Module: wine Branch: master Commit: 6cbd5114758bd8c55f4bd60aa58b631fef146167 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6cbd5114758bd8c55f4bd60aa5...
Author: Matteo Bruni matteo.mystral@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, ®); } + | INSTR_DCL dclusage REG_INPUT + { + struct shader_reg reg; + TRACE("Input reg declaration\n"); + ZeroMemory(®, 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, ®); + } + | INSTR_DCL dclusage REG_INPUT writemask + { + struct shader_reg reg; + TRACE("Input reg declaration\n"); + ZeroMemory(®, 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, ®); + } | 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);