From c69389864eb7950d069ec71fe731863676ffaef1 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 26 Feb 2015 14:25:40 +0000 Subject: [PATCH] Fix buffer map diff comparison, and skip it for range maps * For range maps, similar to glFlushMappedBufferRange, we assume the user selected the range deliberately and we upload it all. We only find a difference range for whole-buffer maps (of large enough buffers). This includes glMapBuffer(), by definition. * Also, the comparison point is between the map pointer, so we have to offset the shadow pointer to compare it against to get accurate results. --- renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index 918749428..873361542 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -1841,9 +1841,17 @@ bool WrappedOpenGL::Serialise_glUnmapNamedBufferEXT(GLuint buffer) size_t diffStart = 0; size_t diffEnd = (size_t)len; - if(m_State == WRITING_CAPFRAME && len > 512 && !record->Map.invalidate) + if(m_State == WRITING_CAPFRAME && + // don't bother checking diff range for tiny buffers + len > 512 && + // if the map has a sub-range specified, trust the user to have specified + // a minimal range, similar to glFlushMappedBufferRange, so don't find diff + // range. + record->Map.offset == 0 && record->Map.length == record->Length && + // similarly for invalidate maps, we want to update the whole buffer + !record->Map.invalidate) { - bool found = FindDiffRange(record->Map.ptr, record->GetShadowPtr(1), (size_t)len, diffStart, diffEnd); + bool found = FindDiffRange(record->Map.ptr, record->GetShadowPtr(1)+offs, (size_t)len, diffStart, diffEnd); if(found) { static size_t saved = 0;