Skip to content

Commit

Permalink
Fix glsl_restart with material system
Browse files Browse the repository at this point in the history
  • Loading branch information
VReaperV committed Jan 30, 2025
1 parent 396d7ee commit 14dc0d3
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 0 deletions.
16 changes: 16 additions & 0 deletions src/engine/renderer/Material.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1360,6 +1360,13 @@ void MaterialSystem::ProcessStage( drawSurf_t* drawSurf, shaderStage_t* pStage,
pStage->materialProcessor( &material, pStage, drawSurf );
pStage->paddedSize = material.shader->GetPaddedSize();

// HACK: Copy the shaderStage_t and drawSurf_t that we need into the material, so we can use it with glsl_restart
material.refStage = pStage;
material.refDrawSurf = *drawSurf;
material.refDrawSurf.entity = nullptr;
material.refDrawSurf.depthSurface = nullptr;
material.refDrawSurf.fogSurface = nullptr;

std::vector<Material>& materials = materialPacks[materialPack].materials;
std::vector<Material>::iterator currentSearchIt = materials.begin();
std::vector<Material>::iterator materialIt;
Expand Down Expand Up @@ -1507,6 +1514,15 @@ void MaterialSystem::AddAllWorldSurfaces() {
generatingWorldCommandBuffer = false;
}

void MaterialSystem::GLSLRestart() {
for ( MaterialPack& materialPack : materialPacks ) {
for ( Material& material : materialPack.materials ) {
// We only really need to reset material.shader here
material.refStage->materialProcessor( &material, material.refStage, &material.refDrawSurf );
}
}
}

void MaterialSystem::AddStageTextures( drawSurf_t* drawSurf, const uint32_t stage, Material* material ) {
TextureData textureData;
const shaderStage_t* pStage = &drawSurf->shader->stages[stage];
Expand Down
6 changes: 6 additions & 0 deletions src/engine/renderer/Material.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@ struct Material {
GLuint program = 0;
GLShader* shader;

// Used only for glsl_restart
shaderStage_t* refStage;
drawSurf_t refDrawSurf;

int deformIndex;
bool tcGenEnvironment;
bool tcGen_Lightmap;
Expand Down Expand Up @@ -369,6 +373,8 @@ class MaterialSystem {

void AddAllWorldSurfaces();

void GLSLRestart();

void Free();

private:
Expand Down
6 changes: 6 additions & 0 deletions src/engine/renderer/tr_init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1128,6 +1128,12 @@ ScreenshotCmd screenshotPNGRegistration("screenshotPNG", ssFormat_t::SSF_PNG, "p
stage->deformIndex = deformIndex;
}
}

if ( glConfig2.usingMaterialSystem ) {
/* GLSL shaders linked to materials will be invalidated by glsl_restart,
so we need to reset them here */
materialSystem.GLSLRestart();
}
}
};
static GlslRestartCmd glslRestartCmdRegistration;
Expand Down

0 comments on commit 14dc0d3

Please sign in to comment.