History

implemented partial VBOs support in copyWrittenDataToReadArrays()

ZappoMan committed 13 years ago

Commit 322cb2f1 parent 843eba82 files · +82 −11Browse files

Showing the changes to interface/src/VoxelSystem.cpp (1 of 2 files). Show all

Unified · Split

interface/src/VoxelSystem.cpp+79−11
@@ -205,17 +205,86 @@ void VoxelSystem::cleanupRemovedVoxels() { · 204 unmodified lines
205205 }
206206 }
207207
208+void VoxelSystem::copyWrittenDataToReadArraysFullVBOs() {
209+ // lock on the buffer write lock so we can't modify the data when the GPU is reading it
210+ pthread_mutex_lock(&_bufferWriteLock);
211+ int bytesOfVertices = (_voxelsInWriteArrays * VERTEX_POINTS_PER_VOXEL) * sizeof(GLfloat);
212+ int bytesOfColors = (_voxelsInWriteArrays * VERTEX_POINTS_PER_VOXEL) * sizeof(GLubyte);
213+ memcpy(_readVerticesArray, _writeVerticesArray, bytesOfVertices);
214+ memcpy(_readColorsArray, _writeColorsArray, bytesOfColors );
215+ _voxelsInReadArrays = _voxelsInWriteArrays;
216+ pthread_mutex_unlock(&_bufferWriteLock);
217+}
218+
219+void VoxelSystem::copyWrittenDataToReadArraysPartialVBOs() {
220+ // lock on the buffer write lock so we can't modify the data when the GPU is reading it
221+ pthread_mutex_lock(&_bufferWriteLock);
222+
223+ glBufferIndex segmentStart = 0;
224+ glBufferIndex segmentEnd = 0;
225+ bool inSegment = false;
226+ for (glBufferIndex i = 0; i < _voxelsInWriteArrays; i++) {
227+ bool thisVoxelDirty = _voxelDirtyArray[i];
228+ if (!inSegment) {
229+ if (thisVoxelDirty) {
230+ segmentStart = i;
231+ inSegment = true;
232+ }
233+ } else {
234+ if (!thisVoxelDirty) {
235+ // If we got here because because this voxel is NOT dirty, so the last dirty voxel was the one before
236+ // this one and so that's where the "segment" ends
237+ segmentEnd = i - 1;
238+ inSegment = false;
239+ int segmentLength = (segmentEnd - segmentStart) + 1;
240+
241+ GLintptr segmentStartAt = segmentStart * VERTEX_POINTS_PER_VOXEL * sizeof(GLfloat);
242+ GLsizeiptr segmentSizeBytes = segmentLength * VERTEX_POINTS_PER_VOXEL * sizeof(GLfloat);
243+ GLfloat* readVerticesAt = _readVerticesArray + (segmentStart * VERTEX_POINTS_PER_VOXEL);
244+ GLfloat* writeVerticesAt = _writeVerticesArray + (segmentStart * VERTEX_POINTS_PER_VOXEL);
245+ memcpy(readVerticesAt, writeVerticesAt, segmentSizeBytes);
246+
247+ segmentStartAt = segmentStart * VERTEX_POINTS_PER_VOXEL * sizeof(GLubyte);
248+ segmentSizeBytes = segmentLength * VERTEX_POINTS_PER_VOXEL * sizeof(GLubyte);
249+ GLubyte* readColorsAt = _readColorsArray + (segmentStart * VERTEX_POINTS_PER_VOXEL);
250+ GLubyte* writeColorsAt = _writeColorsArray + (segmentStart * VERTEX_POINTS_PER_VOXEL);
251+ memcpy(readColorsAt, writeColorsAt, segmentSizeBytes);
252+ }
253+ }
254+ }
255+
256+ // if we got to the end of the array, and we're in an active dirty segment...
257+ if (inSegment) {
258+ segmentEnd = _voxelsInWriteArrays - 1;
259+ int segmentLength = (segmentEnd - segmentStart) + 1;
260+
261+ GLintptr segmentStartAt = segmentStart * VERTEX_POINTS_PER_VOXEL * sizeof(GLfloat);
262+ GLsizeiptr segmentSizeBytes = segmentLength * VERTEX_POINTS_PER_VOXEL * sizeof(GLfloat);
263+ GLfloat* readVerticesAt = _readVerticesArray + (segmentStart * VERTEX_POINTS_PER_VOXEL);
264+ GLfloat* writeVerticesAt = _writeVerticesArray + (segmentStart * VERTEX_POINTS_PER_VOXEL);
265+ memcpy(readVerticesAt, writeVerticesAt, segmentSizeBytes);
266+
267+ segmentStartAt = segmentStart * VERTEX_POINTS_PER_VOXEL * sizeof(GLubyte);
268+ segmentSizeBytes = segmentLength * VERTEX_POINTS_PER_VOXEL * sizeof(GLubyte);
269+ GLubyte* readColorsAt = _readColorsArray + (segmentStart * VERTEX_POINTS_PER_VOXEL);
270+ GLubyte* writeColorsAt = _writeColorsArray + (segmentStart * VERTEX_POINTS_PER_VOXEL);
271+ memcpy(readColorsAt, writeColorsAt, segmentSizeBytes);
272+ }
273+
274+ // update our length
275+ _voxelsInReadArrays = _voxelsInWriteArrays;
276+
277+ pthread_mutex_unlock(&_bufferWriteLock);
278+}
279+
208280 void VoxelSystem::copyWrittenDataToReadArrays() {
209− PerformanceWarning warn(_renderWarningsOn, "copyWrittenDataToReadArrays()"); // would like to include _voxelsInArrays, _voxelsUpdated
281+ PerformanceWarning warn(_renderWarningsOn, "copyWrittenDataToReadArrays()");
210282 if (_voxelsDirty && _voxelsUpdated) {
211− // lock on the buffer write lock so we can't modify the data when the GPU is reading it
212− pthread_mutex_lock(&_bufferWriteLock);
213− int bytesOfVertices = (_voxelsInWriteArrays * VERTEX_POINTS_PER_VOXEL) * sizeof(GLfloat);
214− int bytesOfColors = (_voxelsInWriteArrays * VERTEX_POINTS_PER_VOXEL) * sizeof(GLubyte);
215− memcpy(_readVerticesArray, _writeVerticesArray, bytesOfVertices);
216− memcpy(_readColorsArray, _writeColorsArray, bytesOfColors );
217− _voxelsInReadArrays = _voxelsInWriteArrays;
218− pthread_mutex_unlock(&_bufferWriteLock);
283+ if (_renderFullVBO) {
284+ copyWrittenDataToReadArraysFullVBOs();
285+ } else {
286+ copyWrittenDataToReadArraysPartialVBOs();
287+ }
219288 }
220289 }
221290
@@ -493,11 +562,10 @@ void VoxelSystem::updateVBOs() { · 271 unmodified lines
493562 };
494563 PerformanceWarning warn(_renderWarningsOn, buffer); // would like to include _callsToTreesToArrays
495564 if (_voxelsDirty) {
496− // updatePartialVBOs() is not yet working. For now, ALWAYS call updateFullVBOs()
497565 if (_renderFullVBO) {
498566 updateFullVBOs();
499567 } else {
500− updatePartialVBOs(); // too many small segments?
568+ updatePartialVBOs();
501569 }
502570 _voxelsDirty = false;
503571 }