[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