|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.