[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49712] branches/soc-2012-swiss_cheese/ source: Adding simple VBO compatibility functions.

Alexander Kuznetsov kuzsasha at gmail.com
Wed Aug 8 19:26:13 CEST 2012


Revision: 49712
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49712
Author:   alexk
Date:     2012-08-08 17:26:13 +0000 (Wed, 08 Aug 2012)
Log Message:
-----------
Adding simple VBO compatibility functions.
It uses mapbuffer when available, otherwise it falls back to glBufferData
Still we need good api for VBO (maybe even gl independent)

Modified Paths:
--------------
    branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_extensions.h
    branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_functions.h
    branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_functions.c
    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/blender/gpu/GPU_extensions.h
===================================================================
--- branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_extensions.h	2012-08-08 17:10:01 UTC (rev 49711)
+++ branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_extensions.h	2012-08-08 17:26:13 UTC (rev 49712)
@@ -47,6 +47,8 @@
 #define GPU_EXT_GLSL_FRAGMENT_ENABLED (GPU_ext_config & GPU_EXT_GLSL_FRAGMENT)
 #define GPU_EXT_FRAMEBUFFERS (1<<3)
 #define GPU_EXT_FRAMEBUFFERS_ENABLED (GPU_ext_config & GPU_EXT_FRAMEBUFFERS)
+#define GPU_EXT_MAPBUFFER (1<<4)
+#define GPU_EXT_MAPBUFFER_ENABLED (GPU_ext_config & GPU_EXT_MAPBUFFER)
 
 #ifdef GLES
 #define GPU_GLTYPE_FIXED_ENABLED (0)

Modified: branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_functions.h
===================================================================
--- branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_functions.h	2012-08-08 17:10:01 UTC (rev 49711)
+++ branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_functions.h	2012-08-08 17:26:13 UTC (rev 49712)
@@ -247,7 +247,12 @@
 GPUFUNC void (GLAPIENTRY* gpuBufferData)(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage);
 GPUFUNC void (GLAPIENTRY* gpuDeleteBuffers)(GLsizei  n, const GLuint * buffers);
 
+GPUFUNC void * (GLAPIENTRY* gpuMapBuffer)(GLenum target, GLenum access);
+GPUFUNC GLboolean (GLAPIENTRY* gpuUnmapBuffer)(GLenum  target);
 
+GPUFUNC void * (GLAPIENTRY* gpuBufferStartUpdate)(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage);
+GPUFUNC void (GLAPIENTRY* gpuBufferFinishUpdate)(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage);
+
 void GPU_func_comp_init(void);
 
 

Modified: branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_functions.c
===================================================================
--- branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_functions.c	2012-08-08 17:10:01 UTC (rev 49711)
+++ branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_functions.c	2012-08-08 17:26:13 UTC (rev 49712)
@@ -31,11 +31,15 @@
 
 #ifdef GLES
 #include <GLES2/gl2.h>
+#include <dlfcn.h>
 #endif
 
 #define GPU_FUNC_INTERN
 #define GIVE_ME_APIENTRY
 #include "GPU_functions.h"
+
+#include "GPU_extensions.h"
+
 #include REAL_GL_MODE
 
 #if GPU_SAFETY
@@ -120,8 +124,27 @@
 	gpuBindBuffer = glBindBufferARB;
 	gpuBufferData =  glBufferDataARB;
 	gpuDeleteBuffers = glDeleteBuffersARB;
+	
+	gpuMapBuffer = glMapBufferARB;
+	gpuUnmapBuffer = glUnmapBufferARB;
 }
 
+static void init_mapbuffers_standard()
+{
+	gpuMapBuffer = glMapBuffer;
+	gpuUnmapBuffer = glUnmapBuffer;
+}
+	
+	
+#else
+
+static void init_mapbuffers_oes(void *gllib)
+{
+	gpuMapBuffer = dlsym(gllib, "glMapBufferOES");
+	gpuUnmapBuffer = dlsym(gllib, "glUnmapBufferOES");
+}
+
+
 #endif
 
 static void check_glGetShaderiv(GLuint shader, GLuint pname, GLint *params)
@@ -211,16 +234,44 @@
 
 #endif
 
+static void * gpuBufferStartUpdate_buffer(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage)
+{
+	gpuBufferData(target, 0, NULL, usage);
+	return data;
+}
 
+static void * gpuBufferStartUpdate_map(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage)
+{
+	gpuBufferData(target, size, NULL, usage);
+	return gpuMapBuffer(target, GL_WRITE_ONLY);
+}
 
