From e5c1f8ee3b982f8da86882d0e1383de3b6101b83 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 18 Jul 2015 18:04:45 +0200 Subject: [PATCH] Make sure any time VAOs/FBOs are ref'd, we also ref the child objects * By the logic that means we need to iterate into the VAO/FBO bound objects on frame start, we also need to do for bound VAOs and FBOs later in the frame. * Also FBO state needs to include the actual attached objects and their attachment parameters, since this information is lost when we stop tracking FBOs. --- renderdoc/driver/gl/gl_manager.cpp | 153 ++++++++++++++++++ renderdoc/driver/gl/gl_manager.h | 8 + renderdoc/driver/gl/gl_renderstate.cpp | 80 +-------- .../driver/gl/wrappers/gl_buffer_funcs.cpp | 56 +++---- .../gl/wrappers/gl_framebuffer_funcs.cpp | 58 ++++--- 5 files changed, 228 insertions(+), 127 deletions(-) diff --git a/renderdoc/driver/gl/gl_manager.cpp b/renderdoc/driver/gl/gl_manager.cpp index d9ba865ec..fae7ca2b6 100644 --- a/renderdoc/driver/gl/gl_manager.cpp +++ b/renderdoc/driver/gl/gl_manager.cpp @@ -65,11 +65,36 @@ struct FeedbackInitialData uint64_t Size[4]; }; +struct FramebufferAttachmentData +{ + bool renderbuffer; + bool layered; + int32_t layer; + int32_t level; + ResourceId obj; +}; + struct FramebufferInitialData { bool valid; + FramebufferAttachmentData Attachments[10]; GLenum DrawBuffers[8]; GLenum ReadBuffer; + + static const GLenum attachmentNames[10]; +}; + +const GLenum FramebufferInitialData::attachmentNames[10] = { + eGL_COLOR_ATTACHMENT0, + eGL_COLOR_ATTACHMENT1, + eGL_COLOR_ATTACHMENT2, + eGL_COLOR_ATTACHMENT3, + eGL_COLOR_ATTACHMENT4, + eGL_COLOR_ATTACHMENT5, + eGL_COLOR_ATTACHMENT6, + eGL_COLOR_ATTACHMENT7, + eGL_DEPTH_ATTACHMENT, + eGL_STENCIL_ATTACHMENT, }; template<> @@ -105,12 +130,25 @@ void Serialiser::Serialise(const char *name, FeedbackInitialData &el) Serialise<4>("Size", el.Size); } +template<> +void Serialiser::Serialise(const char *name, FramebufferAttachmentData &el) +{ + ScopedContext scope(this, this, name, "FramebufferAttachmentData", 0, true); + Serialise("renderbuffer", el.renderbuffer); + Serialise("layered", el.layered); + Serialise("layer", el.layer); + Serialise("level", el.level); + Serialise("obj", el.obj); +} + template<> void Serialiser::Serialise(const char *name, FramebufferInitialData &el) { ScopedContext scope(this, this, name, "FramebufferInitialData", 0, true); Serialise("valid", el.valid); Serialise<8>("DrawBuffers", el.DrawBuffers); + for(size_t i=0; i < ARRAY_COUNT(el.Attachments); i++) + Serialise("Attachments", el.Attachments[i]); Serialise("ReadBuffer", el.ReadBuffer); } @@ -156,6 +194,79 @@ void Serialiser::Serialise(const char *name, TextureStateInitialData &el) Serialise("texBufSize", el.texBufSize); } +void GLResourceManager::MarkVAOReferenced(GLResource res, FrameRefType ref) +{ + const GLHookSet &gl = m_GL->m_Real; + + if(res.name) + { + MarkResourceFrameReferenced(res, ref == eFrameRef_Unknown ? eFrameRef_Unknown : eFrameRef_Read); + + GLint numVBufferBindings = 16; + gl.glGetIntegerv(eGL_MAX_VERTEX_ATTRIB_BINDINGS, &numVBufferBindings); + + for(GLuint i=0; i < (GLuint)numVBufferBindings; i++) + { + GLuint buffer = GetBoundVertexBuffer(gl, i); + + MarkResourceFrameReferenced(BufferRes(res.Context, buffer), ref); + } + + GLuint ibuffer = 0; + gl.glGetIntegerv(eGL_ELEMENT_ARRAY_BUFFER_BINDING, (GLint*)&ibuffer); + MarkResourceFrameReferenced(BufferRes(res.Context, ibuffer), ref); + } +} + +void GLResourceManager::MarkFBOReferenced(GLResource res, FrameRefType ref) +{ + if(res.name == 0) + return; + + MarkResourceFrameReferenced(res, ref == eFrameRef_Unknown ? eFrameRef_Unknown : eFrameRef_Read); + + const GLHookSet &gl = m_GL->m_Real; + + GLint numCols = 8; + gl.glGetIntegerv(eGL_MAX_COLOR_ATTACHMENTS, &numCols); + + GLenum type = eGL_TEXTURE; + GLuint name = 0; + + for(int c=0; c < numCols; c++) + { + gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, GLenum(eGL_COLOR_ATTACHMENT0+c), eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&name); + gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, GLenum(eGL_COLOR_ATTACHMENT0+c), eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint*)&type); + + if(type == eGL_RENDERBUFFER) + MarkResourceFrameReferenced(RenderbufferRes(res.Context, name), ref); + else + MarkResourceFrameReferenced(TextureRes(res.Context, name), ref); + } + + gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&name); + gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint*)&type); + + if(name) + { + if(type == eGL_RENDERBUFFER) + MarkResourceFrameReferenced(RenderbufferRes(res.Context, name), ref); + else + MarkResourceFrameReferenced(TextureRes(res.Context, name), ref); + } + + gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, eGL_STENCIL_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&name); + gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, eGL_STENCIL_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint*)&type); + + if(name) + { + if(type == eGL_RENDERBUFFER) + MarkResourceFrameReferenced(RenderbufferRes(res.Context, name), ref); + else + MarkResourceFrameReferenced(TextureRes(res.Context, name), ref); + } +} + bool GLResourceManager::SerialisableResource(ResourceId id, GLResourceRecord *record) { if(id == m_GL->GetContextResourceID()) @@ -185,6 +296,25 @@ bool GLResourceManager::Prepare_InitialState(GLResource res, byte *blob) gl.glBindFramebuffer(eGL_DRAW_FRAMEBUFFER, res.name); gl.glBindFramebuffer(eGL_READ_FRAMEBUFFER, res.name); + //need to serialise out which objects are bound + GLenum type; + GLuint object; + GLint layered; + for(int i=0; i < (int)ARRAY_COUNT(data->Attachments); i++) + { + FramebufferAttachmentData &a = data->Attachments[i]; + + gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, data->attachmentNames[i], eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&object); + gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, data->attachmentNames[i], eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint*)&type); + gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, data->attachmentNames[i], eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &a.level); + gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, data->attachmentNames[i], eGL_FRAMEBUFFER_ATTACHMENT_LAYERED, &layered); + gl.glGetNamedFramebufferAttachmentParameterivEXT(res.name, data->attachmentNames[i], eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, &a.layer); + + a.layered = (layered != 0); + a.renderbuffer = (type == eGL_RENDERBUFFER); + a.obj = GetID(a.renderbuffer ? RenderbufferRes(res.Context, object) : TextureRes(res.Context, object)); + } + for(int i=0; i < (int)ARRAY_COUNT(data->DrawBuffers); i++) gl.glGetIntegerv(GLenum(eGL_DRAW_BUFFER0 + i), (GLint *)&data->DrawBuffers[i]); @@ -1476,6 +1606,29 @@ void GLResourceManager::Apply_InitialState(GLResource live, InitialContentData i gl.glBindFramebuffer(eGL_DRAW_FRAMEBUFFER, live.name); gl.glBindFramebuffer(eGL_READ_FRAMEBUFFER, live.name); + for(int i=0; i < (int)ARRAY_COUNT(data->Attachments); i++) + { + FramebufferAttachmentData &a = data->Attachments[i]; + + GLuint obj = a.obj == ResourceId() ? 0 : GetLiveResource(a.obj).name; + + if(a.renderbuffer && obj) + { + gl.glNamedFramebufferRenderbufferEXT(live.name, data->attachmentNames[i], eGL_RENDERBUFFER, obj); + } + else + { + if(a.layered && obj) + { + gl.glNamedFramebufferTextureLayerEXT(live.name, data->attachmentNames[i], obj, a.level, a.layer); + } + else + { + gl.glNamedFramebufferTextureEXT(live.name, data->attachmentNames[i], obj, a.level); + } + } + } + // set invalid caps to GL_COLOR_ATTACHMENT0 for(int i=0; i < (int)ARRAY_COUNT(data->DrawBuffers); i++) if(data->DrawBuffers[i] == eGL_BACK || data->DrawBuffers[i] == eGL_FRONT) diff --git a/renderdoc/driver/gl/gl_manager.h b/renderdoc/driver/gl/gl_manager.h index ede13db72..ef9737937 100644 --- a/renderdoc/driver/gl/gl_manager.h +++ b/renderdoc/driver/gl/gl_manager.h @@ -211,6 +211,14 @@ class GLResourceManager : public ResourceManager { return m_SyncIDs[sync]; } + + // we need to find all the children bound to VAOs/FBOs and mark them referenced. The reason for this + // is that say a VAO became high traffic and we stopped serialising buffer binds, but then it is never + // modified in a frame and none of the buffers are ever referenced. They would be eliminated from + // the log and the VAO initial state that tries to bind them would fail. + // Normally this would be handled by record parenting, but that would be a nightmare to track. + void MarkVAOReferenced(GLResource res, FrameRefType ref); + void MarkFBOReferenced(GLResource res, FrameRefType ref); bool Prepare_InitialState(GLResource res, byte *blob); bool Serialise_InitialState(GLResource res); diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index 3c143f3f6..d08c421a7 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -317,30 +317,8 @@ void GLRenderState::MarkReferenced(WrappedOpenGL *gl, bool initial) const manager->MarkResourceFrameReferenced(TextureRes(ctx, Images[i].name), initial ? eFrameRef_Unknown : eFrameRef_ReadBeforeWrite); gl->AddMissingTrack(manager->GetID(TextureRes(ctx, Images[i].name))); } - - manager->MarkResourceFrameReferenced(VertexArrayRes(ctx, VAO), initial ? eFrameRef_Unknown : eFrameRef_Read); - // we need to find all the buffers bound to the VAO and mark them referenced to. The reason for this - // is that say a VAO became high traffic and we stopped serialising buffer binds, but then it is never - // modified in this frame and none of the buffers are ever referenced. They would be eliminated from - // the log and the VAO initial state that tries to bind them would fail. - // Normally this would be handled by record parenting, but that would be a nightmare to track for VAOs. - if(VAO) - { - GLint numVBufferBindings = 16; - gl->glGetIntegerv(eGL_MAX_VERTEX_ATTRIB_BINDINGS, &numVBufferBindings); - - for(GLuint i=0; i < (GLuint)numVBufferBindings; i++) - { - GLuint buffer = GetBoundVertexBuffer(*m_Real, i); - - manager->MarkResourceFrameReferenced(BufferRes(ctx, buffer), initial ? eFrameRef_Unknown : eFrameRef_Read); - } - - GLuint ibuffer = 0; - gl->glGetIntegerv(eGL_ELEMENT_ARRAY_BUFFER_BINDING, (GLint*)&ibuffer); - manager->MarkResourceFrameReferenced(BufferRes(ctx, ibuffer), initial ? eFrameRef_Unknown : eFrameRef_Read); - } + manager->MarkVAOReferenced(VertexArrayRes(ctx, VAO), initial ? eFrameRef_Unknown : eFrameRef_Read); manager->MarkResourceFrameReferenced(FeedbackRes(ctx, FeedbackObj), initial ? eFrameRef_Unknown : eFrameRef_Read); @@ -367,62 +345,12 @@ void GLRenderState::MarkReferenced(WrappedOpenGL *gl, bool initial) const for(size_t i=0; i < ARRAY_COUNT(UniformBinding); i++) manager->MarkResourceFrameReferenced(BufferRes(ctx, UniformBinding[i].name), initial ? eFrameRef_Unknown : eFrameRef_Read); - - GLint numCols = 8; - gl->glGetIntegerv(eGL_MAX_COLOR_ATTACHMENTS, &numCols); - // for the same reason as VAOs above, we need to find all the renderbuffers/textures bound to the FBOs - GLuint fbos[] = { ReadFBO, DrawFBO }; - GLenum tgts[] = { eGL_READ_FRAMEBUFFER, eGL_DRAW_FRAMEBUFFER }; - FrameRefType refs[] = { eFrameRef_Read, eFrameRef_ReadBeforeWrite }; + manager->MarkFBOReferenced(FramebufferRes(ctx, DrawFBO), initial ? eFrameRef_Unknown : eFrameRef_ReadBeforeWrite); // if same FBO is bound to both targets, treat it as draw only - if(ReadFBO == DrawFBO) - fbos[0] = 0; - - for(size_t i=0; i < ARRAY_COUNT(fbos); i++) - { - manager->MarkResourceFrameReferenced(FramebufferRes(ctx, fbos[i]), initial ? eFrameRef_Unknown : eFrameRef_Read); - - if(fbos[i]) - { - GLenum type = eGL_TEXTURE; - GLuint name = 0; - - for(int c=0; c < numCols; c++) - { - gl->glGetFramebufferAttachmentParameteriv(tgts[i], GLenum(eGL_COLOR_ATTACHMENT0+i), eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&name); - gl->glGetFramebufferAttachmentParameteriv(tgts[i], GLenum(eGL_COLOR_ATTACHMENT0+i), eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint*)&type); - - if(type == eGL_RENDERBUFFER) - manager->MarkResourceFrameReferenced(RenderbufferRes(ctx, name), initial ? eFrameRef_Unknown : refs[i]); - else - manager->MarkResourceFrameReferenced(TextureRes(ctx, name), initial ? eFrameRef_Unknown : refs[i]); - } - - gl->glGetFramebufferAttachmentParameteriv(tgts[i], eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&name); - gl->glGetFramebufferAttachmentParameteriv(tgts[i], eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint*)&type); - - if(name) - { - if(type == eGL_RENDERBUFFER) - manager->MarkResourceFrameReferenced(RenderbufferRes(ctx, name), initial ? eFrameRef_Unknown : refs[i]); - else - manager->MarkResourceFrameReferenced(TextureRes(ctx, name), initial ? eFrameRef_Unknown : refs[i]); - } - - gl->glGetFramebufferAttachmentParameteriv(tgts[i], eGL_STENCIL_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&name); - gl->glGetFramebufferAttachmentParameteriv(tgts[i], eGL_STENCIL_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, (GLint*)&type); - - if(name) - { - if(type == eGL_RENDERBUFFER) - manager->MarkResourceFrameReferenced(RenderbufferRes(ctx, name), initial ? eFrameRef_Unknown : refs[i]); - else - manager->MarkResourceFrameReferenced(TextureRes(ctx, name), initial ? eFrameRef_Unknown : refs[i]); - } - } - } + if(ReadFBO != DrawFBO) + manager->MarkFBOReferenced(FramebufferRes(ctx, ReadFBO), initial ? eFrameRef_Unknown : eFrameRef_Read); } void GLRenderState::MarkDirty(WrappedOpenGL *gl) diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index 5b47f8b8c..f8f893ef1 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -2705,7 +2705,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribOffsetEXT(GLuint vaobj, GLuint buff if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); if(m_State == WRITING_CAPFRAME && bufrecord) GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read); @@ -2735,7 +2735,7 @@ void WrappedOpenGL::glVertexAttribPointer(GLuint index, GLint size, GLenum type, if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); if(m_State == WRITING_CAPFRAME && bufrecord) GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read); @@ -2800,7 +2800,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribIOffsetEXT(GLuint vaobj, GLuint buf if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); if(m_State == WRITING_CAPFRAME && bufrecord) GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read); @@ -2830,7 +2830,7 @@ void WrappedOpenGL::glVertexAttribIPointer(GLuint index, GLint size, GLenum type if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); if(m_State == WRITING_CAPFRAME && bufrecord) GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read); @@ -2895,7 +2895,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribLOffsetEXT(GLuint vaobj, GLuint buf if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); if(m_State == WRITING_CAPFRAME && bufrecord) GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read); @@ -2925,7 +2925,7 @@ void WrappedOpenGL::glVertexAttribLPointer(GLuint index, GLint size, GLenum type if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); if(m_State == WRITING_CAPFRAME && bufrecord) GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read); @@ -2968,7 +2968,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribBindingEXT(GLuint vaobj, GLuint att if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBBINDING); @@ -2995,7 +2995,7 @@ void WrappedOpenGL::glVertexAttribBinding(GLuint attribindex, GLuint bindinginde if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBBINDING); @@ -3041,7 +3041,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribFormatEXT(GLuint vaobj, GLuint attr if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBFORMAT); @@ -3068,7 +3068,7 @@ void WrappedOpenGL::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBFORMAT); @@ -3113,7 +3113,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribIFormatEXT(GLuint vaobj, GLuint att if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBIFORMAT); @@ -3140,7 +3140,7 @@ void WrappedOpenGL::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBIFORMAT); @@ -3185,7 +3185,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribLFormatEXT(GLuint vaobj, GLuint att if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBLFORMAT); @@ -3212,7 +3212,7 @@ void WrappedOpenGL::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBLFORMAT); @@ -3267,7 +3267,7 @@ void WrappedOpenGL::glVertexArrayVertexAttribDivisorEXT(GLuint vaobj, GLuint ind if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBDIVISOR); @@ -3294,7 +3294,7 @@ void WrappedOpenGL::glVertexAttribDivisor(GLuint index, GLuint divisor) if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBDIVISOR); @@ -3346,7 +3346,7 @@ void WrappedOpenGL::glEnableVertexArrayAttribEXT(GLuint vaobj, GLuint index) if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(ENABLEVERTEXATTRIBARRAY); @@ -3373,7 +3373,7 @@ void WrappedOpenGL::glEnableVertexAttribArray(GLuint index) if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(ENABLEVERTEXATTRIBARRAY); @@ -3425,7 +3425,7 @@ void WrappedOpenGL::glDisableVertexArrayAttribEXT(GLuint vaobj, GLuint index) if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(DISABLEVERTEXATTRIBARRAY); @@ -3452,7 +3452,7 @@ void WrappedOpenGL::glDisableVertexAttribArray(GLuint index) if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(DISABLEVERTEXATTRIBARRAY); @@ -3611,7 +3611,7 @@ void WrappedOpenGL::glBindVertexArray(GLuint array) m_ContextRecord->AddChunk(scope.Get()); if(record) - GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); + GetResourceManager()->MarkVAOReferenced(record->Resource, eFrameRef_ReadBeforeWrite); } } @@ -3656,7 +3656,7 @@ void WrappedOpenGL::glVertexArrayElementBuffer(GLuint vaobj, GLuint buffer) if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); if(m_State == WRITING_CAPFRAME && bufrecord) GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read); @@ -3708,7 +3708,7 @@ void WrappedOpenGL::glVertexArrayBindVertexBufferEXT(GLuint vaobj, GLuint bindin if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); if(m_State == WRITING_CAPFRAME && bufrecord) GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read); @@ -3738,7 +3738,7 @@ void WrappedOpenGL::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLint if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); if(m_State == WRITING_CAPFRAME && bufrecord) GetResourceManager()->MarkResourceFrameReferenced(bufrecord->GetResourceID(), eFrameRef_Read); @@ -3822,7 +3822,7 @@ void WrappedOpenGL::glVertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsiz if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(BIND_VERTEXBUFFERS); @@ -3862,7 +3862,7 @@ void WrappedOpenGL::glBindVertexBuffers(GLuint first, GLsizei count, const GLuin if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(BIND_VERTEXBUFFERS); @@ -3918,7 +3918,7 @@ void WrappedOpenGL::glVertexArrayVertexBindingDivisorEXT(GLuint vaobj, GLuint bi if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(VERTEXBINDINGDIVISOR); @@ -3945,7 +3945,7 @@ void WrappedOpenGL::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor) if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) return; if(m_State == WRITING_CAPFRAME && varecord) - GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkVAOReferenced(varecord->Resource, eFrameRef_ReadBeforeWrite); { SCOPED_SERIALISE_CONTEXT(VERTEXBINDINGDIVISOR); diff --git a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp index 35eaee880..7ec7f52f8 100644 --- a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp @@ -194,7 +194,8 @@ void WrappedOpenGL::glNamedFramebufferTextureEXT(GLuint framebuffer, GLenum atta else { m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read); } } } @@ -250,7 +251,8 @@ void WrappedOpenGL::glFramebufferTexture(GLenum target, GLenum attachment, GLuin else { m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read); } } } @@ -322,7 +324,8 @@ void WrappedOpenGL::glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum at else { m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read); } } } @@ -378,7 +381,8 @@ void WrappedOpenGL::glFramebufferTexture1D(GLenum target, GLenum attachment, GLe else { m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read); } } } @@ -450,7 +454,8 @@ void WrappedOpenGL::glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum at else { m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read); } } } @@ -506,7 +511,8 @@ void WrappedOpenGL::glFramebufferTexture2D(GLenum target, GLenum attachment, GLe else { m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read); } } } @@ -579,7 +585,8 @@ void WrappedOpenGL::glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum at else { m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read); } } } @@ -635,7 +642,8 @@ void WrappedOpenGL::glFramebufferTexture3D(GLenum target, GLenum attachment, GLe else { m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read); } } } @@ -696,7 +704,8 @@ void WrappedOpenGL::glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum else { m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkResourceFrameReferenced(RenderbufferRes(GetCtx(), renderbuffer), eFrameRef_Read); } } } @@ -743,7 +752,8 @@ void WrappedOpenGL::glFramebufferRenderbuffer(GLenum target, GLenum attachment, else { m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkResourceFrameReferenced(RenderbufferRes(GetCtx(), renderbuffer), eFrameRef_Read); } } } @@ -815,7 +825,8 @@ void WrappedOpenGL::glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum else { m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read); } } } @@ -871,7 +882,8 @@ void WrappedOpenGL::glFramebufferTextureLayer(GLenum target, GLenum attachment, else { m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(record->Resource, eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkResourceFrameReferenced(TextureRes(GetCtx(), texture), eFrameRef_Read); } } } @@ -972,7 +984,7 @@ void WrappedOpenGL::glFramebufferReadBufferEXT(GLuint framebuffer, GLenum buf) Serialise_glFramebufferReadBufferEXT(framebuffer, buf); m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_ReadBeforeWrite); } else if(m_State == WRITING_IDLE && framebuffer != 0) { @@ -996,7 +1008,7 @@ void WrappedOpenGL::glReadBuffer(GLenum mode) m_ContextRecord->AddChunk(scope.Get()); if(readrecord) - GetResourceManager()->MarkResourceFrameReferenced(readrecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkFBOReferenced(readrecord->Resource, eFrameRef_ReadBeforeWrite); } else { @@ -1037,7 +1049,7 @@ void WrappedOpenGL::glBindFramebuffer(GLenum target, GLuint framebuffer) Serialise_glBindFramebuffer(target, framebuffer); m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_ReadBeforeWrite); } if(framebuffer == 0 && m_State < WRITING) @@ -1088,7 +1100,7 @@ void WrappedOpenGL::glFramebufferDrawBufferEXT(GLuint framebuffer, GLenum buf) Serialise_glFramebufferDrawBufferEXT(framebuffer, buf); m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_ReadBeforeWrite); } else if(m_State == WRITING_IDLE && framebuffer != 0) { @@ -1112,7 +1124,7 @@ void WrappedOpenGL::glDrawBuffer(GLenum buf) m_ContextRecord->AddChunk(scope.Get()); if(drawrecord) - GetResourceManager()->MarkResourceFrameReferenced(drawrecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkFBOReferenced(drawrecord->Resource, eFrameRef_ReadBeforeWrite); } else { @@ -1159,7 +1171,7 @@ void WrappedOpenGL::glFramebufferDrawBuffersEXT(GLuint framebuffer, GLsizei n, c Serialise_glFramebufferDrawBuffersEXT(framebuffer, n, bufs); m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), framebuffer), eFrameRef_ReadBeforeWrite); } else if(m_State == WRITING_IDLE && framebuffer != 0) { @@ -1186,7 +1198,7 @@ void WrappedOpenGL::glDrawBuffers(GLsizei n, const GLenum *bufs) m_ContextRecord->AddChunk(scope.Get()); if(drawrecord) - GetResourceManager()->MarkResourceFrameReferenced(drawrecord->GetResourceID(), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkFBOReferenced(drawrecord->Resource, eFrameRef_ReadBeforeWrite); } else { @@ -1396,8 +1408,8 @@ void WrappedOpenGL::glBlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFr Serialise_glBlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), readFramebuffer), eFrameRef_Read); - GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), drawFramebuffer), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), readFramebuffer), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), drawFramebuffer), eFrameRef_ReadBeforeWrite); } // use ARB_direct_state_access functions here as we use EXT_direct_state_access elsewhere. If @@ -1422,8 +1434,8 @@ void WrappedOpenGL::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLi Serialise_glBlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); m_ContextRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), readFramebuffer), eFrameRef_Read); - GetResourceManager()->MarkResourceFrameReferenced(FramebufferRes(GetCtx(), drawFramebuffer), eFrameRef_Read); + GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), readFramebuffer), eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkFBOReferenced(FramebufferRes(GetCtx(), drawFramebuffer), eFrameRef_ReadBeforeWrite); } m_Real.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);