Henri Verbeet : wined3d: Handle relative addresses in the common code in shader_glsl_get_register_name ().

Alexandre Julliard julliard at winehq.org
Mon Nov 12 14:14:40 CST 2012


Module: wine
Branch: master
Commit: 0a7b32e3f08d68feddd563afca3c03416cc4cb00
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0a7b32e3f08d68feddd563afca3c03416cc4cb00

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Sun Nov 11 18:52:39 2012 +0100

wined3d: Handle relative addresses in the common code in shader_glsl_get_register_name().

---

 dlls/wined3d/glsl_shader.c |   39 ++++++++++++++++-----------------------
 1 files changed, 16 insertions(+), 23 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 1e09c9e..66cee1b 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -1378,7 +1378,12 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
     const struct wined3d_shader_version *version = &reg_maps->shader_version;
     const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
     const char *prefix = shader_glsl_get_prefix(version->type);
+    struct glsl_src_param rel_param0, rel_param1;
 
+    if (reg->idx[0].offset != ~0U && reg->idx[0].rel_addr)
+        shader_glsl_add_src_param(ins, reg->idx[0].rel_addr, WINED3DSP_WRITEMASK_0, &rel_param0);
+    if (reg->idx[1].offset != ~0U && reg->idx[1].rel_addr)
+        shader_glsl_add_src_param(ins, reg->idx[1].rel_addr, WINED3DSP_WRITEMASK_0, &rel_param1);
     *is_color = FALSE;
 
     switch (reg->type)
@@ -1406,24 +1411,20 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
 
                 if (reg->idx[0].rel_addr)
                 {
-                    struct glsl_src_param rel_param;
-
-                    shader_glsl_add_src_param(ins, reg->idx[0].rel_addr, WINED3DSP_WRITEMASK_0, &rel_param);
-
-                    /* Removing a + 0 would be an obvious optimization, but macos doesn't see the NOP
-                     * operation there */
+                    /* Removing a + 0 would be an obvious optimization, but
+                     * OS X doesn't see the NOP operation there. */
                     if (idx)
                     {
                         if (shader->u.ps.declared_in_count > in_count)
                         {
                             sprintf(register_name,
                                     "((%s + %u) > %u ? (%s + %u) > %u ? gl_SecondaryColor : gl_Color : %s_in[%s + %u])",
-                                    rel_param.param_str, idx, in_count - 1, rel_param.param_str, idx, in_count,
-                                    prefix, rel_param.param_str, idx);
+                                    rel_param0.param_str, idx, in_count - 1, rel_param0.param_str, idx, in_count,
+                                    prefix, rel_param0.param_str, idx);
                         }
                         else
                         {
-                            sprintf(register_name, "%s_in[%s + %u]", prefix, rel_param.param_str, idx);
+                            sprintf(register_name, "%s_in[%s + %u]", prefix, rel_param0.param_str, idx);
                         }
                     }
                     else
@@ -1431,12 +1432,12 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
                         if (shader->u.ps.declared_in_count > in_count)
                         {
                             sprintf(register_name, "((%s) > %u ? (%s) > %u ? gl_SecondaryColor : gl_Color : %s_in[%s])",
-                                    rel_param.param_str, in_count - 1, rel_param.param_str, in_count,
-                                    prefix, rel_param.param_str);
+                                    rel_param0.param_str, in_count - 1, rel_param0.param_str, in_count,
+                                    prefix, rel_param0.param_str);
                         }
                         else
                         {
-                            sprintf(register_name, "%s_in[%s]", prefix, rel_param.param_str);
+                            sprintf(register_name, "%s_in[%s]", prefix, rel_param0.param_str);
                         }
                     }
                 }
@@ -1462,12 +1463,10 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
                 /* Relative addressing */
                 if (reg->idx[0].rel_addr)
                 {
-                    struct glsl_src_param rel_param;
-                    shader_glsl_add_src_param(ins, reg->idx[0].rel_addr, WINED3DSP_WRITEMASK_0, &rel_param);
                     if (reg->idx[0].offset)
-                        sprintf(register_name, "%s_c[%s + %u]", prefix, rel_param.param_str, reg->idx[0].offset);
+                        sprintf(register_name, "%s_c[%s + %u]", prefix, rel_param0.param_str, reg->idx[0].offset);
                     else
-                        sprintf(register_name, "%s_c[%s]", prefix, rel_param.param_str);
+                        sprintf(register_name, "%s_c[%s]", prefix, rel_param0.param_str);
                 }
                 else
                 {
@@ -1606,16 +1605,10 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
 
         case WINED3DSPR_CONSTBUFFER:
             if (reg->idx[1].rel_addr)
-            {
-                struct glsl_src_param rel_param;
-                shader_glsl_add_src_param(ins, reg->idx[1].rel_addr, WINED3DSP_WRITEMASK_0, &rel_param);
                 sprintf(register_name, "%s_cb%u[%s + %u]",
-                        prefix, reg->idx[0].offset, rel_param.param_str, reg->idx[1].offset);
-            }
+                        prefix, reg->idx[0].offset, rel_param1.param_str, reg->idx[1].offset);
             else
-            {
                 sprintf(register_name, "%s_cb%u[%u]", prefix, reg->idx[0].offset, reg->idx[1].offset);
-            }
             break;
 
         case WINED3DSPR_PRIMID:




More information about the wine-cvs mailing list