[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