Simplified renderparms

This commit is contained in:
Robert Beckebans 2018-10-13 13:50:44 +02:00
parent 5483a186d3
commit 5ea900fd61
4 changed files with 43 additions and 73 deletions

View file

@ -3679,7 +3679,7 @@ int idRenderBackend::DrawShaderPasses( const drawSurf_t* const* const drawSurfs,
parm[1] = regs[ newStage->vertexParms[j][1] ];
parm[2] = regs[ newStage->vertexParms[j][2] ];
parm[3] = regs[ newStage->vertexParms[j][3] ];
SetVertexParm( ( renderParm_t )( RENDERPARM_USER + j ), parm );
SetVertexParm( ( renderParm_t )( RENDERPARM_USER0 + j ), parm );
}
// set rpEnableSkinning if the shader has optional support for skinning

View file

@ -204,44 +204,7 @@ void idRenderProgManager::Init()
r_useHalfLambertLighting.ClearModified();
r_useHDR.ClearModified();
// special case handling for fastZ shaders
/*
switch( glConfig.driverType )
{
case GLDRV_OPENGL32_CORE_PROFILE:
case GLDRV_OPENGL_ES2:
case GLDRV_OPENGL_ES3:
case GLDRV_OPENGL_MESA:
{
builtinShaders[BUILTIN_SHADOW] = FindVertexShader( "shadow.vp" );
int shadowFragmentShaderIndex = FindFragmentShader( "shadow.fp" );
FindGLSLProgram( "shadow.vp", builtinShaders[BUILTIN_SHADOW], shadowFragmentShaderIndex );
if( glConfig.gpuSkinningAvailable )
{
builtinShaders[BUILTIN_SHADOW_SKINNED] = FindVertexShader( "shadow_skinned.vp" );
int shadowFragmentShaderIndex = FindFragmentShader( "shadow_skinned.fp" );
FindGLSLProgram( "shadow_skinned.vp", builtinShaders[BUILTIN_SHADOW_SKINNED], shadowFragmentShaderIndex );
break;
}
}
default:
{
// fast path on PC
builtinShaders[BUILTIN_SHADOW] = FindVertexShader( "shadow.vp" );
FindGLSLProgram( "shadow.vp", builtinShaders[BUILTIN_SHADOW], -1 );
if( glConfig.gpuSkinningAvailable )
{
builtinShaders[BUILTIN_SHADOW_SKINNED] = FindVertexShader( "shadow_skinned.vp" );
FindGLSLProgram( "shadow_skinned.vp", builtinShaders[BUILTIN_SHADOW_SKINNED], -1 );
}
}
}
*/
glslUniforms.SetNum( RENDERPARM_USER + MAX_GLSL_USER_PARMS, vec4_zero );
glslUniforms.SetNum( RENDERPARM_TOTAL, vec4_zero );
if( glConfig.gpuSkinningAvailable )
{

View file

@ -3,7 +3,8 @@
Doom 3 BFG Edition GPL Source Code
Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
Copyright (C) 2013-2016 Robert Beckebans
Copyright (C) 2013-2018 Robert Beckebans
Copyright (C) 2016-2017 Dustin Land
This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
@ -190,18 +191,22 @@ enum renderParm_t
RENDERPARM_SHADOW_MATRIX_5_Y,
RENDERPARM_SHADOW_MATRIX_5_Z,
RENDERPARM_SHADOW_MATRIX_5_W,
RENDERPARM_USER0,
RENDERPARM_USER1,
RENDERPARM_USER2,
RENDERPARM_USER3,
RENDERPARM_USER4,
RENDERPARM_USER5,
RENDERPARM_USER6,
RENDERPARM_USER7,
// RB end
RENDERPARM_TOTAL,
RENDERPARM_USER = 128,
};
struct glslUniformLocation_t
{
int parmIndex;
int uniformIndex;
};
@ -219,6 +224,10 @@ public:
void Init();
void Shutdown();
void StartFrame();
const idVec4& GetRenderParm( renderParm_t rp );
void SetRenderParm( renderParm_t rp, const float* value );
void SetRenderParms( renderParm_t rp, const float* values, int numValues );
@ -727,6 +736,7 @@ protected:
bool builtin; // RB: part of the core shaders built into the executable
idList<int> uniforms;
};
struct fragmentShader_t
{
fragmentShader_t() : progId( INVALID_PROGID ), shaderFeatures( 0 ), builtin( false ) {}
@ -738,9 +748,9 @@ protected:
idList<int> uniforms;
};
struct glslProgram_t
struct renderProg_t
{
glslProgram_t() : progId( INVALID_PROGID ),
renderProg_t() : progId( INVALID_PROGID ),
vertexShaderIndex( -1 ),
fragmentShaderIndex( -1 ),
vertexUniformArray( -1 ),
@ -751,17 +761,17 @@ protected:
int fragmentShaderIndex;
uint vertexUniformArray;
uint fragmentUniformArray;
idList<glslUniformLocation_t> uniformLocations;
};
int currentRenderProgram;
idList<glslProgram_t, TAG_RENDER> glslPrograms;
idStaticList < idVec4, RENDERPARM_USER + MAX_GLSL_USER_PARMS > glslUniforms;
int currentRenderProgram;
idList<renderProg_t, TAG_RENDER> glslPrograms;
idStaticList < idVec4, RENDERPARM_TOTAL > glslUniforms;
int currentVertexShader;
int currentFragmentShader;
idList<vertexShader_t, TAG_RENDER> vertexShaders;
idList<fragmentShader_t, TAG_RENDER> fragmentShaders;
int currentVertexShader;
int currentFragmentShader;
idList<vertexShader_t, TAG_RENDER> vertexShaders;
idList<fragmentShader_t, TAG_RENDER> fragmentShaders;
};
extern idRenderProgManager renderProgManager;

