Ivan Gyurdiev : wined3d: Use shader_get_param() in trace pass, reg. count pass, generation pass.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 17 04:46:49 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 03b67e3030092f4fb33548b95b200da1cf08e80d
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=03b67e3030092f4fb33548b95b200da1cf08e80d

Author: Ivan Gyurdiev <ivg2 at cornell.edu>
Date:   Wed May 17 02:04:30 2006 -0400

wined3d: Use shader_get_param() in trace pass, reg. count pass, generation pass.

Change the trace pass, the register counting pass, and the hw
generator pass to take into account the new get_params() function. For
hw generation, store the address tokens into the SHADER_OPCODE_ARG
structure, so they're available to generator functions.

---

 dlls/wined3d/baseshader.c      |   42 +++++++++++++++++++++++++++++++---------
 dlls/wined3d/pixelshader.c     |   28 ++++++++++++++++++++-------
 dlls/wined3d/vertexshader.c    |   28 ++++++++++++++++++++-------
 dlls/wined3d/wined3d_private.h |    2 ++
 4 files changed, 77 insertions(+), 23 deletions(-)

diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index abf5019..f69f0ab 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -4,6 +4,7 @@
  * Copyright 2002-2003 Jason Edmeades
  * Copyright 2002-2003 Raphael Junqueira
  * Copyright 2005 Oliver Stieber
