wined3d: Get rid of a few stack buffers.

Henri Verbeet hverbeet at codeweavers.com
Tue Mar 10 03:19:04 CDT 2009


---
 dlls/wined3d/baseshader.c      |   21 +++++---
 dlls/wined3d/glsl_shader.c     |  110 +++++++++++++++++-----------------------
 dlls/wined3d/wined3d_private.h |    1 +
 3 files changed, 61 insertions(+), 71 deletions(-)

diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index c9b949e..34ab181 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -52,17 +52,12 @@ void shader_buffer_free(struct SHADER_BUFFER *buffer)
     HeapFree(GetProcessHeap(), 0, buffer->buffer);
 }
 
-int shader_addline(
-    SHADER_BUFFER* buffer,  
-    const char *format, ...) {
-
+int shader_vaddline(SHADER_BUFFER* buffer, const char *format, va_list args)
+{
     char* base = buffer->buffer + buffer->bsize;
     int rc;
 
-    va_list args;
-    va_start(args, format);
     rc = vsnprintf(base, SHADER_PGMSIZE - 1 - buffer->bsize, format, args);
-    va_end(args);
 
     if (rc < 0 ||                                   /* C89 */ 
         rc > SHADER_PGMSIZE - 1 - buffer->bsize) {  /* C99 */
@@ -88,6 +83,18 @@ int shader_addline(
     return 0;
 }
 
+int shader_addline(SHADER_BUFFER* buffer, const char *format, ...)
+{
+    int ret;
+    va_list args;
+
+    va_start(args, format);
+    ret = shader_vaddline(buffer, format, args);
+    va_end(args);
+
+    return ret;
+}
+
 void shader_init(struct IWineD3DBaseShaderClass *shader,
         IWineD3DDevice *device, const SHADER_OPCODE *instruction_table)
 {
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 4f9fc2a..1fd3a05 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -1470,12 +1470,14 @@ static void shader_glsl_color_correction(const struct SHADER_OPCODE_ARG *arg, st
     }
 }
 
-static void shader_glsl_gen_sample_code(const SHADER_OPCODE_ARG *arg, DWORD sampler, const char *coord_reg,
-                                        const glsl_sample_function_t *sample_function, DWORD swizzle,
-                                        const char *bias) {
+static void PRINTF_ATTR(6, 7) shader_glsl_gen_sample_code(const SHADER_OPCODE_ARG *arg,
+        DWORD sampler, const glsl_sample_function_t *sample_function, DWORD swizzle,
+        const char *bias, const char *coord_reg_fmt, ...)
+{
     const char *sampler_base;
     char dst_swizzle[6];
     struct color_fixup_desc fixup;
+    va_list args;
 
     shader_glsl_get_swizzle(swizzle, FALSE, arg->dst, dst_swizzle);
 
@@ -1490,12 +1492,16 @@ static void shader_glsl_gen_sample_code(const SHADER_OPCODE_ARG *arg, DWORD samp
 
     shader_glsl_append_dst(arg->buffer, arg);
 
+    shader_addline(arg->buffer, "%s(%s%u, ", sample_function->name, sampler_base, sampler);
+
+    va_start(args, coord_reg_fmt);
+    shader_vaddline(arg->buffer, coord_reg_fmt, args);
+    va_end(args);
+
     if(bias) {
-        shader_addline(arg->buffer, "%s(%s%u, %s, %s)%s);\n",
-                       sample_function->name, sampler_base, sampler, coord_reg, bias, dst_swizzle);
+        shader_addline(arg->buffer, ", %s)%s);\n", bias, dst_swizzle);
     } else {
-        shader_addline(arg->buffer, "%s(%s%u, %s)%s);\n",
-                       sample_function->name, sampler_base, sampler, coord_reg, dst_swizzle);
+        shader_addline(arg->buffer, ")%s);\n", dst_swizzle);
     }
 
     if(!is_identity_fixup(fixup)) {
@@ -1671,7 +1677,6 @@ static void shader_glsl_map2gl(const SHADER_OPCODE_ARG *arg)
     SHADER_BUFFER* buffer = arg->buffer;
     glsl_src_param_t src_param;
     const char *instruction;
-    char arguments[256];
     DWORD write_mask;
     unsigned i;
 
@@ -1694,18 +1699,18 @@ static void shader_glsl_map2gl(const SHADER_OPCODE_ARG *arg)
 
     write_mask = shader_glsl_append_dst(buffer, arg);
 
-    arguments[0] = '\0';
+    shader_addline(buffer, "%s(", instruction);
+
     if (curOpcode->num_params > 0) {
         shader_glsl_add_src_param(arg, arg->src[0], arg->src_addr[0], write_mask, &src_param);
-        strcat(arguments, src_param.param_str);
+        shader_addline(buffer, "%s", src_param.param_str);
         for (i = 2; i < curOpcode->num_params; ++i) {
-            strcat(arguments, ", ");
             shader_glsl_add_src_param(arg, arg->src[i-1], arg->src_addr[i-1], write_mask, &src_param);
-            strcat(arguments, src_param.param_str);
+            shader_addline(buffer, ", %s", src_param.param_str);
         }
     }
 
-    shader_addline(buffer, "%s(%s));\n", instruction, arguments);
+    shader_addline(buffer, "));\n");
 }
 
 /** Process the WINED3DSIO_EXPP instruction in GLSL:
@@ -2380,21 +2385,21 @@ static void pshader_glsl_tex(const SHADER_OPCODE_ARG *arg)
        1.4+: Use provided coordinate source register. */
     if (shader_version < WINED3DPS_VERSION(1,4))
     {
-        char coord_mask[6], srcreg[12];
+        char coord_mask[6];
         shader_glsl_get_write_mask(mask, coord_mask);
-        sprintf(srcreg, "T%u%s", sampler_idx, coord_mask);
-        shader_glsl_gen_sample_code(arg, sampler_idx, srcreg, &sample_function, swizzle, NULL);
+        shader_glsl_gen_sample_code(arg, sampler_idx, &sample_function, swizzle, NULL,
+                "T%u%s", sampler_idx, coord_mask);
     } else {
         glsl_src_param_t coord_param;
         shader_glsl_add_src_param(arg, arg->src[0], arg->src_addr[0], mask, &coord_param);
         if(arg->opcode_token & WINED3DSI_TEXLD_BIAS) {
             glsl_src_param_t bias;
             shader_glsl_add_src_param(arg, arg->src[0], arg->src_addr[0], WINED3DSP_WRITEMASK_3, &bias);
-            shader_glsl_gen_sample_code(arg, sampler_idx, coord_param.param_str, &sample_function,
-                                        swizzle, bias.param_str);
+            shader_glsl_gen_sample_code(arg, sampler_idx, &sample_function, swizzle, bias.param_str,
+                    "%s", coord_param.param_str);
         } else {
-            shader_glsl_gen_sample_code(arg, sampler_idx, coord_param.param_str, &sample_function,
-                                        swizzle, NULL);
+            shader_glsl_gen_sample_code(arg, sampler_idx, &sample_function, swizzle, NULL,
+                    "%s", coord_param.param_str);
         }
     }
 }
@@ -2427,9 +2432,8 @@ static void shader_glsl_texldl(const SHADER_OPCODE_ARG *arg)
          * However, they seem to work just fine in fragment shaders as well. */
         WARN("Using %s in fragment shader.\n", sample_function.name);
     }
-    shader_glsl_gen_sample_code(arg, sampler_idx, coord_param.param_str,
-                                &sample_function, swizzle,
-                                lod_param.param_str);
+    shader_glsl_gen_sample_code(arg, sampler_idx, &sample_function, swizzle, lod_param.param_str,
+            "%s", coord_param.param_str);
 }
 
 static void pshader_glsl_texcoord(const SHADER_OPCODE_ARG *arg)
@@ -2485,7 +2489,6 @@ static void pshader_glsl_texcoord(const SHADER_OPCODE_ARG *arg)
 static void pshader_glsl_texdp3tex(const SHADER_OPCODE_ARG *arg)
 {
     glsl_src_param_t src0_param;
-    char coord_param[64];
     glsl_sample_function_t sample_function;
     DWORD sampler_idx = arg->dst & WINED3DSP_REGNUM_MASK;
     DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
@@ -2505,27 +2508,24 @@ static void pshader_glsl_texdp3tex(const SHADER_OPCODE_ARG *arg)
     switch(mask_size)
     {
         case 1:
-            sprintf(coord_param, "dot(gl_TexCoord[%u].xyz, %s)",
-                    sampler_idx, src0_param.param_str);
+            shader_glsl_gen_sample_code(arg, sampler_idx, &sample_function, WINED3DVS_NOSWIZZLE, NULL,
+                    "dot(gl_TexCoord[%u].xyz, %s)", sampler_idx, src0_param.param_str);
             break;
 
         case 2:
-            sprintf(coord_param, "vec2(dot(gl_TexCoord[%u].xyz, %s), 0.0)",
-                    sampler_idx, src0_param.param_str);
+            shader_glsl_gen_sample_code(arg, sampler_idx, &sample_function, WINED3DVS_NOSWIZZLE, NULL,
+                    "vec2(dot(gl_TexCoord[%u].xyz, %s), 0.0)", sampler_idx, src0_param.param_str);
             break;
 
         case 3:
-            sprintf(coord_param, "vec3(dot(gl_TexCoord[%u].xyz, %s), 0.0, 0.0)",
-                    sampler_idx, src0_param.param_str);
+            shader_glsl_gen_sample_code(arg, sampler_idx, &sample_function, WINED3DVS_NOSWIZZLE, NULL,
+                    "vec3(dot(gl_TexCoord[%u].xyz, %s), 0.0, 0.0)", sampler_idx, src0_param.param_str);
             break;
 
         default:
             FIXME("Unexpected mask size %u\n", mask_size);
             break;
     }
-    shader_glsl_gen_sample_code(arg, sampler_idx, coord_param,
-                                &sample_function, WINED3DVS_NOSWIZZLE,
-                                NULL);
 }
 
 /** Process the WINED3DSIO_TEXDP3 instruction in GLSL:
@@ -2627,9 +2627,7 @@ static void pshader_glsl_texm3x2tex(const SHADER_OPCODE_ARG *arg)
     shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
 
     /* Sample the texture using the calculated coordinates */
-    shader_glsl_gen_sample_code(arg, reg, "tmp0.xy",
-                                &sample_function, WINED3DVS_NOSWIZZLE,
-                                NULL);
+    shader_glsl_gen_sample_code(arg, reg, &sample_function, WINED3DVS_NOSWIZZLE, NULL, "tmp0.xy");
 }
 
 /** Process the WINED3DSIO_TEXM3X3TEX instruction in GLSL
@@ -2651,9 +2649,7 @@ static void pshader_glsl_texm3x3tex(const SHADER_OPCODE_ARG *arg)
     shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
 
     /* Sample the texture using the calculated coordinates */
-    shader_glsl_gen_sample_code(arg, reg, "tmp0.xyz",
-                                &sample_function, WINED3DVS_NOSWIZZLE,
-                                NULL);
+    shader_glsl_gen_sample_code(arg, reg, &sample_function, WINED3DVS_NOSWIZZLE, NULL, "tmp0.xyz");
 
     current_state->current_row = 0;
 }
@@ -2704,9 +2700,7 @@ static void pshader_glsl_texm3x3spec(const SHADER_OPCODE_ARG *arg)
     shader_glsl_get_sample_function(stype, 0, &sample_function);
 
     /* Sample the texture */
-    shader_glsl_gen_sample_code(arg, reg, "tmp0.xyz",
-                                &sample_function, WINED3DVS_NOSWIZZLE,
-                                NULL);
+    shader_glsl_gen_sample_code(arg, reg, &sample_function, WINED3DVS_NOSWIZZLE, NULL, "tmp0.xyz");
 
     current_state->current_row = 0;
 }