View file

@ -324,6 +324,15 @@ static const char* GLSLParmNames[RENDERPARM_TOTAL] =
"rpShadowMatrix5Y",
"rpShadowMatrix5Z",
"rpShadowMatrix5W",
"rpUser0",
"rpUser1",
"rpUser2",
"rpUser3",
"rpUser4",
"rpUser5",
"rpUser6",
"rpUser7"
// RB end
};
@ -1762,14 +1771,7 @@ GLuint idRenderProgManager::LoadGLSLShader( GLenum target, const char* name, con
index = i;
}
}
for( int i = 0; i < MAX_GLSL_USER_PARMS && index == -1; i++ )
{
const char* parmName = GetGLSLParmName( RENDERPARM_USER + i );
if( token == parmName )
{
index = RENDERPARM_USER + i;
}
}
if( index == -1 )
{
idLib::Error( "couldn't find uniform %s for %s", token.c_str(), outFileGLSL.c_str() );
@ -1858,7 +1860,7 @@ int idRenderProgManager::FindGLSLProgram( const char* name, int vIndex, int fIn
}
}
glslProgram_t program;
renderProg_t program;
program.name = name;
int index = glslPrograms.Append( program );
LoadGLSLProgram( index, vIndex, fIndex );
@ -1872,11 +1874,6 @@ idRenderProgManager::GetGLSLParmName
*/
const char* idRenderProgManager::GetGLSLParmName( int rp ) const
{
if( rp >= RENDERPARM_USER )
{
int userParmIndex = rp - RENDERPARM_USER;
return va( "rpUser%d", userParmIndex );
}
assert( rp < RENDERPARM_TOTAL );
return GLSLParmNames[ rp ];
}
@ -1914,11 +1911,11 @@ void idRenderProgManager::CommitUniforms()
{
#if !defined(USE_VULKAN)
const int progID = GetGLSLCurrentProgram();
const glslProgram_t& prog = glslPrograms[progID];
const renderProg_t& prog = glslPrograms[progID];
//GL_CheckErrors();
ALIGNTYPE16 idVec4 localVectors[RENDERPARM_USER + MAX_GLSL_USER_PARMS];
ALIGNTYPE16 idVec4 localVectors[RENDERPARM_TOTAL];
if( prog.vertexShaderIndex >= 0 )
{
@ -1988,7 +1985,7 @@ idRenderProgManager::LoadGLSLProgram
void idRenderProgManager::LoadGLSLProgram( const int programIndex, const int vertexShaderIndex, const int fragmentShaderIndex )
{
#if !defined(USE_VULKAN)
glslProgram_t& prog = glslPrograms[programIndex];
renderProg_t& prog = glslPrograms[programIndex];
if( prog.progId != INVALID_PROGID )
{