Browse Source

Fix Mesh/Buffer:flush uploading more data than it needs to, sometimes.

Alex Szpakowski 5 years ago
parent
commit
1d087cc5c2
2 changed files with 15 additions and 2 deletions
  1. 14 2
      src/modules/graphics/opengl/Buffer.cpp
  2. 1 0
      src/modules/graphics/opengl/Buffer.h

+ 14 - 2
src/modules/graphics/opengl/Buffer.cpp

@@ -112,6 +112,7 @@ void *Buffer::map()
 
 
 	modifiedOffset = 0;
 	modifiedOffset = 0;
 	modifiedSize = 0;
 	modifiedSize = 0;
+	isMappedDataModified = false;
 
 
 	return memoryMap;
 	return memoryMap;
 }
 }
@@ -149,8 +150,13 @@ void Buffer::unmap()
 	if (!mapped)
 	if (!mapped)
 		return;
 		return;
 
 
+	mapped = false;
+
 	if ((mapFlags & MAP_EXPLICIT_RANGE_MODIFY) != 0)
 	if ((mapFlags & MAP_EXPLICIT_RANGE_MODIFY) != 0)
 	{
 	{
+		if (!isMappedDataModified)
+			return;
+
 		modifiedOffset = std::min(modifiedOffset, getSize() - 1);
 		modifiedOffset = std::min(modifiedOffset, getSize() - 1);
 		modifiedSize = std::min(modifiedSize, getSize() - modifiedOffset);
 		modifiedSize = std::min(modifiedSize, getSize() - modifiedOffset);
 	}
 	}
@@ -184,8 +190,6 @@ void Buffer::unmap()
 
 
 	modifiedOffset = 0;
 	modifiedOffset = 0;
 	modifiedSize = 0;
 	modifiedSize = 0;
-
-	mapped = false;
 }
 }
 
 
 void Buffer::setMappedRangeModified(size_t offset, size_t modifiedsize)
 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))
 	if (!mapped || !(mapFlags & MAP_EXPLICIT_RANGE_MODIFY))
 		return;
 		return;
 
 
+	if (!isMappedDataModified)
+	{
+		modifiedOffset = offset;
+		modifiedSize = size;
+		isMappedDataModified = true;
+		return;
+	}
+
 	// We're being conservative right now by internally marking the whole range
 	// 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
 	// from the start of section a to the end of section b as modified if both
 	// a and b are marked as modified.
 	// a and b are marked as modified.

+ 1 - 0
src/modules/graphics/opengl/Buffer.h

@@ -75,6 +75,7 @@ private:
 
 
 	size_t modifiedOffset = 0;
 	size_t modifiedOffset = 0;
 	size_t modifiedSize = 0;
 	size_t modifiedSize = 0;
+	bool isMappedDataModified = false;
 
 
 }; // Buffer
 }; // Buffer