[WINED3D 2/5] Trace improvements.

Ivan Gyurdiev ivg2 at cornell.edu
Tue Jun 6 01:40:08 CDT 2006


1) add support for printing out defi instructions
2) add support for printing defb instructions
3) add support for printing constants > 256.
   A lot more than 256 constants can be supported according to spec.
   There are 4 register files (CONST, CONST2, CONST3, and CONST4) - use
   correct offsets to get the right constant value for large constants.

4) allow relative addressing against an INPUT register
   (this is valid in shaders 3.0 against aL)

5) minor style issue - don't print array brackets unless relative 
addressing is used

-------------- next part --------------
---

 dlls/wined3d/baseshader.c      |   41 +++++++++++++++++++++++++++------
 dlls/wined3d/pixelshader.c     |   49 ++++++++++++++++++++++++++--------------
 dlls/wined3d/vertexshader.c    |   49 ++++++++++++++++++++++++++--------------
 dlls/wined3d/wined3d_private.h |    2 ++
 4 files changed, 99 insertions(+), 42 deletions(-)

718f49197c233c08b33d023a861ddc6b0fdaf7cb
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index 7c24fa0..ee54a5e 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -160,6 +160,25 @@ int shader_skip_unrecognized(
     return tokens_read;
 }
 
+/* Convert floating point offset relative
+ * to a register file to an absolute offset for float constants */
+
+unsigned int shader_get_float_offset(const DWORD reg) {
+
+     unsigned int regnum = reg & D3DSP_REGNUM_MASK;
+     int regtype = shader_get_regtype(reg);
+
+     switch (regtype) {
+        case D3DSPR_CONST: return regnum;
+        case D3DSPR_CONST2: return 2048 + regnum;
+        case D3DSPR_CONST3: return 4096 + regnum;
+        case D3DSPR_CONST4: return 6144 + regnum;
+        default:
+            FIXME("Unsupported register type: %d\n", regtype);
+            return regnum;
+     }
+}
+
 /* Note that this does not count the loop register
  * as an address register. */
 
