From: Matteo Bruni Subject: [PATCH 5/6] wined3d: Introduce a shader_snprintf() function. Message-Id: <1427397142-13403-5-git-send-email-mbruni@codeweavers.com> Date: Thu, 26 Mar 2015 20:12:21 +0100 It could be used in more places, some of them need additional rework though. I'm not sure this is what you had in mind. I didn't feel like making these strings heap allocated, it seems to get quite ugly that way. --- dlls/wined3d/glsl_shader.c | 50 +++++++++++++++++++++--------------------- dlls/wined3d/shader.c | 17 ++++++++++++++ dlls/wined3d/wined3d_private.h | 1 + 3 files changed, 43 insertions(+), 25 deletions(-) diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index e4ddbe6..e0577eb 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -445,7 +445,7 @@ static void shader_glsl_load_samplers(const struct wined3d_gl_info *gl_info, for (j = 0; j < sampler_info[i].count; ++j) { - snprintf(sampler_name, sizeof(sampler_name), "%s_sampler%u", prefix, j); + shader_snprintf(sampler_name, sizeof(sampler_name), "%s_sampler%u", prefix, j); name_loc = GL_EXTCALL(glGetUniformLocation(program_id, sampler_name)); if (name_loc == -1) continue; @@ -1872,24 +1872,24 @@ static void shader_glsl_add_src_param(const struct wined3d_shader_instruction *i } else { - char reg_name[200]; + char reg_name[100]; switch (wined3d_src->reg.data_type) { case WINED3D_DATA_FLOAT: - sprintf(reg_name, "%s", glsl_src->reg_name); + shader_snprintf(reg_name, sizeof(reg_name), "%s", glsl_src->reg_name); break; case WINED3D_DATA_INT: - sprintf(reg_name, "floatBitsToInt(%s)", glsl_src->reg_name); + shader_snprintf(reg_name, sizeof(reg_name), "floatBitsToInt(%s)", glsl_src->reg_name); break; case WINED3D_DATA_RESOURCE: case WINED3D_DATA_SAMPLER: case WINED3D_DATA_UINT: - sprintf(reg_name, "floatBitsToUint(%s)", glsl_src->reg_name); + shader_snprintf(reg_name, sizeof(reg_name), "floatBitsToUint(%s)", glsl_src->reg_name); break; default: FIXME("Unhandled data type %#x.\n", wined3d_src->reg.data_type); - sprintf(reg_name, "%s", glsl_src->reg_name); + shader_snprintf(reg_name, sizeof(reg_name), "%s", glsl_src->reg_name); break; } @@ -4396,11 +4396,11 @@ static void handle_ps3_input(struct wined3d_shader_buffer *buffer, } if (in_idx == in_count) - sprintf(destination, "gl_FrontColor"); + shader_snprintf(destination, sizeof(destination), "gl_FrontColor"); else if (in_idx == in_count + 1) - sprintf(destination, "gl_FrontSecondaryColor"); + shader_snprintf(destination, sizeof(destination), "gl_FrontSecondaryColor"); else - sprintf(destination, "ps_link[%u]", in_idx); + shader_snprintf(destination, sizeof(destination), "ps_link[%u]", in_idx); if (!set[in_idx]) set[in_idx] = ~0u; @@ -4444,11 +4444,11 @@ static void handle_ps3_input(struct wined3d_shader_buffer *buffer, reg_mask[size] = '\0'; if (i == in_count) - sprintf(destination, "gl_FrontColor"); + shader_snprintf(destination, sizeof(destination), "gl_FrontColor"); else if (i == in_count + 1) - sprintf(destination, "gl_FrontSecondaryColor"); + shader_snprintf(destination, sizeof(destination), "gl_FrontSecondaryColor"); else - sprintf(destination, "ps_link[%u]", i); + shader_snprintf(destination, sizeof(destination), "ps_link[%u]", i); if (size == 1) shader_addline(buffer, "%s.%s = 0.0;\n", destination, reg_mask); else shader_addline(buffer, "%s.%s = vec%u(0.0);\n", destination, reg_mask, size); @@ -5739,7 +5739,7 @@ static GLuint shader_glsl_generate_ffp_fragment_shader(struct wined3d_shader_buf stage, texture_function, stage, stage, coord_mask); } - sprintf(tex_reg_name, "tex%u", stage); + shader_snprintf(tex_reg_name, sizeof(tex_reg_name), "tex%u", stage); shader_glsl_color_correction_ext(buffer, tex_reg_name, WINED3DSP_WRITEMASK_ALL, settings->op[stage].color_fixup); } @@ -5865,7 +5865,7 @@ static void shader_glsl_init_vs_uniform_locations(const struct wined3d_gl_info * sizeof(GLuint) * gl_info->limits.glsl_vs_float_constants); for (i = 0; i < vs_c_count; ++i) { - snprintf(name, sizeof(name), "vs_c[%u]", i); + shader_snprintf(name, sizeof(name), "vs_c[%u]", i); vs->uniform_f_locations[i] = GL_EXTCALL(glGetUniformLocation(program_id, name)); } memset(&vs->uniform_f_locations[vs_c_count], 0xff, @@ -5873,13 +5873,13 @@ static void shader_glsl_init_vs_uniform_locations(const struct wined3d_gl_info * for (i = 0; i < MAX_CONST_I; ++i) { - snprintf(name, sizeof(name), "vs_i[%u]", i); + shader_snprintf(name, sizeof(name), "vs_i[%u]", i); vs->uniform_i_locations[i] = GL_EXTCALL(glGetUniformLocation(program_id, name)); } for (i = 0; i < MAX_CONST_B; ++i) { - snprintf(name, sizeof(name), "vs_b[%u]", i); + shader_snprintf(name, sizeof(name), "vs_b[%u]", i); vs->uniform_b_locations[i] = GL_EXTCALL(glGetUniformLocation(program_id, name)); } @@ -5900,7 +5900,7 @@ static void shader_glsl_init_ps_uniform_locations(const struct wined3d_gl_info * sizeof(GLuint) * gl_info->limits.glsl_ps_float_constants); for (i = 0; i < ps_c_count; ++i) { - snprintf(name, sizeof(name), "ps_c[%u]", i); + shader_snprintf(name, sizeof(name), "ps_c[%u]", i); ps->uniform_f_locations[i] = GL_EXTCALL(glGetUniformLocation(program_id, name)); } memset(&ps->uniform_f_locations[ps_c_count], 0xff, @@ -5908,25 +5908,25 @@ static void shader_glsl_init_ps_uniform_locations(const struct wined3d_gl_info * for (i = 0; i < MAX_CONST_I; ++i) { - snprintf(name, sizeof(name), "ps_i[%u]", i); + shader_snprintf(name, sizeof(name), "ps_i[%u]", i); ps->uniform_i_locations[i] = GL_EXTCALL(glGetUniformLocation(program_id, name)); } for (i = 0; i < MAX_CONST_B; ++i) { - snprintf(name, sizeof(name), "ps_b[%u]", i); + shader_snprintf(name, sizeof(name), "ps_b[%u]", i); ps->uniform_b_locations[i] = GL_EXTCALL(glGetUniformLocation(program_id, name)); } for (i = 0; i < MAX_TEXTURES; ++i) { - snprintf(name, sizeof(name), "bumpenv_mat%u", i); + shader_snprintf(name, sizeof(name), "bumpenv_mat%u", i); ps->bumpenv_mat_location[i] = GL_EXTCALL(glGetUniformLocation(program_id, name)); - snprintf(name, sizeof(name), "bumpenv_lum_scale%u", i); + shader_snprintf(name, sizeof(name), "bumpenv_lum_scale%u", i); ps->bumpenv_lum_scale_location[i] = GL_EXTCALL(glGetUniformLocation(program_id, name)); - snprintf(name, sizeof(name), "bumpenv_lum_offset%u", i); + shader_snprintf(name, sizeof(name), "bumpenv_lum_offset%u", i); ps->bumpenv_lum_offset_location[i] = GL_EXTCALL(glGetUniformLocation(program_id, name)); - snprintf(name, sizeof(name), "tss_const%u", i); + shader_snprintf(name, sizeof(name), "tss_const%u", i); ps->tss_constant_location[i] = GL_EXTCALL(glGetUniformLocation(program_id, name)); } @@ -5949,7 +5949,7 @@ static void shader_glsl_init_uniform_block_bindings(const struct wined3d_gl_info if (!reg_maps->cb_sizes[i]) continue; - snprintf(name, sizeof(name), "block_%s_cb%u", prefix, i); + shader_snprintf(name, sizeof(name), "block_%s_cb%u", prefix, i); block_idx = GL_EXTCALL(glGetUniformBlockIndex(program_id, name)); GL_EXTCALL(glUniformBlockBinding(program_id, block_idx, base + i)); } @@ -6103,7 +6103,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context, const { if (!(map & 1)) continue; - snprintf(tmp_name, sizeof(tmp_name), "vs_in%u", i); + shader_snprintf(tmp_name, sizeof(tmp_name), "vs_in%u", i); GL_EXTCALL(glBindAttribLocation(program_id, i, tmp_name)); } checkGLcall("glBindAttribLocation"); diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index 31b391b..12009d4 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -331,6 +331,23 @@ int shader_addline(struct wined3d_shader_buffer *buffer, const char *format, ... return ret; } +void shader_snprintf(char *string, unsigned int size, const char *format, ...) +{ + va_list args; + int ret; + + va_start(args, format); + + ret = vsnprintf(string, size, format, args); + if (ret < 0 || ret >= size) + { + ERR("Insufficient string buffer %p, size %u!\n", string, size); + string[0] = '\0'; + } + + va_end(args); +} + /* Convert floating point offset relative to a register file to an absolute * offset for float constants. */ static unsigned int shader_get_float_offset(enum wined3d_shader_register_type register_type, UINT register_idx) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 96b8244..a08fd29 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2879,6 +2879,7 @@ struct wined3d_shader_limits /* Base Shader utility functions. */ int shader_addline(struct wined3d_shader_buffer *buffer, const char *fmt, ...) PRINTF_ATTR(2,3) DECLSPEC_HIDDEN; int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *fmt, va_list args) DECLSPEC_HIDDEN; +void shader_snprintf(char *string, unsigned int size, const char *format, ...) PRINTF_ATTR(3, 4) DECLSPEC_HIDDEN; /* Vertex shader utility functions */ BOOL vshader_get_input(const struct wined3d_shader *shader, -- 2.0.5