+static void gpuBufferFinishUpdate_buffer(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage)
+{
+	gpuBufferData(target, size, data, usage);
+
+}
+
+static void gpuBufferFinishUpdate_map(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage)
+{
+	gpuUnmapBuffer(target);
+
+}
+
 void GPU_func_comp_init(void)
 {
 #ifdef GLES
 
+	void * gllib = dlopen("libGLESv2.so", RTLD_LAZY);
+
 	init_glsl_standard();
 	init_framebuffers_standard();
+	
 	init_buffers_standard();
+	init_mapbuffers_oes(gllib);
 	
+	dlclose(gllib);
+	
 #else
 	/*	Here we rely on GLEW
 	We expect all symbols be present, even if they are only 0,
@@ -228,7 +279,10 @@
 	*/
 
 	if(GLEW_VERSION_1_5)
+	{
 		init_buffers_standard();
+		init_mapbuffers_standard();
+	}
 	else
 		init_buffers_arb();
 
@@ -242,4 +296,15 @@
 	else
 		init_framebuffers_ext();
 #endif
+	if(gpuMapBuffer!=NULL)
+	{
+		GPU_ext_config|=GPU_EXT_MAPBUFFER;
+		gpuBufferStartUpdate = gpuBufferStartUpdate_map;
+		gpuBufferFinishUpdate = gpuBufferFinishUpdate_map;		
+	} else
+	{
+		gpuBufferStartUpdate = gpuBufferStartUpdate_buffer;
+		gpuBufferFinishUpdate = gpuBufferFinishUpdate_buffer;		
+	
+	}
 }

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-08 17:10:01 UTC (rev 49711)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.cpp	2012-08-08 17:26:13 UTC (rev 49712)
@@ -31,6 +31,7 @@
 #include "RAS_MeshObject.h"
 
 #include "GPU_compatibility.h"
+#include REAL_GL_MODE /* GPU_compatibility.h includes intern/gpu_immediate_inline.h which includes fake glew.h. We need to switch to real mode due to glDraw. Should be removed soon.*/
 #include "GPU_extensions.h"
 
 #include "GPU_object.h"
@@ -55,6 +56,8 @@
 	// Generate Buffers
 	gpuGenBuffers(1, &this->ibo);
 	gpuGenBuffers(1, &this->vbo_id);
+	
+	this->vbo = GPU_EXT_MAPBUFFER_ENABLED ? NULL : new GLfloat[this->stride*this->size];
 
 	// Fill the buffers with initial data
 	UpdateIndices();
@@ -72,6 +75,8 @@
 {
 	gpuDeleteBuffers(1, &this->ibo);
 	gpuDeleteBuffers(1, &this->vbo_id);
+	
+	delete this->vbo;
 }
 
 void VBO::UpdateData()
@@ -79,11 +84,9 @@
 	unsigned int i, j, k;
 	
 	gpuBindBuffer(GL_ARRAY_BUFFER, this->vbo_id);
-	gpuBufferData(GL_ARRAY_BUFFER, this->stride*this->size, NULL, GL_STATIC_DRAW);
-
-	// Map the buffer
-	GLfloat *vbo_map = (GLfloat*)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
-
+	
+	// Map the buffer or frees previous
+	GLfloat *vbo_map = (GLfloat*)gpuBufferStartUpdate(GL_ARRAY_BUFFER, this->stride*this->size, vbo, GL_DYNAMIC_DRAW);
 	// Gather data
 	for (i = 0, j = 0; i < data->m_vertex.size(); i++, j += this->stride/sizeof(GLfloat))
 	{
@@ -95,8 +98,7 @@
 		for (k = 0; k < RAS_TexVert::MAX_UNIT; k++)
 			memcpy(&vbo_map[j+11+(k*2)], data->m_vertex[i].getUV(k), sizeof(float)*2);
 	}
-	
-	glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
+	gpuBufferFinishUpdate(GL_ARRAY_BUFFER, this->stride*this->size, vbo, GL_DYNAMIC_DRAW);
 }
 
 void VBO::UpdateIndices()
@@ -105,7 +107,7 @@
 	gpuBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->ibo);
 
 	// Upload Data to VBO
-	gpuBufferData(GL_ELEMENT_ARRAY_BUFFER, space, &data->m_index[0], GL_STATIC_DRAW);
+	gpuBufferData(GL_ELEMENT_ARRAY_BUFFER, space, &data->m_index[0], GL_DYNAMIC_DRAW);
 }
 
 void VBO::Draw(int texco_num, RAS_IRasterizer::TexCoGen* texco, int attrib_num, RAS_IRasterizer::TexCoGen* attrib, bool multi)
@@ -190,6 +192,7 @@
 			}
 		}
 	}	
+	
 	glDrawElements(this->mode, this->indices, GL_UNSIGNED_SHORT, 0);
 	
 	gpugameobj.gpuCleanupAfterDraw();

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-08 17:10:01 UTC (rev 49711)
+++ branches/soc-2012-swiss_cheese/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.h	2012-08-08 17:26:13 UTC (rev 49712)
@@ -55,6 +55,7 @@
 	GLenum			mode;
 	GLuint			ibo;
 	GLuint			vbo_id;
+	GLfloat*		vbo;
 
 	void*			vertex_offset;
 	void*			normal_offset;




More information about the Bf-blender-cvs mailing list