From 2ed2e9de0c4aad15695ae0e22cf7a69bc232079d Mon Sep 17 00:00:00 2001 From: vladislavbelov Date: Thu, 17 Mar 2022 18:17:11 +0000 Subject: [PATCH] Invalidates CDeviceCommandContext texture bind cache properly. Tested By: Langbart Differential Revision: https://code.wildfiregames.com/D4553 This was SVN commit r26664. --- source/renderer/SceneRenderer.cpp | 2 ++ source/renderer/backend/gl/DeviceCommandContext.cpp | 8 ++++++++ source/renderer/backend/gl/DeviceCommandContext.h | 2 ++ source/renderer/backend/gl/Texture.cpp | 1 + 4 files changed, 13 insertions(+) diff --git a/source/renderer/SceneRenderer.cpp b/source/renderer/SceneRenderer.cpp index 8836ab9343..f58385ea86 100644 --- a/source/renderer/SceneRenderer.cpp +++ b/source/renderer/SceneRenderer.cpp @@ -693,6 +693,8 @@ void CSceneRenderer::RenderSilhouettes( // inverted depth test so any behind an occluder will get drawn in a constant // color. + deviceCommandContext->SetGraphicsPipelineState( + Renderer::Backend::MakeDefaultGraphicsPipelineStateDesc()); deviceCommandContext->ClearFramebuffer(false, true, true); // Render occluders: diff --git a/source/renderer/backend/gl/DeviceCommandContext.cpp b/source/renderer/backend/gl/DeviceCommandContext.cpp index 949aaced70..97671fe70c 100644 --- a/source/renderer/backend/gl/DeviceCommandContext.cpp +++ b/source/renderer/backend/gl/DeviceCommandContext.cpp @@ -390,6 +390,14 @@ void CDeviceCommandContext::BindBuffer(const CBuffer::Type type, CBuffer* buffer glBindBufferARB(BufferTypeToGLTarget(type), buffer ? buffer->GetHandle() : 0); } +void CDeviceCommandContext::OnTextureDestroy(CTexture* texture) +{ + ENSURE(texture); + for (size_t index = 0; index < m_BoundTextures.size(); ++index) + if (m_BoundTextures[index].second == texture->GetHandle()) + BindTexture(index, GL_TEXTURE_2D, 0); +} + void CDeviceCommandContext::Flush() { ResetStates(); diff --git a/source/renderer/backend/gl/DeviceCommandContext.h b/source/renderer/backend/gl/DeviceCommandContext.h index 44062fc95b..4bca70965d 100644 --- a/source/renderer/backend/gl/DeviceCommandContext.h +++ b/source/renderer/backend/gl/DeviceCommandContext.h @@ -105,6 +105,8 @@ public: // TODO: remove direct binding after moving shaders. void BindTexture(const uint32_t unit, const GLenum target, const GLuint handle); void BindBuffer(const CBuffer::Type type, CBuffer* buffer); + // We need to know when to invalidate our texture bind cache. + void OnTextureDestroy(CTexture* texture); void Flush(); diff --git a/source/renderer/backend/gl/Texture.cpp b/source/renderer/backend/gl/Texture.cpp index dace9f38cb..bcd6903d32 100644 --- a/source/renderer/backend/gl/Texture.cpp +++ b/source/renderer/backend/gl/Texture.cpp @@ -293,6 +293,7 @@ CTexture::CTexture() = default; CTexture::~CTexture() { + m_Device->GetActiveCommandContext()->OnTextureDestroy(this); if (m_Handle) glDeleteTextures(1, &m_Handle); }