Henri Verbeet : wined3d: Avoid using WINED3DSP_REGNUM_MASK in the def/defi/ defb handlers.

Alexandre Julliard julliard at winehq.org
Fri May 1 09:33:21 CDT 2009


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Fri May  1 09:13:54 2009 +0200

wined3d: Avoid using WINED3DSP_REGNUM_MASK in the def/defi/defb handlers.

---

 dlls/wined3d/baseshader.c |   86 +++++++++++++++++++++++++++-----------------
 1 files changed, 53 insertions(+), 33 deletions(-)

diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index c56b3cf..9bdad17 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -468,17 +468,6 @@ void shader_init(struct IWineD3DBaseShaderClass *shader,
     list_init(&shader->linked_programs);
 }
 
-static inline WINED3DSHADER_PARAM_REGISTER_TYPE shader_get_regtype(DWORD param)
-{
-    return ((param & WINED3DSP_REGTYPE_MASK) >> WINED3DSP_REGTYPE_SHIFT)
-            | ((param & WINED3DSP_REGTYPE_MASK2) >> WINED3DSP_REGTYPE_SHIFT2);
-}
-
-static inline DWORD shader_get_writemask(DWORD param)
-{
-    return param & WINED3DSP_WRITEMASK_ALL;
-}
-
 /* Convert floating point offset relative
  * to a register file to an absolute offset for float constants */
 static unsigned int shader_get_float_offset(WINED3DSHADER_PARAM_REGISTER_TYPE register_type, UINT register_idx)
@@ -671,10 +660,17 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, struct shader_reg_m
         }
         else if (ins.handler_idx == WINED3DSIH_DEF)
         {
+            struct wined3d_shader_dst_param dst;
+            struct wined3d_shader_src_param rel_addr;
+
             local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
             if (!lconst) return E_OUTOFMEMORY;
-            lconst->idx = *pToken & WINED3DSP_REGNUM_MASK;
-            memcpy(lconst->value, pToken + 1, 4 * sizeof(DWORD));
+
+            shader_sm1_read_dst_param(&pToken, &dst, &rel_addr, shader_version);
+            lconst->idx = dst.register_idx;
+
+            memcpy(lconst->value, pToken, 4 * sizeof(DWORD));
+            pToken += 4;
 
             /* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */
             if (WINED3DSHADER_VERSION_MAJOR(shader_version) == 1 && pshader)
@@ -691,25 +687,38 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, struct shader_reg_m
             }
 
             list_add_head(&This->baseShader.constantsF, &lconst->entry);
-            pToken += param_size;
         }
         else if (ins.handler_idx == WINED3DSIH_DEFI)
         {
+            struct wined3d_shader_dst_param dst;
+            struct wined3d_shader_src_param rel_addr;
+
             local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
             if (!lconst) return E_OUTOFMEMORY;
-            lconst->idx = *pToken & WINED3DSP_REGNUM_MASK;
-            memcpy(lconst->value, pToken + 1, 4 * sizeof(DWORD));
+
+            shader_sm1_read_dst_param(&pToken, &dst, &rel_addr, shader_version);
+            lconst->idx = dst.register_idx;
+
+            memcpy(lconst->value, pToken, 4 * sizeof(DWORD));
+            pToken += 4;
+
             list_add_head(&This->baseShader.constantsI, &lconst->entry);
-            pToken += param_size;
         }
         else if (ins.handler_idx == WINED3DSIH_DEFB)
         {
+            struct wined3d_shader_dst_param dst;
+            struct wined3d_shader_src_param rel_addr;
+
             local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant));
             if (!lconst) return E_OUTOFMEMORY;
-            lconst->idx = *pToken & WINED3DSP_REGNUM_MASK;
-            memcpy(lconst->value, pToken + 1, 1 * sizeof(DWORD));
+
+            shader_sm1_read_dst_param(&pToken, &dst, &rel_addr, shader_version);
+            lconst->idx = dst.register_idx;
+
+            memcpy(lconst->value, pToken, sizeof(DWORD));
+            ++pToken;
+
             list_add_head(&This->baseShader.constantsB, &lconst->entry);
-            pToken += param_size;
         }
         /* If there's a loop in the shader */
         else if (ins.handler_idx == WINED3DSIH_LOOP
@@ -1279,30 +1288,41 @@ void shader_trace_init(const DWORD *pFunction, const SHADER_OPCODE *opcode_table
         }
         else if (ins.handler_idx == WINED3DSIH_DEF)
         {
-            unsigned int offset = shader_get_float_offset(shader_get_regtype(*pToken),
-                    *pToken & WINED3DSP_REGNUM_MASK);
+            struct wined3d_shader_dst_param dst;
+            struct wined3d_shader_src_param rel_addr;
+
+            shader_sm1_read_dst_param(&pToken, &dst, &rel_addr, shader_version);
 
-            TRACE("def c%u = %f, %f, %f, %f", offset,
+            TRACE("def c%u = %f, %f, %f, %f", shader_get_float_offset(dst.register_type, dst.register_idx),
+                    *(const float *)(pToken),
                     *(const float *)(pToken + 1),
                     *(const float *)(pToken + 2),
-                    *(const float *)(pToken + 3),
-                    *(const float *)(pToken + 4));
-            pToken += 5;
+                    *(const float *)(pToken + 3));
+            pToken += 4;
         }
         else if (ins.handler_idx == WINED3DSIH_DEFI)
         {
-            TRACE("defi i%u = %d, %d, %d, %d", *pToken & WINED3DSP_REGNUM_MASK,
+            struct wined3d_shader_dst_param dst;
+            struct wined3d_shader_src_param rel_addr;
+
+            shader_sm1_read_dst_param(&pToken, &dst, &rel_addr, shader_version);
+
+            TRACE("defi i%u = %d, %d, %d, %d", dst.register_idx,
+                    *(pToken),
                     *(pToken + 1),
                     *(pToken + 2),
-                    *(pToken + 3),
-                    *(pToken + 4));
-            pToken += 5;
+                    *(pToken + 3));
+            pToken += 4;
         }
         else if (ins.handler_idx == WINED3DSIH_DEFB)
         {
-            TRACE("defb b%u = %s", *pToken & WINED3DSP_REGNUM_MASK,
-                    *(pToken + 1)? "true": "false");
-            pToken += 2;
+            struct wined3d_shader_dst_param dst;
+            struct wined3d_shader_src_param rel_addr;
+
+            shader_sm1_read_dst_param(&pToken, &dst, &rel_addr, shader_version);
+
+            TRACE("defb b%u = %s", dst.register_idx, *pToken ? "true" : "false");
+            ++pToken;
         }
         else
         {




More information about the wine-cvs mailing list