@@ -330,21 +349,23 @@ static void shader_dump_arr_entry(
     IWineD3DBaseShader *iface,
     const DWORD param,
     const DWORD addr_token,
+    unsigned int reg,
     int input) {
 
-    DWORD reg = param & D3DSP_REGNUM_MASK;
     char relative =
         ((param & D3DSHADER_ADDRESSMODE_MASK) == D3DSHADER_ADDRMODE_RELATIVE);
 
-    TRACE("[");
     if (relative) {
+        TRACE("[");
         if (addr_token)
             shader_dump_param(iface, addr_token, 0, input);
         else
             TRACE("a0.x");
         TRACE(" + ");
      }
-     TRACE("%lu]", reg);
+     TRACE("%u", reg);
+     if (relative)
+         TRACE("]");
 }
 
 void shader_dump_param(
@@ -388,11 +409,15 @@ void shader_dump_param(
             TRACE("r%lu", reg);
             break;
         case D3DSPR_INPUT:
-            TRACE("v%lu", reg);
+            TRACE("v");
+            shader_dump_arr_entry(iface, param, addr_token, reg, input);
             break;
         case D3DSPR_CONST:
+        case D3DSPR_CONST2:
+        case D3DSPR_CONST3:
+        case D3DSPR_CONST4:
             TRACE("c");
-            shader_dump_arr_entry(iface, param, addr_token, input);
+            shader_dump_arr_entry(iface, param, addr_token, shader_get_float_offset(param), input);
             break;
         case D3DSPR_TEXTURE: /* vs: case D3DSPR_ADDR */
             TRACE("%c%lu", (pshader? 't':'a'), reg);
@@ -416,18 +441,18 @@ void shader_dump_param(
 
             if (D3DSHADER_VERSION_MAJOR(This->baseShader.hex_version) >= 3) {
                 TRACE("o");
-                shader_dump_arr_entry(iface, param, addr_token, input);
+                shader_dump_arr_entry(iface, param, addr_token, reg, input);
             }
             else 
                TRACE("oT%lu", reg);
             break;
         case D3DSPR_CONSTINT:
             TRACE("i");
-            shader_dump_arr_entry(iface, param, addr_token, input);
+            shader_dump_arr_entry(iface, param, addr_token, reg, input);
             break;
         case D3DSPR_CONSTBOOL:
             TRACE("b");
-            shader_dump_arr_entry(iface, param, addr_token, input);
+            shader_dump_arr_entry(iface, param, addr_token, reg, input);
             break;
         case D3DSPR_LABEL:
             TRACE("l%lu", reg);
diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c
index a1b1d49..30e1831 100644
--- a/dlls/wined3d/pixelshader.c
+++ b/dlls/wined3d/pixelshader.c
@@ -1424,23 +1424,38 @@ HRESULT WINAPI IWineD3DPixelShaderImpl_S
                     pToken += 2;
                     len += 2;
 
-                } else 
-                    if (curOpcode->opcode == D3DSIO_DEF) {
-                        TRACE("def c%lu = ", *pToken & 0xFF);
-                        ++pToken;
-                        ++len;
-                        TRACE("%f ,", *(float *)pToken);
-                        ++pToken;
-                        ++len;
-                        TRACE("%f ,", *(float *)pToken);
-                        ++pToken;
-                        ++len;
-                        TRACE("%f ,", *(float *)pToken);
-                        ++pToken;
-                        ++len;
-                        TRACE("%f", *(float *)pToken);
-                        ++pToken;
-                        ++len;
+                } else if (curOpcode->opcode == D3DSIO_DEF) {
+
+                        unsigned int offset = shader_get_float_offset(*pToken);
+
+                        TRACE("def c%u = %f, %f, %f, %f", offset,
+                            *(float *)(pToken + 1),
+                            *(float *)(pToken + 2),
+                            *(float *)(pToken + 3),
+                            *(float *)(pToken + 4));
+
+                        pToken += 5;
+                        len += 5;
+
+                } else if (curOpcode->opcode == D3DSIO_DEFI) {
+
+                        TRACE("defi i%lu = %ld, %ld, %ld, %ld", *pToken & D3DSP_REGNUM_MASK,
+                            (long) *(pToken + 1),
+                            (long) *(pToken + 2),
+                            (long) *(pToken + 3),
+                            (long) *(pToken + 4));
+
+                        pToken += 5;
+                        len += 5;
+
+                } else if (curOpcode->opcode == D3DSIO_DEFB) {
+
+                        TRACE("defb b%lu = %s", *pToken & D3DSP_REGNUM_MASK,
+                            *(pToken + 1)? "true": "false");
+
+                        pToken += 2;
+                        len += 2;
+
                 } else {
 
                     DWORD param, addr_token;
diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index d82546e..0c525a6 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -1571,23 +1571,38 @@ HRESULT WINAPI IWineD3DVertexShaderImpl_
                     pToken += 2;
                     len += 2;
 
-                } else 
-                    if (curOpcode->opcode == D3DSIO_DEF) {
-                        TRACE("def c%lu = ", *pToken & 0xFF);
-                        ++pToken;
-                        ++len;
-                        TRACE("%f ,", *(float *)pToken);
-                        ++pToken;
-                        ++len;
-                        TRACE("%f ,", *(float *)pToken);
-                        ++pToken;
-                        ++len;
-                        TRACE("%f ,", *(float *)pToken);
-                        ++pToken;
-                        ++len;
-                        TRACE("%f", *(float *)pToken);
-                        ++pToken;
-                        ++len;
+                } else if (curOpcode->opcode == D3DSIO_DEF) {
+
+                        unsigned int offset = shader_get_float_offset(*pToken);
+
+                        TRACE("def c%u = %f, %f, %f, %f", offset,
+                            *(float *)(pToken + 1),
+                            *(float *)(pToken + 2),
+                            *(float *)(pToken + 3),
+                            *(float *)(pToken + 4));
+
+                        pToken += 5;
+                        len += 5;
+
+                } else if (curOpcode->opcode == D3DSIO_DEFI) {
+
+                        TRACE("defi i%lu = %ld, %ld, %ld, %ld", *pToken & D3DSP_REGNUM_MASK,
+                            (long) *(pToken + 1),
+                            (long) *(pToken + 2),
+                            (long) *(pToken + 3),
+                            (long) *(pToken + 4));
+
+                        pToken += 5;
+                        len += 5;
+
+                } else if (curOpcode->opcode == D3DSIO_DEFB) {
+
+                        TRACE("defb b%lu = %s", *pToken & D3DSP_REGNUM_MASK,
+                            *(pToken + 1)? "true": "false");
+
+                        pToken += 2;
+                        len += 2;
+
                 } else {
 
                     DWORD param, addr_token;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 0552ee4..5148c01 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1363,6 +1363,8 @@ inline static int shader_get_regtype(con
             ((param & D3DSP_REGTYPE_MASK2) >> D3DSP_REGTYPE_SHIFT2));
 }
 
+extern unsigned int shader_get_float_offset(const DWORD reg);
+
 inline static BOOL shader_is_pshader_version(DWORD token) {
     return 0xFFFF0000 == (token & 0xFFFF0000);
 }
-- 
1.3.3



More information about the wine-patches mailing list