[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