From c2730739352f1f836fa51a34e5860ded96e58f3d Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 12 Nov 2014 00:48:56 +0000 Subject: [PATCH] Proper record deletion and record parenting --- renderdoc/driver/gl/gl_manager.h | 18 ++++ .../driver/gl/wrappers/gl_buffer_funcs.cpp | 28 ++++-- .../gl/wrappers/gl_framebuffer_funcs.cpp | 98 +++++++++++++++++-- .../driver/gl/wrappers/gl_query_funcs.cpp | 17 +++- .../driver/gl/wrappers/gl_sampler_funcs.cpp | 14 ++- .../driver/gl/wrappers/gl_shader_funcs.cpp | 30 +++++- .../driver/gl/wrappers/gl_texture_funcs.cpp | 18 +++- 7 files changed, 196 insertions(+), 27 deletions(-) diff --git a/renderdoc/driver/gl/gl_manager.h b/renderdoc/driver/gl/gl_manager.h index 3a2a2e893..cdb42130c 100644 --- a/renderdoc/driver/gl/gl_manager.h +++ b/renderdoc/driver/gl/gl_manager.h @@ -79,6 +79,17 @@ class GLResourceManager : public ResourceManager return id; } + using ResourceManager::HasCurrentResource; + + bool HasCurrentResource(GLResource res) + { + auto it = m_CurrentResourceIds.find(res); + if(it != m_CurrentResourceIds.end()) + return true; + + return false; + } + void UnregisterResource(GLResource res) { auto it = m_CurrentResourceIds.find(res); @@ -106,6 +117,13 @@ class GLResourceManager : public ResourceManager return ret; } + + using ResourceManager::HasResourceRecord; + + bool HasResourceRecord(GLResource res) + { + return ResourceManager::HasResourceRecord(GetID(res)); + } using ResourceManager::GetResourceRecord; diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index 24895a87e..6a6078840 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -1946,18 +1946,34 @@ void WrappedOpenGL::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor) void WrappedOpenGL::glDeleteBuffers(GLsizei n, const GLuint *buffers) { - m_Real.glDeleteBuffers(n, buffers); - for(GLsizei i=0; i < n; i++) - GetResourceManager()->UnregisterResource(BufferRes(GetCtx(), buffers[i])); + { + GLResource res = BufferRes(GetCtx(), buffers[i]); + if(GetResourceManager()->HasCurrentResource(res)) + { + if(GetResourceManager()->HasResourceRecord(res)) + GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); + GetResourceManager()->UnregisterResource(res); + } + } + + m_Real.glDeleteBuffers(n, buffers); } void WrappedOpenGL::glDeleteVertexArrays(GLsizei n, const GLuint *arrays) { - m_Real.glDeleteVertexArrays(n, arrays); - for(GLsizei i=0; i < n; i++) - GetResourceManager()->UnregisterResource(VertexArrayRes(GetCtx(), arrays[i])); + { + GLResource res = VertexArrayRes(GetCtx(), arrays[i]); + if(GetResourceManager()->HasCurrentResource(res)) + { + if(GetResourceManager()->HasResourceRecord(res)) + GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); + GetResourceManager()->UnregisterResource(res); + } + } + + m_Real.glDeleteVertexArrays(n, arrays); } #pragma endregion diff --git a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp index 929dad094..d20aaff16 100644 --- a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp @@ -117,7 +117,11 @@ void WrappedOpenGL::glNamedFramebufferTextureEXT(GLuint framebuffer, GLenum atta Serialise_glNamedFramebufferTextureEXT(framebuffer, attachment, texture, level); if(m_State == WRITING_IDLE) + { + if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) + record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture))); record->AddChunk(scope.Get()); + } else m_ContextRecord->AddChunk(scope.Get()); } @@ -145,9 +149,15 @@ void WrappedOpenGL::glFramebufferTexture(GLenum target, GLenum attachment, GLuin attachment, texture, level); if(m_State == WRITING_IDLE) + { + if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) + record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture))); record->AddChunk(scope.Get()); + } else + { m_ContextRecord->AddChunk(scope.Get()); + } } } @@ -193,9 +203,15 @@ void WrappedOpenGL::glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum at Serialise_glNamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level); if(m_State == WRITING_IDLE) + { + if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) + record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture))); record->AddChunk(scope.Get()); + } else + { m_ContextRecord->AddChunk(scope.Get()); + } } } @@ -221,9 +237,15 @@ void WrappedOpenGL::glFramebufferTexture1D(GLenum target, GLenum attachment, GLe attachment, textarget, texture, level); if(m_State == WRITING_IDLE) + { + if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) + record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture))); record->AddChunk(scope.Get()); + } else + { m_ContextRecord->AddChunk(scope.Get()); + } } } @@ -269,9 +291,15 @@ void WrappedOpenGL::glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum at Serialise_glNamedFramebufferTexture2DEXT(framebuffer, attachment, textarget, texture, level); if(m_State == WRITING_IDLE) + { + if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) + record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture))); record->AddChunk(scope.Get()); + } else + { m_ContextRecord->AddChunk(scope.Get()); + } } } @@ -297,9 +325,15 @@ void WrappedOpenGL::glFramebufferTexture2D(GLenum target, GLenum attachment, GLe attachment, textarget, texture, level); if(m_State == WRITING_IDLE) + { + if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) + record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture))); record->AddChunk(scope.Get()); + } else + { m_ContextRecord->AddChunk(scope.Get()); + } } } @@ -346,9 +380,15 @@ void WrappedOpenGL::glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum at Serialise_glNamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset); if(m_State == WRITING_IDLE) + { + if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) + record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture))); record->AddChunk(scope.Get()); + } else + { m_ContextRecord->AddChunk(scope.Get()); + } } } @@ -374,9 +414,15 @@ void WrappedOpenGL::glFramebufferTexture3D(GLenum target, GLenum attachment, GLe attachment, textarget, texture, level, zoffset); if(m_State == WRITING_IDLE) + { + if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) + record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture))); record->AddChunk(scope.Get()); + } else + { m_ContextRecord->AddChunk(scope.Get()); + } } } bool WrappedOpenGL::Serialise_glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) @@ -421,9 +467,15 @@ void WrappedOpenGL::glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum Serialise_glNamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer); if(m_State == WRITING_IDLE) + { + if(renderbuffer != 0 && GetResourceManager()->HasResourceRecord(RenderbufferRes(GetCtx(), renderbuffer))) + record->AddParent(GetResourceManager()->GetResourceRecord(RenderbufferRes(GetCtx(), renderbuffer))); record->AddChunk(scope.Get()); + } else + { m_ContextRecord->AddChunk(scope.Get()); + } } } @@ -449,9 +501,15 @@ void WrappedOpenGL::glFramebufferRenderbuffer(GLenum target, GLenum attachment, attachment, renderbuffertarget, renderbuffer); if(m_State == WRITING_IDLE) + { + if(renderbuffer != 0 && GetResourceManager()->HasResourceRecord(RenderbufferRes(GetCtx(), renderbuffer))) + record->AddParent(GetResourceManager()->GetResourceRecord(RenderbufferRes(GetCtx(), renderbuffer))); record->AddChunk(scope.Get()); + } else + { m_ContextRecord->AddChunk(scope.Get()); + } } } @@ -497,9 +555,15 @@ void WrappedOpenGL::glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum Serialise_glNamedFramebufferTextureLayerEXT(framebuffer, attachment, texture, level, layer); if(m_State == WRITING_IDLE) + { + if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) + record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture))); record->AddChunk(scope.Get()); + } else + { m_ContextRecord->AddChunk(scope.Get()); + } } } @@ -525,9 +589,15 @@ void WrappedOpenGL::glFramebufferTextureLayer(GLenum target, GLenum attachment, attachment, texture, level, layer); if(m_State == WRITING_IDLE) + { + if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture))) + record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture))); record->AddChunk(scope.Get()); + } else + { m_ContextRecord->AddChunk(scope.Get()); + } } } @@ -754,10 +824,18 @@ void WrappedOpenGL::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLi void WrappedOpenGL::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers) { - m_Real.glDeleteFramebuffers(n, framebuffers); - for(GLsizei i=0; i < n; i++) - GetResourceManager()->UnregisterResource(FramebufferRes(GetCtx(), framebuffers[i])); + { + GLResource res = FramebufferRes(GetCtx(), framebuffers[i]); + if(GetResourceManager()->HasCurrentResource(res)) + { + if(GetResourceManager()->HasResourceRecord(res)) + GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); + GetResourceManager()->UnregisterResource(res); + } + } + + m_Real.glDeleteFramebuffers(n, framebuffers); } bool WrappedOpenGL::Serialise_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers) @@ -823,10 +901,18 @@ void WrappedOpenGL::glBindRenderbuffer(GLenum target, GLuint renderbuffer) void WrappedOpenGL::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers) { - m_Real.glDeleteRenderbuffers(n, renderbuffers); - for(GLsizei i=0; i < n; i++) - GetResourceManager()->UnregisterResource(RenderbufferRes(GetCtx(), renderbuffers[i])); + { + GLResource res = RenderbufferRes(GetCtx(), renderbuffers[i]); + if(GetResourceManager()->HasCurrentResource(res)) + { + if(GetResourceManager()->HasResourceRecord(res)) + GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); + GetResourceManager()->UnregisterResource(res); + } + } + + m_Real.glDeleteRenderbuffers(n, renderbuffers); } bool WrappedOpenGL::Serialise_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) diff --git a/renderdoc/driver/gl/wrappers/gl_query_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_query_funcs.cpp index 0202dadea..728d792ac 100644 --- a/renderdoc/driver/gl/wrappers/gl_query_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_query_funcs.cpp @@ -149,7 +149,8 @@ void WrappedOpenGL::glDeleteSync(GLsync sync) ResourceId id = GetResourceManager()->GetSyncID(sync); - GetResourceManager()->UnregisterResource(GetResourceManager()->GetCurrentResource(id)); + if(GetResourceManager()->HasCurrentResource(id)) + GetResourceManager()->UnregisterResource(GetResourceManager()->GetCurrentResource(id)); } bool WrappedOpenGL::Serialise_glGenQueries(GLsizei n, GLuint* ids) @@ -281,8 +282,16 @@ void WrappedOpenGL::glQueryCounter(GLuint query, GLenum target) void WrappedOpenGL::glDeleteQueries(GLsizei n, const GLuint *ids) { - m_Real.glDeleteQueries(n, ids); - for(GLsizei i=0; i < n; i++) - GetResourceManager()->UnregisterResource(QueryRes(GetCtx(), ids[i])); + { + GLResource res = QueryRes(GetCtx(), ids[i]); + if(GetResourceManager()->HasCurrentResource(res)) + { + if(GetResourceManager()->HasResourceRecord(res)) + GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); + GetResourceManager()->UnregisterResource(res); + } + } + + m_Real.glDeleteQueries(n, ids); } diff --git a/renderdoc/driver/gl/wrappers/gl_sampler_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_sampler_funcs.cpp index 949008717..283f8607f 100644 --- a/renderdoc/driver/gl/wrappers/gl_sampler_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_sampler_funcs.cpp @@ -354,8 +354,16 @@ void WrappedOpenGL::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const G void WrappedOpenGL::glDeleteSamplers(GLsizei n, const GLuint *ids) { - m_Real.glDeleteSamplers(n, ids); - for(GLsizei i=0; i < n; i++) - GetResourceManager()->UnregisterResource(SamplerRes(GetCtx(), ids[i])); + { + GLResource res = SamplerRes(GetCtx(), ids[i]); + if(GetResourceManager()->HasCurrentResource(res)) + { + if(GetResourceManager()->HasResourceRecord(res)) + GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); + GetResourceManager()->UnregisterResource(res); + } + } + + m_Real.glDeleteSamplers(n, ids); } diff --git a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp index f5273c1af..3f1a33618 100644 --- a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp @@ -201,7 +201,13 @@ void WrappedOpenGL::glDeleteShader(GLuint shader) { m_Real.glDeleteShader(shader); - GetResourceManager()->UnregisterResource(ShaderRes(GetCtx(), shader)); + GLResource res = ShaderRes(GetCtx(), shader); + if(GetResourceManager()->HasCurrentResource(res)) + { + if(GetResourceManager()->HasResourceRecord(res)) + GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); + GetResourceManager()->UnregisterResource(res); + } } bool WrappedOpenGL::Serialise_glAttachShader(GLuint program, GLuint shader) @@ -638,7 +644,13 @@ void WrappedOpenGL::glDeleteProgram(GLuint program) { m_Real.glDeleteProgram(program); - GetResourceManager()->UnregisterResource(ProgramRes(GetCtx(), program)); + GLResource res = ProgramRes(GetCtx(), program); + if(GetResourceManager()->HasCurrentResource(res)) + { + if(GetResourceManager()->HasResourceRecord(res)) + GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); + GetResourceManager()->UnregisterResource(res); + } } bool WrappedOpenGL::Serialise_glUseProgram(GLuint program) @@ -825,10 +837,18 @@ void WrappedOpenGL::glBindProgramPipeline(GLuint pipeline) void WrappedOpenGL::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines) { - m_Real.glDeleteProgramPipelines(n, pipelines); - for(GLsizei i=0; i < n; i++) - GetResourceManager()->UnregisterResource(ProgramPipeRes(GetCtx(), pipelines[i])); + { + GLResource res = ProgramPipeRes(GetCtx(), pipelines[i]); + if(GetResourceManager()->HasCurrentResource(res)) + { + if(GetResourceManager()->HasResourceRecord(res)) + GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); + GetResourceManager()->UnregisterResource(res); + } + } + + m_Real.glDeleteProgramPipelines(n, pipelines); } #pragma endregion diff --git a/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp index 5d95aabca..9128bca14 100644 --- a/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp @@ -83,10 +83,18 @@ void WrappedOpenGL::glGenTextures(GLsizei n, GLuint* textures) void WrappedOpenGL::glDeleteTextures(GLsizei n, const GLuint *textures) { - m_Real.glDeleteTextures(n, textures); - for(GLsizei i=0; i < n; i++) - GetResourceManager()->UnregisterResource(TextureRes(GetCtx(), textures[i])); + { + GLResource res = TextureRes(GetCtx(), textures[i]); + if(GetResourceManager()->HasCurrentResource(res)) + { + if(GetResourceManager()->HasResourceRecord(res)) + GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager()); + GetResourceManager()->UnregisterResource(res); + } + } + + m_Real.glDeleteTextures(n, textures); } bool WrappedOpenGL::Serialise_glBindTexture(GLenum target, GLuint texture) @@ -2754,6 +2762,7 @@ void WrappedOpenGL::glTextureBufferRangeEXT(GLuint texture, GLenum target, GLenu Serialise_glTextureBufferRangeEXT(texture, target, internalformat, buffer, offset, size); record->AddChunk(scope.Get()); + record->AddParent(GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer))); } } @@ -2771,6 +2780,7 @@ void WrappedOpenGL::glTexBufferRange(GLenum target, GLenum internalformat, GLuin target, internalformat, buffer, offset, size); record->AddChunk(scope.Get()); + record->AddParent(GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer))); } } @@ -2811,6 +2821,7 @@ void WrappedOpenGL::glTextureBufferEXT(GLuint texture, GLenum target, GLenum int Serialise_glTextureBufferEXT(texture, target, internalformat, buffer); record->AddChunk(scope.Get()); + record->AddParent(GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer))); } } @@ -2828,6 +2839,7 @@ void WrappedOpenGL::glTexBuffer(GLenum target, GLenum internalformat, GLuint buf target, internalformat, buffer); record->AddChunk(scope.Get()); + record->AddParent(GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer))); } }