[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