diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index e7cdd80dc..62b6ce51b 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -1928,6 +1928,13 @@ void *WrappedOpenGL::glMapNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GL { // reading must be available access |= GL_MAP_READ_BIT; + + // can't invalidate if we are reading. This flag is safe to remove because it only has a perf + // impact - invalid data could by coincidence be the precise previous contents. We've also + // already set invalidateMap above so if we're verifying buffer contents we know to check for + // it. + access &= ~(GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_INVALIDATE_RANGE_BIT); + directMap = true; persistent = true; } diff --git a/util/test/demos/gl/gl_buffer_updates.cpp b/util/test/demos/gl/gl_buffer_updates.cpp index 9b3cf1ca0..249b7b709 100644 --- a/util/test/demos/gl/gl_buffer_updates.cpp +++ b/util/test/demos/gl/gl_buffer_updates.cpp @@ -96,6 +96,8 @@ void main() BUFFER_TEST(CleanBufferMapFlushExplicit) \ BUFFER_TEST(DirtyBufferMapFlushExplicit) \ BUFFER_TEST(CoherentMapWrite) \ + BUFFER_TEST(CoherentMapWriteInvalidateRange) \ + BUFFER_TEST(CoherentMapWriteInvalidateBuffer) \ BUFFER_TEST(NonCoherentMapFlush) \ BUFFER_TEST(OffsetMapWrite) \ BUFFER_TEST(OffsetMapFlush) @@ -195,7 +197,8 @@ void main() glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(Vec4f), &red); glBindBuffer(GL_UNIFORM_BUFFER, buffers[DirtyBufferMapFlushExplicit]); - glBufferStorage(GL_UNIFORM_BUFFER, sizeof(Vec4f), &red, GL_MAP_WRITE_BIT); + glBufferStorage(GL_UNIFORM_BUFFER, sizeof(Vec4f), &red, + GL_MAP_WRITE_BIT | GL_DYNAMIC_STORAGE_BIT); for(int i = 0; i < 100; i++) glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(Vec4f), &red); @@ -207,6 +210,22 @@ void main() (Vec4f *)glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(Vec4f), GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_WRITE_BIT); + glBindBuffer(GL_UNIFORM_BUFFER, buffers[CoherentMapWriteInvalidateRange]); + glBufferStorage(GL_UNIFORM_BUFFER, sizeof(Vec4f), &red, + GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); + + ptrs[CoherentMapWriteInvalidateRange] = (Vec4f *)glMapBufferRange( + GL_UNIFORM_BUFFER, 0, sizeof(Vec4f), GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | + GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT); + + glBindBuffer(GL_UNIFORM_BUFFER, buffers[CoherentMapWriteInvalidateBuffer]); + glBufferStorage(GL_UNIFORM_BUFFER, sizeof(Vec4f), &red, + GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); + + ptrs[CoherentMapWriteInvalidateBuffer] = (Vec4f *)glMapBufferRange( + GL_UNIFORM_BUFFER, 0, sizeof(Vec4f), GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT | + GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); + glBindBuffer(GL_UNIFORM_BUFFER, buffers[NonCoherentMapFlush]); glBufferStorage(GL_UNIFORM_BUFFER, sizeof(Vec4f), &red, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT); @@ -324,6 +343,8 @@ void main() glUnmapBuffer(GL_UNIFORM_BUFFER); memcpy(ptrs[CoherentMapWrite], &red, sizeof(Vec4f)); + memcpy(ptrs[CoherentMapWriteInvalidateRange], &red, sizeof(Vec4f)); + memcpy(ptrs[CoherentMapWriteInvalidateBuffer], &red, sizeof(Vec4f)); glBindBuffer(GL_UNIFORM_BUFFER, buffers[NonCoherentMapFlush]); memcpy(ptrs[NonCoherentMapFlush], &red, sizeof(Vec4f)); @@ -359,8 +380,9 @@ void main() glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0, GL_DEBUG_SEVERITY_HIGH, -1, TestNames[buf]); - if(buf == CoherentMapWrite) - memcpy(ptrs[CoherentMapWrite], &green, sizeof(Vec4f)); + if(buf == CoherentMapWrite || buf == CoherentMapWriteInvalidateRange || + buf == CoherentMapWriteInvalidateBuffer) + memcpy(ptrs[buf], &green, sizeof(Vec4f)); if(buf == NonCoherentMapFlush) {