[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20570] branches/bb_dev/source/blender/gpu : Further overhead reduction in the rasterizer.

Benoit Bolsee benoit.bolsee at online.be
Tue Jun 2 00:07:48 CEST 2009


Revision: 20570
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20570
Author:   ben2610
Date:     2009-06-02 00:07:46 +0200 (Tue, 02 Jun 2009)

Log Message:
-----------
Further overhead reduction in the rasterizer. Use array rather then linked link for dynamic shader input, avoid unnecessary call to GPU_print_error. Fix compilation problem in the player.

Modified Paths:
--------------
    branches/bb_dev/source/blender/gpu/GPU_extensions.h
    branches/bb_dev/source/blender/gpu/intern/gpu_codegen.c
    branches/bb_dev/source/blender/gpu/intern/gpu_extensions.c
    branches/bb_dev/source/blender/gpu/intern/gpu_material.c

Modified: branches/bb_dev/source/blender/gpu/GPU_extensions.h
===================================================================
--- branches/bb_dev/source/blender/gpu/GPU_extensions.h	2009-06-01 21:38:03 UTC (rev 20569)
+++ branches/bb_dev/source/blender/gpu/GPU_extensions.h	2009-06-01 22:07:46 UTC (rev 20570)
@@ -55,7 +55,9 @@
 void GPU_extensions_init(void); /* call this before running any of the functions below */
 void GPU_extensions_exit(void);
 int GPU_extensions_minimum_support(void);
-int GPU_print_error(char *str);
+int GPU_print_error_intern(char *str);
+#define GPU_print_error(str)	\
+	if (G.f & G_DEBUG) GPU_print_error_intern(str)
 
 /* GPU Texture
    - always returns unsigned char RGBA textures

Modified: branches/bb_dev/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/bb_dev/source/blender/gpu/intern/gpu_codegen.c	2009-06-01 21:38:03 UTC (rev 20569)
+++ branches/bb_dev/source/blender/gpu/intern/gpu_codegen.c	2009-06-01 22:07:46 UTC (rev 20570)
@@ -158,12 +158,22 @@
 	GPUBuiltin builtin;		/* builtin uniform */
 } GPUInput;
 
+/* simplified structure for dynamic vector */
+typedef struct GPUDynInput
+{	
+	int shaderloc;
+	int type;
+	float *dynamicvec;
+} GPUDynInput;
+
 struct GPUPass {
 	struct GPUPass *next, *prev;
 
 	ListBase inputs;
 	struct GPUOutput *output;
 	struct GPUShader *shader;
+	GPUDynInput *dyninputs;
+	int numdyninputs;
 };
 
 /* Strings utility */
@@ -774,8 +784,9 @@
 	GPUShader *shader = pass->shader;
 	GPUNode *node;
 	GPUInput *next, *input;
+	GPUDynInput *dyninput;
 	ListBase *inputs = &pass->inputs;
-	int extract, z;
+	int extract, z, dyncount;
 
 	memset(inputs, 0, sizeof(*inputs));
 
@@ -783,7 +794,7 @@
 		return;
 
 	GPU_shader_bind(shader);
-
+	dyncount = 0;
 	for (node=nodes->first; node; node=node->next) {
 		z = 0;
 		for (input=node->inputs.first; input; input=next, z++) {
@@ -817,11 +828,25 @@
 			if(extract) {
 				BLI_remlink(&node->inputs, input);
 				BLI_addtail(inputs, input);
+				if (!(input->ima || input->tex))
+					dyncount++;
 			}
 		}
 	}
-
-	GPU_shader_unbind(shader);
+	// let's implement an accelaration structure for the material dynamic inputs: they
+	// are scanned very frequently and it's better to put them in a contigous array
+	if (dyncount) {
+		pass->dyninputs = MEM_callocN(sizeof(GPUDynInput)*dyncount, "GPUDynInput");
+		pass->numdyninputs = dyncount;
+		for (dyninput=pass->dyninputs, input=inputs->first; input; input=input->next) {
+			if(!(input->ima || input->tex)) {
+				dyninput->shaderloc = input->shaderloc;
+				dyninput->type = input->type;
+				dyninput->dynamicvec = input->dynamicvec;
+				++dyninput;
+			}
+		}
+	}
 }
 
 void GPU_pass_bind(GPUPass *pass, double time)
