[3/3] d3dx9: Accept texture coordinate registers in dcl instruction.

Matteo Bruni matteo.mystral at gmail.com
Wed Jun 9 08:59:03 CDT 2010


-------------- next part --------------
From ad3ed7eddf75c2e451af27b7ae6515cabde0fa53 Mon Sep 17 00:00:00 2001
From: Matteo Bruni <matteo.mystral at gmail.com>
Date: Tue, 8 Jun 2010 00:53:23 +0200
Subject: d3dx9: Accept texture coordinate registers in dcl instruction.

---
 dlls/d3dx9_36/asmshader.y |   36 +++++++++++++++++++++++-------------
 dlls/d3dx9_36/tests/asm.c |   11 +++++++++++
 2 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/dlls/d3dx9_36/asmshader.y b/dlls/d3dx9_36/asmshader.y
index fa6d00c..0c335b4 100644
--- a/dlls/d3dx9_36/asmshader.y
+++ b/dlls/d3dx9_36/asmshader.y
@@ -255,6 +255,7 @@ void set_rel_reg(struct shader_reg *reg, struct rel_reg *rel) {
 %type <modshift> omodifier
 %type <comptype> comp
 %type <declaration> dclusage
+%type <reg> dcl_inputreg
 %type <samplertype> sampdcl
 %type <rel_reg> rel_reg
 %type <reg> predicate
@@ -539,7 +540,7 @@ instruction:          INSTR_ADD omods dreg ',' sregs
                                 reg.writemask = $4;
                                 asm_ctx.funcs->dcl_output(&asm_ctx, $2.dclusage, $2.regnum, &reg);
                             }
-                    | INSTR_DCL dclusage omods REG_INPUT
+                    | INSTR_DCL dclusage omods dcl_inputreg
                             {
                                 struct shader_reg reg;
                                 TRACE("Input reg declaration\n");
@@ -549,14 +550,14 @@ instruction:          INSTR_ADD omods dreg ',' sregs
                                     set_parse_status(&asm_ctx, PARSE_ERR);
                                 }
                                 ZeroMemory(&reg, sizeof(reg));
-                                reg.type = BWRITERSPR_INPUT;
-                                reg.regnum = $4;
+                                reg.type = $4.type;
+                                reg.regnum = $4.regnum;
                                 reg.rel_reg = NULL;
                                 reg.srcmod = 0;
                                 reg.writemask = BWRITERSP_WRITEMASK_ALL;
                                 asm_ctx.funcs->dcl_input(&asm_ctx, $2.dclusage, $2.regnum, $3.mod, &reg);
                             }
-                    | INSTR_DCL dclusage omods REG_INPUT writemask
+                    | INSTR_DCL dclusage omods dcl_inputreg writemask
                             {
                                 struct shader_reg reg;
                                 TRACE("Input reg declaration\n");
@@ -566,14 +567,14 @@ instruction:          INSTR_ADD omods dreg ',' sregs
                                     set_parse_status(&asm_ctx, PARSE_ERR);
                                 }
                                 ZeroMemory(&reg, sizeof(reg));
-                                reg.type = BWRITERSPR_INPUT;
-                                reg.regnum = $4;
+                                reg.type = $4.type;
+                                reg.regnum = $4.regnum;
                                 reg.rel_reg = NULL;
                                 reg.srcmod = 0;
                                 reg.writemask = $5;
                                 asm_ctx.funcs->dcl_input(&asm_ctx, $2.dclusage, $2.regnum, $3.mod, &reg);
                             }
-                    | INSTR_DCL omods REG_INPUT
+                    | INSTR_DCL omods dcl_inputreg
                             {
                                 struct shader_reg reg;
                                 TRACE("Input reg declaration\n");
@@ -583,14 +584,14 @@ instruction:          INSTR_ADD omods dreg ',' sregs
                                     set_parse_status(&asm_ctx, PARSE_ERR);
                                 }
                                 ZeroMemory(&reg, sizeof(reg));
-                                reg.type = BWRITERSPR_INPUT;
-                                reg.regnum = $3;
+                                reg.type = $3.type;
+                                reg.regnum = $3.regnum;
                                 reg.rel_reg = NULL;
                                 reg.srcmod = 0;
                                 reg.writemask = BWRITERSP_WRITEMASK_ALL;
                                 asm_ctx.funcs->dcl_input(&asm_ctx, 0, 0, $2.mod, &reg);
                             }
-                    | INSTR_DCL omods REG_INPUT writemask
+                    | INSTR_DCL omods dcl_inputreg writemask
                             {
                                 struct shader_reg reg;
                                 TRACE("Input reg declaration\n");
@@ -600,8 +601,8 @@ instruction:          INSTR_ADD omods dreg ',' sregs
                                     set_parse_status(&asm_ctx, PARSE_ERR);
                                 }
                                 ZeroMemory(&reg, sizeof(reg));
-                                reg.type = BWRITERSPR_INPUT;
-                                reg.regnum = $3;
+                                reg.type = $3.type;
+                                reg.regnum = $3.regnum;
                                 reg.rel_reg = NULL;
                                 reg.srcmod = 0;
                                 reg.writemask = $4;
@@ -617,7 +618,7 @@ instruction:          INSTR_ADD omods dreg ',' sregs
                                 }
                                 asm_ctx.funcs->dcl_sampler(&asm_ctx, $2, $3.mod, $4, asm_ctx.line_no);
                             }
-                    | INSTR_DCL sampdcl omods REG_INPUT
+                    | INSTR_DCL sampdcl omods dcl_inputreg
                             {
                                 TRACE("Error rule: sampler decl of input reg\n");
                                 asmparser_message(&asm_ctx, "Line %u: Sampler declarations of input regs is not valid\n",
@@ -1342,6 +1343,15 @@ dclusage:             USAGE_POSITION
                             $$.dclusage = BWRITERDECLUSAGE_SAMPLE;
                         }
 
+dcl_inputreg:         REG_INPUT
+                        {
+                            $$.regnum = $1; $$.type = BWRITERSPR_INPUT;
+                        }
+                    | REG_TEXTURE
+                        {
+                            $$.regnum = $1; $$.type = BWRITERSPR_TEXTURE;
+                        }
+
 sampdcl:              SAMPTYPE_1D
                         {
                             $$ = BWRITERSTT_1D;
diff --git a/dlls/d3dx9_36/tests/asm.c b/dlls/d3dx9_36/tests/asm.c
index 5ed286e..dda0e2b 100644
--- a/dlls/d3dx9_36/tests/asm.c
+++ b/dlls/d3dx9_36/tests/asm.c
@@ -891,6 +891,17 @@ static void ps_2_0_test(void) {
             "dcl v0\n",
             {0xffff0200, 0x0200001f, 0x80000000, 0x900f0000, 0x0000ffff}
         },
+        {   /* shader 12 */
+            "ps_2_0\n"
+            "dcl t0.xyz\n"
+            "dcl t1\n",
+            {0xffff0200, 0x0200001f, 0x80000000, 0xb0070000, 0x0200001f, 0x80000000, 0xb00f0001, 0x0000ffff}
+        },
+        {   /* shader 13 */
+            "ps_2_0\n"
+            "dcl_pp t0\n",
+            {0xffff0200, 0x0200001f, 0x80000000, 0xb02f0000, 0x0000ffff}
+        },
     };
 
     exec_tests("ps_2_0", tests, sizeof(tests) / sizeof(tests[0]));
-- 
1.6.4.4


More information about the wine-patches mailing list