Matteo Bruni : d3dx9: Add ps_3_0 instructions parsing to the shader assembler.

Alexandre Julliard julliard at winehq.org
Wed May 19 10:34:18 CDT 2010


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

Author: Matteo Bruni <matteo.mystral at gmail.com>
Date:   Wed May 19 14:57:38 2010 +0200

d3dx9: Add ps_3_0 instructions parsing to the shader assembler.

---

 dlls/d3dx9_36/asmshader.l        |   10 ++++++
 dlls/d3dx9_36/asmshader.y        |   57 ++++++++++++++++++++++++++++++++++++++
 dlls/d3dx9_36/asmutils.c         |   21 ++++++++++++++
 dlls/d3dx9_36/d3dx9_36_private.h |   13 ++++++++
 4 files changed, 101 insertions(+), 0 deletions(-)

diff --git a/dlls/d3dx9_36/asmshader.l b/dlls/d3dx9_36/asmshader.l
index e65c6f9..e1aac26 100644
--- a/dlls/d3dx9_36/asmshader.l
+++ b/dlls/d3dx9_36/asmshader.l
@@ -161,6 +161,16 @@ texldl                  {return INSTR_TEXLDL;       }
 lit                     {return INSTR_LIT;          }
 mova                    {return INSTR_MOVA;         }
 
