Roderick Colenbrander : wined3d: Vertex Shader regtype cleanups.

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 5 12:11:19 CDT 2006


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

Author: Roderick Colenbrander <thunderbird2k at gmx.net>
Date:   Sun Apr 23 17:14:13 2006 +0200

wined3d: Vertex Shader regtype cleanups.

---

 dlls/wined3d/vertexshader.c |   34 ++++++++++++++--------------------
 1 files changed, 14 insertions(+), 20 deletions(-)

diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index 7cd05e3..f4056a8 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -707,12 +707,17 @@ inline static const SHADER_OPCODE* vshad
     return NULL;
 }
 
+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 = ((param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT);
+  DWORD regtype = vshader_program_get_regtype(param);
 
   if ((param & D3DSP_SRCMOD_MASK) == D3DSPSM_NEG) TRACE("-");
 
@@ -781,18 +786,9 @@ inline static void vshader_program_dump_
 inline static void vshader_program_dump_vs_param(const DWORD param, int input) {
   static const char* rastout_reg_names[] = { "oPos", "oFog", "oPts" };
   static const char swizzle_reg_chars[] = "xyzw";
-   /* 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);
-
-  if(param & UNKNOWN_MASK) { /* if this register has any of the unknown bits set then report them*/
-      FIXME("Unknown bits set regtype %lx , %lx, UK(%lx)\n", regtype, (param & EXTENDED_REG), param & UNKNOWN_MASK);
-  }
+  DWORD regtype = vshader_program_get_regtype(param);
 
   if ((param & D3DSP_SRCMOD_MASK) == D3DSPSM_NEG) TRACE("-");
 
@@ -875,9 +871,7 @@ #define EXTENDED_REG 0x1800
 
 inline static void vshader_program_dump_decl_usage(
     IWineD3DVertexShaderImpl *This, DWORD decl, DWORD param) {
-
-    DWORD regtype = ((param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT) |
-                    ((param & D3DSP_REGTYPE_MASK2) >> D3DSP_REGTYPE_SHIFT2);
+    DWORD regtype = vshader_program_get_regtype(param);
 
     TRACE("dcl_");
 
@@ -1023,7 +1017,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 = ((param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT);
+  DWORD regtype = vshader_program_get_regtype(param);
   char  tmpReg[255];
   BOOL is_color = FALSE;
 
@@ -1362,7 +1356,7 @@ #define PNSTRCAT(_pgmStr, _tmpLine) { \
                 } else {
                     /* Check to see if and tmp or addressing redisters are used */
                     if (curOpcode->num_params > 0) {
-                        regtype = ((((*pToken) & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT));
+                        regtype = vshader_program_get_regtype(*pToken);
                         reg = ((*pToken)  & D3DSP_REGNUM_MASK);
                         if (D3DSPR_ADDR == regtype && nUseAddressRegister <= reg) nUseAddressRegister = reg + 1;
                         if (D3DSPR_TEMP == regtype){
@@ -1371,7 +1365,7 @@ #define PNSTRCAT(_pgmStr, _tmpLine) { \
                         }
                         ++pToken;
                         for (i = 1; i < curOpcode->num_params; ++i) {
-                            regtype = ((((*pToken) & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT));
+                            regtype = vshader_program_get_regtype(*pToken);
                             reg = ((*pToken)  & D3DSP_REGNUM_MASK);
                             if (D3DSPR_ADDR == regtype && nUseAddressRegister <= reg) nUseAddressRegister = reg + 1;
                             if (D3DSPR_TEMP == regtype){
@@ -1645,7 +1639,7 @@ #endif
             continue;
         case D3DSIO_MOV:
             /* Address registers must be loaded with the ARL instruction */
-            if ((((*pToken) & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT) == D3DSPR_ADDR) {
+            if (vshader_program_get_regtype(*pToken) == D3DSPR_ADDR) {
                 if (((*pToken) & D3DSP_REGNUM_MASK) < nUseAddressRegister) {
                     strcpy(tmpLine, "ARL");
                     break;
@@ -1840,9 +1834,9 @@ #endif
                 /* 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 = ((pToken[i] & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT);
+                    DWORD regtype = vshader_program_get_regtype(pToken[i]);
     
-                    switch (regtype << D3DSP_REGTYPE_SHIFT) {
+                    switch (regtype /*<< D3DSP_REGTYPE_SHIFT*/) {
                     case D3DSPR_TEMP:
                         /* TRACE("p[%d]=R[%d]\n", i, reg); */
                         p[i] = &R[reg];




More information about the wine-cvs mailing list