diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 094bdaa8d..daa4e434d 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -738,6 +738,8 @@ public: FillReflectionArray(GetResourceManager()->GetID(program), stages); } + ResourceId ExtractFBOAttachment(GLenum target, GLenum attachment); + struct TextureData { TextureData() diff --git a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp index e5890d6cd..211d2ad6f 100644 --- a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp @@ -4445,51 +4445,29 @@ bool WrappedOpenGL::Serialise_glClear(SerialiserType &ser, GLbitfield mask) if(mask & (eGL_DEPTH_BUFFER_BIT | eGL_STENCIL_BUFFER_BIT)) draw.flags |= DrawFlags::ClearDepthStencil; - AddDrawcall(draw, true); - - GLuint attachment = 0; - GLenum type = eGL_TEXTURE; + ResourceId dstId; if(mask & GL_DEPTH_BUFFER_BIT) { - GL.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, - eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, - (GLint *)&attachment); - GL.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, - eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, - (GLint *)&type); + ResourceId res_id = ExtractFBOAttachment(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT); - if(attachment) + if(res_id != ResourceId()) { - if(type == eGL_TEXTURE) - m_ResourceUses[GetResourceManager()->GetID(TextureRes(GetCtx(), attachment))].push_back( - EventUsage(m_CurEventID, ResourceUsage::Clear)); - else - m_ResourceUses[GetResourceManager()->GetID(RenderbufferRes(GetCtx(), attachment))].push_back( - EventUsage(m_CurEventID, ResourceUsage::Clear)); + m_ResourceUses[res_id].push_back(EventUsage(m_CurEventID, ResourceUsage::Clear)); + + dstId = res_id; } } - attachment = 0; - type = eGL_TEXTURE; - if(mask & GL_STENCIL_BUFFER_BIT) { - GL.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_STENCIL_ATTACHMENT, - eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, - (GLint *)&attachment); - GL.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_STENCIL_ATTACHMENT, - eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, - (GLint *)&type); + ResourceId res_id = ExtractFBOAttachment(eGL_DRAW_FRAMEBUFFER, eGL_STENCIL_ATTACHMENT); - if(attachment) + if(res_id != ResourceId()) { - if(type == eGL_TEXTURE) - m_ResourceUses[GetResourceManager()->GetID(TextureRes(GetCtx(), attachment))].push_back( - EventUsage(m_CurEventID, ResourceUsage::Clear)); - else - m_ResourceUses[GetResourceManager()->GetID(RenderbufferRes(GetCtx(), attachment))].push_back( - EventUsage(m_CurEventID, ResourceUsage::Clear)); + m_ResourceUses[res_id].push_back(EventUsage(m_CurEventID, ResourceUsage::Clear)); + + dstId = res_id; } } @@ -4498,32 +4476,25 @@ bool WrappedOpenGL::Serialise_glClear(SerialiserType &ser, GLbitfield mask) GLint numCols = 8; GL.glGetIntegerv(eGL_MAX_COLOR_ATTACHMENTS, &numCols); - for(int i = 0; i < numCols; i++) + for(int i = numCols - 1; i >= 0; --i) { - attachment = 0; - type = eGL_TEXTURE; + ResourceId res_id = + ExtractFBOAttachment(eGL_DRAW_FRAMEBUFFER, GLenum(eGL_COLOR_ATTACHMENT0 + i)); - GL.glGetFramebufferAttachmentParameteriv( - eGL_DRAW_FRAMEBUFFER, GLenum(eGL_COLOR_ATTACHMENT0 + i), - eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint *)&attachment); - GL.glGetFramebufferAttachmentParameteriv( - eGL_DRAW_FRAMEBUFFER, GLenum(eGL_COLOR_ATTACHMENT0 + i), - eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint *)&type); - - if(attachment) + if(res_id != ResourceId()) { - if(type == eGL_TEXTURE) - m_ResourceUses[GetResourceManager()->GetID(TextureRes(GetCtx(), attachment))].push_back( - EventUsage(m_CurEventID, ResourceUsage::Clear)); - else - m_ResourceUses[GetResourceManager()->GetID(RenderbufferRes(GetCtx(), attachment))] - .push_back(EventUsage(m_CurEventID, ResourceUsage::Clear)); + m_ResourceUses[res_id].push_back(EventUsage(m_CurEventID, ResourceUsage::Clear)); + + dstId = res_id; } } + + draw.copyDestination = GetResourceManager()->GetOriginalID(dstId); + + AddDrawcall(draw, true); } } } - return true; } @@ -4542,6 +4513,10 @@ void WrappedOpenGL::glClear(GLbitfield mask) Serialise_glClear(ser, mask); GetContextRecord()->AddChunk(scope.Get()); + + GLint fbo; + GL.glGetIntegerv(eGL_DRAW_FRAMEBUFFER_BINDING, &fbo); + GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), fbo), eFrameRef_CompleteWrite); } } diff --git a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp index 6792cb258..f63dab689 100644 --- a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp @@ -27,6 +27,30 @@ #include "common/common.h" #include "strings/string_utils.h" +ResourceId WrappedOpenGL::ExtractFBOAttachment(GLenum target, GLenum attachment) +{ + GLint name = 0; + GLint type = eGL_TEXTURE; + + GL.glGetFramebufferAttachmentParameteriv(target, attachment, + eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &name); + GL.glGetFramebufferAttachmentParameteriv(target, attachment, + eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type); + + GLResource res; + + if(type == eGL_TEXTURE) + { + res = TextureRes(GetCtx(), name); + } + else if(type == eGL_RENDERBUFFER) + { + res = RenderbufferRes(GetCtx(), name); + } + + return GetResourceManager()->GetID(res); +} + template bool WrappedOpenGL::Serialise_glGenFramebuffers(SerialiserType &ser, GLsizei n, GLuint *framebuffers) {