+    /* Pixel shader only instructions   */
+cmp                     {return INSTR_CMP;          }
+dp2add                  {return INSTR_DP2ADD;       }
+texkill                 {return INSTR_TEXKILL;      }
+texld                   {return INSTR_TEXLD;        }
+dsx                     {return INSTR_DSX;          }
+dsy                     {return INSTR_DSY;          }
+texldp                  {return INSTR_TEXLDP;       }
+texldb                  {return INSTR_TEXLDB;       }
+texldd                  {return INSTR_TEXLDD;       }
 
 {REG_TEMP}              {
                             asmshader_lval.regnum = atoi(yytext + 1);
diff --git a/dlls/d3dx9_36/asmshader.y b/dlls/d3dx9_36/asmshader.y
index f8dd716..657ce3c 100644
--- a/dlls/d3dx9_36/asmshader.y
+++ b/dlls/d3dx9_36/asmshader.y
@@ -147,6 +147,17 @@ void set_rel_reg(struct shader_reg *reg, struct rel_reg *rel) {
 %token INSTR_LIT
 %token INSTR_MOVA
 
+/* Pixel shader only instructions   */
+%token INSTR_CMP
+%token INSTR_DP2ADD
+%token INSTR_TEXKILL
+%token INSTR_TEXLD
+%token INSTR_DSX
+%token INSTR_DSY
+%token INSTR_TEXLDP
+%token INSTR_TEXLDB
+%token INSTR_TEXLDD
+
 /* Registers */
 %token <regnum> REG_TEMP
 %token <regnum> REG_OUTPUT
@@ -685,6 +696,52 @@ instruction:          INSTR_ADD omods dreg ',' sregs
                                 TRACE("MOVA\n");
                                 asm_ctx.funcs->instr(&asm_ctx, BWRITERSIO_MOVA, $2.mod, $2.shift, 0, &$3, &$5, 1);
                             }
+                    | INSTR_CMP omods dreg ',' sregs
+                            {
+                                TRACE("CMP\n");
+                                asm_ctx.funcs->instr(&asm_ctx, BWRITERSIO_CMP, $2.mod, $2.shift, 0, &$3, &$5, 3);
+                            }
+                    | INSTR_DP2ADD omods dreg ',' sregs
+                            {
+                                TRACE("DP2ADD\n");
+                                asm_ctx.funcs->instr(&asm_ctx, BWRITERSIO_DP2ADD, $2.mod, $2.shift, 0, &$3, &$5, 3);
+                            }
+                    | INSTR_TEXLD omods dreg ',' sregs
+                            {
+                                TRACE("TEXLD\n");
+                                /* There is more than one acceptable syntax for texld:
+                                   with 1 sreg (PS 1.4) or
+                                   with 2 sregs (PS 2.0+)
+                                   Moreover, texld shares the same opcode as the tex instruction,
+                                   so there are a total of 3 valid syntaxes
+                                   These variations are handled in asmparser.c */
+                                asm_ctx.funcs->instr(&asm_ctx, BWRITERSIO_TEX, $2.mod, $2.shift, 0, &$3, &$5, 2);
+                            }
+                    | INSTR_TEXLDP omods dreg ',' sregs
+                            {
+                                TRACE("TEXLDP\n");
+                                asm_ctx.funcs->instr(&asm_ctx, BWRITERSIO_TEX | ( BWRITERSI_TEXLD_PROJECT << BWRITER_OPCODESPECIFICCONTROL_SHIFT ), $2.mod, $2.shift, 0, &$3, &$5, 2);
+                            }
+                    | INSTR_TEXLDB omods dreg ',' sregs
+                            {
+                                TRACE("TEXLDB\n");
+                                asm_ctx.funcs->instr(&asm_ctx, BWRITERSIO_TEX | ( BWRITERSI_TEXLD_BIAS << BWRITER_OPCODESPECIFICCONTROL_SHIFT ), $2.mod, $2.shift, 0, &$3, &$5, 2);
+                            }
+                    | INSTR_DSX omods dreg ',' sregs
+                            {
+                                TRACE("DSX\n");
+                                asm_ctx.funcs->instr(&asm_ctx, BWRITERSIO_DSX, $2.mod, $2.shift, 0, &$3, &$5, 1);
+                            }
+                    | INSTR_DSY omods dreg ',' sregs
+                            {
+                                TRACE("DSY\n");
+                                asm_ctx.funcs->instr(&asm_ctx, BWRITERSIO_DSY, $2.mod, $2.shift, 0, &$3, &$5, 1);
+                            }
+                    | INSTR_TEXLDD omods dreg ',' sregs
+                            {
+                                TRACE("TEXLDD\n");
+                                asm_ctx.funcs->instr(&asm_ctx, BWRITERSIO_TEXLDD, $2.mod, $2.shift, 0, &$3, &$5, 4);
+                            }
 
 dreg:                 dreg_name rel_reg
                             {
diff --git a/dlls/d3dx9_36/asmutils.c b/dlls/d3dx9_36/asmutils.c
index c5ef6c2..e000a5f 100644
--- a/dlls/d3dx9_36/asmutils.c
+++ b/dlls/d3dx9_36/asmutils.c
@@ -191,9 +191,17 @@ DWORD d3d9_opcode(DWORD bwriter_opcode) {
         case BWRITERSIO_MOVA:        return D3DSIO_MOVA;
         case BWRITERSIO_DEFB:        return D3DSIO_DEFB;
         case BWRITERSIO_DEFI:        return D3DSIO_DEFI;
+
+        case BWRITERSIO_TEXKILL:     return D3DSIO_TEXKILL;
+        case BWRITERSIO_TEX:         return D3DSIO_TEX;
         case BWRITERSIO_EXPP:        return D3DSIO_EXPP;
         case BWRITERSIO_LOGP:        return D3DSIO_LOGP;
         case BWRITERSIO_DEF:         return D3DSIO_DEF;
+        case BWRITERSIO_CMP:         return D3DSIO_CMP;
+        case BWRITERSIO_DP2ADD:      return D3DSIO_DP2ADD;
+        case BWRITERSIO_DSX:         return D3DSIO_DSX;
+        case BWRITERSIO_DSY:         return D3DSIO_DSY;
+        case BWRITERSIO_TEXLDD:      return D3DSIO_TEXLDD;
         case BWRITERSIO_SETP:        return D3DSIO_SETP;
         case BWRITERSIO_TEXLDL:      return D3DSIO_TEXLDL;
         case BWRITERSIO_BREAKP:      return D3DSIO_BREAKP;
@@ -201,6 +209,9 @@ DWORD d3d9_opcode(DWORD bwriter_opcode) {
         case BWRITERSIO_COMMENT:     return D3DSIO_COMMENT;
         case BWRITERSIO_END:         return D3DSIO_END;
 
+        case BWRITERSIO_TEX | ( BWRITERSI_TEXLD_PROJECT << BWRITER_OPCODESPECIFICCONTROL_SHIFT ):                    return D3DSIO_TEX | D3DSI_TEXLD_PROJECT;
+        case BWRITERSIO_TEX | ( BWRITERSI_TEXLD_BIAS << BWRITER_OPCODESPECIFICCONTROL_SHIFT ):                       return D3DSIO_TEX | D3DSI_TEXLD_BIAS;
+
         default:
             FIXME("Unhandled BWRITERSIO token %u\n", bwriter_opcode);
             return -1;
@@ -459,13 +470,23 @@ const char *debug_print_opcode(DWORD opcode) {
         case BWRITERSIO_MOVA:         return "mova";
         case BWRITERSIO_DEFB:         return "defb";
         case BWRITERSIO_DEFI:         return "defi";
+        case BWRITERSIO_TEXKILL:      return "texkill";
+        case BWRITERSIO_TEX:          return "tex";
         case BWRITERSIO_EXPP:         return "expp";
         case BWRITERSIO_LOGP:         return "logp";
         case BWRITERSIO_DEF:          return "def";
+        case BWRITERSIO_CMP:          return "cmp";
+        case BWRITERSIO_DP2ADD:       return "dp2add";
+        case BWRITERSIO_DSX:          return "dsx";
+        case BWRITERSIO_DSY:          return "dsy";
+        case BWRITERSIO_TEXLDD:       return "texldd";
         case BWRITERSIO_SETP:         return "setp";
         case BWRITERSIO_TEXLDL:       return "texldl";
         case BWRITERSIO_BREAKP:       return "breakp";
 
+        case BWRITERSIO_TEX | ( BWRITERSI_TEXLD_PROJECT << BWRITER_OPCODESPECIFICCONTROL_SHIFT ):                     return "texldp";
+        case BWRITERSIO_TEX | ( BWRITERSI_TEXLD_BIAS << BWRITER_OPCODESPECIFICCONTROL_SHIFT ):                        return "texldb";
+
         default:                      return "unknown";
     }
 }
diff --git a/dlls/d3dx9_36/d3dx9_36_private.h b/dlls/d3dx9_36/d3dx9_36_private.h
index ffecd31..e5816b3 100644
--- a/dlls/d3dx9_36/d3dx9_36_private.h
+++ b/dlls/d3dx9_36/d3dx9_36_private.h
@@ -448,9 +448,16 @@ typedef enum _BWRITERSHADER_INSTRUCTION_OPCODE_TYPE {
     BWRITERSIO_DEFB,
     BWRITERSIO_DEFI,
 
+    BWRITERSIO_TEXKILL,
+    BWRITERSIO_TEX,
     BWRITERSIO_EXPP,
     BWRITERSIO_LOGP,
     BWRITERSIO_DEF,
+    BWRITERSIO_CMP,
+    BWRITERSIO_DP2ADD,
+    BWRITERSIO_DSX,
+    BWRITERSIO_DSY,
+    BWRITERSIO_TEXLDD,
     BWRITERSIO_SETP,
     BWRITERSIO_TEXLDL,
     BWRITERSIO_BREAKP,
@@ -508,6 +515,9 @@ typedef enum _BWRITERSAMPLER_TEXTURE_TYPE {
     BWRITERSTT_VOLUME = 4,
 } BWRITERSAMPLER_TEXTURE_TYPE;
 
+#define BWRITERSI_TEXLD_PROJECT 1
+#define BWRITERSI_TEXLD_BIAS    2
+
 typedef enum _BWRITERSHADER_PARAM_SRCMOD_TYPE {
     BWRITERSPSM_NONE = 0,
     BWRITERSPSM_NEG,
@@ -578,6 +588,9 @@ typedef enum _BWRITERDECLUSAGE {
     BWRITERDECLUSAGE_SAMPLE
 } BWRITERDECLUSAGE;
 
+#define BWRITER_OPCODESPECIFICCONTROL_SHIFT     16
+#define BWRITER_OPCODESPECIFICCONTROL_MASK      (0xff << BWRITER_OPCODESPECIFICCONTROL_SHIFT)
+
 struct bwriter_shader *SlAssembleShader(const char *text, char **messages);
 DWORD SlWriteBytecode(const struct bwriter_shader *shader, int dxversion, DWORD **result);
 void SlDeleteShader(struct bwriter_shader *shader);




More information about the wine-cvs mailing list