Fix again for the NVidia driver bug. This time I'm just giving up
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Fri, 19 Sep 2008 16:09:26 +0000 (16:09 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Fri, 19 Sep 2008 16:09:26 +0000 (16:09 +0000)
using linking together the precompiled library shader code and
material code and recompiling it all again for each material even
if it gives a performance hit, since the previous workaround only
worked on some driver versions still.

source/blender/gpu/GPU_extensions.h
source/blender/gpu/intern/gpu_codegen.c
source/blender/gpu/intern/gpu_extensions.c

index d3faa81ebb136cc8d23818894a9a45fb92cb7a8c..3813fe3da8ec8cb25fc5d002230ebb561ef1e5f4 100644 (file)
@@ -108,8 +108,8 @@ void GPU_framebuffer_restore();
    - only for fragment shaders now
    - must call texture bind before setting a texture as uniform! */
 
-GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, GPUShader *lib);
-GPUShader *GPU_shader_create_lib(const char *code);
+GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const char *libcode); /*GPUShader *lib);*/
+/*GPUShader *GPU_shader_create_lib(const char *code);*/
 void GPU_shader_free(GPUShader *shader);
 
 void GPU_shader_bind(GPUShader *shader);
index 78a99cab44719da3f231f690bed9e59b5d9a4d9a..1c29bdc8741d46772d8b5b816e76e4f068d7eb69 100644 (file)
@@ -188,8 +188,8 @@ static void BLI_dynstr_printf(DynStr *dynstr, const char *format, ...)
  * These are stored in a hash for lookup when creating a material. */
 
 static GHash *FUNCTION_HASH= NULL;
-static char *FUNCTION_PROTOTYPES= NULL;
-static GPUShader *FUNCTION_LIB= NULL;
+/*static char *FUNCTION_PROTOTYPES= NULL;
+static GPUShader *FUNCTION_LIB= NULL;*/
 
 static int gpu_str_prefix(char *str, char *prefix)
 {
@@ -299,6 +299,7 @@ static void gpu_parse_functions_string(GHash *hash, char *code)
        }
 }
 
+#if 0
 static char *gpu_generate_function_prototyps(GHash *hash)
 {
        DynStr *ds = BLI_dynstr_new();
@@ -346,14 +347,15 @@ static char *gpu_generate_function_prototyps(GHash *hash)
 
        return prototypes;
 }
+#endif
 
 GPUFunction *GPU_lookup_function(char *name)
 {
        if(!FUNCTION_HASH) {
                FUNCTION_HASH = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp);
                gpu_parse_functions_string(FUNCTION_HASH, datatoc_gpu_shader_material_glsl);
-               FUNCTION_PROTOTYPES = gpu_generate_function_prototyps(FUNCTION_HASH);
-               FUNCTION_LIB = GPU_shader_create_lib(datatoc_gpu_shader_material_glsl);
+               /*FUNCTION_PROTOTYPES = gpu_generate_function_prototyps(FUNCTION_HASH);
+               FUNCTION_LIB = GPU_shader_create_lib(datatoc_gpu_shader_material_glsl);*/
        }
 
        return (GPUFunction*)BLI_ghash_lookup(FUNCTION_HASH, name);
@@ -370,14 +372,14 @@ void GPU_extensions_exit(void)
                BLI_ghash_free(FUNCTION_HASH, NULL, (GHashValFreeFP)MEM_freeN);
                FUNCTION_HASH = NULL;
        }
-       if(FUNCTION_PROTOTYPES) {
+       /*if(FUNCTION_PROTOTYPES) {
                MEM_freeN(FUNCTION_PROTOTYPES);
                FUNCTION_PROTOTYPES = NULL;
-       }
-       if(FUNCTION_LIB) {
+       }*/
+       /*if(FUNCTION_LIB) {
                GPU_shader_free(FUNCTION_LIB);
                FUNCTION_LIB = NULL;
-       }
+       }*/
 }
 
 /* GLSL code generation */
@@ -688,7 +690,7 @@ static char *code_generate_fragment(ListBase *nodes, GPUOutput *output, const ch
        DynStr *ds = BLI_dynstr_new();
        char *code;
 
-       BLI_dynstr_append(ds, FUNCTION_PROTOTYPES);
+       /*BLI_dynstr_append(ds, FUNCTION_PROTOTYPES);*/
 
        codegen_set_unique_ids(nodes);
        codegen_print_uniforms_functions(ds, nodes);
@@ -1393,10 +1395,10 @@ GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttri
        GPUPass *pass;
        char *vertexcode, *fragmentcode;
 
-       if(!FUNCTION_LIB) {
+       /*if(!FUNCTION_LIB) {
                GPU_nodes_free(nodes);
                return NULL;
-       }
+       }*/
 
        /* prune unused nodes */
        gpu_nodes_prune(nodes, outlink);
@@ -1407,7 +1409,7 @@ GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttri
        /* generate code and compile with opengl */
        fragmentcode = code_generate_fragment(nodes, outlink->output, name);
        vertexcode = code_generate_vertex(nodes);
-       shader = GPU_shader_create(vertexcode, fragmentcode, FUNCTION_LIB);
+       shader = GPU_shader_create(vertexcode, fragmentcode, datatoc_gpu_shader_material_glsl); /*FUNCTION_LIB);*/
        MEM_freeN(fragmentcode);
        MEM_freeN(vertexcode);
 
index 4c3090dd2c1c77998214ace436d9eb10f8000166..10603aa72834953813d051a16fa21ef8f41ea9ef 100644 (file)
@@ -669,11 +669,13 @@ static void shader_print_errors(char *task, char *log, const char *code)
        fprintf(stderr, "%s\n", log);
 }
 
-GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, GPUShader *lib)
+GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, /*GPUShader *lib,*/ const char *libcode)
 {
        GLint status;
        GLcharARB log[5000];
+       const char *fragsource[2];
        GLsizei length = 0;
+       GLint count;
        GPUShader *shader;
 
        if (!GLEW_ARB_vertex_shader || !GLEW_ARB_fragment_shader)
@@ -712,8 +714,12 @@ GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, GPUSh
        }
 
        if(fragcode) {
+               count = 0;
+               if(libcode) fragsource[count++] = libcode;
+               if(fragcode) fragsource[count++] = fragcode;
+
                glAttachObjectARB(shader->object, shader->fragment);
-               glShaderSourceARB(shader->fragment, 1, (const char**)&fragcode, NULL);
+               glShaderSourceARB(shader->fragment, count, fragsource, NULL);
 
                glCompileShaderARB(shader->fragment);
                glGetObjectParameterivARB(shader->fragment, GL_OBJECT_COMPILE_STATUS_ARB, &status);
@@ -727,8 +733,8 @@ GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, GPUSh
                }
        }
 
-       if(lib && lib->lib)
-               glAttachObjectARB(shader->object, lib->lib);
+       /*if(lib && lib->lib)
+               glAttachObjectARB(shader->object, lib->lib);*/
 
        glLinkProgramARB(shader->object);
        glGetObjectParameterivARB(shader->object, GL_OBJECT_LINK_STATUS_ARB, &status);
@@ -743,6 +749,7 @@ GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, GPUSh
        return shader;
 }
 
+#if 0
 GPUShader *GPU_shader_create_lib(const char *code)
 {
        GLint status;
@@ -778,6 +785,7 @@ GPUShader *GPU_shader_create_lib(const char *code)
 
        return shader;
 }
+#endif
 
 void GPU_shader_bind(GPUShader *shader)
 {