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, ®);
}
+ | 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);
More information about the wine-cvs
mailing list