Ivan Gyurdiev : wined3d: Support for shift modifiers.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Apr 19 13:15:16 CDT 2006


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

Author: Ivan Gyurdiev <ivg2 at cornell.edu>
Date:   Wed Apr 19 10:20:03 2006 -0400

wined3d: Support for shift modifiers.

---

 dlls/wined3d/pixelshader.c |   99 ++++++++++++++++++++------------------------
 1 files changed, 46 insertions(+), 53 deletions(-)

diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c
index c2b37e2..b121f7b 100644
--- a/dlls/wined3d/pixelshader.c
+++ b/dlls/wined3d/pixelshader.c
@@ -1205,8 +1205,10 @@ #endif
 
             } else {
  
-                /* Common processing: [inst] [dst] [src]* */
-
+                /* Common processing: [inst] [dst]* [src]* */
+                DWORD shift;
+                char output_rname[256];
+                char output_wmask[20];
 
                 TRACE("Found opcode D3D:%s GL:%s, PARAMS:%d, \n",
                 curOpcode->name, curOpcode->glname, curOpcode->num_params);
@@ -1461,6 +1463,7 @@ #endif
                     continue;
                 }
 
+                /* Process modifiers */
                 if (0 != (*pToken & D3DSP_DSTMOD_MASK)) {
                     DWORD mask = *pToken & D3DSP_DSTMOD_MASK;
                     switch (mask) {
@@ -1468,24 +1471,18 @@ #endif
 #if 0 /* as yet unhandled modifiers */
                     case D3DSPDM_CENTROID: centroid = TRUE; break;
                     case D3DSPDM_PP: partialpresision = TRUE; break;
-                    case D3DSPDM_X2: X2 = TRUE; break;
-                    case D3DSPDM_X4: X4 = TRUE; break;
-                    case D3DSPDM_X8: X8 = TRUE; break;
-                    case D3DSPDM_D2: D2 = TRUE; break;
-                    case D3DSPDM_D4: D4 = TRUE; break;
-                    case D3DSPDM_D8: D8 = TRUE; break;
 #endif
                     default:
                         TRACE("_unhandled_modifier(0x%08lx)\n", mask);
                     }
                 }
+                shift = (*pToken & D3DSP_DSTSHIFT_MASK) >> D3DSP_DSTSHIFT_SHIFT;
 
                 /* Generate input and output registers */
                 if (curOpcode->num_params > 0) {
                     char regs[5][50];
                     char operands[4][100];
                     char swzstring[20];
-                    int saturate = 0;
                     char tmpOp[256];
 
                     /* Generate lines that handle input modifier computation */
@@ -1496,15 +1493,11 @@ #endif
                         }
                     }
 
-                    /* Handle saturation only when no shift is present in the output modifier */
-                    if ((*pToken & D3DSPDM_SATURATE) && (0 == (*pToken & D3DSP_DSTSHIFT_MASK)))
-                        saturate = 1;
-
                     /* Handle output register */
-                    get_register_name(*pToken, tmpOp, This->constants);
-                    strcpy(operands[0], tmpOp);
-                    get_write_mask(*pToken, tmpOp);
-                    strcat(operands[0], tmpOp);
+                    get_register_name(*pToken, output_rname, This->constants);
+                    strcpy(operands[0], output_rname);
+                    get_write_mask(*pToken, output_wmask);
+                    strcat(operands[0], output_wmask);
 
                     /* This function works because of side effects from  gen_input_modifier_line */
                     /* Handle input registers */
@@ -1525,7 +1518,7 @@ #endif
                         sprintf(tmpLine, "CMP%s %s, TMP, %s, %s;\n", (saturate ? "_SAT" : ""), operands[0], operands[2], operands[3]);
                     break;
                     default:
-                        if (saturate)
+                        if (saturate && (shift == 0))
                             strcat(tmpLine, "_SAT");
                         strcat(tmpLine, " ");
                         strcat(tmpLine, operands[0]);
@@ -1536,24 +1529,14 @@ #endif
                         strcat(tmpLine,";\n");
                     }
                     addline(&lineNum, pgmStr, &pgmLength, tmpLine);
