From b2ab4b6cf1a38a66211cc72325cbc949986014c2 Mon Sep 17 00:00:00 2001 From: slipher Date: Fri, 1 Aug 2025 17:25:45 -0500 Subject: [PATCH 1/2] Warn when loading non-2D shaders before map Since the necessity of sRGB conversions is not known. --- src/engine/client/cl_main.cpp | 2 +- src/engine/client/client.h | 2 +- src/engine/renderer/tr_shader.cpp | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/engine/client/cl_main.cpp b/src/engine/client/cl_main.cpp index da9a91d9d2..7a02046fe5 100644 --- a/src/engine/client/cl_main.cpp +++ b/src/engine/client/cl_main.cpp @@ -2143,7 +2143,7 @@ bool CL_InitRenderer() FS_FCloseFile( f ); } - cls.whiteShader = re.RegisterShader( "white", RSF_NOMIP ); + cls.whiteShader = re.RegisterShader( "white", RSF_NOMIP | RSF_2D ); g_console_field_width = cls.glconfig.vidWidth / SMALLCHAR_WIDTH - 2; g_consoleField.SetWidth(g_console_field_width); diff --git a/src/engine/client/client.h b/src/engine/client/client.h index f53156e89f..6e2eb49000 100644 --- a/src/engine/client/client.h +++ b/src/engine/client/client.h @@ -315,7 +315,7 @@ struct clientStatic_t glconfig_t glconfig; glconfig2_t glconfig2; qhandle_t charSetShader; - qhandle_t whiteShader; + qhandle_t whiteShader; // used for console drawing bool useLegacyConsoleFont; bool useLegacyConsoleFace; fontInfo_t *consoleFont; diff --git a/src/engine/renderer/tr_shader.cpp b/src/engine/renderer/tr_shader.cpp index c59bb64b89..3ec2926424 100644 --- a/src/engine/renderer/tr_shader.cpp +++ b/src/engine/renderer/tr_shader.cpp @@ -6092,6 +6092,11 @@ shader_t *R_FindShader( const char *name, int flags ) // going to have to upload an image R_SyncRenderThread(); + if ( !( flags & RSF_2D ) && !tr.worldMapLoaded ) + { + Log::Warn( "non-2D shader '%s' registered before map colorspace is known, assuming naive blending", name ); + } + ClearGlobalShader(); Q_strncpyz( shader.name, strippedName, sizeof( shader.name ) ); From 3493cb6139275a7b00791b64f875965fde6c3dc6 Mon Sep 17 00:00:00 2001 From: slipher Date: Fri, 1 Aug 2025 18:16:44 -0500 Subject: [PATCH 2/2] Implement stage-level colorspace shader keyword Allows making conditional stages that depend on whether naive or linear blending is used. --- src/engine/renderer/tr_shader.cpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/engine/renderer/tr_shader.cpp b/src/engine/renderer/tr_shader.cpp index 3ec2926424..5ef5fb2891 100644 --- a/src/engine/renderer/tr_shader.cpp +++ b/src/engine/renderer/tr_shader.cpp @@ -2020,6 +2020,7 @@ static bool ParseStage( shaderStage_t *stage, const char **text ) filterType_t filterType; char buffer[ 1024 ] = ""; bool loadMap = false; + bool colorspaceMatch = true; while ( true ) { @@ -2855,6 +2856,23 @@ static bool ParseStage( shaderStage_t *stage, const char **text ) continue; } } + // disable the stage if the renderer's blending mode does not match the specified mode + else if ( !Q_stricmp( token, "colorspace" ) ) + { + token = COM_ParseExt2( text, false ); + if ( !Q_stricmp( token, "naive" ) ) + { + colorspaceMatch = !tr.worldLinearizeTexture; + } + else if ( !Q_stricmp( token, "linear" ) ) + { + colorspaceMatch = tr.worldLinearizeTexture; + } + else + { + Log::Warn( "unknown colorspace '%s' in shader '%s'", token, shader.name ); + } + } // alpha else if ( !Q_stricmp( token, "alpha" ) ) { @@ -3233,6 +3251,11 @@ static bool ParseStage( shaderStage_t *stage, const char **text ) } } + if ( !colorspaceMatch ) + { + return true; // parsing succeeded, but not active + } + // parsing succeeded stage->active = true; @@ -3866,8 +3889,6 @@ static bool ParseShader( const char *_text ) return false; } - stage->active = true; - /* Examples of shaders with light styles, those shaders are generated by the q3map2 map compiler.