From 0f6fc0b207e48d413b728119506c399ae4597699 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 19 Sep 2008 16:09:26 +0000 Subject: Fix again for the NVidia driver bug. This time I'm just giving up 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 | 4 ++-- source/blender/gpu/intern/gpu_codegen.c | 26 ++++++++++++++------------ source/blender/gpu/intern/gpu_extensions.c | 16 ++++++++++++---- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h index d3faa81ebb1..3813fe3da8e 100644 --- a/source/blender/gpu/GPU_extensions.h +++ b/source/blender/gpu/GPU_extensions.h @@ -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); diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c index 78a99cab447..1c29bdc8741 100644 --- a/source/blender/gpu/intern/gpu_codegen.c +++ b/source/blender/gpu/intern/gpu_codegen.c @@ -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); diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c index 4c3090dd2c1..10603aa7283 100644 --- a/source/blender/gpu/intern/gpu_extensions.c +++ b/source/blender/gpu/intern/gpu_extensions.c @@ -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) { -- cgit v1.2.3