From 5691ea6f9f5338e505770b92f9e7d698c6a3de9b Mon Sep 17 00:00:00 2001 From: VReaperV Date: Tue, 18 Mar 2025 19:23:30 +0300 Subject: [PATCH 1/3] NUKE surface sorting by fog #1408 had removed the hacky way of drawing fog surfaces and made them into actual stages. This change removes the sorting by fog index since it now has no positive effect (and potentially has a negative one, preventing surfaces from being merged). The fognum bits are redistributed towards drawsurf indexes and entity count. --- src/engine/renderer/Material.cpp | 2 +- src/engine/renderer/ShadeCommon.h | 10 ---------- src/engine/renderer/tr_backend.cpp | 2 +- src/engine/renderer/tr_bsp.cpp | 9 --------- src/engine/renderer/tr_local.h | 24 +++++++----------------- src/engine/renderer/tr_main.cpp | 2 +- 6 files changed, 10 insertions(+), 39 deletions(-) diff --git a/src/engine/renderer/Material.cpp b/src/engine/renderer/Material.cpp index 89202ca0c0..95f6482810 100644 --- a/src/engine/renderer/Material.cpp +++ b/src/engine/renderer/Material.cpp @@ -2036,7 +2036,7 @@ void MaterialSystem::AddAutospriteSurfaces() { for ( const drawSurf_t &drawSurf : autospriteSurfaces ) { R_AddDrawSurf( drawSurf.surface, drawSurf.shader, - drawSurf.lightmapNum(), drawSurf.fogNum(), drawSurf.bspSurface ); + drawSurf.lightmapNum(), drawSurf.fog, drawSurf.bspSurface ); } } diff --git a/src/engine/renderer/ShadeCommon.h b/src/engine/renderer/ShadeCommon.h index f83f6ecf92..bae521f9c8 100644 --- a/src/engine/renderer/ShadeCommon.h +++ b/src/engine/renderer/ShadeCommon.h @@ -87,16 +87,6 @@ template static bool hasExplicitelyDisabledLightMap( Obj* obj ) return GetSurfaceShader( obj )->surfaceFlags & SURF_NOLIGHTMAP; } -inline size_t GetFogNum( shaderCommands_t* tess ) -{ - return tess->fogNum; -} - -inline size_t GetFogNum( drawSurf_t* drawSurf ) -{ - return drawSurf->fogNum(); -} - inline shaderStage_t* GetSurfaceLastStage( shaderCommands_t* tess ) { return tess->surfaceLastStage; diff --git a/src/engine/renderer/tr_backend.cpp b/src/engine/renderer/tr_backend.cpp index e30e76be71..c2a40f463b 100644 --- a/src/engine/renderer/tr_backend.cpp +++ b/src/engine/renderer/tr_backend.cpp @@ -5446,7 +5446,7 @@ const RenderCommand *FinalisePortalCommand::ExecuteSelf( ) const glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); Tess_Begin( Tess_StageIteratorColor, shader, - nullptr, false, surface->lightmapNum(), surface->fogNum(), surface->bspSurface ); + nullptr, false, surface->lightmapNum(), surface->fog, surface->bspSurface ); rb_surfaceTable[Util::ordinal( *( surface->surface ) )]( surface->surface ); Tess_End(); diff --git a/src/engine/renderer/tr_bsp.cpp b/src/engine/renderer/tr_bsp.cpp index adcf7432e4..64d96cd107 100644 --- a/src/engine/renderer/tr_bsp.cpp +++ b/src/engine/renderer/tr_bsp.cpp @@ -2789,15 +2789,6 @@ static int LeafSurfaceCompare( const void *a, const void *b ) return 1; } - if ( aa->fogIndex < bb->fogIndex ) - { - return -1; - } - else if ( aa->fogIndex > bb->fogIndex ) - { - return 1; - } - // sort by leaf if ( aa->interactionBits < bb->interactionBits ) { diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 1cebe2e0ff..49b7389711 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -1605,35 +1605,30 @@ enum class ssaoMode { // 4. fogNum // 5. index - static const uint64_t SORT_INDEX_BITS = 16; - static const uint64_t SORT_FOGNUM_BITS = 13; - static const uint64_t SORT_ENTITYNUM_BITS = 10; + static const uint64_t SORT_INDEX_BITS = 20; + static const uint64_t SORT_ENTITYNUM_BITS = 13; static const uint64_t SORT_LIGHTMAP_BITS = 9; static const uint64_t SORT_SHADER_BITS = 16; + static const uint64_t SORT_UNUSED_BITS = 6; static_assert( SORT_SHADER_BITS + SORT_LIGHTMAP_BITS + SORT_ENTITYNUM_BITS + - SORT_FOGNUM_BITS + - SORT_INDEX_BITS == 64, "invalid number of drawSurface sort bits" ); + SORT_INDEX_BITS + + SORT_UNUSED_BITS == 64, "invalid number of drawSurface sort bits" ); - static const uint64_t SORT_FOGNUM_SHIFT = SORT_INDEX_BITS; - static const uint64_t SORT_ENTITYNUM_SHIFT = SORT_FOGNUM_BITS + SORT_FOGNUM_SHIFT; + static const uint64_t SORT_ENTITYNUM_SHIFT = SORT_INDEX_BITS; static const uint64_t SORT_LIGHTMAP_SHIFT = SORT_ENTITYNUM_BITS + SORT_ENTITYNUM_SHIFT; static const uint64_t SORT_SHADER_SHIFT = SORT_LIGHTMAP_BITS + SORT_LIGHTMAP_SHIFT; #define MASKBITS( b ) ( 1 << (b) ) - 1 static const uint32_t SORT_INDEX_MASK = MASKBITS( SORT_INDEX_BITS ); - static const uint32_t SORT_FOGNUM_MASK = MASKBITS( SORT_FOGNUM_BITS ); static const uint32_t SORT_ENTITYNUM_MASK = MASKBITS( SORT_ENTITYNUM_BITS ); static const uint32_t SORT_LIGHTMAP_MASK = MASKBITS( SORT_LIGHTMAP_BITS ); static const uint32_t SORT_SHADER_MASK = MASKBITS( SORT_SHADER_BITS ); static_assert( SORT_INDEX_MASK >= MAX_DRAWSURFS - 1, "not enough index bits" ); - // need space for 0 fog (no fog), in addition to MAX_MAP_FOGS - static_assert( SORT_FOGNUM_MASK >= MAX_MAP_FOGS, "not enough fognum bits" ); - // need space for tr.worldEntity, in addition to MAX_REF_ENTITIES static_assert( SORT_ENTITYNUM_MASK >= MAX_REF_ENTITIES, "not enough entity bits" ); @@ -1652,7 +1647,6 @@ enum class ssaoMode { int fog; int portalNum = -1; - uint32_t materialPackIDs[MAX_SHADER_STAGES]; uint32_t materialIDs[MAX_SHADER_STAGES]; @@ -1671,9 +1665,6 @@ enum class ssaoMode { inline int entityNum() const { return int( ( sort >> SORT_ENTITYNUM_SHIFT ) & SORT_ENTITYNUM_MASK ) - 1; } - inline int fogNum() const { - return int( ( sort >> SORT_FOGNUM_SHIFT ) & SORT_FOGNUM_MASK ); - } inline int lightmapNum() const { return int( ( sort >> SORT_LIGHTMAP_SHIFT ) & SORT_LIGHTMAP_MASK ) - 1; } @@ -1681,11 +1672,10 @@ enum class ssaoMode { return int( sort >> SORT_SHADER_SHIFT ); } - inline void setSort( int shaderNum, int lightmapNum, int entityNum, int fogNum, int index ) { + inline void setSort( int shaderNum, int lightmapNum, int entityNum, int index ) { entityNum = entityNum + 1; //world entity is -1 lightmapNum = lightmapNum + 1; //no lightmap is -1 sort = uint64_t( index & SORT_INDEX_MASK ) | - ( uint64_t( fogNum & SORT_FOGNUM_MASK ) << SORT_FOGNUM_SHIFT ) | ( uint64_t( entityNum & SORT_ENTITYNUM_MASK ) << SORT_ENTITYNUM_SHIFT ) | ( uint64_t( lightmapNum & SORT_LIGHTMAP_MASK ) << SORT_LIGHTMAP_SHIFT ) | ( uint64_t( shaderNum & SORT_SHADER_MASK ) << SORT_SHADER_SHIFT ); diff --git a/src/engine/renderer/tr_main.cpp b/src/engine/renderer/tr_main.cpp index 639226424a..937ed66643 100644 --- a/src/engine/renderer/tr_main.cpp +++ b/src/engine/renderer/tr_main.cpp @@ -1882,7 +1882,7 @@ int R_AddDrawSurf( surfaceType_t *surface, shader_t *shader, int lightmapNum, in index = MAX_DRAWSURFS - index; // reverse the sorting (front:back -> back:front) } - drawSurf->setSort( shader->sortedIndex, lightmapNum, entityNum, fogNum, index ); + drawSurf->setSort( shader->sortedIndex, lightmapNum, entityNum, index ); tr.refdef.numDrawSurfs++; From 761cefa299a08418c60c87597a16ee963776cf20 Mon Sep 17 00:00:00 2001 From: VReaperV Date: Sat, 22 Mar 2025 09:57:05 +0300 Subject: [PATCH 2/3] Allow merging main surfaces regardless of fogNum These surfaces themselves won't be used to render fog, instead that is done by adding surfaces referencing the same geometry, but using one of `tr.fogEqualShader` or `tr.fogLEShader`. --- src/engine/renderer/tr_main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/engine/renderer/tr_main.cpp b/src/engine/renderer/tr_main.cpp index 937ed66643..cec31369ea 100644 --- a/src/engine/renderer/tr_main.cpp +++ b/src/engine/renderer/tr_main.cpp @@ -1863,7 +1863,9 @@ int R_AddDrawSurf( surfaceType_t *surface, shader_t *shader, int lightmapNum, in drawSurf->surface = surface; drawSurf->shader = shader; drawSurf->bspSurface = bspSurface; - drawSurf->fog = fogNum; + /* Allow the renderer backend to merge main surfaces that have fog, ignoring the fogNum, + as it only matters for the emitted fog surfaces */ + drawSurf->fog = ( shader == tr.fogEqualShader || shader == tr.fogLEShader ) ? fogNum : 0; drawSurf->portalNum = portalNum; int entityNum; From 9b92e7dbb71601faf536ccd42a1c92075abde5b9 Mon Sep 17 00:00:00 2001 From: VReaperV Date: Sat, 22 Mar 2025 09:58:12 +0300 Subject: [PATCH 3/3] Fix a comment on drawSurf sorting --- src/engine/renderer/tr_local.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 49b7389711..2a1a169c6e 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -1602,8 +1602,7 @@ enum class ssaoMode { // 1. shaderNum // 2. lightmapNum // 3. entityNum - // 4. fogNum - // 5. index + // 4. index static const uint64_t SORT_INDEX_BITS = 20; static const uint64_t SORT_ENTITYNUM_BITS = 13;