/* ================================================================================================ idRenderProgManager::FindGLSLProgram ================================================================================================ */ int idRenderProgManager::FindGLSLProgram( const char * name, int vIndex, int fIndex ) { for ( int i = 0; i < glslPrograms.Num(); ++i ) { if ( ( glslPrograms[i].vertexShaderIndex == vIndex ) && ( glslPrograms[i].fragmentShaderIndex == fIndex ) ) { LoadGLSLProgram( i, vIndex, fIndex ); return i; } } glslProgram_t program; program.name = name; int index = glslPrograms.Append( program ); LoadGLSLProgram( index, vIndex, fIndex ); return index; }
/* ================================================================================================ idRenderProgManager::LoadAllShaders() ================================================================================================ */ void idRenderProgManager::LoadAllShaders() { for( int i = 0; i < vertexShaders.Num(); i++ ) { LoadVertexShader( i ); } for( int i = 0; i < fragmentShaders.Num(); i++ ) { LoadFragmentShader( i ); } for( int i = 0; i < glslPrograms.Num(); ++i ) { if( glslPrograms[i].vertexShaderIndex == -1 || glslPrograms[i].fragmentShaderIndex == -1 ) { // RB: skip reloading because we didn't load it initially continue; } LoadGLSLProgram( i, glslPrograms[i].vertexShaderIndex, glslPrograms[i].fragmentShaderIndex ); } }
/* ================================================================================================ idRenderProgManager::Init() ================================================================================================ */ void idRenderProgManager::Init() { common->Printf( "----- Initializing Render Shaders -----\n" ); for( int i = 0; i < MAX_BUILTINS; i++ ) { builtinShaders[i] = -1; } // RB: added checks for GPU skinning struct builtinShaders_t { int index; const char* name; const char* nameOutSuffix; uint32 shaderFeatures; bool requireGPUSkinningSupport; } builtins[] = { { BUILTIN_GUI, "gui.vfp", 0, false }, { BUILTIN_COLOR, "color.vfp", 0, false }, // RB begin { BUILTIN_COLOR_SKINNED, "color", "_skinned", BIT( USE_GPU_SKINNING ), true }, { BUILTIN_VERTEX_COLOR, "vertex_color.vfp", "", 0, false }, // RB end // { BUILTIN_SIMPLESHADE, "simpleshade.vfp", 0, false }, { BUILTIN_TEXTURED, "texture.vfp", 0, false }, { BUILTIN_TEXTURE_VERTEXCOLOR, "texture_color.vfp", 0, false }, { BUILTIN_TEXTURE_VERTEXCOLOR_SKINNED, "texture_color_skinned.vfp", 0, true }, { BUILTIN_TEXTURE_TEXGEN_VERTEXCOLOR, "texture_color_texgen.vfp", 0, false }, // RB begin { BUILTIN_INTERACTION, "interaction.vfp", "", 0, false }, { BUILTIN_INTERACTION_SKINNED, "interaction", "_skinned", BIT( USE_GPU_SKINNING ), true }, { BUILTIN_INTERACTION_AMBIENT, "interactionAmbient.vfp", 0, false }, { BUILTIN_INTERACTION_AMBIENT_SKINNED, "interactionAmbient_skinned.vfp", 0, true }, { BUILTIN_INTERACTION_SHADOW_MAPPING_SPOT, "interactionSM", "_spot", 0, false }, { BUILTIN_INTERACTION_SHADOW_MAPPING_SPOT_SKINNED, "interactionSM", "_spot_skinned", BIT( USE_GPU_SKINNING ), true }, { BUILTIN_INTERACTION_SHADOW_MAPPING_POINT, "interactionSM", "_point", BIT( LIGHT_POINT ), false }, { BUILTIN_INTERACTION_SHADOW_MAPPING_POINT_SKINNED, "interactionSM", "_point_skinned", BIT( USE_GPU_SKINNING ) | BIT( LIGHT_POINT ), true }, { BUILTIN_INTERACTION_SHADOW_MAPPING_PARALLEL, "interactionSM", "_parallel", BIT( LIGHT_PARALLEL ), false }, { BUILTIN_INTERACTION_SHADOW_MAPPING_PARALLEL_SKINNED, "interactionSM", "_parallel_skinned", BIT( USE_GPU_SKINNING ) | BIT( LIGHT_PARALLEL ), true }, // RB end { BUILTIN_ENVIRONMENT, "environment.vfp", 0, false }, { BUILTIN_ENVIRONMENT_SKINNED, "environment_skinned.vfp", 0, true }, { BUILTIN_BUMPY_ENVIRONMENT, "bumpyenvironment.vfp", 0, false }, { BUILTIN_BUMPY_ENVIRONMENT_SKINNED, "bumpyenvironment_skinned.vfp", 0, true }, { BUILTIN_DEPTH, "depth.vfp", 0, false }, { BUILTIN_DEPTH_SKINNED, "depth_skinned.vfp", 0, true }, { BUILTIN_SHADOW, "shadow.vfp", 0, false }, { BUILTIN_SHADOW_SKINNED, "shadow_skinned.vfp", 0, true }, { BUILTIN_SHADOW_DEBUG, "shadowDebug.vfp", 0, false }, { BUILTIN_SHADOW_DEBUG_SKINNED, "shadowDebug_skinned.vfp", 0, true }, { BUILTIN_BLENDLIGHT, "blendlight.vfp", 0, false }, { BUILTIN_FOG, "fog.vfp", 0, false }, { BUILTIN_FOG_SKINNED, "fog_skinned.vfp", 0, true }, { BUILTIN_SKYBOX, "skybox.vfp", 0, false }, { BUILTIN_WOBBLESKY, "wobblesky.vfp", 0, false }, { BUILTIN_POSTPROCESS, "postprocess.vfp", 0, false }, { BUILTIN_STEREO_DEGHOST, "stereoDeGhost.vfp", 0, false }, { BUILTIN_STEREO_WARP, "stereoWarp.vfp", 0, false }, // { BUILTIN_ZCULL_RECONSTRUCT, "zcullReconstruct.vfp", 0, false }, { BUILTIN_BINK, "bink.vfp", 0, false }, { BUILTIN_BINK_GUI, "bink_gui.vfp", 0, false }, { BUILTIN_STEREO_INTERLACE, "stereoInterlace.vfp", 0, false }, { BUILTIN_MOTION_BLUR, "motionBlur.vfp", 0, false }, // RB begin { BUILTIN_DEBUG_SHADOWMAP, "debug_shadowmap.vfp", "", 0, false }, // RB end }; int numBuiltins = sizeof( builtins ) / sizeof( builtins[0] ); vertexShaders.SetNum( numBuiltins ); fragmentShaders.SetNum( numBuiltins ); glslPrograms.SetNum( numBuiltins ); for( int i = 0; i < numBuiltins; i++ ) { vertexShaders[i].name = builtins[i].name; vertexShaders[i].nameOutSuffix = builtins[i].nameOutSuffix; vertexShaders[i].shaderFeatures = builtins[i].shaderFeatures; vertexShaders[i].builtin = true; fragmentShaders[i].name = builtins[i].name; fragmentShaders[i].nameOutSuffix = builtins[i].nameOutSuffix; fragmentShaders[i].shaderFeatures = builtins[i].shaderFeatures; fragmentShaders[i].builtin = true; builtinShaders[builtins[i].index] = i; if( builtins[i].requireGPUSkinningSupport && !glConfig.gpuSkinningAvailable ) { // RB: don't try to load shaders that would break the GLSL compiler in the OpenGL driver continue; } LoadVertexShader( i ); LoadFragmentShader( i ); LoadGLSLProgram( i, i, i ); } // 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 ); if( glConfig.gpuSkinningAvailable ) { vertexShaders[builtinShaders[BUILTIN_TEXTURE_VERTEXCOLOR_SKINNED]].usesJoints = true; vertexShaders[builtinShaders[BUILTIN_INTERACTION_SKINNED]].usesJoints = true; vertexShaders[builtinShaders[BUILTIN_INTERACTION_AMBIENT_SKINNED]].usesJoints = true; vertexShaders[builtinShaders[BUILTIN_ENVIRONMENT_SKINNED]].usesJoints = true; vertexShaders[builtinShaders[BUILTIN_BUMPY_ENVIRONMENT_SKINNED]].usesJoints = true; vertexShaders[builtinShaders[BUILTIN_DEPTH_SKINNED]].usesJoints = true; vertexShaders[builtinShaders[BUILTIN_SHADOW_SKINNED]].usesJoints = true; vertexShaders[builtinShaders[BUILTIN_SHADOW_DEBUG_SKINNED]].usesJoints = true; vertexShaders[builtinShaders[BUILTIN_FOG_SKINNED]].usesJoints = true; // RB begin vertexShaders[builtinShaders[BUILTIN_INTERACTION_SHADOW_MAPPING_SPOT_SKINNED]].usesJoints = true; vertexShaders[builtinShaders[BUILTIN_INTERACTION_SHADOW_MAPPING_POINT_SKINNED]].usesJoints = true; vertexShaders[builtinShaders[BUILTIN_INTERACTION_SHADOW_MAPPING_PARALLEL_SKINNED]].usesJoints = true; // RB end } cmdSystem->AddCommand( "reloadShaders", R_ReloadShaders, CMD_FL_RENDERER, "reloads shaders" ); }