[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46990] branches/soc-2012-swiss_cheese/ source/blender/gpu: Optimization (after Profiling), and refactoring of gpuImmediate.

Jason Wilkins Jason.A.Wilkins at gmail.com
Fri May 25 03:26:25 CEST 2012


Revision: 46990
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46990
Author:   jwilkins
Date:     2012-05-25 01:26:20 +0000 (Fri, 25 May 2012)
Log Message:
-----------
Optimization (after Profiling), and refactoring of gpuImmediate.

Added gpuImmediateLock/gpuImmediateUnlock so that gpuBegin/gpuEnd have less to do so it is faster to send multiple batches.

Profiled the code using the text renderer as a pathological case.

Modified Paths:
--------------
    branches/soc-2012-swiss_cheese/source/blender/gpu/CMakeLists.txt
    branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_compatibility.h
    branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_immediate.c

Added Paths:
-----------
    branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_immediate.h
    branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_immediate_gl11.c
    branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_immediate_inline.h
    branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_immediate_internal.h
    branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_immediate_vbo.c

Removed Paths:
-------------
    branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_immediate.h

Modified: branches/soc-2012-swiss_cheese/source/blender/gpu/CMakeLists.txt
===================================================================
--- branches/soc-2012-swiss_cheese/source/blender/gpu/CMakeLists.txt	2012-05-24 23:50:20 UTC (rev 46989)
+++ branches/soc-2012-swiss_cheese/source/blender/gpu/CMakeLists.txt	2012-05-25 01:26:20 UTC (rev 46990)
@@ -50,6 +50,8 @@
 	intern/gpu_draw.c
 	intern/gpu_extensions.c
 	intern/gpu_immediate.c
+	intern/gpu_immediate_gl11.c
+	intern/gpu_immediate_vbo.c
 	intern/gpu_material.c
 	
 	shaders/gpu_shader_material.glsl.c
@@ -67,6 +69,8 @@
 	intern/gpu_codegen.h
 	intern/gpu_deprecated.h
 	intern/gpu_immediate.h
+	intern/gpu_immediate_inline.h
+	intern/gpu_immediate_internal.h
 )
 
 if(WITH_MOD_SMOKE)

Modified: branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_compatibility.h
===================================================================
--- branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_compatibility.h	2012-05-24 23:50:20 UTC (rev 46989)
+++ branches/soc-2012-swiss_cheese/source/blender/gpu/GPU_compatibility.h	2012-05-25 01:26:20 UTC (rev 46990)
@@ -32,7 +32,7 @@
 #ifndef __GPU_COMPATIBILITY_H__
 #define __GPU_COMPATIBILITY_H__
 
-#include "intern/gpu_immediate.h"
+#include "intern/gpu_immediate_inline.h"
 #include "intern/gpu_deprecated.h"
 
 #ifdef __cplusplus

Modified: branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_immediate.c
===================================================================
--- branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_immediate.c	2012-05-24 23:50:20 UTC (rev 46989)
+++ branches/soc-2012-swiss_cheese/source/blender/gpu/intern/gpu_immediate.c	2012-05-25 01:26:20 UTC (rev 46990)
@@ -29,66 +29,60 @@
 *  \ingroup gpu
 */
 
-#include "GPU_immediate.h"
+#include "GPU_immediate_internal.h"
 
 #include "MEM_guardedalloc.h"
 
 
 
+
 /* global symbol needed because the immediate drawing functons are inline */
 GPUimmediate* GPU_IMMEDIATE;
 
 
 
