[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