From 9860d8bba8fe1ec1c640c9351f4cf6d436b62094 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 11 Dec 2014 23:18:06 +0000 Subject: [PATCH] Mark buffers referenced so they're kept alive even if deleted in-frame * We need to have more comprehensive frame references for several reasons but this will handle the case where a buffer is created, bound, deleted before the frame ends. --- .../driver/gl/wrappers/gl_buffer_funcs.cpp | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index dbfee5c1b..6eb30b1df 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -134,6 +134,21 @@ void WrappedOpenGL::glBindBuffer(GLenum target, GLuint buffer) chunk = scope.Get(); } + + if(buffer) + { + FrameRefType refType = eFrameRef_Read; + + // these targets write to the buffer + if(target == eGL_ATOMIC_COUNTER_BUFFER || + target == eGL_COPY_WRITE_BUFFER || + target == eGL_PIXEL_PACK_BUFFER || + target == eGL_SHADER_STORAGE_BUFFER || + target == eGL_TRANSFORM_FEEDBACK_BUFFER) + refType = eFrameRef_Write; + + GetResourceManager()->MarkResourceFrameReferenced(cd.m_BufferRecord[idx]->GetResourceID(), refType); + } m_ContextRecord->AddChunk(chunk); } @@ -734,6 +749,21 @@ void WrappedOpenGL::glBindBufferBase(GLenum target, GLuint index, GLuint buffer) cd.m_BufferRecord[idx] = NULL; else cd.m_BufferRecord[idx] = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer)); + + if(buffer) + { + FrameRefType refType = eFrameRef_Read; + + // these targets write to the buffer + if(target == eGL_ATOMIC_COUNTER_BUFFER || + target == eGL_COPY_WRITE_BUFFER || + target == eGL_PIXEL_PACK_BUFFER || + target == eGL_SHADER_STORAGE_BUFFER || + target == eGL_TRANSFORM_FEEDBACK_BUFFER) + refType = eFrameRef_Write; + + GetResourceManager()->MarkResourceFrameReferenced(cd.m_BufferRecord[idx]->GetResourceID(), refType); + } } // store as transform feedback record state @@ -806,6 +836,21 @@ void WrappedOpenGL::glBindBufferRange(GLenum target, GLuint index, GLuint buffer cd.m_BufferRecord[idx] = NULL; else cd.m_BufferRecord[idx] = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer)); + + if(buffer) + { + FrameRefType refType = eFrameRef_Read; + + // these targets write to the buffer + if(target == eGL_ATOMIC_COUNTER_BUFFER || + target == eGL_COPY_WRITE_BUFFER || + target == eGL_PIXEL_PACK_BUFFER || + target == eGL_SHADER_STORAGE_BUFFER || + target == eGL_TRANSFORM_FEEDBACK_BUFFER) + refType = eFrameRef_Write; + + GetResourceManager()->MarkResourceFrameReferenced(cd.m_BufferRecord[idx]->GetResourceID(), refType); + } } // store as transform feedback record state @@ -888,6 +933,20 @@ void WrappedOpenGL::glBindBuffersBase(GLenum target, GLuint first, GLsizei count cd.m_BufferRecord[idx] = NULL; else cd.m_BufferRecord[idx] = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffers[0])); + + FrameRefType refType = eFrameRef_Read; + + // these targets write to the buffer + if(target == eGL_ATOMIC_COUNTER_BUFFER || + target == eGL_COPY_WRITE_BUFFER || + target == eGL_PIXEL_PACK_BUFFER || + target == eGL_SHADER_STORAGE_BUFFER || + target == eGL_TRANSFORM_FEEDBACK_BUFFER) + refType = eFrameRef_Write; + + for(GLsizei i=0; i < count; i++) + if(buffers[i]) + GetResourceManager()->MarkResourceFrameReferenced(GetResourceManager()->GetID(BufferRes(GetCtx(), buffers[i])), refType); } // store as transform feedback record state @@ -986,6 +1045,20 @@ void WrappedOpenGL::glBindBuffersRange(GLenum target, GLuint first, GLsizei coun cd.m_BufferRecord[idx] = NULL; else cd.m_BufferRecord[idx] = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffers[0])); + + FrameRefType refType = eFrameRef_Read; + + // these targets write to the buffer + if(target == eGL_ATOMIC_COUNTER_BUFFER || + target == eGL_COPY_WRITE_BUFFER || + target == eGL_PIXEL_PACK_BUFFER || + target == eGL_SHADER_STORAGE_BUFFER || + target == eGL_TRANSFORM_FEEDBACK_BUFFER) + refType = eFrameRef_Write; + + for(GLsizei i=0; i < count; i++) + if(buffers[i]) + GetResourceManager()->MarkResourceFrameReferenced(GetResourceManager()->GetID(BufferRes(GetCtx(), buffers[i])), refType); } // store as transform feedback record state