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) {


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to