[PATCH 5/6] wined3d: Introduce a shader_snprintf() function.
Matteo Bruni
mbruni at codeweavers.com
Thu Mar 26 14:12:21 CDT 2015
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
More information about the wine-patches
mailing list