@@ -2738,9 +2732,7 @@ static void pshader_glsl_texm3x3vspec(const SHADER_OPCODE_ARG *arg)
     shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
 
     /* Sample the texture using the calculated coordinates */
-    shader_glsl_gen_sample_code(arg, reg, "tmp0.xyz",
-                                &sample_function, WINED3DVS_NOSWIZZLE,
-                                NULL);
+    shader_glsl_gen_sample_code(arg, reg, &sample_function, WINED3DVS_NOSWIZZLE, NULL, "tmp0.xyz");
 
     current_state->current_row = 0;
 }
@@ -2753,7 +2745,6 @@ static void pshader_glsl_texbem(const SHADER_OPCODE_ARG *arg)
 {
     IWineD3DPixelShaderImpl* This = (IWineD3DPixelShaderImpl*) arg->shader;
     IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device;
-    char coord[128];
     glsl_sample_function_t sample_function;
     glsl_src_param_t coord_param;
     DWORD sampler_type;
@@ -2791,11 +2782,9 @@ static void pshader_glsl_texbem(const SHADER_OPCODE_ARG *arg)
 
     shader_glsl_add_src_param(arg, arg->src[0], arg->src_addr[0], WINED3DSP_WRITEMASK_0|WINED3DSP_WRITEMASK_1, &coord_param);
 
-    sprintf(coord, "T%u%s + vec4(bumpenvmat%d * %s, 0.0, 0.0)%s",
-            sampler_idx, coord_mask, sampler_idx, coord_param.param_str, coord_mask);
-    shader_glsl_gen_sample_code(arg, sampler_idx, coord,
-                                &sample_function, WINED3DVS_NOSWIZZLE,
-                                NULL);
+    shader_glsl_gen_sample_code(arg, sampler_idx, &sample_function, WINED3DVS_NOSWIZZLE, NULL,
+            "T%u%s + vec4(bumpenvmat%d * %s, 0.0, 0.0)%s", sampler_idx, coord_mask, sampler_idx,
+            coord_param.param_str, coord_mask);
 
     if(arg->opcode->opcode == WINED3DSIO_TEXBEML) {
         glsl_src_param_t luminance_param;
@@ -2829,17 +2818,14 @@ static void pshader_glsl_texreg2ar(const SHADER_OPCODE_ARG *arg)
 {
     glsl_src_param_t src0_param;
     DWORD sampler_idx = arg->dst & WINED3DSP_REGNUM_MASK;
-    char src[16];
     DWORD sampler_type = arg->reg_maps->samplers[sampler_idx] & WINED3DSP_TEXTURETYPE_MASK;
     glsl_sample_function_t sample_function;
 
     shader_glsl_add_src_param(arg, arg->src[0], arg->src_addr[0], WINED3DSP_WRITEMASK_ALL, &src0_param);
 
     shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
-    sprintf(src, "%s.wx", src0_param.reg_name);
-    shader_glsl_gen_sample_code(arg, sampler_idx, src,
-                                &sample_function, WINED3DVS_NOSWIZZLE,
-                                NULL);
+    shader_glsl_gen_sample_code(arg, sampler_idx, &sample_function, WINED3DVS_NOSWIZZLE, NULL,
+            "%s.wx", src0_param.reg_name);
 }
 
 /** Process the WINED3DSIO_TEXREG2GB instruction in GLSL
@@ -2848,17 +2834,14 @@ static void pshader_glsl_texreg2gb(const SHADER_OPCODE_ARG *arg)
 {
     glsl_src_param_t src0_param;
     DWORD sampler_idx = arg->dst & WINED3DSP_REGNUM_MASK;
-    char src[16];
     DWORD sampler_type = arg->reg_maps->samplers[sampler_idx] & WINED3DSP_TEXTURETYPE_MASK;
     glsl_sample_function_t sample_function;
 
     shader_glsl_add_src_param(arg, arg->src[0], arg->src_addr[0], WINED3DSP_WRITEMASK_ALL, &src0_param);
 
     shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
-    sprintf(src, "%s.yz", src0_param.reg_name);
-    shader_glsl_gen_sample_code(arg, sampler_idx, src,
-                                &sample_function, WINED3DVS_NOSWIZZLE,
-                                NULL);
+    shader_glsl_gen_sample_code(arg, sampler_idx, &sample_function, WINED3DVS_NOSWIZZLE, NULL,
+            "%s.yz", src0_param.reg_name);
 }
 
 /** Process the WINED3DSIO_TEXREG2RGB instruction in GLSL
@@ -2874,9 +2857,8 @@ static void pshader_glsl_texreg2rgb(const SHADER_OPCODE_ARG *arg)
     shader_glsl_get_sample_function(sampler_type, 0, &sample_function);
     shader_glsl_add_src_param(arg, arg->src[0], arg->src_addr[0], sample_function.coord_mask, &src0_param);
 
-    shader_glsl_gen_sample_code(arg, sampler_idx, src0_param.param_str,
-                                &sample_function, WINED3DVS_NOSWIZZLE,
-                                NULL);
+    shader_glsl_gen_sample_code(arg, sampler_idx, &sample_function, WINED3DVS_NOSWIZZLE, NULL,
+            "%s", src0_param.param_str);
 }
 
 /** Process the WINED3DSIO_TEXKILL instruction in GLSL.
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index add283a..c2a2e24 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2219,6 +2219,7 @@ typedef struct SHADER_PARSE_STATE {
 extern int shader_addline(
     SHADER_BUFFER* buffer,
     const char* fmt, ...) PRINTF_ATTR(2,3);
+int shader_vaddline(SHADER_BUFFER *buffer, const char *fmt, va_list args);
 
 const SHADER_OPCODE *shader_get_opcode(const SHADER_OPCODE *shader_ins, DWORD shader_version, DWORD code);
 
-- 
1.6.0.6



--------------090105080405000605090005--



More information about the wine-patches mailing list