From dcf243ad635e178ca25125da437c9c74acea8083 Mon Sep 17 00:00:00 2001 From: Baldur Karlsson Date: Tue, 24 Jun 2014 15:57:45 +0100 Subject: [PATCH] Quick optimisation - detect case of glBufferData just to orphan --- .../driver/gl/wrappers/gl_buffer_funcs.cpp | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index e82645474..d6727bbda 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -330,6 +330,16 @@ void WrappedOpenGL::glNamedBufferDataEXT(GLuint buffer, GLsizeiptr size, const v { GLResourceRecord *record = GetResourceManager()->GetResourceRecord(BufferRes(buffer)); RDCASSERT(record); + + // detect buffer orphaning and just update backing store + if(m_State == WRITING_IDLE && record->GetDataPtr() != NULL && size == record->Length && usage == record->usage) + { + if(data) + memcpy(record->GetDataPtr(), data, (size_t)size); + else + memset(record->GetDataPtr(), 0xbe, (size_t)size); + return; + } SCOPED_SERIALISE_CONTEXT(BUFFERDATA); Serialise_glNamedBufferDataEXT(buffer, size, data, usage); @@ -345,6 +355,7 @@ void WrappedOpenGL::glNamedBufferDataEXT(GLuint buffer, GLsizeiptr size, const v record->AddChunk(chunk); record->SetDataPtr(chunk->GetData()); record->Length = (int32_t)size; + record->usage = usage; } } } @@ -360,6 +371,16 @@ void WrappedOpenGL::glBufferData(GLenum target, GLsizeiptr size, const void *dat GLResourceRecord *record = m_BufferRecord[BufferIdx(target)]; RDCASSERT(record); + // detect buffer orphaning and just update backing store + if(m_State == WRITING_IDLE && record->GetDataPtr() != NULL && size == record->Length && usage == record->usage) + { + if(data) + memcpy(record->GetDataPtr(), data, (size_t)size); + else + memset(record->GetDataPtr(), 0xbe, (size_t)size); + return; + } + SCOPED_SERIALISE_CONTEXT(BUFFERDATA); Serialise_glNamedBufferDataEXT(GetResourceManager()->GetCurrentResource(record->GetResourceID()).name, size, data, usage); @@ -375,6 +396,7 @@ void WrappedOpenGL::glBufferData(GLenum target, GLsizeiptr size, const void *dat record->AddChunk(chunk); record->SetDataPtr(chunk->GetData()); record->Length = (int32_t)size; + record->usage = usage; } } }