From 2ae29bbecb7763147e91b96782cf3346bdad7095 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 3 May 2019 11:37:17 +0100 Subject: [PATCH] Try to avoid crashing if a failed map is used mid-capture --- .../driver/gl/wrappers/gl_buffer_funcs.cpp | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index b38f12712..e57acfaaa 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -2375,7 +2375,8 @@ bool WrappedOpenGL::Serialise_glFlushMappedNamedBufferRangeEXT(SerialiserType &s { record = GetResourceManager()->GetResourceRecord(buffer); - FlushedData = record->Map.ptr + offset; + if(record->Map.ptr) + FlushedData = record->Map.ptr + offset; MapOffset = record->Map.offset; } @@ -2564,27 +2565,31 @@ void WrappedOpenGL::PersistentMapMemoryBarrier(const set &ma RDCASSERT(record && record->Map.ptr); - size_t diffStart = 0, diffEnd = record->Map.length; - bool found = true; - - if(record->GetShadowPtr(0)) - found = FindDiffRange(record->GetShadowPtr(0), record->Map.ptr, (size_t)record->Map.length, - diffStart, diffEnd); - - if(found && diffEnd > diffStart) + if(record->Map.ptr) { - // update the modified region in the 'comparison' shadow buffer for next check - if(record->GetShadowPtr(0) == NULL) - record->AllocShadowStorage(record->Map.length); - else - memcpy(record->GetShadowPtr(0) + diffStart, record->Map.ptr + diffStart, diffEnd - diffStart); + size_t diffStart = 0, diffEnd = record->Map.length; + bool found = true; - // we use our own flush function so it will serialise chunks when necessary, and it - // also handles copying into the persistent mapped pointer and flushing the real GL - // buffer - gl_CurChunk = GLChunk::CoherentMapWrite; - glFlushMappedNamedBufferRangeEXT(record->Resource.name, GLintptr(diffStart), - GLsizeiptr(diffEnd - diffStart)); + if(record->GetShadowPtr(0)) + found = FindDiffRange(record->GetShadowPtr(0), record->Map.ptr, (size_t)record->Map.length, + diffStart, diffEnd); + + if(found && diffEnd > diffStart) + { + // update the modified region in the 'comparison' shadow buffer for next check + if(record->GetShadowPtr(0) == NULL) + record->AllocShadowStorage(record->Map.length); + else + memcpy(record->GetShadowPtr(0) + diffStart, record->Map.ptr + diffStart, + diffEnd - diffStart); + + // we use our own flush function so it will serialise chunks when necessary, and it + // also handles copying into the persistent mapped pointer and flushing the real GL + // buffer + gl_CurChunk = GLChunk::CoherentMapWrite; + glFlushMappedNamedBufferRangeEXT(record->Resource.name, GLintptr(diffStart), + GLsizeiptr(diffEnd - diffStart)); + } } } }