Skip to content

Commit

Permalink
Send stage variant data through UpdateSurfaceData*
Browse files Browse the repository at this point in the history
  • Loading branch information
VReaperV committed Jan 28, 2025
1 parent bd7fbc3 commit 90d092b
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 43 deletions.
51 changes: 25 additions & 26 deletions src/engine/renderer/Material.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,14 +132,14 @@ static void ComputeDynamics( shaderStage_t* pStage ) {
// UpdateSurface*() functions will actually write the uniform values to the SSBO
// Mirrors parts of the Render_*() functions in tr_shade.cpp

void UpdateSurfaceDataNONE( uint32_t*, shaderStage_t* ) {
void UpdateSurfaceDataNONE( uint32_t*, shaderStage_t*, bool, bool, bool ) {
ASSERT_UNREACHABLE();
}

void UpdateSurfaceDataNOP( uint32_t*, shaderStage_t* ) {
void UpdateSurfaceDataNOP( uint32_t*, shaderStage_t*, bool, bool, bool ) {
}

void UpdateSurfaceDataGeneric3D( uint32_t* materials, shaderStage_t* pStage ) {
void UpdateSurfaceDataGeneric3D( uint32_t* materials, shaderStage_t* pStage, bool mayUseVertexOverbright, bool, bool ) {
// shader_t* shader = pStage->shader;

materials += pStage->bufferOffset;
Expand All @@ -151,7 +151,6 @@ void UpdateSurfaceDataGeneric3D( uint32_t* materials, shaderStage_t* pStage ) {
colorGen_t rgbGen = SetRgbGen( pStage );
alphaGen_t alphaGen = SetAlphaGen( pStage );

bool mayUseVertexOverbright = pStage->mayUseVertexOverbright;
const bool styleLightMap = pStage->type == stageType_t::ST_STYLELIGHTMAP || pStage->type == stageType_t::ST_STYLECOLORMAP;
gl_genericShaderMaterial->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, mayUseVertexOverbright, styleLightMap );

Expand All @@ -166,7 +165,7 @@ void UpdateSurfaceDataGeneric3D( uint32_t* materials, shaderStage_t* pStage ) {
gl_genericShaderMaterial->WriteUniformsToBuffer( materials );
}

void UpdateSurfaceDataLightMapping( uint32_t* materials, shaderStage_t* pStage ) {
void UpdateSurfaceDataLightMapping( uint32_t* materials, shaderStage_t* pStage, bool, bool vertexLit, bool fullbright ) {
shader_t* shader = pStage->shader;

materials += pStage->bufferOffset;
Expand All @@ -178,12 +177,12 @@ void UpdateSurfaceDataLightMapping( uint32_t* materials, shaderStage_t* pStage )
Tess_ComputeColor( pStage );

// HACK: This only has effect on vertex-lit surfaces
if ( pStage->vertexLit ) {
if ( vertexLit ) {
SetVertexLightingSettings( lightMode_t::VERTEX, rgbGen );
}

// u_ColorModulate
gl_lightMappingShaderMaterial->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, false, !pStage->fullbright );
gl_lightMappingShaderMaterial->SetUniform_ColorModulateColorGen( rgbGen, alphaGen, false, !fullbright );

// u_Color
gl_lightMappingShaderMaterial->SetUniform_Color( tess.svars.color );
Expand Down Expand Up @@ -218,7 +217,7 @@ void UpdateSurfaceDataLightMapping( uint32_t* materials, shaderStage_t* pStage )
gl_lightMappingShaderMaterial->WriteUniformsToBuffer( materials );
}

void UpdateSurfaceDataReflection( uint32_t* materials, shaderStage_t* pStage) {
void UpdateSurfaceDataReflection( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool ) {
shader_t* shader = pStage->shader;

materials += pStage->bufferOffset;
Expand Down Expand Up @@ -259,7 +258,7 @@ void UpdateSurfaceDataReflection( uint32_t* materials, shaderStage_t* pStage) {
gl_reflectionShaderMaterial->WriteUniformsToBuffer( materials );
}

void UpdateSurfaceDataSkybox( uint32_t* materials, shaderStage_t* pStage ) {
void UpdateSurfaceDataSkybox( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool ) {
// shader_t* shader = pStage->shader;

materials += pStage->bufferOffset;
Expand All @@ -270,7 +269,7 @@ void UpdateSurfaceDataSkybox( uint32_t* materials, shaderStage_t* pStage ) {
gl_skyboxShaderMaterial->WriteUniformsToBuffer( materials );
}

void UpdateSurfaceDataScreen( uint32_t* materials, shaderStage_t* pStage) {
void UpdateSurfaceDataScreen( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool ) {
// shader_t* shader = pStage->shader;

materials += pStage->bufferOffset;
Expand All @@ -283,7 +282,7 @@ void UpdateSurfaceDataScreen( uint32_t* materials, shaderStage_t* pStage) {
gl_screenShaderMaterial->WriteUniformsToBuffer( materials );
}

void UpdateSurfaceDataHeatHaze( uint32_t* materials, shaderStage_t* pStage) {
void UpdateSurfaceDataHeatHaze( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool ) {
// shader_t* shader = pStage->shader;

materials += pStage->bufferOffset;
Expand All @@ -302,7 +301,7 @@ void UpdateSurfaceDataHeatHaze( uint32_t* materials, shaderStage_t* pStage) {
gl_heatHazeShaderMaterial->WriteUniformsToBuffer( materials );
}

void UpdateSurfaceDataLiquid( uint32_t* materials, shaderStage_t* pStage) {
void UpdateSurfaceDataLiquid( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool ) {
// shader_t* shader = pStage->shader;

materials += pStage->bufferOffset;
Expand Down Expand Up @@ -354,7 +353,7 @@ void UpdateSurfaceDataLiquid( uint32_t* materials, shaderStage_t* pStage) {
gl_liquidShaderMaterial->WriteUniformsToBuffer( materials );
}

void UpdateSurfaceDataFog( uint32_t* materials, shaderStage_t* pStage ) {
void UpdateSurfaceDataFog( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool ) {
// shader_t* shader = pStage->shader;

materials += pStage->bufferOffset;
Expand Down Expand Up @@ -489,15 +488,14 @@ void MaterialSystem::GenerateMaterialsBuffer( std::vector<shaderStage_t*>& stage
uint32_t variants = 0;
for ( int i = 0; i < Util::ordinal( ShaderStageVariant::ALL ) && variants < pStage->variantOffset; i++ ) {
if ( pStage->variantOffsets[i] != -1 ) {
pStage->mayUseVertexOverbright = i & Util::ordinal( ShaderStageVariant::VERTEX_OVERBRIGHT );
pStage->vertexLit = i & Util::ordinal( ShaderStageVariant::VERTEX_LIT );
pStage->fullbright = i & Util::ordinal( ShaderStageVariant::FULLBRIGHT );
pStage->currentOffset = pStage->variantOffsets[i];
const bool mayUseVertexOverbright = i & Util::ordinal( ShaderStageVariant::VERTEX_OVERBRIGHT );
const bool vertexLit = i & Util::ordinal( ShaderStageVariant::VERTEX_LIT );
const bool fullbright = i & Util::ordinal( ShaderStageVariant::FULLBRIGHT );

const uint32_t variantOffset = pStage->variantOffsets[i] * pStage->paddedSize;
pStage->bufferOffset += variantOffset;

pStage->surfaceDataUpdater( materialsData, pStage );
pStage->surfaceDataUpdater( materialsData, pStage, mayUseVertexOverbright, vertexLit, fullbright );

pStage->bufferOffset -= variantOffset;
variants++;
Expand Down Expand Up @@ -1244,10 +1242,11 @@ void ProcessMaterialFog( Material* material, shaderStage_t* pStage, drawSurf_t*
material->program = gl_fogQuake3ShaderMaterial->GetProgram( pStage->deformIndex );
}

void MaterialSystem::AddStage( drawSurf_t* drawSurf, shaderStage_t* pStage, uint32_t stage ) {
const int variant = ( pStage->mayUseVertexOverbright ? Util::ordinal( ShaderStageVariant::VERTEX_OVERBRIGHT ) : 0 )
| ( pStage->vertexLit ? Util::ordinal( ShaderStageVariant::VERTEX_LIT ) : 0 )
| ( pStage->fullbright ? Util::ordinal( ShaderStageVariant::FULLBRIGHT ) : 0 );
void MaterialSystem::AddStage( drawSurf_t* drawSurf, shaderStage_t* pStage, uint32_t stage,
const bool mayUseVertexOverbright, const bool vertexLit, const bool fullbright ) {
const int variant = ( mayUseVertexOverbright ? Util::ordinal( ShaderStageVariant::VERTEX_OVERBRIGHT ) : 0 )
| ( vertexLit ? Util::ordinal( ShaderStageVariant::VERTEX_LIT ) : 0 )
| ( fullbright ? Util::ordinal( ShaderStageVariant::FULLBRIGHT ) : 0 );

if ( pStage->variantOffsets[variant] == -1 ) {
pStage->variantOffsets[variant] = pStage->variantOffset;
Expand Down Expand Up @@ -1353,9 +1352,9 @@ void MaterialSystem::ProcessStage( drawSurf_t* drawSurf, shaderStage_t* pStage,
lightMode_t lightMode;
deluxeMode_t deluxeMode;
SetLightDeluxeMode( drawSurf, pStage->type, lightMode, deluxeMode );
pStage->mayUseVertexOverbright = pStage->type == stageType_t::ST_COLORMAP && drawSurf->bspSurface && pStage->shaderBinder == BindShaderGeneric3D;
pStage->vertexLit = lightMode == lightMode_t::VERTEX && pStage->shaderBinder == BindShaderLightMapping;
pStage->fullbright = lightMode == lightMode_t::FULLBRIGHT && pStage->shaderBinder == BindShaderLightMapping;
const bool mayUseVertexOverbright = pStage->type == stageType_t::ST_COLORMAP && drawSurf->bspSurface && pStage->shaderBinder == BindShaderGeneric3D;
const bool vertexLit = lightMode == lightMode_t::VERTEX && pStage->shaderBinder == BindShaderLightMapping;
const bool fullbright = lightMode == lightMode_t::FULLBRIGHT && pStage->shaderBinder == BindShaderLightMapping;

ComputeDynamics( pStage );

Expand Down Expand Up @@ -1424,7 +1423,7 @@ void MaterialSystem::ProcessStage( drawSurf_t* drawSurf, shaderStage_t* pStage,
pStage->useMaterialSystem = true;
pStage->initialized = true;

AddStage( drawSurf, pStage, stage );
AddStage( drawSurf, pStage, stage, mayUseVertexOverbright, vertexLit, fullbright );
AddStageTextures( drawSurf, stage, &materials[previousMaterialID] );

if ( std::find( materials[previousMaterialID].drawSurfs.begin(), materials[previousMaterialID].drawSurfs.end(), drawSurf )
Expand Down
23 changes: 12 additions & 11 deletions src/engine/renderer/Material.h
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,8 @@ class MaterialSystem {
void GenerateDepthImages( const int width, const int height, imageParams_t imageParms );

void AddStageTextures( drawSurf_t* drawSurf, const uint32_t stage, Material* material );
void AddStage( drawSurf_t* drawSurf, shaderStage_t* pStage, uint32_t stage );
void AddStage( drawSurf_t* drawSurf, shaderStage_t* pStage, uint32_t stage,
const bool mayUseVertexOverbright, const bool vertexLit, const bool fullbright );
void ProcessStage( drawSurf_t* drawSurf, shaderStage_t* pStage, shader_t* shader, uint32_t* packIDs, uint32_t& stage,
uint32_t& previousMaterialID );
void GenerateWorldMaterials();
Expand Down Expand Up @@ -407,16 +408,16 @@ extern GLSSBO debugSSBO; // Global

extern MaterialSystem materialSystem;

void UpdateSurfaceDataNONE( uint32_t*, shaderStage_t* );
void UpdateSurfaceDataNOP( uint32_t*, shaderStage_t* );
void UpdateSurfaceDataGeneric3D( uint32_t* materials, shaderStage_t* pStage );
void UpdateSurfaceDataLightMapping( uint32_t* materials, shaderStage_t* pStage );
void UpdateSurfaceDataReflection( uint32_t* materials, shaderStage_t* pStage);
void UpdateSurfaceDataSkybox( uint32_t* materials, shaderStage_t* pStage );
void UpdateSurfaceDataScreen( uint32_t* materials, shaderStage_t* pStage);
void UpdateSurfaceDataHeatHaze( uint32_t* materials, shaderStage_t* pStage);
void UpdateSurfaceDataLiquid( uint32_t* materials, shaderStage_t* pStage);
void UpdateSurfaceDataFog( uint32_t* materials, shaderStage_t* pStage );
void UpdateSurfaceDataNONE( uint32_t*, shaderStage_t*, bool, bool, bool );
void UpdateSurfaceDataNOP( uint32_t*, shaderStage_t*, bool, bool, bool );
void UpdateSurfaceDataGeneric3D( uint32_t* materials, shaderStage_t* pStage, bool mayUseVertexOverbright, bool, bool );
void UpdateSurfaceDataLightMapping( uint32_t* materials, shaderStage_t* pStage, bool, bool vertexLit, bool fullbright );
void UpdateSurfaceDataReflection( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool );
void UpdateSurfaceDataSkybox( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool );
void UpdateSurfaceDataScreen( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool );
void UpdateSurfaceDataHeatHaze( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool );
void UpdateSurfaceDataLiquid( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool );
void UpdateSurfaceDataFog( uint32_t* materials, shaderStage_t* pStage, bool, bool, bool );

// void UpdateSurf( uint32)

Expand Down
7 changes: 1 addition & 6 deletions src/engine/renderer/tr_local.h
Original file line number Diff line number Diff line change
Expand Up @@ -1102,7 +1102,7 @@ enum class shaderProfilerRenderSubGroupsMode {
struct drawSurf_t;

using stageRenderer_t = void(*)(shaderStage_t *);
using surfaceDataUpdater_t = void(*)(uint32_t*, shaderStage_t*);
using surfaceDataUpdater_t = void(*)(uint32_t*, shaderStage_t*, bool, bool, bool);
using stageShaderBinder_t = void(*)(Material*);
using stageMaterialProcessor_t = void(*)(Material*, shaderStage_t*, drawSurf_t*);

Expand Down Expand Up @@ -1225,11 +1225,6 @@ enum class shaderProfilerRenderSubGroupsMode {

int variantOffsets[Util::ordinal( ShaderStageVariant::ALL )];
uint32_t variantOffset = 0;
uint32_t currentOffset = 0;

bool mayUseVertexOverbright = false;
bool vertexLit = false;
bool fullbright = false;
};

enum cullType_t : int
Expand Down

0 comments on commit 90d092b

Please sign in to comment.