Old features cleanup: GL_ARB_multitexture is not optional anymore, always use qglDrawElements for rendering.
This commit is contained in:
parent
a4a5920a93
commit
fa40b3b8ce
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -567,42 +561,22 @@ static void GLW_InitExtensions( void )
|
|||
}
|
||||
|
||||
// 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" );
|
||||
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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -3565,7 +3565,6 @@ qboolean QGL_Init( const char *dllname )
|
|||
qwglSwapIntervalEXT = 0;
|
||||
qglActiveTextureARB = 0;
|
||||
qglClientActiveTextureARB = 0;
|
||||
qglMultiTexCoord2fARB = 0;
|
||||
qglLockArraysEXT = 0;
|
||||
qglUnlockArraysEXT = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ) {
|
||||
// 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 );
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=============================================================
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user