diff --git a/src/engine/renderer/Material.cpp b/src/engine/renderer/Material.cpp index 64c1b3917d..c6e2762a63 100644 --- a/src/engine/renderer/Material.cpp +++ b/src/engine/renderer/Material.cpp @@ -1877,6 +1877,42 @@ void MaterialSystem::GeneratePortalBoundingSpheres() { portalSurfacesTmp.clear(); } +void MaterialSystem::InitGLBuffers() { + materialsUBO.GenBuffer(); + texDataBuffer.GenBuffer(); + lightmapDataUBO.GenBuffer(); + + surfaceDescriptorsSSBO.GenBuffer(); + surfaceCommandsSSBO.GenBuffer(); + culledCommandsBuffer.GenBuffer(); + surfaceBatchesUBO.GenBuffer(); + atomicCommandCountersBuffer.GenBuffer(); + + portalSurfacesSSBO.GenBuffer(); + + if ( r_materialDebug.Get() ) { + debugSSBO.GenBuffer(); + } +} + +void MaterialSystem::FreeGLBuffers() { + materialsUBO.DelBuffer(); + texDataBuffer.DelBuffer(); + lightmapDataUBO.DelBuffer(); + + surfaceDescriptorsSSBO.DelBuffer(); + surfaceCommandsSSBO.DelBuffer(); + culledCommandsBuffer.DelBuffer(); + surfaceBatchesUBO.DelBuffer(); + atomicCommandCountersBuffer.DelBuffer(); + + portalSurfacesSSBO.DelBuffer(); + + if ( r_materialDebug.Get() ) { + debugSSBO.DelBuffer(); + } +} + void MaterialSystem::Free() { generatedWorldCommandBuffer = false; diff --git a/src/engine/renderer/Material.h b/src/engine/renderer/Material.h index 3e03121c61..2431dd1f1d 100644 --- a/src/engine/renderer/Material.h +++ b/src/engine/renderer/Material.h @@ -341,6 +341,9 @@ class MaterialSystem { void GenerateDepthImages( const int width, const int height, imageParams_t imageParms ); + void InitGLBuffers(); + void FreeGLBuffers(); + void AddStageTextures( drawSurf_t* drawSurf, const uint32_t stage, Material* material ); void AddStage( drawSurf_t* drawSurf, shaderStage_t* pStage, uint32_t stage ); void ProcessStage( drawSurf_t* drawSurf, shaderStage_t* pStage, shader_t* shader, uint32_t* packIDs, uint32_t& stage, diff --git a/src/engine/renderer/tr_init.cpp b/src/engine/renderer/tr_init.cpp index 64e3970b60..fa4b174b96 100644 --- a/src/engine/renderer/tr_init.cpp +++ b/src/engine/renderer/tr_init.cpp @@ -1103,6 +1103,19 @@ 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 regenerate all the material stuff here */ + const uint8_t maxStages = materialSystem.maxStages; + materialSystem.Free(); + materialSystem.FreeGLBuffers(); + + materialSystem.InitGLBuffers(); + materialSystem.maxStages = maxStages; + + materialSystem.GenerateWorldMaterials(); + } } /* diff --git a/src/engine/renderer/tr_vbo.cpp b/src/engine/renderer/tr_vbo.cpp index daf3f504bf..3322371bc0 100644 --- a/src/engine/renderer/tr_vbo.cpp +++ b/src/engine/renderer/tr_vbo.cpp @@ -727,26 +727,6 @@ static void R_InitLightUBO() } } -static void R_InitMaterialBuffers() { - if( glConfig2.usingMaterialSystem ) { - materialsUBO.GenBuffer(); - texDataBuffer.GenBuffer(); - lightmapDataUBO.GenBuffer(); - - surfaceDescriptorsSSBO.GenBuffer(); - surfaceCommandsSSBO.GenBuffer(); - culledCommandsBuffer.GenBuffer(); - surfaceBatchesUBO.GenBuffer(); - atomicCommandCountersBuffer.GenBuffer(); - - portalSurfacesSSBO.GenBuffer(); - - if ( r_materialDebug.Get() ) { - debugSSBO.GenBuffer(); - } - } -} - /* ============ R_InitVBOs @@ -790,7 +770,9 @@ void R_InitVBOs() R_InitLightUBO(); - R_InitMaterialBuffers(); + if ( glConfig2.usingMaterialSystem ) { + materialSystem.InitGLBuffers(); + } GL_CheckErrors(); } @@ -861,21 +843,7 @@ void R_ShutdownVBOs() } if ( glConfig2.usingMaterialSystem ) { - materialsUBO.DelBuffer(); - texDataBuffer.DelBuffer(); - lightmapDataUBO.DelBuffer(); - - surfaceDescriptorsSSBO.DelBuffer(); - surfaceCommandsSSBO.DelBuffer(); - culledCommandsBuffer.DelBuffer(); - surfaceBatchesUBO.DelBuffer(); - atomicCommandCountersBuffer.DelBuffer(); - - portalSurfacesSSBO.DelBuffer(); - - if ( r_materialDebug.Get() ) { - debugSSBO.DelBuffer(); - } + materialSystem.FreeGLBuffers(); } tess.verts = tess.vertsBuffer = nullptr;