Commit: 86f21ba17741f661989a3919d6575cf49def716c
Author: Antony Riakiotakis
Date:   Wed Mar 18 20:00:43 2015 +0100
Branches: temp_viewport_fx_merge
https://developer.blender.org/rB86f21ba17741f661989a3919d6575cf49def716c

Refactoring to make stub for vertex interface redundant.

===================================================================

M       source/blender/gpu/GPU_immediate.h
M       source/blender/gpu/intern/gpu_immediate.c
M       source/blender/gpu/intern/gpu_matrix.c
A       source/blender/gpu/intern/gpu_vertex_stream.c

===================================================================

diff --git a/source/blender/gpu/GPU_immediate.h 
b/source/blender/gpu/GPU_immediate.h
index 636b0a4..d335584 100644
--- a/source/blender/gpu/GPU_immediate.h
+++ b/source/blender/gpu/GPU_immediate.h
@@ -171,7 +171,7 @@ typedef struct GPUarrays {
 #define GPU_MAX_FLOAT_ATTRIBS 32
 #define GPU_MAX_UBYTE_ATTRIBS 32
 
-typedef struct GPUimmediateformat {
+typedef struct GPUImmediateFormat {
        GLint     vertexSize;
        GLint     normalSize;
        GLint     colorSize;
@@ -191,12 +191,12 @@ typedef struct GPUimmediateformat {
        GLuint    attribIndexMap_ub  [GPU_MAX_UBYTE_ATTRIBS];
        GLboolean attribNormalized_ub[GPU_MAX_UBYTE_ATTRIBS];
        size_t    attribCount_ub;
-} GPUimmediateformat;
+} GPUImmediateFormat;
 
 typedef struct GPUimmediate {
        GLenum mode;
 
-       GPUimmediateformat format;
+       GPUImmediateFormat format;
 
        GLfloat vertex[4];
        GLfloat normal[3];
@@ -206,7 +206,7 @@ typedef struct GPUimmediate {
        GLubyte attrib_ub[GPU_MAX_UBYTE_ATTRIBS][4];
 
        GLubyte *mappedBuffer;
-       void *bufferData;
+       void *vertex_stream;
        GLsizei stride;
        size_t  offset;
        GLsizei maxVertexCount;
@@ -231,8 +231,6 @@ GPUimmediate* gpuNewImmediate(void);
 void gpuImmediateMakeCurrent(GPUimmediate *immediate);
 void gpuDeleteImmediate(GPUimmediate *immediate);
 
-
-
 void gpuPushImmediate(void);
 GPUimmediate* gpuPopImmediate(void);
 void gpuImmediateSingleDraw(GLenum mode, GPUimmediate *immediate);
diff --git a/source/blender/gpu/intern/gpu_immediate.c 
b/source/blender/gpu/intern/gpu_immediate.c
index bcc941d..cc0415d 100644
--- a/source/blender/gpu/intern/gpu_immediate.c
+++ b/source/blender/gpu/intern/gpu_immediate.c
@@ -42,7 +42,51 @@
 /* standard */
 #include <string.h>
 
-#define ALIGN64(p) (((p) + 63) & ~63)
+#define ALIGN64(p) ((((uintptr_t)p) + 63) & ~63)
+
+typedef struct GPUVertexStream {
+       /* type of stream (array buffer/element array buffer) */
+       int type;
+
+       /* size of buffer */
+       size_t size;
+
+       /* bind buffers to their attribute slots */
+       void (*bind)(struct GPUVertexStream *);
+       /* unbind the buffers from their attribute slots */
+       void (*unbind)(struct GPUVertexStream *);
+
+       /* map the buffer - will give pointer to user that can be used to
+        * fill the buffer. Pointer will be placed in mappedBuffer */
+       GLubyte * (*map) (struct GPUVertexStream *);
+       void (*unmap) (struct GPUVertexStream *);
+
+       void (*realloc)(struct GPUVertexStream *stream, size_t newsize);
+       void (*free) (struct GPUVertexStream *stream);
+} GPUVertexStream;
+
+typedef struct GPUVertexBufferStream {
+       GPUVertexStream stream;
+       GLuint vbo;
+} GPUVertexBufferStream;
+
+typedef struct GPUVertexArrayStream {
+       GPUVertexBufferStream vstream;
+       GLuint vao;
+} GPUVertexArrayStream;
+
+typedef struct GPURAMArrayStream {
+       GPUVertexStream stream;
+       void *unalignedPtr;
+       GLubyte* unmappedBuffer;
+} GPURAMArrayStream;
+
+enum StreamTypes {
+       eStreamTypeVertexArray = 0,
+       eStreamTypeRAM,
+       eStreamTypeVertexBuffer,
+};
+
 
 typedef struct bufferDataGLSL {
        size_t   size;
@@ -53,10 +97,135 @@ typedef struct bufferDataGLSL {
        GLubyte* unmappedBuffer;
 } bufferDataGLSL;
 
+static void realloc_stream_ram(GPUVertexStream *stream, size_t newsize)
+{
+       if (newsize > stream->size) {
+               GPURAMArrayStream *ram_stream = (GPURAMArrayStream *)stream;
+               if (ram_stream->unalignedPtr != 0) {
+                       ram_stream->unalignedPtr   = 
MEM_reallocN((GLubyte*)(ram_stream->unalignedPtr), newsize+63);
+                       ram_stream->unmappedBuffer = 
(GLubyte*)ALIGN64(ram_stream->unalignedPtr);
+                       stream->size = newsize;
+               }
+       }
+}
+
+static void realloc_stream_vbuffer(GPUVertexStream *stream, size_t newsize)
+{
+       if (newsize > stream->size) {
+               GPUVertexBufferStream * va_stream = (GPUVertexBufferStream 
*)stream;
+               glBindBuffer(stream->type, va_stream->vbo);
+               glBufferData(stream->type, newsize, NULL, GL_STREAM_DRAW);
+               stream->size = newsize;
+       }
+}
+
+static GLubyte *map_stream_ram(GPUVertexStream *stream)
+{
+       GPURAMArrayStream *ram_stream = (GPURAMArrayStream *)stream;
+       return ram_stream->unmappedBuffer;
+}
+
+static GLubyte *map_stream_vbuffer(GPUVertexStream *stream)
+{
+       GPUVertexBufferStream * va_stream = (GPUVertexBufferStream *)stream;
+       glBindBuffer(stream->type, va_stream->vbo);
+       return glMapBufferARB(stream->type, GL_WRITE_ONLY);
+}
+
+static void unmap_stream_ram(GPUVertexStream *UNUSED(stream))
+{
+}
+
+static void unmap_stream_vbuffer(GPUVertexStream *stream)
+{
+       GPUVertexBufferStream * va_stream = (GPUVertexBufferStream *)stream;
+       glBindBuffer(stream->type, va_stream->vbo);
+       glUnmapBufferARB(stream->type);
+}
+
+static void free_stream_ram(GPUVertexStream *stream)
+{
+       GPURAMArrayStream *ram_stream = (GPURAMArrayStream *)stream;
+       if (ram_stream->unalignedPtr)
+               MEM_freeN(ram_stream->unalignedPtr);
+       MEM_freeN(stream);
+}
+
+static void free_stream_varray(GPUVertexStream *stream)
+{
+       GPUVertexArrayStream * va_stream = (GPUVertexArrayStream *)stream;
+       if (va_stream->vao != 0)
+               glDeleteVertexArrays(1, &va_stream->vao);
+
+       if (va_stream->vstream.vbo != 0)
+               glDeleteBuffers(1, &va_stream->vstream.vbo);
+
+       MEM_freeN(stream);
+}
+
+static void free_stream_vbuffer(GPUVertexStream *stream)
+{
+       GPUVertexBufferStream * va_stream = (GPUVertexBufferStream *)stream;
+
+       if (va_stream->vbo != 0)
+               glDeleteBuffers(1, &va_stream->vbo);
+
+       MEM_freeN(stream);
+}
+
+
+static GPUVertexStream * gpu_new_vertex_stream(enum StreamTypes type, int 
array_type)
+{
+       GPUVertexStream *ret;
+       switch (type) {
+               case eStreamTypeVertexArray:
+               {
+                       GPUVertexArrayStream *stream = 
MEM_callocN(sizeof(GPUVertexArrayStream), "GPUVertexArrayStream");
+                       ret = &stream->vstream.stream;
+                       ret->realloc = realloc_stream_vbuffer;
+                       ret->map = map_stream_vbuffer;
+                       ret->unmap = unmap_stream_vbuffer;
+                       ret->free = free_stream_varray;
+                       break;
+               }
+
+               case eStreamTypeRAM:
+               {
+                       GPURAMArrayStream *stream = 
MEM_callocN(sizeof(GPURAMArrayStream), "GPURAMArrayStream");
+                       ret = &stream->stream;
+                       ret->realloc = realloc_stream_ram;
+                       ret->map = map_stream_ram;
+                       ret->unmap = unmap_stream_ram;
+                       ret->free = free_stream_ram;
+                       break;
+               }
+
+               case eStreamTypeVertexBuffer:
+               {
+                       GPUVertexBufferStream *stream = 
MEM_callocN(sizeof(GPUVertexBufferStream), "GPUVertexBufferStream");
+                       ret = &stream->stream;
+                       ret->realloc = realloc_stream_vbuffer;
+                       ret->map = map_stream_vbuffer;
+                       ret->unmap = unmap_stream_vbuffer;
+                       ret->free = free_stream_vbuffer;
+                       break;
+               }
+
+               default:
+                       return NULL;
+       }
+
+       if (ret) {
+               ret->type = array_type;
+       }
+
+       return NULL;
+}
+
 static GLsizei calc_stride(void)
 {
        size_t              stride = 0;
-       GPUimmediateformat* format = &(GPU_IMMEDIATE->format);
+       GPUImmediateFormat* format = &(GPU_IMMEDIATE->format);
        size_t i;
 
        /* vertex */
@@ -96,23 +265,10 @@ static void allocate(void)
 
        newSize = (size_t)(GPU_IMMEDIATE->stride * 
GPU_IMMEDIATE->maxVertexCount);
 
-       if (GPU_IMMEDIATE->bufferData) {
-               bufferDataGLSL* bufferData = 
(bufferDataGLSL*)GPU_IMMEDIATE->bufferData;
+       if (GPU_IMMEDIATE->vertex_stream) {
+               GPUVertexStream* vertex_stream = 
(GPUVertexStream*)GPU_IMMEDIATE->vertex_stream;
 
-               if (bufferData->vbo != 0)
-                       glBindBuffer(GL_ARRAY_BUFFER, bufferData->vbo);
-
-               if (newSize > bufferData->size) {
-                       if (bufferData->vbo != 0)
-                               glBufferData(GL_ARRAY_BUFFER, newSize, NULL, 
GL_STREAM_DRAW);
-
-                       if (bufferData->unalignedPtr != 0) {
-                               bufferData->unalignedPtr   = 
(GLintptr)MEM_reallocN((GLubyte*)(bufferData->unalignedPtr), newSize+63);
-                               bufferData->unmappedBuffer = 
(GLubyte*)ALIGN64(bufferData->unalignedPtr);
-                       }
-
-                       bufferData->size = newSize;
-               }
+               vertex_stream->realloc(vertex_stream, newSize);
        }
        else {
                bufferDataGLSL* bufferData = 
(bufferDataGLSL*)MEM_callocN(sizeof(bufferDataGLSL), "bufferDataGLSL");
@@ -133,7 +289,7 @@ static void allocate(void)
 
                bufferData->size = newSize;
 
-               GPU_IMMEDIATE->bufferData = bufferData;
+               GPU_IMMEDIATE->vertex_stream = bufferData;
        }
 
        GPU_ASSERT_NO_GL_ERRORS("allocate end");
@@ -143,9 +299,9 @@ static void allocate(void)
 
 static void setup(void)
 {
-       GPUimmediateformat* format     = &(GPU_IMMEDIATE->format);
+       GPUImmediateFormat* format     = &(GPU_IMMEDIATE->format);
        const GLsizei       stride     = GPU_IMMEDIATE->stride;
-       bufferDataGLSL*     bufferData = 
(bufferDataGLSL*)(GPU_IMMEDIATE->bufferData);
+       bufferDataGLSL*     bufferData = 
(bufferDataGLSL*)(GPU_IMMEDIATE->vertex_stream);
        const GLubyte*      base       = bufferData->vbo != 0 ? NULL : 
(GLubyte*)(bufferData->unmappedBuffer);
 
        size_t offset = 0;
@@ -449,7 +605,7 @@ void gpu_lock_buffer_gl(void)
        allocateIndex();
 
        if (GLEW_ARB_vertex_buffer_object) {
-               bufferDataGLSL* bufferData = 
(bufferDataGLSL*)(GPU_IMMEDIATE->bufferData);
+               bufferDataGLSL* bufferData = 
(bufferDataGLSL*)(GPU_IMMEDIATE->vertex_stream);
                bool do_init = (bufferData->vao == 0);
 
                if (do_init)
@@ -469,28 +625,21 @@ void gpu_lock_buffer_gl(void)
 
 void gpu_begin_buffer_gl(void)
 {
-       bufferDataGLSL* bufferData = 
(bufferDataGLSL*)(GPU_IMMEDIATE->bufferData);
-
-       bufferData->mappedBuffer =
-               (GLubyte*)gpu_buffer_start_update(GL_ARRAY_BUFFER, 
bufferData->unmappedBuffer);
+       GPUVertexStream* stream = 
(GPUVertexStream*)(GPU_IMMEDIATE->vertex_stream);
 
-       GPU_IMMEDIATE->mappedBuffer = bufferData->mappedBuffer;
+       GPU_IMMEDIATE->mappedBuffer = stream->map(stream);
 }
 
 
 
 void gpu_end_buffer_gl(void)
 {
-       bufferDataGLSL* bufferData = 
(bufferDataGLSL*)(GPU_IMMEDIATE->bufferData);
+       GPUVertexStream* stream = 
(GPUVertexStream*)(GPU_IMMEDIATE->vertex_stream);
 
        GPU_ASSERT_NO_GL_ERRORS("gpu_end_buffer_gl start");
 
-       if (bufferData->mappedBuffer != NULL) {
-               gpu_buffer_finish_update(GL_ARRAY_BUFFER, 
GPU_IMMEDIATE->offset, bufferData->mappedBuffer);
-
-               bufferData->mappedBuffer = NULL;
-               GPU_IMMEDIATE->mappedBuffer = NULL;
-       }
+       stream->unmap(stream);
+       GPU_IMMEDIATE->mappedBuffer = NULL;
 
        if (!(GPU_IMMEDIATE->mode == GL_NOOP || GPU_IMMEDIATE->count == 0)) {
                if (!GPU_commit_aspect())
@@ -539,7 +688,7 @@ void gpu_end_buffer_gl(void)
 
 void gpu_unlock_buffer_gl(void)
 {
-       bufferDataGLSL* bufferData = 
(bufferDataGLSL*)(GPU_IMMEDIATE->bufferData);
+       bufferDataGLSL* bufferData = 
(bufferDataGLSL*)(GPU_IMMEDIATE->vertex_stream);
 
        if (bufferData->vao != 0)
                glBi

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to