Quake-2

Quake 2 GPL Source Release
Log | Files | Refs

gl_fxmesa.c (4310B)


      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