From: Henri Verbeet hverbeet@codeweavers.com
--- dlls/wined3d/glsl_shader.c | 22 ++++++++++++++-------- dlls/wined3d/wined3d_private.h | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 8 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 594fdf73f46..1c037b78b84 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -518,29 +518,35 @@ void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLuint id, BOOL * that if there are errors. */ if (length > 1) { - const char *ptr, *line; + const char *ptr, *end, *line;
log = heap_alloc(length); - /* The info log is supposed to be zero-terminated, but at least some - * versions of fglrx don't terminate the string properly. The reported - * length does include the terminator, so explicitly set it to zero - * here. */ - log[length - 1] = 0; if (program) GL_EXTCALL(glGetProgramInfoLog(id, length, NULL, log)); else GL_EXTCALL(glGetShaderInfoLog(id, length, NULL, log));
ptr = log; + /* The info log is supposed to be zero-terminated. Note that at least + * some versions of fglrx don't terminate the string properly. The + * reported length does include the supposed terminator though, so we + * don't care here. */ + end = &ptr[length - 1]; if (gl_info->quirks & WINED3D_QUIRK_INFO_LOG_SPAM) { WARN("Info log received from GLSL shader #%u:\n", id); - while ((line = get_info_log_line(&ptr))) WARN(" %.*s", (int)(ptr - line), line); + while ((line = wined3d_get_line(&ptr, end))) + { + WARN(" %.*s", (int)(ptr - line), line); + } } else { FIXME("Info log received from GLSL shader #%u:\n", id); - while ((line = get_info_log_line(&ptr))) FIXME(" %.*s", (int)(ptr - line), line); + while ((line = wined3d_get_line(&ptr, end))) + { + FIXME(" %.*s", (int)(ptr - line), line); + } } heap_free(log); } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 425261a195e..0c8cc03738a 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -74,6 +74,20 @@ static inline float int_to_float(uint32_t i) return u.f; }
+static inline const char *wined3d_get_line(const char **ptr, const char *end) +{ + const char *p, *q; + + if ((p = *ptr) >= end) + return NULL; + + if (!(q = memchr(p, '\n', end - p))) + *ptr = end; + else + *ptr = q + 1; + return p; +} + #define MAKEDWORD_VERSION(maj, min) (((maj & 0xffffu) << 16) | (min & 0xffffu))
/* Driver quirks */
From: Henri Verbeet hverbeet@codeweavers.com
--- dlls/wined3d/glsl_shader.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 1c037b78b84..69b15c7421d 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -555,14 +555,18 @@ void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLuint id, BOOL /* Context activation is done by the caller. */ static void shader_glsl_compile(const struct wined3d_gl_info *gl_info, GLuint shader, const char *src) { - const char *ptr, *line; + const char *ptr, *end, *line;
TRACE("Compiling shader object %u.\n", shader);
if (TRACE_ON(d3d_shader)) { ptr = src; - while ((line = get_info_log_line(&ptr))) TRACE_(d3d_shader)(" %.*s", (int)(ptr - line), line); + end = ptr + strlen(ptr); + while ((line = wined3d_get_line(&ptr, end))) + { + TRACE_(d3d_shader)(" %.*s", (int)(ptr - line), line); + } }
GL_EXTCALL(glShaderSource(shader, 1, &src, NULL));
From: Henri Verbeet hverbeet@codeweavers.com
Thereby removing the last user of get_info_log_line(). --- dlls/wined3d/glsl_shader.c | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 69b15c7421d..451e023d5fb 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -484,22 +484,6 @@ static void shader_glsl_append_imm_ivec(struct wined3d_string_buffer *buffer, shader_addline(buffer, ")"); }
-static const char *get_info_log_line(const char **ptr) -{ - const char *p, *q; - - p = *ptr; - if (!(q = strstr(p, "\n"))) - { - if (!*p) return NULL; - *ptr += strlen(p); - return p; - } - *ptr = q + 1; - - return p; -} - /* Context activation is done by the caller. */ void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLuint id, BOOL program) { @@ -593,7 +577,7 @@ static void shader_glsl_dump_program_source(const struct wined3d_gl_info *gl_inf GL_EXTCALL(glGetAttachedShaders(program, shader_count, NULL, shaders)); for (i = 0; i < shader_count; ++i) { - const char *ptr, *line; + const char *ptr, *end, *line; GLint tmp;
GL_EXTCALL(glGetShaderiv(shaders[i], GL_SHADER_SOURCE_LENGTH, &tmp)); @@ -602,7 +586,7 @@ static void shader_glsl_dump_program_source(const struct wined3d_gl_info *gl_inf { heap_free(source);
- if (!(source = heap_alloc_zero(tmp))) + if (!(source = heap_alloc(tmp))) { ERR("Failed to allocate %d bytes for shader source.\n", tmp); heap_free(shaders); @@ -611,16 +595,20 @@ static void shader_glsl_dump_program_source(const struct wined3d_gl_info *gl_inf source_size = tmp; }
+ GL_EXTCALL(glGetShaderSource(shaders[i], source_size, NULL, source)); + ptr = source; + end = &ptr[tmp - 1]; + FIXME("Shader %u:\n", shaders[i]); GL_EXTCALL(glGetShaderiv(shaders[i], GL_SHADER_TYPE, &tmp)); FIXME(" GL_SHADER_TYPE: %s.\n", debug_gl_shader_type(tmp)); GL_EXTCALL(glGetShaderiv(shaders[i], GL_COMPILE_STATUS, &tmp)); FIXME(" GL_COMPILE_STATUS: %d.\n", tmp); FIXME("\n"); - - ptr = source; - GL_EXTCALL(glGetShaderSource(shaders[i], source_size, NULL, source)); - while ((line = get_info_log_line(&ptr))) FIXME(" %.*s", (int)(ptr - line), line); + while ((line = wined3d_get_line(&ptr, end))) + { + FIXME(" %.*s", (int)(ptr - line), line); + } FIXME("\n"); }
From: Henri Verbeet hverbeet@codeweavers.com
--- dlls/wined3d/arb_program_shader.c | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index b799e6c1e38..592216051c2 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -46,22 +46,6 @@ static BOOL shader_is_vshader_version(enum wined3d_shader_type type) return type == WINED3D_SHADER_TYPE_VERTEX; }
-static const char *get_line(const char **ptr) -{ - const char *p, *q; - - p = *ptr; - if (!(q = strstr(p, "\n"))) - { - if (!*p) return NULL; - *ptr += strlen(p); - return p; - } - *ptr = q + 1; - - return p; -} - enum arb_helper_value { ARB_ZERO, @@ -3315,13 +3299,17 @@ static void shader_hw_call(const struct wined3d_shader_instruction *ins)
static BOOL shader_arb_compile(const struct wined3d_gl_info *gl_info, GLenum target, const char *src) { - const char *ptr, *line; + const char *ptr, *end, *line; GLint native, pos;
if (TRACE_ON(d3d_shader)) { ptr = src; - while ((line = get_line(&ptr))) TRACE_(d3d_shader)(" %.*s", (int)(ptr - line), line); + end = ptr + strlen(ptr); + while ((line = wined3d_get_line(&ptr, end))) + { + TRACE_(d3d_shader)(" %.*s", (int)(ptr - line), line); + } }
GL_EXTCALL(glProgramStringARB(target, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(src), src)); @@ -3335,7 +3323,11 @@ static BOOL shader_arb_compile(const struct wined3d_gl_info *gl_info, GLenum tar FIXME_(d3d_shader)("Program error at position %d: %s\n\n", pos, debugstr_a((const char *)gl_info->gl_ops.gl.p_glGetString(GL_PROGRAM_ERROR_STRING_ARB))); ptr = src; - while ((line = get_line(&ptr))) FIXME_(d3d_shader)(" %.*s", (int)(ptr - line), line); + end = ptr + strlen(ptr); + while ((line = wined3d_get_line(&ptr, end))) + { + FIXME_(d3d_shader)(" %.*s", (int)(ptr - line), line); + } FIXME_(d3d_shader)("\n");
return FALSE;
From: Henri Verbeet hverbeet@codeweavers.com
--- dlls/wined3d/shader_spirv.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index 60ef2c022aa..7c8351453a1 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -279,11 +279,12 @@ static VkShaderModule shader_spirv_compile_shader(struct wined3d_context_vk *con ret = vkd3d_shader_compile(&info, &spirv, &messages); if (messages && *messages && FIXME_ON(d3d_shader)) { - const char *ptr = messages; - const char *line; + const char *ptr, *end, *line;
FIXME("Shader log:\n"); - while ((line = get_line(&ptr))) + ptr = messages; + end = ptr + strlen(ptr); + while ((line = wined3d_get_line(&ptr, end))) { FIXME(" %.*s", (int)(ptr - line), line); }
From: Henri Verbeet hverbeet@codeweavers.com
--- dlls/wined3d/shader_spirv.c | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-)
diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index 7c8351453a1..1dff25cc6a6 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -202,22 +202,6 @@ static void shader_spirv_init_compile_args(struct wined3d_shader_spirv_compile_a } }
-static const char *get_line(const char **ptr) -{ - const char *p, *q; - - p = *ptr; - if (!(q = strstr(p, "\n"))) - { - if (!*p) return NULL; - *ptr += strlen(p); - return p; - } - *ptr = q + 1; - - return p; -} - static void shader_spirv_init_shader_interface_vk(struct wined3d_shader_spirv_shader_interface *iface, const struct shader_spirv_resource_bindings *b, const struct wined3d_stream_output_desc *so_desc) { @@ -720,11 +704,12 @@ static void shader_spirv_scan_shader(struct wined3d_shader *shader, ERR("Failed to scan shader, ret %d.\n", ret); if (messages && *messages && FIXME_ON(d3d_shader)) { - const char *ptr = messages; - const char *line; + const char *ptr, *end, *line;
FIXME("Shader log:\n"); - while ((line = get_line(&ptr))) + ptr = messages; + end = ptr + strlen(ptr); + while ((line = wined3d_get_line(&ptr, end))) { FIXME(" %.*s", (int)(ptr - line), line); }
This merge request was approved by Zebediah Figura.
This merge request was approved by Jan Sikorski.