[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49547] branches/soc-2012-swiss_cheese/ source/gameengine/Rasterizer/RAS_OpenGLRasterizer: Using glMapBuffer to directly write data into VBOs.

Mitchell Stokes mogurijin at gmail.com
Sat Aug 4 02:01:29 CEST 2012


Revision: 49547
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49547
Author:   moguri
Date:     2012-08-04 00:01:27 +0000 (Sat, 04 Aug 2012)
Log Message:
-----------
Using glMapBuffer to directly write data into VBOs. This makes updating the VBOs not nearly as slow, which provides a huge speed up to scenes with a lot of updating (e.g., skinned meshes). By the way, this code might have to fixed up for Android/GLES.

Modified Paths:
--------------
    branches/soc-2012-swiss_cheese/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.cpp
    branches/soc-2012-swiss_cheese/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.h

Modified: branches/soc-2012-swiss_cheese/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.cpp
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.cpp	2012-08-03 23:45:47 UTC (rev 49546)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.cpp	2012-08-04 00:01:27 UTC (rev 49547)
@@ -56,9 +56,6 @@
 	gpuGenBuffers(1, &this->ibo);
 	gpuGenBuffers(1, &this->vbo_id);
 
-	// Allocate some space to gather data into before uploading to GPU
-	this->vbo = new GLfloat[this->stride*this->size];
-
 	// Fill the buffers with initial data
 	UpdateIndices();
 	UpdateData();
@@ -69,15 +66,12 @@
 	this->tangent_offset = (void*)(6*sizeof(GLfloat));
 	this->color_offset = (void*)(10*sizeof(GLfloat));
 	this->uv_offset = (void*)(11*sizeof(GLfloat));
-	this->dummy_offset = (void*)(27*sizeof(GLfloat));
 }
 
 VBO::~VBO()
 {
 	gpuDeleteBuffers(1, &this->ibo);
 	gpuDeleteBuffers(1, &this->vbo_id);
-
-	delete this->vbo;
 }
 
 void VBO::UpdateData()
@@ -85,24 +79,24 @@
 	unsigned int i, j, k;
 	
 	gpuBindBuffer(GL_ARRAY_BUFFER, this->vbo_id);
+	gpuBufferData(GL_ARRAY_BUFFER, this->stride*this->size, NULL, GL_STATIC_DRAW);
 
-	// Lets the video card know we are done with the old VBO
-	gpuBufferData(GL_ARRAY_BUFFER, 0, NULL, GL_DYNAMIC_DRAW);
+	// Map the buffer
+	GLfloat *vbo_map = (GLfloat*)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
 
 	// Gather data
 	for (i = 0, j = 0; i < data->m_vertex.size(); i++, j += this->stride/sizeof(GLfloat))
 	{
-		memcpy(&this->vbo[j], data->m_vertex[i].getXYZ(), sizeof(float)*3);
-		memcpy(&this->vbo[j+3], data->m_vertex[i].getNormal(), sizeof(float)*3);
-		memcpy(&this->vbo[j+6], data->m_vertex[i].getTangent(), sizeof(float)*4);
-		memcpy(&this->vbo[j+10], data->m_vertex[i].getRGBA(), sizeof(char)*4);
+		memcpy(&vbo_map[j], data->m_vertex[i].getXYZ(), sizeof(float)*3);
+		memcpy(&vbo_map[j+3], data->m_vertex[i].getNormal(), sizeof(float)*3);
+		memcpy(&vbo_map[j+6], data->m_vertex[i].getTangent(), sizeof(float)*4);
+		memcpy(&vbo_map[j+10], data->m_vertex[i].getRGBA(), sizeof(char)*4);
 
 		for (k = 0; k < RAS_TexVert::MAX_UNIT; k++)
-			memcpy(&this->vbo[j+11+(k*2)], data->m_vertex[i].getUV(k), sizeof(float)*2);
+			memcpy(&vbo_map[j+11+(k*2)], data->m_vertex[i].getUV(k), sizeof(float)*2);
 	}
-
-	// Upload Data to GPU
-	gpuBufferData(GL_ARRAY_BUFFER, this->size*this->stride, this->vbo, GL_DYNAMIC_DRAW);
+	
+	glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
 }
 
 void VBO::UpdateIndices()
@@ -110,11 +104,8 @@
 	int space = data->m_index.size() * sizeof(GLushort);
 	gpuBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->ibo);
 
-	// Lets the video card know we are done with the old VBO
-	gpuBufferData(GL_ELEMENT_ARRAY_BUFFER, 0, NULL, GL_DYNAMIC_DRAW);
-
 	// Upload Data to VBO
-	gpuBufferData(GL_ELEMENT_ARRAY_BUFFER, space, &data->m_index[0], GL_DYNAMIC_DRAW);
+	gpuBufferData(GL_ELEMENT_ARRAY_BUFFER, space, &data->m_index[0], GL_STATIC_DRAW);
 }
 
 void VBO::Draw(int texco_num, RAS_IRasterizer::TexCoGen* texco, int attrib_num, RAS_IRasterizer::TexCoGen* attrib, bool multi)
@@ -157,7 +148,6 @@
 						gpugameobj.gpuTexCoordPointer(4, GL_FLOAT, this->stride, this->tangent_offset);
 						break;
 					default:
-						gpugameobj.gpuTexCoordPointer(1, GL_SHORT, this->stride, this->dummy_offset);
 						break;
 				}
 			}

Modified: branches/soc-2012-swiss_cheese/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.h
===================================================================
--- branches/soc-2012-swiss_cheese/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.h	2012-08-03 23:45:47 UTC (rev 49546)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.h	2012-08-04 00:01:27 UTC (rev 49547)
@@ -58,14 +58,12 @@
 	GLenum			mode;
 	GLuint			ibo;
 	GLuint			vbo_id;
-	GLfloat*		vbo;
 
 	void*			vertex_offset;
 	void*			normal_offset;
 	void*			color_offset;
 	void*			tangent_offset;
 	void*			uv_offset;
-	void*			dummy_offset;
 };
 
 class RAS_StorageVBO : public RAS_IStorage




More information about the Bf-blender-cvs mailing list