Cleanup: removed r_ignoreFastPath and fast pass code.
This optimization is not important nowdays. Also fast pass was disabled by default in original code. This change simplifies rendering code since now we have only two shader stage processing functions: generic and sky.
This commit is contained in:
parent
0962288d03
commit
a02cb3ee10
|
|
@ -38,8 +38,6 @@ cvar_t *r_railWidth;
|
||||||
cvar_t *r_railCoreWidth;
|
cvar_t *r_railCoreWidth;
|
||||||
cvar_t *r_railSegmentLength;
|
cvar_t *r_railSegmentLength;
|
||||||
|
|
||||||
cvar_t *r_ignoreFastPath;
|
|
||||||
|
|
||||||
cvar_t *r_verbose;
|
cvar_t *r_verbose;
|
||||||
cvar_t *r_ignore;
|
cvar_t *r_ignore;
|
||||||
|
|
||||||
|
|
@ -829,7 +827,6 @@ void R_Register( void )
|
||||||
r_uiFullScreen = ri.Cvar_Get( "r_uifullscreen", "0", 0);
|
r_uiFullScreen = ri.Cvar_Get( "r_uifullscreen", "0", 0);
|
||||||
r_subdivisions = ri.Cvar_Get ("r_subdivisions", "4", CVAR_ARCHIVE | CVAR_LATCH);
|
r_subdivisions = ri.Cvar_Get ("r_subdivisions", "4", CVAR_ARCHIVE | CVAR_LATCH);
|
||||||
r_smp = ri.Cvar_Get( "r_smp", "0", CVAR_ARCHIVE | CVAR_LATCH);
|
r_smp = ri.Cvar_Get( "r_smp", "0", CVAR_ARCHIVE | CVAR_LATCH);
|
||||||
r_ignoreFastPath = ri.Cvar_Get( "r_ignoreFastPath", "1", CVAR_ARCHIVE | CVAR_LATCH );
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// temporary latched variables that can only change over a restart
|
// temporary latched variables that can only change over a restart
|
||||||
|
|
|
||||||
|
|
@ -982,7 +982,6 @@ extern cvar_t *r_railSegmentLength;
|
||||||
|
|
||||||
extern cvar_t *r_ignore; // used for debugging anything
|
extern cvar_t *r_ignore; // used for debugging anything
|
||||||
extern cvar_t *r_verbose; // used for verbose debug spew
|
extern cvar_t *r_verbose; // used for verbose debug spew
|
||||||
extern cvar_t *r_ignoreFastPath; // allows us to ignore our Tess fast paths
|
|
||||||
|
|
||||||
extern cvar_t *r_znear; // near Z clip plane
|
extern cvar_t *r_znear; // near Z clip plane
|
||||||
|
|
||||||
|
|
@ -1295,8 +1294,6 @@ void RB_CheckOverflow( int verts, int indexes );
|
||||||
|
|
||||||
void RB_StageIteratorGeneric( void );
|
void RB_StageIteratorGeneric( void );
|
||||||
void RB_StageIteratorSky( void );
|
void RB_StageIteratorSky( void );
|
||||||
void RB_StageIteratorVertexLitTexture( void );
|
|
||||||
void RB_StageIteratorLightmappedMultitexture( void );
|
|
||||||
|
|
||||||
void RB_AddQuadStamp( vec3_t origin, vec3_t left, vec3_t up, byte *color );
|
void RB_AddQuadStamp( vec3_t origin, vec3_t left, vec3_t up, byte *color );
|
||||||
void RB_AddQuadStampExt( vec3_t origin, vec3_t left, vec3_t up, byte *color, float s1, float t1, float s2, float t2 );
|
void RB_AddQuadStampExt( vec3_t origin, vec3_t left, vec3_t up, byte *color, float s1, float t1, float s2, float t2 );
|
||||||
|
|
|
||||||
|
|
@ -963,190 +963,6 @@ void RB_StageIteratorGeneric( void )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
** RB_StageIteratorVertexLitTexture
|
|
||||||
*/
|
|
||||||
void RB_StageIteratorVertexLitTexture( void )
|
|
||||||
{
|
|
||||||
shaderCommands_t *input;
|
|
||||||
shader_t *shader;
|
|
||||||
|
|
||||||
input = &tess;
|
|
||||||
|
|
||||||
shader = input->shader;
|
|
||||||
|
|
||||||
//
|
|
||||||
// compute colors
|
|
||||||
//
|
|
||||||
RB_CalcDiffuseColor( ( unsigned char * ) tess.svars.colors );
|
|
||||||
|
|
||||||
//
|
|
||||||
// log this call
|
|
||||||
//
|
|
||||||
if ( r_logFile->integer )
|
|
||||||
{
|
|
||||||
// don't just call LogComment, or we will get
|
|
||||||
// a call to va() every frame!
|
|
||||||
GLimp_LogComment( va("--- RB_StageIteratorVertexLitTexturedUnfogged( %s ) ---\n", tess.shader->name) );
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// set face culling appropriately
|
|
||||||
//
|
|
||||||
GL_Cull( input->shader->cullType );
|
|
||||||
|
|
||||||
//
|
|
||||||
// set arrays and lock
|
|
||||||
//
|
|
||||||
qglEnableClientState( GL_COLOR_ARRAY);
|
|
||||||
qglEnableClientState( GL_TEXTURE_COORD_ARRAY);
|
|
||||||
|
|
||||||
qglColorPointer( 4, GL_UNSIGNED_BYTE, 0, tess.svars.colors );
|
|
||||||
qglTexCoordPointer( 2, GL_FLOAT, 16, tess.texCoords[0][0] );
|
|
||||||
qglVertexPointer (3, GL_FLOAT, 16, input->xyz);
|
|
||||||
|
|
||||||
if ( qglLockArraysEXT )
|
|
||||||
{
|
|
||||||
qglLockArraysEXT(0, input->numVertexes);
|
|
||||||
GLimp_LogComment( "glLockArraysEXT\n" );
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// call special shade routine
|
|
||||||
//
|
|
||||||
R_BindAnimatedImage( &tess.xstages[0]->bundle[0] );
|
|
||||||
GL_State( tess.xstages[0]->stateBits );
|
|
||||||
R_DrawElements( input->numIndexes, input->indexes );
|
|
||||||
|
|
||||||
//
|
|
||||||
// now do any dynamic lighting needed
|
|
||||||
//
|
|
||||||
if ( tess.dlightBits && tess.shader->sort <= SS_OPAQUE ) {
|
|
||||||
ProjectDlightTexture();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// now do fog
|
|
||||||
//
|
|
||||||
if ( tess.fogNum && tess.shader->fogPass ) {
|
|
||||||
RB_FogPass();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// unlock arrays
|
|
||||||
//
|
|
||||||
if (qglUnlockArraysEXT)
|
|
||||||
{
|
|
||||||
qglUnlockArraysEXT();
|
|
||||||
GLimp_LogComment( "glUnlockArraysEXT\n" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//define REPLACE_MODE
|
|
||||||
|
|
||||||
void RB_StageIteratorLightmappedMultitexture( void ) {
|
|
||||||
shaderCommands_t *input;
|
|
||||||
|
|
||||||
input = &tess;
|
|
||||||
|
|
||||||
//
|
|
||||||
// log this call
|
|
||||||
//
|
|
||||||
if ( r_logFile->integer ) {
|
|
||||||
// don't just call LogComment, or we will get
|
|
||||||
// a call to va() every frame!
|
|
||||||
GLimp_LogComment( va("--- RB_StageIteratorLightmappedMultitexture( %s ) ---\n", tess.shader->name) );
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// set face culling appropriately
|
|
||||||
//
|
|
||||||
GL_Cull( input->shader->cullType );
|
|
||||||
|
|
||||||
//
|
|
||||||
// set color, pointers, and lock
|
|
||||||
//
|
|
||||||
GL_State( GLS_DEFAULT );
|
|
||||||
qglVertexPointer( 3, GL_FLOAT, 16, input->xyz );
|
|
||||||
|
|
||||||
#ifdef REPLACE_MODE
|
|
||||||
qglDisableClientState( GL_COLOR_ARRAY );
|
|
||||||
qglColor3f( 1, 1, 1 );
|
|
||||||
qglShadeModel( GL_FLAT );
|
|
||||||
#else
|
|
||||||
qglEnableClientState( GL_COLOR_ARRAY );
|
|
||||||
qglColorPointer( 4, GL_UNSIGNED_BYTE, 0, tess.constantColor255 );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// select base stage
|
|
||||||
//
|
|
||||||
GL_SelectTexture( 0 );
|
|
||||||
|
|
||||||
qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
|
|
||||||
R_BindAnimatedImage( &tess.xstages[0]->bundle[0] );
|
|
||||||
qglTexCoordPointer( 2, GL_FLOAT, 16, tess.texCoords[0][0] );
|
|
||||||
|
|
||||||
//
|
|
||||||
// configure second stage
|
|
||||||
//
|
|
||||||
GL_SelectTexture( 1 );
|
|
||||||
qglEnable( GL_TEXTURE_2D );
|
|
||||||
if ( r_lightmap->integer ) {
|
|
||||||
GL_TexEnv( GL_REPLACE );
|
|
||||||
} else {
|
|
||||||
GL_TexEnv( GL_MODULATE );
|
|
||||||
}
|
|
||||||
R_BindAnimatedImage( &tess.xstages[0]->bundle[1] );
|
|
||||||
qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
|
|
||||||
qglTexCoordPointer( 2, GL_FLOAT, 16, tess.texCoords[0][1] );
|
|
||||||
|
|
||||||
//
|
|
||||||
// lock arrays
|
|
||||||
//
|
|
||||||
if ( qglLockArraysEXT ) {
|
|
||||||
qglLockArraysEXT(0, input->numVertexes);
|
|
||||||
GLimp_LogComment( "glLockArraysEXT\n" );
|
|
||||||
}
|
|
||||||
|
|
||||||
R_DrawElements( input->numIndexes, input->indexes );
|
|
||||||
|
|
||||||
//
|
|
||||||
// disable texturing on TEXTURE1, then select TEXTURE0
|
|
||||||
//
|
|
||||||
qglDisable( GL_TEXTURE_2D );
|
|
||||||
qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
|
|
||||||
|
|
||||||
GL_SelectTexture( 0 );
|
|
||||||
#ifdef REPLACE_MODE
|
|
||||||
GL_TexEnv( GL_MODULATE );
|
|
||||||
qglShadeModel( GL_SMOOTH );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// now do any dynamic lighting needed
|
|
||||||
//
|
|
||||||
if ( tess.dlightBits && tess.shader->sort <= SS_OPAQUE ) {
|
|
||||||
ProjectDlightTexture();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// now do fog
|
|
||||||
//
|
|
||||||
if ( tess.fogNum && tess.shader->fogPass ) {
|
|
||||||
RB_FogPass();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// unlock arrays
|
|
||||||
//
|
|
||||||
if ( qglUnlockArraysEXT ) {
|
|
||||||
qglUnlockArraysEXT();
|
|
||||||
GLimp_LogComment( "glUnlockArraysEXT\n" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** RB_EndSurface
|
** RB_EndSurface
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -1614,88 +1614,6 @@ SHADER OPTIMIZATION AND FOGGING
|
||||||
========================================================================================
|
========================================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
===================
|
|
||||||
ComputeStageIteratorFunc
|
|
||||||
|
|
||||||
See if we can use on of the simple fastpath stage functions,
|
|
||||||
otherwise set to the generic stage function
|
|
||||||
===================
|
|
||||||
*/
|
|
||||||
static void ComputeStageIteratorFunc( void )
|
|
||||||
{
|
|
||||||
shader.optimalStageIteratorFunc = RB_StageIteratorGeneric;
|
|
||||||
|
|
||||||
//
|
|
||||||
// see if this should go into the sky path
|
|
||||||
//
|
|
||||||
if ( shader.isSky )
|
|
||||||
{
|
|
||||||
shader.optimalStageIteratorFunc = RB_StageIteratorSky;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( r_ignoreFastPath->integer )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// see if this can go into the vertex lit fast path
|
|
||||||
//
|
|
||||||
if ( shader.numUnfoggedPasses == 1 )
|
|
||||||
{
|
|
||||||
if ( stages[0].rgbGen == CGEN_LIGHTING_DIFFUSE )
|
|
||||||
{
|
|
||||||
if ( stages[0].alphaGen == AGEN_IDENTITY )
|
|
||||||
{
|
|
||||||
if ( stages[0].bundle[0].tcGen == TCGEN_TEXTURE )
|
|
||||||
{
|
|
||||||
if ( !shader.polygonOffset )
|
|
||||||
{
|
|
||||||
if ( !shader.multitextureEnv )
|
|
||||||
{
|
|
||||||
if ( !shader.numDeforms )
|
|
||||||
{
|
|
||||||
shader.optimalStageIteratorFunc = RB_StageIteratorVertexLitTexture;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// see if this can go into an optimized LM, multitextured path
|
|
||||||
//
|
|
||||||
if ( shader.numUnfoggedPasses == 1 )
|
|
||||||
{
|
|
||||||
if ( ( stages[0].rgbGen == CGEN_IDENTITY ) && ( stages[0].alphaGen == AGEN_IDENTITY ) )
|
|
||||||
{
|
|
||||||
if ( stages[0].bundle[0].tcGen == TCGEN_TEXTURE &&
|
|
||||||
stages[0].bundle[1].tcGen == TCGEN_LIGHTMAP )
|
|
||||||
{
|
|
||||||
if ( !shader.polygonOffset )
|
|
||||||
{
|
|
||||||
if ( !shader.numDeforms )
|
|
||||||
{
|
|
||||||
if ( shader.multitextureEnv )
|
|
||||||
{
|
|
||||||
shader.optimalStageIteratorFunc = RB_StageIteratorLightmappedMultitexture;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int blendA;
|
int blendA;
|
||||||
int blendB;
|
int blendB;
|
||||||
|
|
@ -2244,7 +2162,11 @@ static shader_t *FinishShader( void ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// determine which stage iterator function is appropriate
|
// determine which stage iterator function is appropriate
|
||||||
ComputeStageIteratorFunc();
|
if ( shader.isSky ) {
|
||||||
|
shader.optimalStageIteratorFunc = RB_StageIteratorSky;
|
||||||
|
} else {
|
||||||
|
shader.optimalStageIteratorFunc = RB_StageIteratorGeneric;
|
||||||
|
}
|
||||||
|
|
||||||
return GeneratePermanentShader();
|
return GeneratePermanentShader();
|
||||||
}
|
}
|
||||||
|
|
@ -2782,10 +2704,6 @@ void R_ShaderList_f (void) {
|
||||||
ri.Printf( PRINT_ALL, "gen " );
|
ri.Printf( PRINT_ALL, "gen " );
|
||||||
} else if ( shader->optimalStageIteratorFunc == RB_StageIteratorSky ) {
|
} else if ( shader->optimalStageIteratorFunc == RB_StageIteratorSky ) {
|
||||||
ri.Printf( PRINT_ALL, "sky " );
|
ri.Printf( PRINT_ALL, "sky " );
|
||||||
} else if ( shader->optimalStageIteratorFunc == RB_StageIteratorLightmappedMultitexture ) {
|
|
||||||
ri.Printf( PRINT_ALL, "lmmt" );
|
|
||||||
} else if ( shader->optimalStageIteratorFunc == RB_StageIteratorVertexLitTexture ) {
|
|
||||||
ri.Printf( PRINT_ALL, "vlt " );
|
|
||||||
} else {
|
} else {
|
||||||
ri.Printf( PRINT_ALL, " " );
|
ri.Printf( PRINT_ALL, " " );
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user