[Bf-blender-cvs] [86f21ba] temp_viewport_fx_merge: Refactoring to make stub for vertex interface redundant.
Antony Riakiotakis
noreply at git.blender.org
Wed Mar 18 20:03:35 CET 2015
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. @@
More information about the Bf-blender-cvs
mailing list