Skip to content

Commit 562a91d

Browse files
committed
Fix bad depth buffer reads with depth fade
On my machine the depth fade shader sometimes reads out bad values when a polygonOffset shader is used (or if the material system is on). Fix it by calling glTextureBarrier before using a depth fade shader.
1 parent 38ad170 commit 562a91d

File tree

5 files changed

+25
-0
lines changed

5 files changed

+25
-0
lines changed

src/engine/renderer/tr_backend.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2587,6 +2587,9 @@ static void RB_RenderView( bool depthPass )
25872587
// draw everything that is translucent
25882588
if ( glConfig2.usingMaterialSystem ) {
25892589
materialSystem.RenderMaterials( shaderSort_t::SS_ENVIRONMENT_NOFOG, shaderSort_t::SS_POST_PROCESS, backEnd.viewParms.viewID );
2590+
2591+
// HACK: assume surfaces with depth fade don't use the material system
2592+
backEnd.dirtyDepthBuffer = true;
25902593
}
25912594
RB_RenderDrawSurfaces( shaderSort_t::SS_ENVIRONMENT_NOFOG, shaderSort_t::SS_POST_PROCESS, DRAWSURFACES_ALL );
25922595

@@ -3256,6 +3259,8 @@ const RenderCommand *ClearBufferCommand::ExecuteSelf( ) const
32563259
// 2D images again
32573260
backEnd.projection2D = false;
32583261

3262+
backEnd.dirtyDepthBuffer = false;
3263+
32593264
// set the modelview matrix for the viewer
32603265
SetViewportAndScissor();
32613266

src/engine/renderer/tr_local.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2286,6 +2286,7 @@ enum class ssaoMode {
22862286
bool isHyperspace;
22872287
trRefEntity_t *currentEntity;
22882288
bool skyRenderedThisView; // flag for drawing sun
2289+
bool dirtyDepthBuffer;
22892290
bool postDepthLightTileRendered = false;
22902291

22912292
bool projection2D; // if true, drawstretchpic doesn't need to change modes

src/engine/renderer/tr_public.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ struct glconfig2_t
135135
bool uniformBufferObjectAvailable;
136136
bool mapBufferRangeAvailable;
137137
bool syncAvailable;
138+
bool textureBarrierAvailable;
138139
bool halfFloatVertexAvailable;
139140

140141
bool colorGrading;

src/engine/renderer/tr_shade.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,11 @@ void Tess_DrawElements()
550550
backEnd.pc.c_indexes += tess.numIndexes;
551551
backEnd.pc.c_vertexes += tess.numVertexes;
552552
}
553+
554+
if ( glState.glStateBits & GLS_DEPTHMASK_TRUE )
555+
{
556+
backEnd.dirtyDepthBuffer = true;
557+
}
553558
}
554559

555560
/*
@@ -863,6 +868,14 @@ void Render_generic3D( shaderStage_t *pStage )
863868
bool hasDepthFade = pStage->hasDepthFade;
864869
bool needDepthMap = pStage->hasDepthFade;
865870

871+
if ( needDepthMap && backEnd.dirtyDepthBuffer && glConfig2.textureBarrierAvailable )
872+
{
873+
// Flush depth buffer to make sure it is available for reading in the depth fade
874+
// GLSL - prevents https://github.com/DaemonEngine/Daemon/issues/1676
875+
glTextureBarrier();
876+
backEnd.dirtyDepthBuffer = false;
877+
}
878+
866879
// choose right shader program ----------------------------------
867880
ProcessShaderGeneric3D( pStage );
868881
gl_genericShader->BindProgram( pStage->deformIndex );

src/engine/sys/sdl_glimp.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ static Cvar::Cvar<bool> r_arb_shading_language_420pack( "r_arb_shading_language_
102102
"Use GL_ARB_shading_language_420pack if available", Cvar::NONE, true );
103103
static Cvar::Cvar<bool> r_arb_sync( "r_arb_sync",
104104
"Use GL_ARB_sync if available", Cvar::NONE, true );
105+
static Cvar::Cvar<bool> r_arb_texture_barrier( "r_arb_texture_barrier",
106+
"Use GL_ARB_texture_barrier if available", Cvar::NONE, true );
105107
static Cvar::Cvar<bool> r_arb_texture_gather( "r_arb_texture_gather",
106108
"Use GL_ARB_texture_gather if available", Cvar::NONE, true );
107109
static Cvar::Cvar<bool> r_arb_uniform_buffer_object( "r_arb_uniform_buffer_object",
@@ -2366,6 +2368,9 @@ static void GLimp_InitExtensions()
23662368
// made required in OpenGL 3.2
23672369
glConfig2.syncAvailable = LOAD_EXTENSION_WITH_TEST( ExtFlag_CORE, ARB_sync, r_arb_sync.Get() );
23682370

2371+
// made required in OpenGL 4.5
2372+
glConfig2.textureBarrierAvailable = LOAD_EXTENSION_WITH_TEST( ExtFlag_NONE, ARB_texture_barrier, r_arb_texture_barrier.Get() );
2373+
23692374
// made required in OpenGL 4.3
23702375
glConfig2.computeShaderAvailable = LOAD_EXTENSION_WITH_TEST( ExtFlag_NONE, ARB_compute_shader, r_arb_compute_shader.Get() );
23712376

0 commit comments

Comments
 (0)