+ * Copyright 2006 Ivan Gyurdiev
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -214,13 +215,17 @@ void shader_get_registers_used(
             int i;
 
             for (i = 0; i < curOpcode->num_params; ++i) {
-                DWORD regtype = (((*pToken) & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT);
-                DWORD reg = (*pToken) & D3DSP_REGNUM_MASK;
+
+                DWORD param, addr_token, reg, regtype;
+                pToken += shader_get_param(iface, pToken, &param, &addr_token);
+
+                regtype = (param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT;
+                reg = param & D3DSP_REGNUM_MASK;
+
                 if (D3DSPR_TEXTURE == regtype)
                     *texUsed |= (1 << reg);
                 if (D3DSPR_TEMP == regtype)
                     *tempsUsed |= (1 << reg);
-                ++pToken;
              }
         }
     }
@@ -563,12 +568,33 @@ void generate_base_shader(
                 hw_arg.shader = iface;
                 hw_arg.opcode = curOpcode;
                 hw_arg.buffer = buffer;
+
                 if (curOpcode->num_params > 0) {
-                    hw_arg.dst = *pToken;
 
-                    /* FIXME: this does not account for relative address tokens */
-                    for (i = 1; i < curOpcode->num_params; i++)
-                       hw_arg.src[i-1] = *(pToken + i);
+                    DWORD param, addr_token = 0;
+
+                    /* DCL instruction has usage dst parameter, not register */
+                    if (curOpcode->opcode == D3DSIO_DCL)
+                        param = *pToken++;
+                    else
+                        pToken += shader_get_param(iface, pToken, &param, &addr_token);
+
+                    hw_arg.dst = param;
+                    hw_arg.dst_addr = addr_token;
+
+                    for (i = 1; i < curOpcode->num_params; i++) {
+                        /* DEF* instructions have constant src parameters, not registers */
+                        if (curOpcode->opcode == D3DSIO_DEF || 
+                            curOpcode->opcode == D3DSIO_DEFI || 
+                            curOpcode->opcode == D3DSIO_DEFB) {
+                            param = *pToken++;
+
+                        } else
+                            pToken += shader_get_param(iface, pToken, &param, &addr_token);
+
+                        hw_arg.src[i-1] = param;
+                        hw_arg.src_addr[i-1] = addr_token;
+                    }
                 }
 
                 /* Call appropriate function for output target */
@@ -577,8 +603,6 @@ void generate_base_shader(
                 else
                     curOpcode->hw_fct(&hw_arg);
 
-                pToken += curOpcode->num_params;
-
             } else {
 
                 /* Unless we encounter a no-op command, this opcode is unrecognized */
diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c
index 4c109e2..afee2fd 100644
--- a/dlls/wined3d/pixelshader.c
+++ b/dlls/wined3d/pixelshader.c
@@ -4,6 +4,7 @@
  * Copyright 2002-2003 Jason Edmeades
  * Copyright 2002-2003 Raphael Junqueira
  * Copyright 2005 Oliver Stieber
+ * Copyright 2006 Ivan Gyurdiev
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1448,18 +1449,31 @@ HRESULT WINAPI IWineD3DPixelShaderImpl_S
                         ++pToken;
                         ++len;
                 } else {
+
+                    DWORD param, addr_token;
+                    int tokens_read;
+
                     TRACE("%s", curOpcode->name);
                     if (curOpcode->num_params > 0) {
-                        shader_dump_ins_modifiers(*pToken);
+
+                        tokens_read = shader_get_param((IWineD3DBaseShader*) This,
+                            pToken, &param, &addr_token);                       
+                        pToken += tokens_read;
+                        len += tokens_read;
+
+                        shader_dump_ins_modifiers(param);
                         TRACE(" ");
-                        shader_dump_param((IWineD3DBaseShader*) This, *pToken, 0);
-                        ++pToken;
-                        ++len;
+                        shader_dump_param((IWineD3DBaseShader*) This, param, 0);
+                         
                         for (i = 1; i < curOpcode->num_params; ++i) {
+
+                            tokens_read = shader_get_param((IWineD3DBaseShader*) This,
+                               pToken, &param, &addr_token);
+                            pToken += tokens_read;
+                            len += tokens_read;
+
                             TRACE(", ");
-                            shader_dump_param((IWineD3DBaseShader*) This, *pToken, 1);
-                            ++pToken;
-                            ++len;
+                            shader_dump_param((IWineD3DBaseShader*) This, param, 1);
                         }
                     }
                 }
diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index fc68c71..9b46866 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -4,6 +4,7 @@
  * Copyright 2002-2003 Jason Edmeades
  * Copyright 2002-2003 Raphael Junqueira
  * Copyright 2005 Oliver Stieber
+ * Copyright 2006 Ivan Gyurdiev
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1570,18 +1571,31 @@ HRESULT WINAPI IWineD3DVertexShaderImpl_
                         ++pToken;
                         ++len;
                 } else {
+
+                    DWORD param, addr_token;
+                    int tokens_read;
+
                     TRACE("%s", curOpcode->name);
                     if (curOpcode->num_params > 0) {
-                        shader_dump_ins_modifiers(*pToken);
+
+                        tokens_read = shader_get_param((IWineD3DBaseShader*) This,
+                            pToken, &param, &addr_token);
+                        pToken += tokens_read;
+                        len += tokens_read;
+
+                        shader_dump_ins_modifiers(param);
                         TRACE(" ");
-                        shader_dump_param((IWineD3DBaseShader*) This, *pToken, 0);
-                        ++pToken;
-                        ++len;
+                        shader_dump_param((IWineD3DBaseShader*) This, param, 0);
+
                         for (i = 1; i < curOpcode->num_params; ++i) {
+
+                            tokens_read = shader_get_param((IWineD3DBaseShader*) This,
+                               pToken, &param, &addr_token);
+                            pToken += tokens_read;
+                            len += tokens_read;
+
                             TRACE(", ");
-                            shader_dump_param((IWineD3DBaseShader*) This, *pToken, 1);
-                            ++pToken;
-                            ++len;
+                            shader_dump_param((IWineD3DBaseShader*) This, param, 1);
                         }
                     }
                 }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 34d512e..1227b3f 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1295,7 +1295,9 @@ typedef struct SHADER_OPCODE_ARG {
     IWineD3DBaseShader* shader;
     CONST SHADER_OPCODE* opcode;
     DWORD dst;
+    DWORD dst_addr;
     DWORD src[4];
+    DWORD src_addr[4];
     SHADER_BUFFER* buffer;
 } SHADER_OPCODE_ARG;
 




More information about the wine-cvs mailing list