[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60344] branches/soc-2013-viewport_fx/ source/blender/gpu: fancier shader compiler error messages

Jason Wilkins Jason.A.Wilkins at gmail.com
Mon Sep 23 23:20:04 CEST 2013


Revision: 60344
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60344
Author:   jwilkins
Date:     2013-09-23 21:20:04 +0000 (Mon, 23 Sep 2013)
Log Message:
-----------
fancier shader compiler error messages

Modified Paths:
--------------
    branches/soc-2013-viewport_fx/source/blender/gpu/GPU_extensions.h
    branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_aspect.c
    branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_basic.c
    branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_codegen.c
    branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_extensions.c
    branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_font.c
    branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_pixels.c
    branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_raster.c

Modified: branches/soc-2013-viewport_fx/source/blender/gpu/GPU_extensions.h
===================================================================
--- branches/soc-2013-viewport_fx/source/blender/gpu/GPU_extensions.h	2013-09-23 19:35:21 UTC (rev 60343)
+++ branches/soc-2013-viewport_fx/source/blender/gpu/GPU_extensions.h	2013-09-23 21:20:04 UTC (rev 60344)
@@ -176,7 +176,7 @@
  * - 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, const char *libcode, const char *defines);
+GPUShader *GPU_shader_create(const char* from, const char *vertexcode, const char *fragcode, const char *libcode, const char *defines);
 void GPU_shader_free(GPUShader *shader);
 
 void GPU_shader_bind(GPUShader *shader);

Modified: branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_aspect.c
===================================================================
--- branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_aspect.c	2013-09-23 19:35:21 UTC (rev 60343)
+++ branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_aspect.c	2013-09-23 21:20:04 UTC (rev 60344)
@@ -102,9 +102,9 @@
 
 	if (aspectImpl != NULL) {
 		if (in_select_mode)
-			return (aspectImpl->select_commit != NULL) ? aspectImpl->select_commit(aspectImpl->param) : false;
+			return aspectImpl->select_commit != NULL ? aspectImpl->select_commit(aspectImpl->param) : false;
 		else
-			return (aspectImpl->render_commit != NULL) ? aspectImpl->render_commit(aspectImpl->param) : false;
+			return aspectImpl->render_commit != NULL ? aspectImpl->render_commit(aspectImpl->param) : false;
 	}
 
 	return false;
@@ -121,9 +121,9 @@
 	}
 
 	if (count > aspect_free) {
-		aspect_max   = aspect_max + count - aspect_free;
+		aspect_max       = aspect_max + count - aspect_free;
 		GPU_ASPECT_FUNCS = (GPUaspectimpl**)MEM_reallocN(GPU_ASPECT_FUNCS, aspect_max * sizeof(GPUaspectimpl*));
-		aspect_free  = count;
+		aspect_free      = count;
 	}
 
 	src = aspect_fill;
@@ -179,39 +179,52 @@
 
 	aspectImpl = GPU_ASPECT_FUNCS[aspect];
 
