From 886665e62d6973be42bdc386268820855ebec846 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 10 Jun 2026 10:14:07 +0000 Subject: [PATCH 1/2] Remove stale Vulkan compile gates and legacy OpenGL cvar wiring - Drop dead non-PBR shader init fallback in vk_shader_modules.c (USE_VK_PBR is always defined for the Vulkan renderer). - Remove unused USE_TESS_NEEDS_* and USE_VBO_GRID compile gates; grid VBO path and unconditional normal/ST2 tessellation are now the only path. - Gate r_allowSoftwareGL/r_glDriver registration behind USE_OPENGL_API on Vulkan-only client builds; SDL GLimp only references them when OpenGL is compiled in. - Extend regression/compat guards to prevent reintroducing removed flags. Co-authored-by: Tim Fox --- examples/demo_game/mod/demo_features.cfg | 3 +- scripts/q3_openarena_compat_check.sh | 8 ++ src/client/cl_main.c | 14 +- src/client/client.h | 4 +- src/platform/sdl/sdl_glimp.c | 8 +- src/renderers/vulkan/tr_animation.c | 22 +--- src/renderers/vulkan/tr_local.h | 18 +-- src/renderers/vulkan/tr_main.c | 3 - src/renderers/vulkan/tr_shade.c | 11 -- src/renderers/vulkan/tr_surface.c | 95 ++++---------- src/renderers/vulkan/vk_shader_modules.c | 122 ------------------ src/renderers/vulkan/vk_vbo.c | 18 --- .../test_vulkan_regression_source_guards.sh | 6 + 13 files changed, 64 insertions(+), 268 deletions(-) diff --git a/examples/demo_game/mod/demo_features.cfg b/examples/demo_game/mod/demo_features.cfg index 4bf15572a3..cdafa90e8e 100644 --- a/examples/demo_game/mod/demo_features.cfg +++ b/examples/demo_game/mod/demo_features.cfg @@ -14,8 +14,7 @@ set r_fontConsoleAlign 1 // Optional SDF (pre-generated BMFont + distance atlas in pk3): set r_sdfEnable 1; set r_sdfFont "fonts/demo_console_sdf"; tune r_sdfSmoothing -// --- Renderer backend (user often sets on command line) --- -// +set cl_renderer vulkan or opengl +// --- Renderer backend (Vulkan only; SDL video driver via r_vid_driver / vid_restart) --- // --- PBR / materials (Vulkan path) --- set r_pbr 1 diff --git a/scripts/q3_openarena_compat_check.sh b/scripts/q3_openarena_compat_check.sh index 91a39c008f..5da6fd0206 100755 --- a/scripts/q3_openarena_compat_check.sh +++ b/scripts/q3_openarena_compat_check.sh @@ -94,6 +94,14 @@ else fail "r_vdbFog default not 0" fi +if grep -q '#ifdef USE_OPENGL_API' "$PROJECT_ROOT/src/client/cl_main.c" && \ + awk '/CL_InitGLimp_Cvars/,/^}/ { if ($0 ~ /r_allowSoftwareGL = Cvar_Get/ && prev !~ /USE_OPENGL_API/) bad=1 } { prev=$0 } END { exit bad ? 1 : 0 }' \ + "$PROJECT_ROOT/src/client/cl_main.c"; then + pass "r_allowSoftwareGL registration gated behind USE_OPENGL_API" +else + fail "r_allowSoftwareGL must be registered only when USE_OPENGL_API is defined" +fi + if grep -qE 'cs_autoInit[[:space:]]*=[[:space:]]*Cvar_Get\([[:space:]]*"cs_autoInit"[[:space:]]*,[[:space:]]*"0"' \ "$PROJECT_ROOT/src/qcommon/csharp_debug.c"; then pass "cs_autoInit defaults to 0 (C# runtime manual until cs_reload)" diff --git a/src/client/cl_main.c b/src/client/cl_main.c index 3e93c1bd80..d84d08ffa1 100644 --- a/src/client/cl_main.c +++ b/src/client/cl_main.c @@ -879,9 +879,11 @@ cvar_t *vid_xpos; // X coordinate of window position cvar_t *vid_ypos; // Y coordinate of window position cvar_t *r_noborder; -cvar_t *r_allowSoftwareGL; // don't abort out if the pixelformat claims software cvar_t *r_swapInterval; +#ifdef USE_OPENGL_API +cvar_t *r_allowSoftwareGL; // don't abort out if the pixelformat claims software cvar_t *r_glDriver; +#endif cvar_t *r_displayRefresh; cvar_t *r_fullscreen; cvar_t *r_mode; @@ -4000,13 +4002,15 @@ static void CL_ToggleImgui_f( void ) static void CL_InitGLimp_Cvars( void ) { - // shared with GLimp - r_allowSoftwareGL = Cvar_Get( "r_allowSoftwareGL", "0", CVAR_LATCH ); - Cvar_SetDescription( r_allowSoftwareGL, "Legacy cvar (ignored). OpenGL renderer removed; Vulkan only." ); + // shared with GLimp / VKimp r_swapInterval = Cvar_Get( "r_swapInterval", "0", CVAR_ARCHIVE_ND ); Cvar_SetDescription( r_swapInterval, "V-blanks to wait before swapping buffers.\n 0: No V-Sync\n 1: Synced to the monitor's refresh rate." ); +#ifdef USE_OPENGL_API + r_allowSoftwareGL = Cvar_Get( "r_allowSoftwareGL", "0", CVAR_LATCH ); + Cvar_SetDescription( r_allowSoftwareGL, "Toggle the use of the default software OpenGL driver supplied by the Operating System." ); r_glDriver = Cvar_Get( "r_glDriver", OPENGL_DRIVER_NAME, CVAR_ARCHIVE_ND | CVAR_LATCH ); - Cvar_SetDescription( r_glDriver, "Legacy cvar (ignored). OpenGL renderer removed; Vulkan only." ); + Cvar_SetDescription( r_glDriver, "Specifies the OpenGL driver to use, will revert back to default if driver name set is invalid." ); +#endif r_displayRefresh = Cvar_Get( "r_displayRefresh", "0", CVAR_LATCH ); Cvar_CheckRange( r_displayRefresh, "0", "500", CV_INTEGER ); diff --git a/src/client/client.h b/src/client/client.h index 52b13d6db6..5d4359b4b4 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -428,9 +428,11 @@ extern cvar_t *vid_xpos; extern cvar_t *vid_ypos; extern cvar_t *r_noborder; -extern cvar_t *r_allowSoftwareGL; extern cvar_t *r_swapInterval; +#ifdef USE_OPENGL_API +extern cvar_t *r_allowSoftwareGL; extern cvar_t *r_glDriver; +#endif extern cvar_t *r_displayRefresh; extern cvar_t *r_fullscreen; diff --git a/src/platform/sdl/sdl_glimp.c b/src/platform/sdl/sdl_glimp.c index 2a79c8aae9..f52ed9e89d 100644 --- a/src/platform/sdl/sdl_glimp.c +++ b/src/platform/sdl/sdl_glimp.c @@ -412,9 +412,10 @@ static int GLW_SetMode( int mode, const char *modeFS, qboolean fullscreen, qbool else perChannelColorBits = 4; -#ifdef USE_VULKAN_API +#if defined(USE_OPENGL_API) +# ifdef USE_VULKAN_API if ( !vulkan ) -#endif +# endif { #ifdef __sgi /* Fix for SGIs grabbing too many bits of color */ @@ -450,6 +451,7 @@ static int GLW_SetMode( int mode, const char *modeFS, qboolean fullscreen, qbool if ( !r_allowSoftwareGL->integer ) SDL_GL_SetAttribute( SDL_GL_ACCELERATED_VISUAL, 1 ); } +#endif /* USE_OPENGL_API */ if ( ( SDL_window = SDL_CreateWindow( cl_title, x, y, config->vidWidth, config->vidHeight, flags ) ) == NULL ) { @@ -692,7 +694,9 @@ void GLimp_Init( glconfig_t *config ) in_nograb = Cvar_Get( "in_nograb", "0", 0 ); Cvar_SetDescription( in_nograb, "Do not capture mouse in game, may be useful during online streaming." ); +#ifdef USE_OPENGL_API r_allowSoftwareGL = Cvar_Get( "r_allowSoftwareGL", "0", CVAR_LATCH ); +#endif r_swapInterval = Cvar_Get( "r_swapInterval", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_stereoEnabled = Cvar_Get( "r_stereoEnabled", "0", CVAR_ARCHIVE | CVAR_LATCH ); diff --git a/src/renderers/vulkan/tr_animation.c b/src/renderers/vulkan/tr_animation.c index 74aa8a49b1..db0871a85f 100644 --- a/src/renderers/vulkan/tr_animation.c +++ b/src/renderers/vulkan/tr_animation.c @@ -411,28 +411,18 @@ void RB_MDRSurfaceAnim( mdrSurface_t *surface ) tempVert[1] += w->boneWeight * ( DotProduct( bone->matrix[1], w->offset ) + bone->matrix[1][3] ); tempVert[2] += w->boneWeight * ( DotProduct( bone->matrix[2], w->offset ) + bone->matrix[2][3] ); -#ifdef USE_TESS_NEEDS_NORMAL - if ( tess.needsNormal ) -#endif - { - tempNormal[0] += w->boneWeight * DotProduct( bone->matrix[0], v->normal ); - tempNormal[1] += w->boneWeight * DotProduct( bone->matrix[1], v->normal ); - tempNormal[2] += w->boneWeight * DotProduct( bone->matrix[2], v->normal ); - } + tempNormal[0] += w->boneWeight * DotProduct( bone->matrix[0], v->normal ); + tempNormal[1] += w->boneWeight * DotProduct( bone->matrix[1], v->normal ); + tempNormal[2] += w->boneWeight * DotProduct( bone->matrix[2], v->normal ); } tess.xyz[baseVertex + j][0] = tempVert[0]; tess.xyz[baseVertex + j][1] = tempVert[1]; tess.xyz[baseVertex + j][2] = tempVert[2]; -#ifdef USE_TESS_NEEDS_NORMAL - if ( tess.needsNormal ) -#endif - { - tess.normal[baseVertex + j][0] = tempNormal[0]; - tess.normal[baseVertex + j][1] = tempNormal[1]; - tess.normal[baseVertex + j][2] = tempNormal[2]; - } + tess.normal[baseVertex + j][0] = tempNormal[0]; + tess.normal[baseVertex + j][1] = tempNormal[1]; + tess.normal[baseVertex + j][2] = tempNormal[2]; tess.texCoords[0][baseVertex + j][0] = v->texCoords[0]; tess.texCoords[0][baseVertex + j][1] = v->texCoords[1]; diff --git a/src/renderers/vulkan/tr_local.h b/src/renderers/vulkan/tr_local.h index 8d41478a67..f2395f9b7e 100644 --- a/src/renderers/vulkan/tr_local.h +++ b/src/renderers/vulkan/tr_local.h @@ -42,13 +42,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #define MAX_TEXTURE_SIZE 32768 -#ifdef USE_VBO -#define USE_VBO_GRID /* put SF_GRID to VBO */ -#endif - -//#define USE_TESS_NEEDS_NORMAL -//#define USE_TESS_NEEDS_ST2 - #define SH_COEFF_COUNT 9 #include "../../qcommon/q_shared.h" @@ -2047,9 +2040,7 @@ image_t *vk_create_pbr_albedo_srgb( const char *albedoMapName, imgFlags_t flags // // tr_surface.c // -#ifdef USE_VBO_GRID -void RB_SurfaceGridEstimate( srfGridMesh_t *cv, int *numVertexes, int *numIndexes ); -#endif +void RB_SurfaceGridEstimate( srfGridMesh_t *cv, int *numVertexes, int *numIndexes ); /* ==================================================================== @@ -2115,13 +2106,6 @@ typedef struct shaderCommands_s #endif // info extracted from current shader -#ifdef USE_TESS_NEEDS_NORMAL - int needsNormal; -#endif -#ifdef USE_TESS_NEEDS_ST2 - int needsST2; -#endif - int numPasses; shaderStage_t **xstages; diff --git a/src/renderers/vulkan/tr_main.c b/src/renderers/vulkan/tr_main.c index 5f1eef047b..9909ca4065 100644 --- a/src/renderers/vulkan/tr_main.c +++ b/src/renderers/vulkan/tr_main.c @@ -1078,9 +1078,6 @@ static qboolean SurfIsOffscreen( const drawSurf_t *drawSurf, qboolean *isMirror RB_BeginSurface( shader, fogNum ); #ifdef USE_VBO tess.allowVBO = qfalse; -#endif -#ifdef USE_TESS_NEEDS_NORMAL - tess.needsNormal = qtrue; #endif rb_surfaceTable[ *drawSurf->surface ]( drawSurf->surface ); diff --git a/src/renderers/vulkan/tr_shade.c b/src/renderers/vulkan/tr_shade.c index c05d28240f..5556347052 100644 --- a/src/renderers/vulkan/tr_shade.c +++ b/src/renderers/vulkan/tr_shade.c @@ -390,17 +390,6 @@ void RB_BeginSurface( shader_t *shader, int fogNum ) { tess.dlightUpdateParams = qtrue; } -#ifdef USE_TESS_NEEDS_NORMAL - tess.needsNormal = state->needsNormal || tess.dlightPass || r_shownormals->integer || - ( backEnd.currentEntity == &tr.worldEntity && - ( ( r_shDebugView && r_shDebugView->integer ) || - ( r_shWorldLighting && r_shWorldLighting->integer && r_shLighting && r_shLighting->integer ) ) ); -#endif - -#ifdef USE_TESS_NEEDS_ST2 - tess.needsST2 = state->needsST2; -#endif - tess.numIndexes = 0; tess.numVertexes = 0; tess.sdfUiEdge = -1.0f; diff --git a/src/renderers/vulkan/tr_surface.c b/src/renderers/vulkan/tr_surface.c index 18a8aacabc..ce39c75765 100644 --- a/src/renderers/vulkan/tr_surface.c +++ b/src/renderers/vulkan/tr_surface.c @@ -405,14 +405,9 @@ static void RB_SurfaceTriangles( const srfTriangles_t *srf ) { xyz[1] = dv->xyz[1]; xyz[2] = dv->xyz[2]; -#ifdef USE_TESS_NEEDS_NORMAL - if ( tess.needsNormal ) -#endif - { - normal[0] = dv->normal[0]; - normal[1] = dv->normal[1]; - normal[2] = dv->normal[2]; - } + normal[0] = dv->normal[0]; + normal[1] = dv->normal[1]; + normal[2] = dv->normal[2]; #ifdef USE_VK_PBR if( vk.pbrActive ) { @@ -433,14 +428,9 @@ static void RB_SurfaceTriangles( const srfTriangles_t *srf ) { texCoords0[0] = dv->st[0]; texCoords0[1] = dv->st[1]; -#ifdef USE_TESS_NEEDS_ST2 - if ( tess.needsST2 ) -#endif - { - texCoords1[0] = dv->lightmap[0]; - texCoords1[1] = dv->lightmap[1]; - texCoords1 += 2; - } + texCoords1[0] = dv->lightmap[0]; + texCoords1[1] = dv->lightmap[1]; + texCoords1 += 2; *color = dv->color.u32; } @@ -988,18 +978,13 @@ static void RB_SurfaceFace( const srfSurfaceFace_t *surf ) { numPoints = surf->numPoints; -#ifdef USE_TESS_NEEDS_NORMAL - if ( tess.needsNormal ) -#endif - { - if ( surf->normals ) { - // per-vertex normals for non-coplanar faces - memcpy( &tess.normal[ tess.numVertexes ], surf->normals, numPoints * sizeof( vec4_t ) ); - } else { - normal = surf->plane.normal; - for ( i = 0, ndx = tess.numVertexes; i < numPoints; i++, ndx++ ) { - VectorCopy( normal, tess.normal[ndx] ); - } + if ( surf->normals ) { + // per-vertex normals for non-coplanar faces + memcpy( &tess.normal[ tess.numVertexes ], surf->normals, numPoints * sizeof( vec4_t ) ); + } else { + normal = surf->plane.normal; + for ( i = 0, ndx = tess.numVertexes; i < numPoints; i++, ndx++ ) { + VectorCopy( normal, tess.normal[ndx] ); } } @@ -1017,13 +1002,8 @@ static void RB_SurfaceFace( const srfSurfaceFace_t *surf ) { #ifdef USE_VK_PBR tess.texCoords[0][ndx][0] = v[6]; tess.texCoords[0][ndx][1] = v[7]; -#ifdef USE_TESS_NEEDS_ST2 - if ( tess.needsST2 ) -#endif - { - tess.texCoords[1][ndx][0] = v[8]; - tess.texCoords[1][ndx][1] = v[9]; - } + tess.texCoords[1][ndx][0] = v[8]; + tess.texCoords[1][ndx][1] = v[9]; { uint32_t color; Com_Memcpy( &color, &v[10], sizeof( color ) ); @@ -1032,13 +1012,8 @@ static void RB_SurfaceFace( const srfSurfaceFace_t *surf ) { #else tess.texCoords[0][ndx][0] = v[3]; tess.texCoords[0][ndx][1] = v[4]; -#ifdef USE_TESS_NEEDS_ST2 - if ( tess.needsST2 ) -#endif - { - tess.texCoords[1][ndx][0] = v[5]; - tess.texCoords[1][ndx][1] = v[6]; - } + tess.texCoords[1][ndx][0] = v[5]; + tess.texCoords[1][ndx][1] = v[6]; { uint32_t color; Com_Memcpy( &color, &v[7], sizeof( color ) ); @@ -1083,7 +1058,6 @@ static float LodErrorForVolume( vec3_t local, float radius ) { return r_lodCurveError->value / d; } -#ifdef USE_VBO_GRID void RB_SurfaceGridEstimate( srfGridMesh_t *cv, int *numVertexes, int *numIndexes ) { int lodWidth, lodHeight; @@ -1147,7 +1121,6 @@ void RB_SurfaceGridEstimate( srfGridMesh_t *cv, int *numVertexes, int *numIndexe tess.numVertexes = 0; tess.numIndexes = 0; } -#endif // USE_VBO_GRID /* ============= @@ -1178,7 +1151,6 @@ static void RB_SurfaceGrid( srfGridMesh_t *cv ) { int dlightBits; int *vDlightBits; -#ifdef USE_VBO_GRID if ( tess.allowVBO && cv->vboItemIndex && !cv->dlightBits ) { // transition to vbo render list if ( tess.vboIndex == 0 ) { @@ -1196,23 +1168,16 @@ static void RB_SurfaceGrid( srfGridMesh_t *cv ) { } VBO_Flush(); -#else -#ifdef USE_VBO - VBO_Flush(); -#endif -#endif dlightBits = cv->dlightBits; tess.dlightBits |= dlightBits; -#ifdef USE_VBO_GRID tess.surfType = SF_GRID; // determine the allowable discrepance if ( cv->vboItemIndex && ( tr.mapLoading || ( tess.dlightPass && tess.shader->isStaticShader ) ) ) lodError = r_lodCurveError->value; // fixed quality for VBO else -#endif // USE_VBO_GRID lodError = LodErrorForVolume( cv->lodOrigin, cv->lodRadius ); // determine which rows and columns of the subdivision @@ -1253,13 +1218,11 @@ static void RB_SurfaceGrid( srfGridMesh_t *cv ) { if ( vrows < 2 || irows < 1 ) { if ( tr.mapLoading ) { // estimate and flush -#ifdef USE_VBO_GRID if ( cv->vboItemIndex ) { VBO_PushData( cv->vboItemIndex, &tess ); tess.numIndexes = 0; tess.numVertexes = 0; } else -#endif // USE_VBO_GRID ri.Error( ERR_DROP, "Unexpected grid flush during map loading!\n" ); } else { RB_EndSurface(); @@ -1300,23 +1263,13 @@ static void RB_SurfaceGrid( srfGridMesh_t *cv ) { xyz[2] = dv->xyz[2]; texCoords0[0] = dv->st[0]; texCoords0[1] = dv->st[1]; -#ifdef USE_TESS_NEEDS_ST2 - if ( tess.needsST2 ) -#endif - { - texCoords1[0] = dv->lightmap[0]; - texCoords1[1] = dv->lightmap[1]; - texCoords1 += 2; - } -#ifdef USE_TESS_NEEDS_NORMAL - if ( tess.needsNormal ) -#endif - { - normal[0] = dv->normal[0]; - normal[1] = dv->normal[1]; - normal[2] = dv->normal[2]; - normal += 4; - } + texCoords1[0] = dv->lightmap[0]; + texCoords1[1] = dv->lightmap[1]; + texCoords1 += 2; + normal[0] = dv->normal[0]; + normal[1] = dv->normal[1]; + normal[2] = dv->normal[2]; + normal += 4; #ifdef USE_VK_PBR if( vk.pbrActive ) { diff --git a/src/renderers/vulkan/vk_shader_modules.c b/src/renderers/vulkan/vk_shader_modules.c index a3e4237291..85bfcdc5d6 100644 --- a/src/renderers/vulkan/vk_shader_modules.c +++ b/src/renderers/vulkan/vk_shader_modules.c @@ -37,9 +37,6 @@ static VkShaderModule vk_shader_module_from_spirv( const uint8_t *bytes, int cou void vk_create_shader_modules( void ) { int i, j, k; -#ifndef USE_VK_PBR - int l; -#endif vk.modules.frag.gen0_df = SHADER_MODULE( frag_tx0_df ); SET_OBJECT_NAME( vk.modules.frag.gen0_df, "single-texture df fragment module", VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT ); @@ -69,126 +66,7 @@ void vk_create_shader_modules( void ) } } -#ifdef USE_VK_PBR vk_bind_generated_shaders(); -#else - vk.modules.vert.gen[0][0][0][0] = SHADER_MODULE( vert_tx0 ); - vk.modules.vert.gen[0][0][0][1] = SHADER_MODULE( vert_tx0_fog ); - vk.modules.vert.gen[0][0][1][0] = SHADER_MODULE( vert_tx0_env ); - vk.modules.vert.gen[0][0][1][1] = SHADER_MODULE( vert_tx0_env_fog ); - - vk.modules.vert.gen[1][0][0][0] = SHADER_MODULE( vert_tx1 ); - vk.modules.vert.gen[1][0][0][1] = SHADER_MODULE( vert_tx1_fog ); - vk.modules.vert.gen[1][0][1][0] = SHADER_MODULE( vert_tx1_env ); - vk.modules.vert.gen[1][0][1][1] = SHADER_MODULE( vert_tx1_env_fog ); - - vk.modules.vert.gen[1][1][0][0] = SHADER_MODULE( vert_tx1_cl ); - vk.modules.vert.gen[1][1][0][1] = SHADER_MODULE( vert_tx1_cl_fog ); - vk.modules.vert.gen[1][1][1][0] = SHADER_MODULE( vert_tx1_cl_env ); - vk.modules.vert.gen[1][1][1][1] = SHADER_MODULE( vert_tx1_cl_env_fog ); - - vk.modules.vert.gen[2][0][0][0] = SHADER_MODULE( vert_tx2 ); - vk.modules.vert.gen[2][0][0][1] = SHADER_MODULE( vert_tx2_fog ); - vk.modules.vert.gen[2][0][1][0] = SHADER_MODULE( vert_tx2_env ); - vk.modules.vert.gen[2][0][1][1] = SHADER_MODULE( vert_tx2_env_fog ); - - vk.modules.vert.gen[2][1][0][0] = SHADER_MODULE( vert_tx2_cl ); - vk.modules.vert.gen[2][1][0][1] = SHADER_MODULE( vert_tx2_cl_fog ); - vk.modules.vert.gen[2][1][1][0] = SHADER_MODULE( vert_tx2_cl_env ); - vk.modules.vert.gen[2][1][1][1] = SHADER_MODULE( vert_tx2_cl_env_fog ); - - for ( i = 0; i < 3; i++ ) { - const char *tx[] = { "single", "double", "triple" }; - const char *cl[] = { "", "+cl" }; - const char *env[] = { "", "+env" }; - const char *fog[] = { "", "+fog" }; - for ( j = 0; j < 2; j++ ) { - for ( k = 0; k < 2; k++ ) { - for ( l = 0; l < 2; l++ ) { - const char *s = va( "%s-texture%s%s%s vertex module", tx[i], cl[j], env[k], fog[l] ); - SET_OBJECT_NAME( vk.modules.vert.gen[i][j][k][l], s, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT ); - } - } - } - } - - vk.modules.vert.ident1[0][0][0] = SHADER_MODULE( vert_tx0_ident1 ); - vk.modules.vert.ident1[0][0][1] = SHADER_MODULE( vert_tx0_ident1_fog ); - vk.modules.vert.ident1[0][1][0] = SHADER_MODULE( vert_tx0_ident1_env ); - vk.modules.vert.ident1[0][1][1] = SHADER_MODULE( vert_tx0_ident1_env_fog ); - vk.modules.vert.ident1[1][0][0] = SHADER_MODULE( vert_tx1_ident1 ); - vk.modules.vert.ident1[1][0][1] = SHADER_MODULE( vert_tx1_ident1_fog ); - vk.modules.vert.ident1[1][1][0] = SHADER_MODULE( vert_tx1_ident1_env ); - vk.modules.vert.ident1[1][1][1] = SHADER_MODULE( vert_tx1_ident1_env_fog ); - for ( i = 0; i < 2; i++ ) { - const char *tx[] = { "single", "double" }; - const char *env[] = { "", "+env" }; - const char *fog[] = { "", "+fog" }; - for ( j = 0; j < 2; j++ ) { - for ( k = 0; k < 2; k++ ) { - const char *s = va( "%s-texture identity%s%s vertex module", tx[i], env[j], fog[k] ); - SET_OBJECT_NAME( vk.modules.vert.ident1[i][j][k], s, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT ); - } - } - } - - vk.modules.frag.ident1[0][0] = SHADER_MODULE( frag_tx0_ident1 ); - vk.modules.frag.ident1[0][1] = SHADER_MODULE( frag_tx0_ident1_fog ); - vk.modules.frag.ident1[1][0] = SHADER_MODULE( frag_tx1_ident1 ); - vk.modules.frag.ident1[1][1] = SHADER_MODULE( frag_tx1_ident1_fog ); - for ( i = 0; i < 2; i++ ) { - const char *tx[] = { "single", "double" }; - const char *fog[] = { "", "+fog" }; - for ( j = 0; j < 2; j++ ) { - const char *s = va( "%s-texture identity%s fragment module", tx[i], fog[j] ); - SET_OBJECT_NAME( vk.modules.frag.ident1[i][j], s, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT ); - } - } - - vk.modules.vert.fixed[0][0][0] = SHADER_MODULE( vert_tx0_fixed ); - vk.modules.vert.fixed[0][0][1] = SHADER_MODULE( vert_tx0_fixed_fog ); - vk.modules.vert.fixed[0][1][0] = SHADER_MODULE( vert_tx0_fixed_env ); - vk.modules.vert.fixed[0][1][1] = SHADER_MODULE( vert_tx0_fixed_env_fog ); - vk.modules.vert.fixed[1][0][0] = SHADER_MODULE( vert_tx1_fixed ); - vk.modules.vert.fixed[1][0][1] = SHADER_MODULE( vert_tx1_fixed_fog ); - vk.modules.vert.fixed[1][1][0] = SHADER_MODULE( vert_tx1_fixed_env ); - vk.modules.vert.fixed[1][1][1] = SHADER_MODULE( vert_tx1_fixed_env_fog ); - for ( i = 0; i < 2; i++ ) { - const char *tx[] = { "single", "double" }; - const char *env[] = { "", "+env" }; - const char *fog[] = { "", "+fog" }; - for ( j = 0; j < 2; j++ ) { - for ( k = 0; k < 2; k++ ) { - const char *s = va( "%s-texture fixed-color%s%s vertex module", tx[i], env[j], fog[k] ); - SET_OBJECT_NAME( vk.modules.vert.fixed[i][j][k], s, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT ); - } - } - } - - vk.modules.frag.fixed[0][0] = SHADER_MODULE( frag_tx0_fixed ); - vk.modules.frag.fixed[0][1] = SHADER_MODULE( frag_tx0_fixed_fog ); - vk.modules.frag.fixed[1][0] = SHADER_MODULE( frag_tx1_fixed ); - vk.modules.frag.fixed[1][1] = SHADER_MODULE( frag_tx1_fixed_fog ); - for ( i = 0; i < 2; i++ ) { - const char *tx[] = { "single", "double" }; - const char *fog[] = { "", "+fog" }; - for ( j = 0; j < 2; j++ ) { - const char *s = va( "%s-texture fixed-color%s fragment module", tx[i], fog[j] ); - SET_OBJECT_NAME( vk.modules.frag.fixed[i][j], s, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT ); - } - } - - vk.modules.frag.ent[0][0] = SHADER_MODULE( frag_tx0_ent ); - vk.modules.frag.ent[0][1] = SHADER_MODULE( frag_tx0_ent_fog ); - for ( i = 0; i < 1; i++ ) { - const char *tx[] = { "single" /*, "double" */}; - const char *fog[] = { "", "+fog" }; - for ( j = 0; j < 2; j++ ) { - const char *s = va( "%s-texture entity-color%s fragment module", tx[i], fog[j] ); - SET_OBJECT_NAME( vk.modules.frag.ent[i][j], s, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT ); - } - } -#endif vk.modules.vert.light[0] = SHADER_MODULE( vert_light ); vk.modules.vert.light[1] = SHADER_MODULE( vert_light_fog ); diff --git a/src/renderers/vulkan/vk_vbo.c b/src/renderers/vulkan/vk_vbo.c index 021b58639f..b0704d31e8 100644 --- a/src/renderers/vulkan/vk_vbo.c +++ b/src/renderers/vulkan/vk_vbo.c @@ -594,9 +594,7 @@ void R_BuildWorldVBO( msurface_t *surf, int surfCount ) msurface_t **surfList; srfSurfaceFace_t *face; srfTriangles_t *tris; -#ifdef USE_VBO_GRID srfGridMesh_t *grid; -#endif msurface_t *sf; int ibo_size; int vbo_size; @@ -650,7 +648,6 @@ void R_BuildWorldVBO( msurface_t *surf, int surfCount ) sf->shader->numIndexes += tris->numIndexes; continue; } -#ifdef USE_VBO_GRID grid = (srfGridMesh_t *) sf->data; if ( grid->surfaceType == SF_GRID && isStaticShader( sf->shader ) ) { grid->vboItemIndex = ++numStaticSurfaces; @@ -667,7 +664,6 @@ void R_BuildWorldVBO( msurface_t *surf, int surfCount ) sf->shader->numIndexes += grid->vboExpectIndices; continue; } -#endif // USE_VBO_GRID } if ( numStaticSurfaces == 0 ) { ri.Printf( PRINT_ALL, "...no static surfaces for VBO\n" ); @@ -721,13 +717,11 @@ void R_BuildWorldVBO( msurface_t *surf, int surfCount ) surfList[ n++ ] = sf; continue; } -#ifdef USE_VBO_GRID grid = (srfGridMesh_t *) sf->data; if ( grid->surfaceType == SF_GRID && grid->vboItemIndex ) { surfList[ n++ ] = sf; continue; } -#endif // USE_VBO_GRID } if ( n != numStaticSurfaces ) { @@ -748,41 +742,29 @@ void R_BuildWorldVBO( msurface_t *surf, int surfCount ) sf = surfList[ i ]; face = (srfSurfaceFace_t *) sf->data; tris = (srfTriangles_t *) sf->data; -#ifdef USE_VBO_GRID grid = (srfGridMesh_t *) sf->data; -#endif if ( face->surfaceType == SF_FACE ) face->vboItemIndex = i + 1; else if (tris->surfaceType == SF_TRIANGLES) { tris->vboItemIndex = i + 1; -#ifdef USE_VBO_GRID } else if (grid->surfaceType == SF_GRID) { grid->vboItemIndex = i + 1; -#endif } else { ri.Error( ERR_DROP, "Unexpected surface type" ); } initItem( vbo->items + i + 1 ); RB_BeginSurface( sf->shader, 0 ); tess.allowVBO = qfalse; // block execution of VBO path as we need to tesselate geometry -#ifdef USE_TESS_NEEDS_NORMAL - tess.needsNormal = qtrue; -#endif -#ifdef USE_TESS_NEEDS_ST2 - tess.needsST2 = qtrue; -#endif // tesselate rb_surfaceTable[ *sf->data ]( sf->data ); // VBO_PushData() may be called multiple times there // setup colors and texture coordinates VBO_PushData( i + 1, &tess ); -#ifdef USE_VBO_GRID if ( grid->surfaceType == SF_GRID ) { vbo_item_t *vi = vbo->items + i + 1; if ( vi->num_vertexes != grid->vboExpectVertices || vi->num_indexes != grid->vboExpectIndices ) { ri.Error( ERR_DROP, "Unexpected grid vertexes/indexes count" ); } } -#endif // USE_VBO_GRID tess.numIndexes = 0; tess.numVertexes = 0; } diff --git a/tests/scripts/test_vulkan_regression_source_guards.sh b/tests/scripts/test_vulkan_regression_source_guards.sh index 0b8d3452fa..bc8bdcba39 100755 --- a/tests/scripts/test_vulkan_regression_source_guards.sh +++ b/tests/scripts/test_vulkan_regression_source_guards.sh @@ -73,6 +73,12 @@ assert_contains_literal "$VK_INSTANCE" "device_desc.pNext = &mesh_shader_feature assert_contains_literal "$VK_INIT_DEVICE" "PBR IBL: runtime cubemap convolution is disabled on Vulkan; using fallback IBL." "runtime cubemap fallback warning" assert_not_matches_regex "$VK_INIT_DEVICE" "vk\\.cubemapActive[[:space:]]*=[[:space:]]*qtrue" "runtime cubemap convolution remains disabled" +# PBR shader init must not retain dead non-PBR fallback (USE_VK_PBR is always on for Vulkan). +assert_contains_literal "$PROJECT_ROOT/src/renderers/vulkan/vk_shader_modules.c" "vk_bind_generated_shaders();" "PBR generated shader bind is active path" +assert_not_matches_regex "$PROJECT_ROOT/src/renderers/vulkan/vk_shader_modules.c" "#else[[:space:]]*$" "non-PBR shader init fallback removed from vk_shader_modules.c" +assert_not_matches_regex "$PROJECT_ROOT/src/renderers/vulkan/tr_local.h" "^#define USE_VBO_GRID" "stale USE_VBO_GRID compile gate removed" +assert_not_matches_regex "$PROJECT_ROOT/src/renderers/vulkan/tr_local.h" "USE_TESS_NEEDS_NORMAL" "stale USE_TESS_NEEDS_NORMAL compile gate removed" + # Validation builds need debug-report procs, and pool resets must invalidate cached Forward+ sets. assert_contains_literal "$VK_PROCS" "#ifdef USE_VK_VALIDATION" "validation proc declarations use feature flag" assert_contains_literal "$VK_SHUTDOWN" "vk_forward_plus_on_descriptor_pool_destroyed();" "descriptor-pool reset invalidates Forward+ cache" From 664311ab6d50d31454c06d2eaea1a0d47a8ece76 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 11 Jun 2026 10:07:00 +0000 Subject: [PATCH 2/2] Vulkan: flatten always-on USE_VK_PBR/VK_CUBEMAP header nesting tr_local.h unconditionally defines USE_VK_PBR for the Vulkan renderer; remove dead #ifdef nesting around VK_PBR_BRDFLUT, VK_CUBEMAP, and cubemap size constants. Behavior unchanged; complements stale gate removal. Co-authored-by: Tim Fox --- src/renderers/vulkan/tr_local.h | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/renderers/vulkan/tr_local.h b/src/renderers/vulkan/tr_local.h index f2395f9b7e..92fe00f181 100644 --- a/src/renderers/vulkan/tr_local.h +++ b/src/renderers/vulkan/tr_local.h @@ -24,15 +24,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #define TR_LOCAL_H #define USE_VK_PBR -#ifdef USE_VK_PBR - #define VK_PBR_BRDFLUT // for inspecting codebase, does not toggle brdflut. - #define VK_CUBEMAP - - #ifdef VK_CUBEMAP - #define REF_CUBEMAP_IRRADIANCE_SIZE 64 - #define REF_CUBEMAP_SIZE 256 - #endif -#endif +#define VK_PBR_BRDFLUT // for inspecting codebase, does not toggle brdflut. +#define VK_CUBEMAP +#define REF_CUBEMAP_IRRADIANCE_SIZE 64 +#define REF_CUBEMAP_SIZE 256 #define USE_VBO // store static world geometry in VBO #define USE_FOG_COLLAPSE // not compatible with legacy dlights