diff --git a/changelog.md b/changelog.md index 48368a5..da59648 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,7 @@ Removed cvars: -* r_colorbits (use desktop color depth by default) -* r_maskMinidriver +* r_allowExtensions * r_allowSoftwareGL +* r_colorbits (use desktop color depth by default) +* r_ext_multitexture (mandatory feature) +* r_maskMinidriver +* r_primitives (always use qglDrawElements) diff --git a/src/engine/platform/win_glimp.c b/src/engine/platform/win_glimp.c index 3feb9a1..8ab324d 100644 --- a/src/engine/platform/win_glimp.c +++ b/src/engine/platform/win_glimp.c @@ -506,12 +506,6 @@ static bool GLW_SetMode(int mode, qboolean fullscreen) { */ static void GLW_InitExtensions( void ) { - if ( !r_allowExtensions->integer ) - { - ri.Printf( PRINT_ALL, "*** IGNORING OPENGL EXTENSIONS ***\n" ); - return; - } - ri.Printf( PRINT_ALL, "Initializing OpenGL extensions\n" ); // GL_S3_s3tc @@ -566,44 +560,24 @@ static void GLW_InitExtensions( void ) ri.Printf( PRINT_ALL, "...WGL_EXT_swap_control not found\n" ); } - // GL_ARB_multitexture - qglMultiTexCoord2fARB = NULL; - qglActiveTextureARB = NULL; - qglClientActiveTextureARB = NULL; - if ( strstr( glConfig.extensions_string, "GL_ARB_multitexture" ) ) - { - if ( r_ext_multitexture->integer ) - { - qglMultiTexCoord2fARB = ( PFNGLMULTITEXCOORD2FARBPROC ) qwglGetProcAddress( "glMultiTexCoord2fARB" ); - qglActiveTextureARB = ( PFNGLACTIVETEXTUREARBPROC ) qwglGetProcAddress( "glActiveTextureARB" ); - qglClientActiveTextureARB = ( PFNGLCLIENTACTIVETEXTUREARBPROC ) qwglGetProcAddress( "glClientActiveTextureARB" ); + // GL_ARB_multitexture + { + if (!strstr(glConfig.extensions_string, "GL_ARB_multitexture")) + ri.Error(ERR_FATAL, "GL_ARB_multitexture not found"); - if ( qglActiveTextureARB ) - { - qglGetIntegerv( GL_MAX_ACTIVE_TEXTURES_ARB, &glConfig.maxActiveTextures ); + qglActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)qwglGetProcAddress("glActiveTextureARB"); + qglClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)qwglGetProcAddress("glClientActiveTextureARB"); - if ( glConfig.maxActiveTextures > 1 ) - { - ri.Printf( PRINT_ALL, "...using GL_ARB_multitexture\n" ); - } - else - { - qglMultiTexCoord2fARB = NULL; - qglActiveTextureARB = NULL; - qglClientActiveTextureARB = NULL; - ri.Printf( PRINT_ALL, "...not using GL_ARB_multitexture, < 2 texture units\n" ); - } - } - } - else - { - ri.Printf( PRINT_ALL, "...ignoring GL_ARB_multitexture\n" ); - } - } - else - { - ri.Printf( PRINT_ALL, "...GL_ARB_multitexture not found\n" ); - } + if (!qglActiveTextureARB || !qglClientActiveTextureARB) + ri.Error(ERR_FATAL, "GL_ARB_multitexture: could not initialize function pointers"); + + qglGetIntegerv(GL_MAX_ACTIVE_TEXTURES_ARB, &glConfig.maxActiveTextures); + + if (glConfig.maxActiveTextures < 2) + ri.Error(ERR_FATAL, "GL_ARB_multitexture: < 2 texture units"); + + ri.Printf(PRINT_ALL, "...using GL_ARB_multitexture\n"); + } // GL_EXT_compiled_vertex_array qglLockArraysEXT = NULL; @@ -695,7 +669,7 @@ void GLimp_Init( void ) // create the window and set up the context if (!GLW_SetMode(r_mode->integer, (qboolean)r_fullscreen->integer)) { - ri.Error(ERR_FATAL, "...WARNING: could not set the given mode (%d)\n", r_mode->integer); + ri.Error(ERR_FATAL, "GLW_SetMode - could not set the given mode (%d)\n", r_mode->integer); } // get our config strings diff --git a/src/engine/platform/win_qgl.c b/src/engine/platform/win_qgl.c index 4f52815..da826fc 100644 --- a/src/engine/platform/win_qgl.c +++ b/src/engine/platform/win_qgl.c @@ -3565,7 +3565,6 @@ qboolean QGL_Init( const char *dllname ) qwglSwapIntervalEXT = 0; qglActiveTextureARB = 0; qglClientActiveTextureARB = 0; - qglMultiTexCoord2fARB = 0; qglLockArraysEXT = 0; qglUnlockArraysEXT = 0; diff --git a/src/engine/renderer/qgl.h b/src/engine/renderer/qgl.h index bf648f6..0ff26cc 100644 --- a/src/engine/renderer/qgl.h +++ b/src/engine/renderer/qgl.h @@ -147,7 +147,6 @@ typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum target); // extensions will be function pointers on all platforms -extern void ( APIENTRY * qglMultiTexCoord2fARB )( GLenum texture, GLfloat s, GLfloat t ); extern void ( APIENTRY * qglActiveTextureARB )( GLenum texture ); extern void ( APIENTRY * qglClientActiveTextureARB )( GLenum texture ); diff --git a/src/engine/renderer/tr_image.c b/src/engine/renderer/tr_image.c index 4a3b6a7..d422bd2 100644 --- a/src/engine/renderer/tr_image.c +++ b/src/engine/renderer/tr_image.c @@ -764,16 +764,13 @@ image_t *R_CreateImage( const char *name, const byte *pic, int width, int height image->wrapClampMode = glWrapClampMode; // lightmaps are always allocated on TMU 1 - if ( qglActiveTextureARB && isLightmap ) { + if (isLightmap) { image->TMU = 1; } else { image->TMU = 0; } - if ( qglActiveTextureARB ) { - GL_SelectTexture( image->TMU ); - } - + GL_SelectTexture(image->TMU); GL_Bind(image); Upload32( (unsigned *)pic, image->width, image->height, @@ -1870,14 +1867,10 @@ void R_DeleteTextures( void ) { Com_Memset( glState.currenttextures, 0, sizeof( glState.currenttextures ) ); if ( qglBindTexture ) { - if ( qglActiveTextureARB ) { - GL_SelectTexture( 1 ); - qglBindTexture( GL_TEXTURE_2D, 0 ); - GL_SelectTexture( 0 ); - qglBindTexture( GL_TEXTURE_2D, 0 ); - } else { - qglBindTexture( GL_TEXTURE_2D, 0 ); - } + GL_SelectTexture( 1 ); + qglBindTexture( GL_TEXTURE_2D, 0 ); + GL_SelectTexture( 0 ); + qglBindTexture( GL_TEXTURE_2D, 0 ); } } diff --git a/src/engine/renderer/tr_init.c b/src/engine/renderer/tr_init.c index 573c946..2402f41 100644 --- a/src/engine/renderer/tr_init.c +++ b/src/engine/renderer/tr_init.c @@ -73,11 +73,8 @@ cvar_t *r_facePlaneCull; cvar_t *r_showcluster; cvar_t *r_nocurves; -cvar_t *r_allowExtensions; - cvar_t *r_ext_compressed_textures; cvar_t *r_ext_gamma_control; -cvar_t *r_ext_multitexture; cvar_t *r_ext_compiled_vertex_array; cvar_t *r_ext_texture_env_add; @@ -87,7 +84,6 @@ cvar_t *r_logFile; cvar_t *r_stencilbits; cvar_t *r_depthbits; cvar_t *r_stereo; -cvar_t *r_primitives; cvar_t *r_texturebits; cvar_t *r_drawBuffer; @@ -147,7 +143,6 @@ int max_polys; cvar_t *r_maxpolyverts; int max_polyverts; -void ( APIENTRY * qglMultiTexCoord2fARB )( GLenum texture, GLfloat s, GLfloat t ); void ( APIENTRY * qglActiveTextureARB )( GLenum texture ); void ( APIENTRY * qglClientActiveTextureARB )( GLenum texture ); @@ -707,15 +702,12 @@ void GL_SetDefaultState( void ) qglColor4f (1,1,1,1); - // initialize downstream texture unit if we're running - // in a multitexture environment - if ( qglActiveTextureARB ) { - GL_SelectTexture( 1 ); - GL_TextureMode( r_textureMode->string ); - GL_TexEnv( GL_MODULATE ); - qglDisable( GL_TEXTURE_2D ); - GL_SelectTexture( 0 ); - } + // initialize downstream texture unit + GL_SelectTexture( 1 ); + GL_TextureMode( r_textureMode->string ); + GL_TexEnv( GL_MODULATE ); + qglDisable( GL_TEXTURE_2D ); + GL_SelectTexture( 0 ); qglEnable(GL_TEXTURE_2D); GL_TextureMode( r_textureMode->string ); @@ -779,35 +771,9 @@ void GfxInfo_f( void ) } ri.Printf( PRINT_ALL, "CPU: %s\n", sys_cpustring->string ); - // rendering primitives - { - int primitives; - - // default is to use triangles if compiled vertex arrays are present - ri.Printf( PRINT_ALL, "rendering primitives: " ); - primitives = r_primitives->integer; - if ( primitives == 0 ) { - if ( qglLockArraysEXT ) { - primitives = 2; - } else { - primitives = 1; - } - } - if ( primitives == -1 ) { - ri.Printf( PRINT_ALL, "none\n" ); - } else if ( primitives == 2 ) { - ri.Printf( PRINT_ALL, "single glDrawElements\n" ); - } else if ( primitives == 1 ) { - ri.Printf( PRINT_ALL, "multiple glArrayElement\n" ); - } else if ( primitives == 3 ) { - ri.Printf( PRINT_ALL, "multiple glColor4ubv + glTexCoord2fv + glVertex3fv\n" ); - } - } - ri.Printf( PRINT_ALL, "texturemode: %s\n", r_textureMode->string ); ri.Printf( PRINT_ALL, "picmip: %d\n", r_picmip->integer ); ri.Printf( PRINT_ALL, "texture bits: %d\n", r_texturebits->integer ); - ri.Printf( PRINT_ALL, "multitexture: %s\n", enablestrings[qglActiveTextureARB != 0] ); ri.Printf( PRINT_ALL, "compiled vertex arrays: %s\n", enablestrings[qglLockArraysEXT != 0 ] ); ri.Printf( PRINT_ALL, "texenv add: %s\n", enablestrings[glConfig.textureEnvAddAvailable != 0] ); ri.Printf( PRINT_ALL, "compressed textures: %s\n", enablestrings[glConfig.textureCompression!=TC_NONE] ); @@ -834,10 +800,8 @@ void R_Register( void ) // latched and archived variables // r_glDriver = ri.Cvar_Get( "r_glDriver", OPENGL_DRIVER_NAME, CVAR_ARCHIVE | CVAR_LATCH ); - r_allowExtensions = ri.Cvar_Get( "r_allowExtensions", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_ext_compressed_textures = ri.Cvar_Get( "r_ext_compressed_textures", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_ext_gamma_control = ri.Cvar_Get( "r_ext_gamma_control", "1", CVAR_ARCHIVE | CVAR_LATCH ); - r_ext_multitexture = ri.Cvar_Get( "r_ext_multitexture", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_ext_compiled_vertex_array = ri.Cvar_Get( "r_ext_compiled_vertex_array", "1", CVAR_ARCHIVE | CVAR_LATCH); #ifdef __linux__ // broken on linux r_ext_texture_env_add = ri.Cvar_Get( "r_ext_texture_env_add", "0", CVAR_ARCHIVE | CVAR_LATCH); @@ -915,8 +879,6 @@ void R_Register( void ) r_railCoreWidth = ri.Cvar_Get( "r_railCoreWidth", "6", CVAR_ARCHIVE ); r_railSegmentLength = ri.Cvar_Get( "r_railSegmentLength", "32", CVAR_ARCHIVE ); - r_primitives = ri.Cvar_Get( "r_primitives", "0", CVAR_ARCHIVE ); - r_ambientScale = ri.Cvar_Get( "r_ambientScale", "0.6", CVAR_CHEAT ); r_directedScale = ri.Cvar_Get( "r_directedScale", "1", CVAR_CHEAT ); diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 52e5a35..a93754d 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -999,11 +999,6 @@ extern cvar_t *r_measureOverdraw; // enables stencil buffer overdraw measuremen extern cvar_t *r_lodbias; // push/pull LOD transitions extern cvar_t *r_lodscale; -extern cvar_t *r_primitives; // "0" = based on compiled vertex array existance - // "1" = glDrawElemet tristrips - // "2" = glDrawElements triangles - // "-1" = no drawing - extern cvar_t *r_inGameVideo; // controls whether in game video should be draw extern cvar_t *r_fastsky; // controls whether sky should be cleared or drawn extern cvar_t *r_drawSun; // controls drawing of sun quad @@ -1027,11 +1022,9 @@ extern cvar_t *r_gamma; extern cvar_t *r_displayRefresh; // optional display refresh option extern cvar_t *r_ignorehwgamma; // overrides hardware gamma capabilities -extern cvar_t *r_allowExtensions; // global enable/disable of OpenGL extensions extern cvar_t *r_ext_compressed_textures; // these control use of specific extensions extern cvar_t *r_ext_gamma_control; extern cvar_t *r_ext_texenv_op; -extern cvar_t *r_ext_multitexture; extern cvar_t *r_ext_compiled_vertex_array; extern cvar_t *r_ext_texture_env_add; diff --git a/src/engine/renderer/tr_shade.c b/src/engine/renderer/tr_shade.c index d80d8d5..f4e9f86 100644 --- a/src/engine/renderer/tr_shade.c +++ b/src/engine/renderer/tr_shade.c @@ -30,173 +30,15 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA This file deals with applying shaders to surface data in the tess struct. */ -/* -================ -R_ArrayElementDiscrete - -This is just for OpenGL conformance testing, it should never be the fastest -================ -*/ -static void APIENTRY R_ArrayElementDiscrete( GLint index ) { - qglColor4ubv( tess.svars.colors[ index ] ); - if ( glState.currenttmu ) { - qglMultiTexCoord2fARB( 0, tess.svars.texcoords[ 0 ][ index ][0], tess.svars.texcoords[ 0 ][ index ][1] ); - qglMultiTexCoord2fARB( 1, tess.svars.texcoords[ 1 ][ index ][0], tess.svars.texcoords[ 1 ][ index ][1] ); - } else { - qglTexCoord2fv( tess.svars.texcoords[ 0 ][ index ] ); - } - qglVertex3fv( tess.xyz[ index ] ); -} - -/* -=================== -R_DrawStripElements - -=================== -*/ -static int c_vertexes; // for seeing how long our average strips are -static int c_begins; -static void R_DrawStripElements( int numIndexes, const glIndex_t *indexes, void ( APIENTRY *element )(GLint) ) { - int i; - int last[3] = { -1, -1, -1 }; - qboolean even; - - c_begins++; - - if ( numIndexes <= 0 ) { - return; - } - - qglBegin( GL_TRIANGLE_STRIP ); - - // prime the strip - element( indexes[0] ); - element( indexes[1] ); - element( indexes[2] ); - c_vertexes += 3; - - last[0] = indexes[0]; - last[1] = indexes[1]; - last[2] = indexes[2]; - - even = qfalse; - - for ( i = 3; i < numIndexes; i += 3 ) - { - // odd numbered triangle in potential strip - if ( !even ) - { - // check previous triangle to see if we're continuing a strip - if ( ( (int)indexes[i+0] == last[2] ) && ( (int)indexes[i+1] == last[1] ) ) - { - element( indexes[i+2] ); - c_vertexes++; - assert( indexes[i+2] < tess.numVertexes ); - even = qtrue; - } - // otherwise we're done with this strip so finish it and start - // a new one - else - { - qglEnd(); - - qglBegin( GL_TRIANGLE_STRIP ); - c_begins++; - - element( indexes[i+0] ); - element( indexes[i+1] ); - element( indexes[i+2] ); - - c_vertexes += 3; - - even = qfalse; - } - } - else - { - // check previous triangle to see if we're continuing a strip - if ( ( last[2] == (int)indexes[i+1] ) && ( last[0] == (int)indexes[i+0] ) ) - { - element( indexes[i+2] ); - c_vertexes++; - - even = qfalse; - } - // otherwise we're done with this strip so finish it and start - // a new one - else - { - qglEnd(); - - qglBegin( GL_TRIANGLE_STRIP ); - c_begins++; - - element( indexes[i+0] ); - element( indexes[i+1] ); - element( indexes[i+2] ); - c_vertexes += 3; - - even = qfalse; - } - } - - // cache the last three vertices - last[0] = indexes[i+0]; - last[1] = indexes[i+1]; - last[2] = indexes[i+2]; - } - - qglEnd(); -} - - - /* ================== R_DrawElements - -Optionally performs our own glDrawElements that looks for strip conditions -instead of using the single glDrawElements call that may be inefficient -without compiled vertex arrays. ================== */ static void R_DrawElements( int numIndexes, const glIndex_t *indexes ) { - int primitives; - - primitives = r_primitives->integer; - - // default is to use triangles if compiled vertex arrays are present - if ( primitives == 0 ) { - if ( qglLockArraysEXT ) { - primitives = 2; - } else { - primitives = 1; - } - } - - - if ( primitives == 2 ) { - qglDrawElements( GL_TRIANGLES, - numIndexes, - GL_INDEX_TYPE, - indexes ); - return; - } - - if ( primitives == 1 ) { - R_DrawStripElements( numIndexes, indexes, qglArrayElement ); - return; - } - - if ( primitives == 3 ) { - R_DrawStripElements( numIndexes, indexes, R_ArrayElementDiscrete ); - return; - } - - // anything else will cause no drawing + qglDrawElements(GL_TRIANGLES, numIndexes, GL_INDEX_TYPE, indexes); } - /* ============================================================= diff --git a/src/engine/renderer/tr_shader.c b/src/engine/renderer/tr_shader.c index 64e8c21..0fb715d 100644 --- a/src/engine/renderer/tr_shader.c +++ b/src/engine/renderer/tr_shader.c @@ -1748,10 +1748,6 @@ static qboolean CollapseMultitexture( void ) { int i; textureBundle_t tmpBundle; - if ( !qglActiveTextureARB ) { - return qfalse; - } - // make sure both stages are active if ( !stages[0].active || !stages[1].active ) { return qfalse;