wined3d: Create a relative addressing token for 1.x shaders in the frontend.

Henri Verbeet hverbeet at codeweavers.com
Fri Apr 17 02:46:56 CDT 2009


Rather than handling this in the backends. Note that the ARB backend always
assumes 1.x shaders.
---
 dlls/wined3d/baseshader.c  |   31 +++++++++++++++++++++++--------
 dlls/wined3d/glsl_shader.c |   27 ++++++---------------------
 2 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index e0cedbc..7640a79 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -7,6 +7,7 @@
  * Copyright 2005 Oliver Stieber
  * Copyright 2006 Ivan Gyurdiev
  * Copyright 2007-2008 Stefan Dösinger for CodeWeavers
+ * Copyright 2009 Henri Verbeet for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -131,17 +132,31 @@ const SHADER_OPCODE *shader_get_opcode(const SHADER_OPCODE *opcode_table, DWORD
  * Return the number of tokens read */
 static int shader_get_param(const DWORD *pToken, DWORD shader_version, DWORD *param, DWORD *addr_token)
 {
+    UINT count = 1;
+
+    *param = *pToken;
+
     /* PS >= 3.0 have relative addressing (with token)
      * VS >= 2.0 have relative addressing (with token)
      * VS >= 1.0 < 2.0 have relative addressing (without token)
      * The version check below should work in general */
+    if (*pToken & WINED3DSHADER_ADDRMODE_RELATIVE)
+    {
+        if (WINED3DSHADER_VERSION_MAJOR(shader_version) < 2)
+        {
+            *addr_token = (1 << 31)
+                    | ((WINED3DSPR_ADDR << WINED3DSP_REGTYPE_SHIFT2) & WINED3DSP_REGTYPE_MASK2)
+                    | ((WINED3DSPR_ADDR << WINED3DSP_REGTYPE_SHIFT) & WINED3DSP_REGTYPE_MASK)
+                    | WINED3DSP_NOSWIZZLE;
+        }
+        else
+        {
+            *addr_token = *(pToken + 1);
+            ++count;
+        }
+    }
 
-    char rel_token = WINED3DSHADER_VERSION_MAJOR(shader_version) >= 2 &&
-        ((*pToken & WINED3DSHADER_ADDRESSMODE_MASK) == WINED3DSHADER_ADDRMODE_RELATIVE);
-
-    *param = *pToken;
-    *addr_token = rel_token? *(pToken + 1): 0;
-    return rel_token? 2:1;
+    return count;
 }
 
 /* Return the number of parameters to skip for an opcode */
@@ -167,7 +182,7 @@ static int shader_skip_unrecognized(const DWORD *pToken, DWORD shader_version)
     /* TODO: Think of a good name for 0x80000000 and replace it with a constant */
     while (*pToken & 0x80000000) {
 
-        DWORD param, addr_token;
+        DWORD param, addr_token = 0;
         tokens_read += shader_get_param(pToken, shader_version, &param, &addr_token);
         pToken += tokens_read;
 
@@ -1014,7 +1029,7 @@ void shader_trace_init(const DWORD *pFunction, const SHADER_OPCODE *opcode_table
             }
             else
             {
-                DWORD param, addr_token;
+                DWORD param, addr_token = 0;
                 int tokens_read;
 
                 /* Print out predication source token first - it follows
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 3c8eac1..01a7c38 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -1105,27 +1105,12 @@ static void shader_glsl_get_register_name(WINED3DSHADER_PARAM_REGISTER_TYPE regi
         /* Relative addressing */
         if (rel_addr)
         {
-           /* Relative addressing on shaders 2.0+ have a relative address token, 
-            * prior to that, it was hard-coded as "A0.x" because there's only 1 register */
-           if (WINED3DSHADER_VERSION_MAJOR(shader_version) >= 2)
-           {
-               glsl_src_param_t rel_param;
-               shader_glsl_add_src_param(ins, addr_token, 0, WINED3DSP_WRITEMASK_0, &rel_param);
-               if (register_idx)
-               {
-                   sprintf(register_name, "%cC[%s + %u]", prefix, rel_param.param_str, register_idx);
-               } else {
-                   sprintf(register_name, "%cC[%s]", prefix, rel_param.param_str);
-               }
-           } else {
-               if (register_idx)
-               {
-                   sprintf(register_name, "%cC[A0.x + %u]", prefix, register_idx);
-               } else {
-                   sprintf(register_name, "%cC[A0.x]", prefix);
-               }
-           }
-
+           glsl_src_param_t rel_param;
+           shader_glsl_add_src_param(ins, addr_token, 0, WINED3DSP_WRITEMASK_0, &rel_param);
+           if (register_idx)
+               sprintf(register_name, "%cC[%s + %u]", prefix, rel_param.param_str, register_idx);
+           else
+               sprintf(register_name, "%cC[%s]", prefix, rel_param.param_str);
         } else {
             if (shader_constant_is_local(This, register_idx))
             {
-- 
1.6.0.6



--------------040608050909090403080705--



More information about the wine-patches mailing list