-static GLsizei calcStride()
+GLsizei gpu_calc_stride()
 {
 	size_t i;
 	size_t stride = 0;
 
 	/* vertex */
 
-	if (GPU_IMMEDIATE->vertexSize > 0) {
+	if (GPU_IMMEDIATE->vertexSize != 0) {
 		stride += (size_t)(GPU_IMMEDIATE->vertexSize) * sizeof(GLfloat);
 	}
 
 	/* normal */
 
-	if (GPU_IMMEDIATE->normalSize == 3) {
+	if (GPU_IMMEDIATE->normalSize != 0) {
+		/* normals always have 3 components */
 		stride += 3 * sizeof(GLfloat);
 	}
 
 	/* color */
 
-	if (GPU_IMMEDIATE->colorSize > 0) {
-		/* 4 bytes are always reserved for color, for efficient memory alignment */
-		stride += 4 * sizeof(GLubyte);
+	if (GPU_IMMEDIATE->colorSize != 0) {
+		/* color always get 4 bytes for efficient memory alignment */
+		stride += 4;
 	}
 
 	/* texture coordinate */
 
 	for (i = 0; i < GPU_IMMEDIATE->textureUnitCount; i++) {
-		if (GPU_IMMEDIATE->texCoordSize[i] > 0) {
-			stride +=
-				(size_t)(GPU_IMMEDIATE->texCoordSize[i]) * sizeof(GLfloat);
-		}
+		stride += (size_t)(GPU_IMMEDIATE->texCoordSize[i]) * sizeof(GLfloat);
 	}
 
 	/* float vertex attribute */
 
 	for (i = 0; i < GPU_IMMEDIATE->attribCount_f; i++) {
-		if (GPU_IMMEDIATE->attribSize_f[i] > 0) {
-			stride +=
-				(size_t)(GPU_IMMEDIATE->attribSize_f[i]) * sizeof(GLfloat);
-		}
+		stride += (size_t)(GPU_IMMEDIATE->attribSize_f[i]) * sizeof(GLfloat);
 	}
 
 	/* byte vertex attribute */
 
 	for (i = 0; i < GPU_IMMEDIATE->attribCount_ub; i++) {
-		if (GPU_IMMEDIATE->attribSize_ub[i] > 0) {
-			stride +=
-				(size_t)(GPU_IMMEDIATE->attribSize_ub[i]) * sizeof(GLfloat);
-		}
+		/* byte attributes always get 4 bytes for efficient memory alignment */
+		stride += (size_t)(GPU_IMMEDIATE->attribSize_ub[i]) * sizeof(GLfloat);
 	}
 
 	return (GLsizei)stride;
@@ -96,252 +90,58 @@
 
 
 
-typedef struct bufferDataVBO {
-	GLint bufferObject;
-} bufferDataVBO;
-
-void beginBufferVBO(void)
+void gpuImmediateLock(void)
 {
-}
+	GPU_CHECK_NO_BEGIN();
 
-void endBufferVBO(void)
-{
-}
+	if (GPU_IMMEDIATE->lockCount == 0) {
+		assert(GPU_IMMEDIATE->lockBuffer);
 
-void shutdownBufferVBO(GPUimmediate *restrict immediate)
-{
-}
-
-
-
-typedef struct bufferDataGL11 {
-	size_t   size;
-	GLubyte* ptr;
-	GLsizei stride;
-} bufferDataGL11;
-
-void beginBufferGL11(void)
-{
-	const GLsizei stride = calcStride();
-	bufferDataGL11* bufferData;
-	size_t newSize;
-	size_t offset;
-	GLint savedActiveTexture;
-	size_t i;
-
-	newSize = (size_t)(stride * GPU_IMMEDIATE->maxVertexCount);
-
-	if (GPU_IMMEDIATE->bufferData) {
-		bufferData = (bufferDataGL11*)(GPU_IMMEDIATE->bufferData);
-
-		if (newSize > bufferData->size) {
-			MEM_reallocN(bufferData->ptr, newSize);
-			bufferData->size = newSize;
+		if (GPU_IMMEDIATE->lockBuffer) {
+			GPU_IMMEDIATE->lockBuffer();
 		}
 	}
-	else {
-		bufferData =
-			(bufferDataGL11*)MEM_mallocN(
-				sizeof(bufferDataGL11),
-				"bufferDataGL11");
 
-		assert(bufferData);
+	GPU_IMMEDIATE->lockCount++;
+}
 
-		bufferData->ptr = MEM_mallocN(newSize, "bufferDataGL11->ptr");
-		assert(bufferData->ptr);
 
-		bufferData->size = newSize;
-	}
 
-	bufferData->stride = stride;
+void gpuImmediateUnlock(void)
+{
+	GPU_CHECK_NO_BEGIN();
 
-	/* Assume that vertex arrays have been disabled for everything
-	   and only enable what is needed */
+	assert(GPU_IMMEDIATE->lockCount > 0);
 
-	offset = 0;
+	if (GPU_IMMEDIATE->lockCount == 1) {
+		assert(GPU_IMMEDIATE->unlockBuffer);
 
-	/* vertex */
-
-	glVertexPointer(
-		GPU_IMMEDIATE->vertexSize,
-		GL_FLOAT,
-		stride,
-		bufferData->ptr + offset);
-
-	offset += (size_t)(GPU_IMMEDIATE->vertexSize) * sizeof(GLfloat);
-
-	glEnableClientState(GL_VERTEX_ARRAY);
-
-	/* normal */
-
-	if (GPU_IMMEDIATE->normalSize == 3) {
-		glNormalPointer(
-			GL_FLOAT,
-			stride,
-			bufferData->ptr + offset);
-
-		offset += 3 * sizeof(GLfloat);
-
-		glEnableClientState(GL_NORMAL_ARRAY);
-	}
-
-	/* color */
-
-	if (GPU_IMMEDIATE->colorSize > 0) {
-		glColorPointer(
-			GPU_IMMEDIATE->colorSize,
-			GL_UNSIGNED_BYTE,
-			stride,
-			bufferData->ptr + offset);
-
-		/* 4 bytes are always reserved for color, for efficient memory alignment */
-		offset += 4 * sizeof(GLubyte);
-
-		glEnableClientState(GL_COLOR_ARRAY);
-	}
-
-	/* texture coordinate */
-
-	glGetIntegerv(GL_ACTIVE_TEXTURE, &savedActiveTexture);
-
-	for (i = 0; i < GPU_IMMEDIATE->textureUnitCount; i++) {
-		if (GPU_IMMEDIATE->texCoordSize[i] > 0) {
-			glActiveTexture(GPU_IMMEDIATE->textureUnitMap[i]);
-
-			glTexCoordPointer(
-				GPU_IMMEDIATE->texCoordSize[i],
-				GL_FLOAT,
-				stride,
-				bufferData->ptr + offset);
-
-			offset +=
-				(size_t)(GPU_IMMEDIATE->texCoordSize[i]) * sizeof(GLfloat);
-
-			glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+		if (GPU_IMMEDIATE->unlockBuffer) {
+			GPU_IMMEDIATE->unlockBuffer();
 		}
 	}
 
-	glActiveTexture(savedActiveTexture);
-
-	/* float vertex attribute */
-
-	for (i = 0; i < GPU_IMMEDIATE->attribCount_f; i++) {
-		if (GPU_IMMEDIATE->attribSize_f[i] > 0) {
-			glVertexAttribPointer(
-				GPU_IMMEDIATE->attribIndexMap_f[i],
-				GPU_IMMEDIATE->attribSize_f[i],
-				GL_FLOAT,
-				GPU_IMMEDIATE->attribNormalized_f[i],
-				stride,
-				bufferData->ptr + offset);
-
-			offset +=
-				(size_t)(GPU_IMMEDIATE->attribSize_f[i]) * sizeof(GLfloat);
-
-			glEnableVertexAttribArray(
-				GPU_IMMEDIATE->attribIndexMap_f[i]);
-		}
+	if (GPU_IMMEDIATE->lockCount > 0) {
+		GPU_IMMEDIATE->lockCount--;
 	}
+}
 
-	/* byte vertex attribute */
 
-	for (i = 0; i < GPU_IMMEDIATE->attribCount_ub; i++) {
-		if (GPU_IMMEDIATE->attribSize_ub[i] > 0) {
-			glVertexAttribPointer(
-				GPU_IMMEDIATE->attribIndexMap_ub[i],
-				GPU_IMMEDIATE->attribSize_ub[i],
-				GL_FLOAT,
-				GPU_IMMEDIATE->attribNormalized_ub[i],
-				stride,
-				bufferData->ptr + offset);
 
-			offset +=
-				(size_t)(GPU_IMMEDIATE->attribSize_ub[i]) * sizeof(GLfloat);
-
-			glEnableVertexAttribArray(
-				GPU_IMMEDIATE->attribIndexMap_ub[i]);
-		}
-	}
-
-	GPU_IMMEDIATE->buffer     = bufferData->ptr;
-	GPU_IMMEDIATE->bufferData = bufferData;
-}
-
-void endBufferGL11(void)
+GLboolean gpuImmediateIsLocked(void)
 {
-	GLint savedActiveTexture;
-	size_t i;
+	assert(GPU_IMMEDIATE);
 
-	glDrawArrays(GPU_IMMEDIATE->mode, 0, GPU_IMMEDIATE->count);
-
-	/* Disable any arrays that were used so that everything is off again. */
-
-	/* vertex */
-
-	glDisableClientState(GL_VERTEX_ARRAY);
-
-	/* normal */
-
-	if (GPU_IMMEDIATE->normalSize == 3) {
-		glDisableClientState(GL_NORMAL_ARRAY);
+	if (!GPU_IMMEDIATE) {
+		return GL_FALSE;
 	}
 
-	/* color */
-
-	if (GPU_IMMEDIATE->colorSize > 0) {
-		glDisableClientState(GL_COLOR_ARRAY);
-	}
-
-	/* texture coordinate */
-
-	glGetIntegerv(GL_ACTIVE_TEXTURE, &savedActiveTexture);
-
-	for (i = 0; i < GPU_IMMEDIATE->textureUnitCount; i++) {
-		if (GPU_IMMEDIATE->texCoordSize[i] > 0) {
-			glActiveTexture(GPU_IMMEDIATE->textureUnitMap[i]);
-			glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-		}
-	}
-
-	glActiveTexture(savedActiveTexture);
-
-	/* float vertex attribute */
-
-	for (i = 0; i < GPU_IMMEDIATE->attribCount_f; i++) {
-		if (GPU_IMMEDIATE->attribSize_f[i] > 0) {
-			glDisableVertexAttribArray(
-				GPU_IMMEDIATE->attribIndexMap_f[i]);
-		}
-	}
-
-	/* byte vertex attribute */
-
-	for (i = 0; i < GPU_IMMEDIATE->attribCount_ub; i++) {
-		if (GPU_IMMEDIATE->attribSize_ub[i] > 0) {
-			glDisableVertexAttribArray(
-				GPU_IMMEDIATE->attribIndexMap_ub[i]);
-		}
-	}
+	return GPU_IMMEDIATE->lockCount > 0;
 }
 
-void shutdownBufferGL11(GPUimmediate *restrict immediate)
-{
-	if (immediate->bufferData) {
-		bufferDataGL11* bufferData =
-			(bufferDataGL11*)(immediate->bufferData);
 
-		if (bufferData->ptr) {
-			MEM_freeN(bufferData->ptr);
-			bufferData->ptr = NULL;
-		}
 
-		MEM_freeN(immediate->bufferData);
-		immediate->bufferData = NULL;
-	}
-}
-
-
-static calcLastTexture(GPUimmediate* immediate)
+static void calc_last_texture(GPUimmediate* immediate)
 {
 	GLint maxTextureCoords;
 	GLint maxCombinedTextureImageUnits;
@@ -358,6 +158,8 @@
 		GL_TEXTURE0 + MAX2(maxTextureCoords, maxCombinedTextureImageUnits) - 1;
 }
 
+
+
 GPUimmediate* gpuNewImmediate(void)
 {
 	GPUimmediate* immediate =
@@ -368,28 +170,38 @@
 	immediate->vertexSize = 3;
 
 	//if (GLEW_ARB_vertex_buffer_object) {
-	//	immediate->beginBuffer    = beginBufferVBO;
-	//	immediate->endBuffer      = endBufferVBO;
-	//	immediate->shutdownBuffer = shutdownBufferVBO;
+	//	immediate->lockBuffer     = gpu_lock_buffer_vbo;
+	//	immediate->beginBuffer    = gpu_begin_buffer_vbo;
+	//	immediate->endBuffer      = gpu_end_buffer_vbo;
+	//	immediate->unlockBuffer   = gpu_unlock_buffer_vbo;
+	//	immediate->shutdownBuffer = gpu_shutdown_buffer_vbo;
 	//}
 	//else {
-		immediate->beginBuffer    = beginBufferGL11;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list