-	if (in_select_mode)
-		return (aspectImpl != NULL && aspectImpl->select_begin != NULL) ? aspectImpl->select_begin(aspectImpl->param, object) : true;
-	else
-		return (aspectImpl != NULL && aspectImpl->render_begin != NULL) ? aspectImpl->render_begin(aspectImpl->param, object) : true;
+	if (aspectImpl != NULL) {
+		if (in_select_mode)
+			return aspectImpl->select_begin != NULL ? aspectImpl->select_begin(aspectImpl->param, object) : true;
+		else
+			return aspectImpl->render_begin != NULL ? aspectImpl->render_begin(aspectImpl->param, object) : true;
+	}
+
+	return true;
 }
 
 
 
 bool GPU_aspect_end(void)
 {
-	GPUaspectimpl* aspectImpl = GPU_ASPECT_FUNCS[current_aspect];
-	const void*     object      = current_object;
+	GPUaspectimpl* aspectImpl;
+	const void*    object;
 
 	GPU_ASSERT(gpu_aspect_active());
 	GPU_ASSERT(in_select_mode == gpu_is_select_mode()); /* not allowed to change select/render mode while an aspect is active */
 
+	aspectImpl = GPU_ASPECT_FUNCS[current_aspect];
+	object     = current_object;
+
 	current_aspect = -1;
 	current_object = NULL;
 
-	if (in_select_mode) {
-		return (aspectImpl  != NULL && aspectImpl->select_end != NULL) ? aspectImpl->select_end(aspectImpl->param, object) : true;
+	if (aspectImpl != NULL) {
+		if (in_select_mode)
+			return aspectImpl->select_end != NULL ? aspectImpl->select_end(aspectImpl->param, object) : true;
+		else
+			return aspectImpl->render_end != NULL ? aspectImpl->render_end(aspectImpl->param, object) : true;
 	}
-	else {
-		return (aspectImpl  != NULL && aspectImpl->render_end != NULL) ? aspectImpl->render_end(aspectImpl->param, object) : true;
-	}
+
+	return true;
 }
 
 
 
 void GPU_aspect_enable(uint32_t aspect, uint32_t options)
 {
-	GPUaspectimpl* aspectImpl = GPU_ASPECT_FUNCS[aspect];
+	GPUaspectimpl* aspectImpl;
 
+	GPU_ASSERT(aspect < aspect_max);
+
+	aspectImpl = GPU_ASPECT_FUNCS[aspect];
+
 	if (aspectImpl != NULL && aspectImpl->enable != NULL)
 		aspectImpl->enable(aspectImpl->param, options);
 }
@@ -220,8 +233,12 @@
 
 void GPU_aspect_disable(uint32_t aspect, uint32_t options)
 {
-	GPUaspectimpl* aspectImpl = GPU_ASPECT_FUNCS[aspect];
+	GPUaspectimpl* aspectImpl;
 
+	GPU_ASSERT(aspect < aspect_max);
+
+	aspectImpl = GPU_ASPECT_FUNCS[aspect];
+
 	if (aspectImpl != NULL && aspectImpl->disable != NULL )
 		aspectImpl->disable(aspectImpl->param, options);
 }

Modified: branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_basic.c
===================================================================
--- branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_basic.c	2013-09-23 19:35:21 UTC (rev 60343)
+++ branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_basic.c	2013-09-23 21:20:04 UTC (rev 60344)
@@ -172,6 +172,8 @@
 		char* frag_cstring;
 		char* defs_cstring;
 
+		char nickname[20];
+
 		gpu_include_common_vert(vert);
 		BLI_dynstr_append(vert, datatoc_gpu_shader_basic_vert_glsl);
 
@@ -204,8 +206,10 @@
 		frag_cstring = BLI_dynstr_get_cstring(frag);
 		defs_cstring = BLI_dynstr_get_cstring(defs);
 
+		sprintf(nickname, "Basic[0x%04X]", tweaked_options);
+
 		BASIC_SHADER.gpushader[tweaked_options] =
-			GPU_shader_create(vert_cstring, frag_cstring, NULL, defs_cstring);
+			GPU_shader_create(nickname, vert_cstring, frag_cstring, NULL, defs_cstring);
 
 		MEM_freeN(vert_cstring);
 		MEM_freeN(frag_cstring);

Modified: branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_codegen.c	2013-09-23 19:35:21 UTC (rev 60343)
+++ branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_codegen.c	2013-09-23 21:20:04 UTC (rev 60344)
@@ -1356,6 +1356,7 @@
 	GPUShader *shader;
 	GPUPass *pass;
 	char *vertexcode, *fragmentcode;
+	char nickname[100];
 
 	/*if (!FUNCTION_LIB) {
 		GPU_nodes_free(nodes);
@@ -1371,7 +1372,8 @@
 	/* 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, glsl_material_library, NULL);
+	sprintf(nickname, "GPUPass: %s", name);
+	shader = GPU_shader_create(nickname, vertexcode, fragmentcode, glsl_material_library, NULL);
 
 	/* failed? */
 	if (!shader) {
@@ -1382,7 +1384,7 @@
 	}
 	
 	/* create pass */
-	pass = MEM_callocN(sizeof(GPUPass), "GPUPass");
+	pass = (GPUPass*)MEM_callocN(sizeof(GPUPass), "GPUPass");
 
 	pass->output = outlink->output;
 	pass->shader = shader;

Modified: branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_extensions.c	2013-09-23 19:35:21 UTC (rev 60343)
+++ branches/soc-2013-viewport_fx/source/blender/gpu/intern/gpu_extensions.c	2013-09-23 21:20:04 UTC (rev 60344)
@@ -1295,38 +1295,79 @@
 	return ofs->h;
 }
 
