Matteo Bruni : d3dx9: Add input dcl instruction support to the shader assembler.

Alexandre Julliard julliard at winehq.org
Thu May 13 13:15:02 CDT 2010


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

Author: Matteo Bruni <matteo.mystral at gmail.com>
Date:   Thu May 13 17:21:58 2010 +0200

d3dx9: Add input dcl instruction support to the shader assembler.

---

 dlls/d3dx9_36/asmparser.c        |   10 ++++++++++
 dlls/d3dx9_36/asmshader.y        |   24 ++++++++++++++++++++++++
 dlls/d3dx9_36/bytecodewriter.c   |    1 +
 dlls/d3dx9_36/d3dx9_36_private.h |    2 ++
 4 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/dlls/d3dx9_36/asmparser.c b/dlls/d3dx9_36/asmparser.c
index f1360cb..bee92f6 100644
--- a/dlls/d3dx9_36/asmparser.c
+++ b/dlls/d3dx9_36/asmparser.c
@@ -51,6 +51,15 @@ static void asmparser_dcl_output(struct asm_parser *This, DWORD usage, DWORD num
     }
 }
 
+static void asmparser_dcl_input(struct asm_parser *This, DWORD usage, DWORD num,
+                                const struct shader_reg *reg) {
+    if(!This->shader) return;
+    if(!record_declaration(This->shader, usage, num, FALSE, reg->regnum, reg->writemask)) {
+        ERR("Out of memory\n");
+        set_parse_status(This, PARSE_ERR);
+    }
+}
+
 static void asmparser_instr(struct asm_parser *This, DWORD opcode,
                             DWORD mod, DWORD shift,
                             BWRITER_COMPARISON_TYPE comp,
@@ -149,6 +158,7 @@ static const struct asmparser_backend parser_vs_3 = {
     asmparser_coissue_unsupported,
 
     asmparser_dcl_output,
+    asmparser_dcl_input,
 
     asmparser_end,
 
diff --git a/dlls/d3dx9_36/asmshader.y b/dlls/d3dx9_36/asmshader.y
index 8231c3a..ca4d24c 100644
--- a/dlls/d3dx9_36/asmshader.y
+++ b/dlls/d3dx9_36/asmshader.y
@@ -522,6 +522,30 @@ instruction:          INSTR_ADD omods dreg ',' sregs
                                 reg.writemask = $4;
                                 asm_ctx.funcs->dcl_output(&asm_ctx, $2.dclusage, $2.regnum, &reg);
                             }
+                    | INSTR_DCL dclusage REG_INPUT
+                            {
+                                struct shader_reg reg;
+                                TRACE("Input reg declaration\n");
+                                ZeroMemory(&reg, sizeof(reg));
+                                reg.type = BWRITERSPR_INPUT;
+                                reg.regnum = $3;
+                                reg.rel_reg = NULL;
+                                reg.srcmod = 0;
+                                reg.writemask = BWRITERSP_WRITEMASK_ALL;
+                                asm_ctx.funcs->dcl_input(&asm_ctx, $2.dclusage, $2.regnum, &reg);
+                            }
+                    | INSTR_DCL dclusage REG_INPUT writemask
+                            {
+                                struct shader_reg reg;
+                                TRACE("Input reg declaration\n");
+                                ZeroMemory(&reg, sizeof(reg));
+                                reg.type = BWRITERSPR_INPUT;
+                                reg.regnum = $3;
+                                reg.rel_reg = NULL;
+                                reg.srcmod = 0;
+                                reg.writemask = $4;
+                                asm_ctx.funcs->dcl_input(&asm_ctx, $2.dclusage, $2.regnum, &reg);
+                            }
                     | INSTR_REP sregs
                             {
                                 TRACE("REP\n");
diff --git a/dlls/d3dx9_36/bytecodewriter.c b/dlls/d3dx9_36/bytecodewriter.c
index ff6393f..4d62465 100644
--- a/dlls/d3dx9_36/bytecodewriter.c
+++ b/dlls/d3dx9_36/bytecodewriter.c
@@ -284,6 +284,7 @@ static void sm_3_header(struct bc_writer *This, const struct bwriter_shader *sha
     /* Declare the shader type and version */
     put_dword(buffer, This->version);
 
+    write_declarations(buffer, TRUE, shader->inputs, shader->num_inputs, D3DSPR_INPUT);
     write_declarations(buffer, TRUE, shader->outputs, shader->num_outputs, D3DSPR_OUTPUT);
     return;
 }
diff --git a/dlls/d3dx9_36/d3dx9_36_private.h b/dlls/d3dx9_36/d3dx9_36_private.h
index 19b1921..344bdbf 100644
--- a/dlls/d3dx9_36/d3dx9_36_private.h
+++ b/dlls/d3dx9_36/d3dx9_36_private.h
@@ -255,6 +255,8 @@ struct asmparser_backend {
 
     void (*dcl_output)(struct asm_parser *This, DWORD usage, DWORD num,
                        const struct shader_reg *reg);
+    void (*dcl_input)(struct asm_parser *This, DWORD usage, DWORD num,
+                      const struct shader_reg *reg);
 
     void (*end)(struct asm_parser *This);
 




More information about the wine-cvs mailing list