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