-                    pToken += curOpcode->num_params;
-                }
-#if 0           /* I Think this isn't needed because the code above generates the input / output registers. */
-                if (curOpcode->num_params > 0) {
-                    DWORD param = *(pInstr + 1);
-                    if (0 != (param & D3DSP_DSTSHIFT_MASK)) {
-
-                        /* Generate a line that handle the output modifier computation */
-                        char regstr[100];
-                        char write_mask[20];
-                        DWORD shift = (param & D3DSP_DSTSHIFT_MASK) >> D3DSP_DSTSHIFT_SHIFT;
-                        get_register_name(param, regstr, This->constants);
-                        get_write_mask(param, write_mask);
-                        gen_output_modifier_line(saturate, write_mask, shift, regstr, tmpLine);
+
+                    /* A shift requires another line. */
+                    if (shift != 0) {
+                        gen_output_modifier_line(saturate, output_wmask, shift, output_rname, tmpLine);
                         addline(&lineNum, pgmStr, &pgmLength, tmpLine);
                     }
+                    pToken += curOpcode->num_params;
                 }
-#endif
             }
         }
         /* TODO: What about result.depth? */
@@ -1597,6 +1580,31 @@ #if 1 /* if were using the data buffer o
 #endif
 }
 
+inline static void pshader_program_dump_ins_modifiers(const DWORD output) {
+
+    DWORD shift = (output & D3DSP_DSTSHIFT_MASK) >> D3DSP_DSTSHIFT_SHIFT;
+    DWORD mmask = output & D3DSP_DSTMOD_MASK;
+
+    switch (shift) {
+        case 0: break;
+        case 13: TRACE("_d8"); break;
+        case 14: TRACE("_d4"); break;
+        case 15: TRACE("_d2"); break;
+        case 1: TRACE("_x2"); break;
+        case 3: TRACE("_x4"); break;
+        case 7: TRACE("_x8"); break;
+        default: TRACE("_unhandled_shift(%ld)", shift); break;
+    }
+
+    switch(mmask) {
+        case D3DSPDM_NONE: break;
+        case D3DSPDM_SATURATE: TRACE("_sat"); break;
+        case D3DSPDM_PARTIALPRECISION: TRACE("_pp"); break;
+        case D3DSPDM_MSAMPCENTROID: TRACE("_centroid"); break;
+        default: TRACE("_unhandled_modifier(%#lx)", mmask); break;
+    } 
+}
+
 inline static void pshader_program_dump_ps_param(const DWORD param, int input) {
   static const char* rastout_reg_names[] = { "oC0", "oC1", "oC2", "oC3", "oDepth" };
   static const char swizzle_reg_chars[] = "rgba";
@@ -1660,25 +1668,8 @@ #define EXTENDED_REG 0x1800
   }
 
     if (!input) {
-        /** operand output */
-        /**
-            * for better debugging traces it's done into opcode dump code
-            * @see pshader_program_dump_opcode
-        if (0 != (param & D3DSP_DSTMOD_MASK)) {
-            DWORD mask = param & D3DSP_DSTMOD_MASK;
-            switch (mask) {
-            case D3DSPDM_SATURATE: TRACE("_sat"); break;
-            default:
-            TRACE("_unhandled_modifier(0x%08lx)", mask);
-            }
-        }
-        if (0 != (param & D3DSP_DSTSHIFT_MASK)) {
-            DWORD shift = (param & D3DSP_DSTSHIFT_MASK) >> D3DSP_DSTSHIFT_SHIFT;
-            if (shift > 0) {
-        TRACE("_x%u", 1 << shift);
-            }
-        }
-        */
+        /* operand output (for modifiers and shift, see dump_ins_modifiers) */
+
         if ((param & D3DSP_WRITEMASK_ALL) != D3DSP_WRITEMASK_ALL) {
             TRACE(".");
             if (param & D3DSP_WRITEMASK_0) TRACE(".r");
@@ -1857,8 +1848,10 @@ HRESULT WINAPI IWineD3DPixelShaderImpl_S
                         ++pToken;
                         ++len;
                 } else {
-                    TRACE("%s ", curOpcode->name);
+                    TRACE("%s", curOpcode->name);
                     if (curOpcode->num_params > 0) {
+                        pshader_program_dump_ins_modifiers(*pToken);
+                        TRACE(" ");
                         pshader_program_dump_ps_param(*pToken, 0);
                         ++pToken;
                         ++len;




More information about the wine-cvs mailing list