diff --git a/src/engine/renderer/GLUtils.h b/src/engine/renderer/GLUtils.h index 7c5645a99b..47d8608695 100644 --- a/src/engine/renderer/GLUtils.h +++ b/src/engine/renderer/GLUtils.h @@ -147,6 +147,7 @@ struct GLConfig bool colorGrading; bool realtimeLighting; + int maxRealtimeLights; int realtimeLightLayers; bool deluxeMapping; bool normalMapping; diff --git a/src/engine/renderer/gl_shader.cpp b/src/engine/renderer/gl_shader.cpp index 64b942fae8..cd960cb49d 100644 --- a/src/engine/renderer/gl_shader.cpp +++ b/src/engine/renderer/gl_shader.cpp @@ -679,7 +679,7 @@ static std::string GenEngineConstants() { AddDefine( str, "r_zNear", r_znear->value ); AddDefine( str, "M_PI", static_cast< float >( M_PI ) ); - AddDefine( str, "MAX_REF_LIGHTS", MAX_REF_LIGHTS ); + AddDefine( str, "MAX_REALTIME_LIGHTS", glConfig.maxRealtimeLights ); AddDefine( str, "NUM_LIGHT_LAYERS", glConfig.realtimeLightLayers ); AddDefine( str, "TILE_SIZE", TILE_SIZE ); diff --git a/src/engine/renderer/glsl_source/computeLight_fp.glsl b/src/engine/renderer/glsl_source/computeLight_fp.glsl index 9964ec1dfd..defdc45e91 100644 --- a/src/engine/renderer/glsl_source/computeLight_fp.glsl +++ b/src/engine/renderer/glsl_source/computeLight_fp.glsl @@ -164,7 +164,7 @@ layout(std140, binding = BIND_LIGHTS) uniform u_Lights { #else layout(std140) uniform u_Lights { #endif - Light lights[MAX_REF_LIGHTS]; + Light lights[MAX_REALTIME_LIGHTS]; }; #define GetLight( idx ) lights[idx] diff --git a/src/engine/renderer/glsl_source/lighttile_fp.glsl b/src/engine/renderer/glsl_source/lighttile_fp.glsl index 4548c07b9d..4017ef38a5 100644 --- a/src/engine/renderer/glsl_source/lighttile_fp.glsl +++ b/src/engine/renderer/glsl_source/lighttile_fp.glsl @@ -52,7 +52,7 @@ layout(std140, binding = BIND_LIGHTS) uniform u_Lights { #else layout(std140) uniform u_Lights { #endif - Light lights[MAX_REF_LIGHTS]; + Light lights[MAX_REALTIME_LIGHTS]; }; Light GetLight( in uint idx ) { diff --git a/src/engine/renderer/tr_scene.cpp b/src/engine/renderer/tr_scene.cpp index e95c50c898..d40883b407 100644 --- a/src/engine/renderer/tr_scene.cpp +++ b/src/engine/renderer/tr_scene.cpp @@ -336,7 +336,7 @@ void RE_AddDynamicLightToScene( const vec3_t org, float radius, float r, float g return; } - if ( r_numLights >= MAX_REF_LIGHTS ) + if ( r_numLights >= glConfig.maxRealtimeLights ) { return; } diff --git a/src/engine/renderer/tr_shade.cpp b/src/engine/renderer/tr_shade.cpp index 239a92932d..290d6e48bb 100644 --- a/src/engine/renderer/tr_shade.cpp +++ b/src/engine/renderer/tr_shade.cpp @@ -73,6 +73,10 @@ static void EnableAvailableFeatures() } if ( glConfig.realtimeLighting ) { + // Minimum possible is 16384 / 48 = 341 + glConfig.maxRealtimeLights = + std::min( MAX_REF_LIGHTS, glConfig.maxUniformBlockSize / sizeof( shaderLight_t ) ); + glConfig.realtimeLightLayers = r_realtimeLightLayers.Get(); if ( glConfig.realtimeLightLayers > glConfig.max3DTextureSize ) { @@ -80,8 +84,8 @@ static void EnableAvailableFeatures() Log::Notice( "r_realtimeLightLayers exceeds maximum 3D texture size, using %i instead.", glConfig.max3DTextureSize ); } - Log::Notice( "Using %i dynamic light layers, %i dynamic lights available per tile", glConfig.realtimeLightLayers, - glConfig.realtimeLightLayers * 16 ); + Log::Notice( "Using %i dynamic light layers, %i dynamic lights available per tile, max %d lights", + glConfig.realtimeLightLayers, glConfig.realtimeLightLayers * 16, glConfig.maxRealtimeLights ); } glConfig.colorGrading = r_colorGrading.Get(); diff --git a/src/engine/renderer/tr_vbo.cpp b/src/engine/renderer/tr_vbo.cpp index 6db30d4003..6c78d712a1 100644 --- a/src/engine/renderer/tr_vbo.cpp +++ b/src/engine/renderer/tr_vbo.cpp @@ -698,7 +698,7 @@ static void R_InitLightUBO() if( glConfig.uniformBufferObjectAvailable ) { glGenBuffers( 1, &tr.dlightUBO ); glBindBuffer( GL_UNIFORM_BUFFER, tr.dlightUBO ); - glBufferData( GL_UNIFORM_BUFFER, MAX_REF_LIGHTS * sizeof( shaderLight_t ), nullptr, GL_DYNAMIC_DRAW ); + glBufferData( GL_UNIFORM_BUFFER, glConfig.maxRealtimeLights * sizeof( shaderLight_t ), nullptr, GL_DYNAMIC_DRAW ); glBindBuffer( GL_UNIFORM_BUFFER, 0 ); } }