[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16612] trunk/blender/source/blender/gpu: Fix again for the NVidia driver bug.

Brecht Van Lommel brecht at blender.org
Fri Sep 19 18:09:30 CEST 2008


Revision: 16612
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16612
Author:   blendix
Date:     2008-09-19 18:09:26 +0200 (Fri, 19 Sep 2008)

Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/gpu/GPU_extensions.h
    trunk/blender/source/blender/gpu/intern/gpu_codegen.c
    trunk/blender/source/blender/gpu/intern/gpu_extensions.c

Modified: trunk/blender/source/blender/gpu/GPU_extensions.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_extensions.h	2008-09-19 16:01:22 UTC (rev 16611)
+++ trunk/blender/source/blender/gpu/GPU_extensions.h	2008-09-19 16:09:26 UTC (rev 16612)
@@ -108,8 +108,8 @@
    - 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);

Modified: trunk/blender/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_codegen.c	2008-09-19 16:01:22 UTC (rev 16611)
+++ trunk/blender/source/blender/gpu/intern/gpu_codegen.c	2008-09-19 16:09:26 UTC (rev 16612)
@@ -188,8 +188,8 @@
  * 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 @@
 	}
 }
 
+#if 0
 static char *gpu_generate_function_prototyps(GHash *hash)
 {
 	DynStr *ds = BLI_dynstr_new();
@@ -346,14 +347,15 @@
 
 	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 @@
 		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 @@
 	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 *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 @@
 	/* 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);
 

Modified: trunk/blender/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_extensions.c	2008-09-19 16:01:22 UTC (rev 16611)
+++ trunk/blender/source/blender/gpu/intern/gpu_extensions.c	2008-09-19 16:09:26 UTC (rev 16612)
@@ -669,11 +669,13 @@
 	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 @@
 	}
 
 	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 @@
 		}
 	}
 
-	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 @@
 	return shader;
 }
 
+#if 0
 GPUShader *GPU_shader_create_lib(const char *code)
 {
 	GLint status;
@@ -778,6 +785,7 @@
 
 	return shader;
 }
+#endif
 
 void GPU_shader_bind(GPUShader *shader)
 {





More information about the Bf-blender-cvs mailing list