Annotation of quake2/linux/gl_fxmesa.c, revision 1.1.1.1

1.1       root        1: /*
                      2: ** GLW_IMP.C
                      3: **
                      4: ** This file contains ALL Linux specific stuff having to do with the
                      5: ** OpenGL refresh.  When a port is being made the following functions
                      6: ** must be implemented by the port:
                      7: **
                      8: ** GLimp_EndFrame
                      9: ** GLimp_Init
                     10: ** GLimp_Shutdown
                     11: ** GLimp_SwitchFullscreen
                     12: **
                     13: */
                     14: 
                     15: #include <termios.h>
                     16: #include <sys/ioctl.h>
                     17: #include <sys/stat.h>
                     18: #include <sys/vt.h>
                     19: #include <stdarg.h>
                     20: #include <stdio.h>
                     21: #include <signal.h>
                     22: 
                     23: #include "../ref_gl/gl_local.h"
                     24: #include "../client/keys.h"
                     25: #include "../linux/rw_linux.h"
                     26: 
                     27: #include <GL/fxmesa.h>
                     28: 
                     29: /*****************************************************************************/
                     30: 
                     31: static qboolean GLimp_SwitchFullscreen( int width, int height );
                     32: qboolean GLimp_InitGL (void);
                     33: 
                     34: extern cvar_t *vid_fullscreen;
                     35: extern cvar_t *vid_ref;
                     36: 
                     37: static fxMesaContext fc = NULL;
                     38: 
                     39: #define NUM_RESOLUTIONS 3
                     40: 
                     41: static resolutions[NUM_RESOLUTIONS][3]={ 
                     42:   { 512, 384, GR_RESOLUTION_512x384 },
                     43:   { 640, 400, GR_RESOLUTION_640x400 },
                     44:   { 640, 480, GR_RESOLUTION_640x480 }
                     45: };
                     46: 
                     47: static int findres(int *width, int *height)
                     48: {
                     49:        int i;
                     50: 
                     51:        for(i=0;i<NUM_RESOLUTIONS;i++)
                     52:                if((*width<=resolutions[i][0]) && (*height<=resolutions[i][1])) {
                     53:                        *width = resolutions[i][0];
                     54:                        *height = resolutions[i][1];
                     55:                        return resolutions[i][2];
                     56:                }
                     57:         
                     58:        *width = 640;
                     59:        *height = 480;
                     60:        return GR_RESOLUTION_640x480;
                     61: }
                     62: 
                     63: static void signal_handler(int sig)
                     64: {
                     65:        printf("Received signal %d, exiting...\n", sig);
                     66:        GLimp_Shutdown();
                     67:        _exit(0);
                     68: }
                     69: 
                     70: static void InitSig(void)
                     71: {
                     72:        signal(SIGHUP, signal_handler);
                     73:        signal(SIGQUIT, signal_handler);
                     74:        signal(SIGILL, signal_handler);
                     75:        signal(SIGTRAP, signal_handler);
                     76:        signal(SIGIOT, signal_handler);
                     77:        signal(SIGBUS, signal_handler);
                     78:        signal(SIGFPE, signal_handler);
                     79:        signal(SIGSEGV, signal_handler);
                     80:        signal(SIGTERM, signal_handler);
                     81: }
                     82: 
                     83: /*
                     84: ** GLimp_SetMode
                     85: */
                     86: int GLimp_SetMode( int *pwidth, int *pheight, int mode, qboolean fullscreen )
                     87: {
                     88:        int width, height;
                     89:        GLint attribs[32];
                     90: 
                     91:        ri.Con_Printf( PRINT_ALL, "Initializing OpenGL display\n");
                     92: 
                     93:        ri.Con_Printf (PRINT_ALL, "...setting mode %d:", mode );
                     94: 
                     95:        if ( !ri.Vid_GetModeInfo( &width, &height, mode ) )
                     96:        {
                     97:                ri.Con_Printf( PRINT_ALL, " invalid mode\n" );
                     98:                return rserr_invalid_mode;
                     99:        }
                    100: 
                    101:        ri.Con_Printf( PRINT_ALL, " %d %d\n", width, height );
                    102: 
                    103:        // destroy the existing window
                    104:        GLimp_Shutdown ();
                    105: 
                    106:        // set fx attribs
                    107:        attribs[0] = FXMESA_DOUBLEBUFFER;
                    108:        attribs[1] = FXMESA_ALPHA_SIZE;
                    109:        attribs[2] = 1;
                    110:        attribs[3] = FXMESA_DEPTH_SIZE;
                    111:        attribs[4] = 1;
                    112:        attribs[5] = FXMESA_NONE;
                    113: 
                    114:        fc = fxMesaCreateContext(0, findres(&width, &height), GR_REFRESH_75Hz, 
                    115:                attribs);
                    116:        if (!fc)
                    117:                return rserr_invalid_mode;
                    118: 
                    119:        *pwidth = width;
                    120:        *pheight = height;
                    121: 
                    122:        // let the sound and input subsystems know about the new window
                    123:        ri.Vid_NewWindow (width, height);
                    124: 
                    125:        fxMesaMakeCurrent(fc);
                    126: 
                    127:        return rserr_ok;
                    128: }
                    129: 
                    130: /*
                    131: ** GLimp_Shutdown
                    132: **
                    133: ** This routine does all OS specific shutdown procedures for the OpenGL
                    134: ** subsystem.  Under OpenGL this means NULLing out the current DC and
                    135: ** HGLRC, deleting the rendering context, and releasing the DC acquired
                    136: ** for the window.  The state structure is also nulled out.
                    137: **
                    138: */
                    139: void GLimp_Shutdown( void )
                    140: {
                    141:        if (fc) {
                    142:                fxMesaDestroyContext(fc);
                    143:                fc = NULL;
                    144:        }
                    145: }
                    146: 
                    147: /*
                    148: ** GLimp_Init
                    149: **
                    150: ** This routine is responsible for initializing the OS specific portions
                    151: ** of OpenGL.  
                    152: */
                    153: int GLimp_Init( void *hinstance, void *wndproc )
                    154: {
                    155:        InitSig();
                    156: 
                    157:        return true;
                    158: }
                    159: 
                    160: /*
                    161: ** GLimp_BeginFrame
                    162: */
                    163: void GLimp_BeginFrame( float camera_seperation )
                    164: {
                    165: }
                    166: 
                    167: /*
                    168: ** GLimp_EndFrame
                    169: ** 
                    170: ** Responsible for doing a swapbuffers and possibly for other stuff
                    171: ** as yet to be determined.  Probably better not to make this a GLimp
                    172: ** function and instead do a call to GLimp_SwapBuffers.
                    173: */
                    174: void GLimp_EndFrame (void)
                    175: {
                    176:        glFlush();
                    177:        fxMesaSwapBuffers();
                    178: }
                    179: 
                    180: /*
                    181: ** GLimp_AppActivate
                    182: */
                    183: void GLimp_AppActivate( qboolean active )
                    184: {
                    185: }
                    186: 
                    187: extern void gl3DfxSetPaletteEXT(GLuint *pal);
                    188: 
                    189: void Fake_glColorTableEXT( GLenum target, GLenum internalformat,
                    190:                              GLsizei width, GLenum format, GLenum type,
                    191:                              const GLvoid *table )
                    192: {
                    193:        byte temptable[256][4];
                    194:        byte *intbl;
                    195:        int i;
                    196: 
                    197:        for (intbl = (byte *)table, i = 0; i < 256; i++) {
                    198:                temptable[i][2] = *intbl++;
                    199:                temptable[i][1] = *intbl++;
                    200:                temptable[i][0] = *intbl++;
                    201:                temptable[i][3] = 255;
                    202:        }
                    203:        gl3DfxSetPaletteEXT((GLuint *)temptable);
                    204: }
                    205: 
                    206: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.