Module: wine Branch: master Commit: 42c83f0260ab7972b4524dfe536323b033f1c633 URL: http://source.winehq.org/git/wine.git/?a=commit;h=42c83f0260ab7972b4524dfe53...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Tue Feb 2 12:06:53 2010 +0100
wined3d: Dump ARB program shaders on compile failure.
Similar to the patch for GLSL.
---
dlls/wined3d/arb_program_shader.c | 57 +++++++++++++++++++++++++++++++++---- 1 files changed, 51 insertions(+), 6 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index a76cd66..e4653f0 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -41,6 +41,45 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d);
#define GLINFO_LOCATION (*gl_info)
+/* Extract a line. Note that this modifies the source string. */ +static char *get_line(char **ptr) +{ + char *p, *q; + + p = *ptr; + if (!(q = strstr(p, "\n"))) + { + if (!*p) return NULL; + *ptr += strlen(p); + return p; + } + *q = '\0'; + *ptr = q + 1; + + return p; +} + +static void shader_arb_dump_program_source(const char *source) +{ + unsigned long source_size; + char *ptr, *line, *tmp; + + source_size = strlen(source) + 1; + tmp = HeapAlloc(GetProcessHeap(), 0, source_size); + if (!tmp) + { + ERR("Failed to allocate %lu bytes for shader source.\n", source_size); + return; + } + memcpy(tmp, source, source_size); + + ptr = tmp; + while ((line = get_line(&ptr))) FIXME(" %s\n", line); + FIXME("\n"); + + HeapFree(GetProcessHeap(), 0, tmp); +} + /* GL locking for state handlers is done by the caller. */ static BOOL need_mova_const(IWineD3DBaseShader *shader, const struct wined3d_gl_info *gl_info) { @@ -3047,8 +3086,9 @@ static GLuint create_arb_blt_vertex_program(const struct wined3d_gl_info *gl_inf glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); if (pos != -1) { - FIXME("Vertex program error at position %d: %s\n", pos, + FIXME("Vertex program error at position %d: %s\n\n", pos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + shader_arb_dump_program_source(blt_vprogram); } else { @@ -3109,8 +3149,9 @@ static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_i glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); if (pos != -1) { - FIXME("Fragment program error at position %d: %s\n", pos, + FIXME("Fragment program error at position %d: %s\n\n", pos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + shader_arb_dump_program_source(blt_fprograms[tex_type]); } else { @@ -3565,8 +3606,9 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos); if (errPos != -1) { - FIXME("HW PixelShader Error at position %d: %s\n", + FIXME("HW PixelShader Error at position %d: %s\n\n", errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + shader_arb_dump_program_source(buffer->buffer); retval = 0; } else @@ -3975,8 +4017,9 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos); if (errPos != -1) { - FIXME("HW VertexShader Error at position %d: %s\n", + FIXME("HW VertexShader Error at position %d: %s\n\n", errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + shader_arb_dump_program_source(buffer->buffer); ret = -1; } else @@ -5864,8 +5907,9 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); if (pos != -1) { - FIXME("Fragment program error at position %d: %s\n", pos, + FIXME("Fragment program error at position %d: %s\n\n", pos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + shader_arb_dump_program_source(buffer.buffer); } else { @@ -6568,8 +6612,9 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); if (pos != -1) { - FIXME("Fragment program error at position %d: %s\n", pos, + FIXME("Fragment program error at position %d: %s\n\n", pos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + shader_arb_dump_program_source(buffer.buffer); } else {