@@ -849,18 +874,15 @@
 
 void GPU_pass_update_uniforms(GPUPass *pass)
 {
-	GPUInput *input;
 	GPUShader *shader = pass->shader;
-	ListBase *inputs = &pass->inputs;
+	GPUDynInput *input;
+	int i;
 
 	if (!shader)
 		return;
 
-	/* pass dynamic inputs to opengl, others were removed */
-	for (input=inputs->first; input; input=input->next)
-		if(!(input->ima || input->tex))
-			GPU_shader_uniform_vector(shader, input->shaderloc, input->type, 1,
-				input->dynamicvec);
+	for (i=pass->numdyninputs, input = pass->dyninputs; i>0; --i, ++input) 
+		GPU_shader_uniform_vector(shader, input->shaderloc, input->type, 1,	input->dynamicvec);
 }
 
 void GPU_pass_unbind(GPUPass *pass)
@@ -1442,6 +1464,8 @@
 {
 	GPU_shader_free(pass->shader);
 	GPU_inputs_free(&pass->inputs);
+	if (pass->dyninputs)
+		MEM_freeN(pass->dyninputs);
 	MEM_freeN(pass);
 }
 

Modified: branches/bb_dev/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/bb_dev/source/blender/gpu/intern/gpu_extensions.c	2009-06-01 21:38:03 UTC (rev 20569)
+++ branches/bb_dev/source/blender/gpu/intern/gpu_extensions.c	2009-06-01 22:07:46 UTC (rev 20570)
@@ -98,17 +98,14 @@
 	return !GG.extdisabled && GG.minimumsupport;
 }
 
-int GPU_print_error(char *str)
+int GPU_print_error_intern(char *str)
 {
 	GLenum errCode;
 
-	if (G.f & G_DEBUG) {
-		if ((errCode = glGetError()) != GL_NO_ERROR) {
-    	    fprintf(stderr, "%s opengl error: %s\n", str, gluErrorString(errCode));
-			return 1;
-		}
+	if ((errCode = glGetError()) != GL_NO_ERROR) {
+   	    fprintf(stderr, "%s opengl error: %s\n", str, gluErrorString(errCode));
+		return 1;
 	}
-
 	return 0;
 }
 

Modified: branches/bb_dev/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/bb_dev/source/blender/gpu/intern/gpu_material.c	2009-06-01 21:38:03 UTC (rev 20569)
+++ branches/bb_dev/source/blender/gpu/intern/gpu_material.c	2009-06-01 22:07:46 UTC (rev 20570)
@@ -58,8 +58,6 @@
 
 #include "BLI_arithb.h"
 #include "BLI_blenlib.h"
-/* for test_scriptpoin_but() */
-#include "butspace.h"
 
 #include "GPU_extensions.h"
 #include "GPU_material.h"
@@ -198,6 +196,20 @@
 	attribs->totlayer = b;
 }
 
+static Text *find_script(char *name)
+{
+	ID *id;
+	
+	id= G.main->text.first;
+	while(id) {
+		if( strcmp(name, id->name+2)==0 ) {
+			return (Text *)id;
+		}
+		id= id->next;
+	}
+	return NULL;
+}
+
 static int GPU_material_construct_end(GPUMaterial *material)
 {
 	if (material->outlink) {
@@ -218,7 +230,7 @@
 
 			if (fragshader) {
 				snprintf(name, 24, "%s.fg", material->ma->id.name+2);
-				test_scriptpoin_but(name, (ID **)&text);
+				text = find_script(name);
 				if (!text)
 					text = add_empty_text(name);
 				if (text) {
@@ -228,7 +240,7 @@
 			}
 			if (vertexshader) {
 				snprintf(name, 24, "%s.vx", material->ma->id.name+2);
-				test_scriptpoin_but(name, (ID **)&text);
+				text = find_script(name);
 				if (!text)
 					text = add_empty_text(name);
 				if (text) {





More information about the Bf-blender-cvs mailing list