[WINED3D 1/3] Share get_register_code()

Ivan Gyurdiev ivg2 at cornell.edu
Fri Apr 28 03:57:24 CDT 2006


[I've started using Git, and those patches are against
  Mike McCormack's temporary git tree, which incorporates
  all relevant previously sent changes. ]

Move Roderick's new function for obtaining the register code into 
wined3d_private.h, and use it in both pixel and vertex shaders. Again, 
this function makes the way the register code is obtained consistent, 
and makes extended registers visible everywhere by taking into account 
the correct masks (using the high 2 bits).

---

  dlls/wined3d/pixelshader.c     |   16 ++++------------
  dlls/wined3d/vertexshader.c    |   25 ++++++++++---------------
  dlls/wined3d/wined3d_private.h |    5 +++++
  3 files changed, 19 insertions(+), 27 deletions(-)

6b5d7d874ef7ef1089bf42ca5780fedcc42b7e1d
diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c
index cb14a83..d097242 100644
--- a/dlls/wined3d/pixelshader.c
+++ b/dlls/wined3d/pixelshader.c
@@ -732,7 +732,7 @@ inline static void get_register_name(con
      static const char* rastout_reg_names[] = { "oC0", "oC1", "oC2", 
"oC3", "oDepth" };

      DWORD reg = param & D3DSP_REGNUM_MASK;
-    DWORD regtype = ((param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT);
+    DWORD regtype = shader_get_regtype(param);

      switch (regtype) {
      case D3DSPR_TEMP:
@@ -944,7 +944,7 @@ inline static void pshader_program_get_r
              int i;

              for (i = 0; i < curOpcode->num_params; ++i) {
-                DWORD regtype = (((*pToken) & D3DSP_REGTYPE_MASK) >> 
D3DSP_REGTYPE_SHIFT);
+                DWORD regtype = shader_get_regtype(*pToken);
                  DWORD reg = (*pToken) & D3DSP_REGNUM_MASK;
                  if (D3DSPR_TEXTURE == regtype)
                      *texUsed |= (1 << reg);
@@ -1545,14 +1545,8 @@ inline static void pshader_program_dump_
    static const char* rastout_reg_names[] = { "oC0", "oC1", "oC2", 
"oC3", "oDepth" };
    static const char swizzle_reg_chars[] = "rgba";

-   /* the unknown mask is for bits not yet accounted for by any other 
mask... */
-#define UNKNOWN_MASK 0xC000
-
-   /* for registeres about 7 we have to add on bits 11 and 12 to get 
the correct register */
-#define EXTENDED_REG 0x1800
-
    DWORD reg = param & D3DSP_REGNUM_MASK;
-  DWORD regtype = ((param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT) 
| ((param & EXTENDED_REG) >> 8);
+  DWORD regtype = shader_get_regtype(param);

    if (input) {
      if ( ((param & D3DSP_SRCMOD_MASK) == D3DSPSM_NEG) ||
@@ -1668,9 +1662,7 @@ inline static void pshader_program_dump_
  inline static void pshader_program_dump_decl_usage(
      IWineD3DPixelShaderImpl *This, DWORD decl, DWORD param) {

-    DWORD regtype = ((param & D3DSP_REGTYPE_MASK) >> 
D3DSP_REGTYPE_SHIFT) |
-                    ((param & D3DSP_REGTYPE_MASK2) >> 
D3DSP_REGTYPE_SHIFT2);
-
+    DWORD regtype = shader_get_regtype(param);
      TRACE("dcl_");

      if (regtype == D3DSPR_SAMPLER) {
diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index 318af15..0d3b8d7 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -554,17 +554,12 @@ CONST SHADER_OPCODE IWineD3DVertexShader
      {0,               NULL,       NULL,   0, NULL,            0, 0}
  };

-inline static int vshader_program_get_regtype(const DWORD param) {
-    return (((param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT) |
-                    ((param & D3DSP_REGTYPE_MASK2) >> 
D3DSP_REGTYPE_SHIFT2));
-}
-
  inline static void vshader_program_dump_param(const DWORD param, int 
input) {
    static const char* rastout_reg_names[] = { "oPos", "oFog", "oPts" };
    static const char swizzle_reg_chars[] = "xyzw";

    DWORD reg = param & D3DSP_REGNUM_MASK;
-  DWORD regtype = vshader_program_get_regtype(param);
+  DWORD regtype = shader_get_regtype(param);

    if ((param & D3DSP_SRCMOD_MASK) == D3DSPSM_NEG) TRACE("-");

@@ -635,11 +630,11 @@ inline static void vshader_program_dump_
    static const char swizzle_reg_chars[] = "xyzw";

    DWORD reg = param & D3DSP_REGNUM_MASK;
-  DWORD regtype = vshader_program_get_regtype(param);
+  DWORD regtype = shader_get_regtype(param);

    if ((param & D3DSP_SRCMOD_MASK) == D3DSPSM_NEG) TRACE("-");

-  switch (regtype /*<< D3DSP_REGTYPE_SHIFT*/) {
+  switch (regtype) {
    case D3DSPR_TEMP:
      TRACE("r%lu", reg);
      break;
@@ -718,7 +713,7 @@ inline static void vshader_program_dump_

  inline static void vshader_program_dump_decl_usage(
      IWineD3DVertexShaderImpl *This, DWORD decl, DWORD param) {
-    DWORD regtype = vshader_program_get_regtype(param);
+    DWORD regtype = shader_get_regtype(param);

      TRACE("dcl_");

@@ -864,7 +859,7 @@ inline static void vshader_program_add_p
    static const char* hwrastout_reg_names[] = { "result.position", 
"result.fogcoord", "result.pointsize" };

    DWORD reg = param & D3DSP_REGNUM_MASK;
-  DWORD regtype = vshader_program_get_regtype(param);
+  DWORD regtype = shader_get_regtype(param);
    char  tmpReg[255];
    BOOL is_color = FALSE;

@@ -1236,7 +1231,7 @@ inline static VOID IWineD3DVertexShaderI
                  } else {
                      /* Check to see if and tmp or addressing redisters 
are used */
                      if (curOpcode->num_params > 0) {
-                        regtype = vshader_program_get_regtype(*pToken);
+                        regtype = shader_get_regtype(*pToken);
                          reg = ((*pToken)  & D3DSP_REGNUM_MASK);
                          if (D3DSPR_ADDR == regtype && 
nUseAddressRegister <= reg) nUseAddressRegister = reg + 1;
                          if (D3DSPR_TEMP == regtype){
@@ -1245,7 +1240,7 @@ inline static VOID IWineD3DVertexShaderI
                          }
                          ++pToken;
                          for (i = 1; i < curOpcode->num_params; ++i) {
-                            regtype = vshader_program_get_regtype(*pToken);
+                            regtype = shader_get_regtype(*pToken);
                              reg = ((*pToken)  & D3DSP_REGNUM_MASK);
                              if (D3DSPR_ADDR == regtype && 
nUseAddressRegister <= reg) nUseAddressRegister = reg + 1;
                              if (D3DSPR_TEMP == regtype){
@@ -1451,7 +1446,7 @@ inline static VOID IWineD3DVertexShaderI
              continue;
          case D3DSIO_MOV:
              /* Address registers must be loaded with the ARL 
instruction */
-            if (vshader_program_get_regtype(*pToken) == D3DSPR_ADDR) {
+            if (shader_get_regtype(*pToken) == D3DSPR_ADDR) {
                  if (((*pToken) & D3DSP_REGNUM_MASK) < 
nUseAddressRegister) {
                      strcpy(tmpLine, "ARL");
                      break;
@@ -1640,9 +1635,9 @@ HRESULT WINAPI IWineD3DVertexShaderImpl_
                  /* TRACE(">> execting opcode: pos=%d opcode_name=%s 
token=%08lX\n", pToken - vshader->function, curOpcode->name, *pToken); */
                  for (i = 0; i < curOpcode->num_params; ++i) {
                      DWORD reg = pToken[i] & D3DSP_REGNUM_MASK;
-                    DWORD regtype = vshader_program_get_regtype(pToken[i]);
+                    DWORD regtype = shader_get_regtype(pToken[i]);

-                    switch (regtype /*<< D3DSP_REGTYPE_SHIFT*/) {
+                    switch (regtype) {
                      case D3DSPR_TEMP:
                          /* TRACE("p[%d]=R[%d]\n", i, reg); */
                          p[i] = &R[reg];
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8e372e5..0be6398 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1216,6 +1216,11 @@ extern const SHADER_OPCODE* shader_get_o
      IWineD3DBaseShader *iface,
      const DWORD code);

+inline static int shader_get_regtype(const DWORD param) {
+    return (((param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT) |
+            ((param & D3DSP_REGTYPE_MASK2) >> D3DSP_REGTYPE_SHIFT2));
+}
+
 
/*****************************************************************************
   * IDirect3DBaseShader implementation structure
   */
-- 
1.2.6




More information about the wine-patches mailing list