From 1d087cc5c2cb882424e7d8022ae16740192f36b2 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Tue, 21 Jul 2020 21:56:47 -0300 Subject: [PATCH] Fix Mesh/Buffer:flush uploading more data than it needs to, sometimes. --- src/modules/graphics/opengl/Buffer.cpp | 16 ++++++++++++++-- src/modules/graphics/opengl/Buffer.h | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/modules/graphics/opengl/Buffer.cpp b/src/modules/graphics/opengl/Buffer.cpp index 3fd4beaed..2b17dc121 100644 --- a/src/modules/graphics/opengl/Buffer.cpp +++ b/src/modules/graphics/opengl/Buffer.cpp @@ -112,6 +112,7 @@ void *Buffer::map() modifiedOffset = 0; modifiedSize = 0; + isMappedDataModified = false; return memoryMap; } @@ -149,8 +150,13 @@ void Buffer::unmap() if (!mapped) return; + mapped = false; + if ((mapFlags & MAP_EXPLICIT_RANGE_MODIFY) != 0) { + if (!isMappedDataModified) + return; + modifiedOffset = std::min(modifiedOffset, getSize() - 1); modifiedSize = std::min(modifiedSize, getSize() - modifiedOffset); } @@ -184,8 +190,6 @@ void Buffer::unmap() modifiedOffset = 0; modifiedSize = 0; - - mapped = false; } void Buffer::setMappedRangeModified(size_t offset, size_t modifiedsize) @@ -193,6 +197,14 @@ void Buffer::setMappedRangeModified(size_t offset, size_t modifiedsize) if (!mapped || !(mapFlags & MAP_EXPLICIT_RANGE_MODIFY)) return; + if (!isMappedDataModified) + { + modifiedOffset = offset; + modifiedSize = size; + isMappedDataModified = true; + return; + } + // We're being conservative right now by internally marking the whole range // from the start of section a to the end of section b as modified if both // a and b are marked as modified. diff --git a/src/modules/graphics/opengl/Buffer.h b/src/modules/graphics/opengl/Buffer.h index e3c089ebc..64fde2f3c 100644 --- a/src/modules/graphics/opengl/Buffer.h +++ b/src/modules/graphics/opengl/Buffer.h @@ -75,6 +75,7 @@ private: size_t modifiedOffset = 0; size_t modifiedSize = 0; + bool isMappedDataModified = false; }; // Buffer