-static void shader_print_errors(const char *task, char *log, const char **code, int code_count)
+static void shader_print_log(GLuint object, GLboolean is_program, const char* nickname, const char* kind)
 {
-	int line = 1;
+	char* log;
+	GLint log_size = 0;
 
-	fprintf(stderr, "GPUShader: %s error:\n", task);
+	GPU_CHECK_NO_ERROR();
 
-	if (1 || G.debug & G_DEBUG) {
+	if (is_program)
+		gpu_glGetProgramiv(object, GL_INFO_LOG_LENGTH, &log_size);
+	else
+		gpu_glGetShaderiv(object, GL_INFO_LOG_LENGTH, &log_size);
+
+	if (log_size > 0) {
+		log = (char*)MEM_mallocN(log_size, "shader_print_log");
+
+		if (is_program)
+			gpu_glGetProgramInfoLog(object, log_size, NULL, log);
+		else
+			gpu_glGetShaderInfoLog(object, log_size, NULL, log);
+
+		if (is_program)
+			fprintf(stderr, "Linker Info Log:\n%s\n", log);
+		else
+			fprintf(stderr, "%s Shader: %s\nShader Info Log:\n%s\n", kind, nickname, log);
+
+		MEM_freeN(log);
+	}
+
+	GPU_CHECK_NO_ERROR();
+}
+
+static void shader_print_errors(GLuint object, GLboolean is_program, const char* nickname, const char *kind, const char **code, int code_count)
+{
+	int total_line = 1;
+
+	if (G.debug & G_DEBUG) {
 		int i = 0;
 
+		fprintf(stderr, "Source Code: %s\n", nickname);
+
 		for (i = 0; i < code_count; i++) {
 			const char *c= code[i];
 			const char *pos;
 			const char *end = code[i] + strlen(code[i]);
+			int line = 1;
 
 			while ((c < end) && (pos = strchr(c, '\n'))) {
-				fprintf(stderr, "%3d: ", line);
+				fprintf(stderr, "%d:%3d:%3d: ", i, line, total_line);
 				fwrite(c, (pos+1)-c, 1, stderr);
 				c = pos+1;
 				line++;
+				total_line++;
 			}
 
 			fprintf(stderr, "%s", c);
 		}
 	}
 
-	fprintf(stderr, "%s\n", log);
+	shader_print_log(object, is_program, nickname, kind);
 }
 
-static void shader_print_log(const char *task, char *log, const char **code, int code_count)
+bool print_status(GLuint object, GLboolean is_program, const char* nickname, const char* kind, const char** code, int code_count)
 {
-	if (strlen(log) > 0)
-		fprintf(stderr, "GPUShader: %s log:\n%s\n", task, log);
+	GLint status;
+
+	if (is_program)
+		gpu_glGetProgramiv(object, GL_LINK_STATUS,    &status);
+	else
+		gpu_glGetShaderiv (object, GL_COMPILE_STATUS, &status);
+
+	shader_print_errors(object, is_program, nickname, kind, code, code_count);
+
+	return status;
 }
 
 static const char *gpu_shader_standard_extensions(void)
@@ -1354,47 +1395,9 @@
 	return "";
 }
 
-void print_with_lineno(const char* str)
+GPUShader *GPU_shader_create(const char* nickname, const char *vertexcode, const char *fragcode, const char *libcode, const char *defines)
 {
-	int  lineno = 1;
-	char line[68];
-	int  l = 0;
-	int  s = 0;
-
-	for (;;) {
-		line[l] = str[s];
-
-		if (ELEM(line[l], '\n', '\0') || l == 59) {
-			line[l] = '\0';
-
-			if (l == 59) {
-				while(!ELEM(str[s], '\n', '\0')) {
-					s++;
-				}
-			}
-
-			fprintf(stderr, "%4d:%s%s\n", lineno, line, l == 59 ? "..." : "");
-		}
-
-		if (str[s] == '\0')
-			break;
-
-		if (str[s] == '\n') {
-			lineno++;
-			l = 0;
-		}
-		else {
-			l++;
-		}
-
-		s++;
-	}
-}
-
-GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const char *libcode, const char *defines)
-{
 	GLint status;
-	char log[5000];
 	GLsizei length = 0;
 	GPUShader *shader;
 	int i;
@@ -1460,21 +1463,11 @@
 		gpu_glShaderSource(shader->vertex, num_source, source, NULL);
 
 		gpu_glCompileShader(shader->vertex);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list