From 4c5954eaa4b39bc92f8b20d4f99d7cc6802a76cd Mon Sep 17 00:00:00 2001 From: Matteo Bruni Date: Tue, 20 Jul 2010 15:01:16 +0200 Subject: [PATCH] d3dx9: Add ps_1_x source register modifiers to the shader assembler. --- dlls/d3dx9_36/asmshader.l | 6 ++++ dlls/d3dx9_36/asmshader.y | 68 ++++++++++++++++++++++++++++++++++++++- dlls/d3dx9_36/asmutils.c | 54 +++++++++++++++++++++++++++++++ 3 files changed, 127 insertions(+), 1 deletion(-) diff --git a/dlls/d3dx9_36/asmshader.l b/dlls/d3dx9_36/asmshader.l index e1aac2686e5..cbf0a21c277 100644 --- a/dlls/d3dx9_36/asmshader.l +++ b/dlls/d3dx9_36/asmshader.l @@ -275,6 +275,7 @@ ps_3_0 {return VER_PS30; } } /* Output modifiers */ +\_x2 {return SHIFT_X2; } \_sat {return MOD_SAT; } \_pp {return MOD_PP; } \_centroid {return MOD_CENTROID; } @@ -309,6 +310,11 @@ false { /* for relative addressing */ \[|\]|\+ {return yytext[0]; } +\_bias {return SMOD_BIAS; } + /* No _x2 here; it is identical to MOD_X2 */ +\_bx2 {return SMOD_SCALEBIAS; } +\_dz {return SMOD_DZ; } +\_dw {return SMOD_DW; } \_abs {return SMOD_ABS; } ! {return SMOD_NOT; } diff --git a/dlls/d3dx9_36/asmshader.y b/dlls/d3dx9_36/asmshader.y index 501354d3bad..16a5a17b40d 100644 --- a/dlls/d3dx9_36/asmshader.y +++ b/dlls/d3dx9_36/asmshader.y @@ -198,6 +198,7 @@ void set_rel_reg(struct shader_reg *reg, struct rel_reg *rel) { %token VER_PS30 /* Output modifiers */ +%token SHIFT_X2 %token MOD_SAT %token MOD_PP %token MOD_CENTROID @@ -211,6 +212,10 @@ void set_rel_reg(struct shader_reg *reg, struct rel_reg *rel) { %token COMP_NE /* Source register modifiers */ +%token SMOD_BIAS +%token SMOD_SCALEBIAS +%token SMOD_DZ +%token SMOD_DW %token SMOD_ABS %token SMOD_NOT @@ -1102,12 +1107,53 @@ sreg: sreg_name rel_reg swizzle $$.regnum = $2.regnum; set_rel_reg(&$$, &$3); switch($4) { + case BWRITERSPSM_BIAS: $$.srcmod = BWRITERSPSM_BIASNEG; break; + case BWRITERSPSM_X2: $$.srcmod = BWRITERSPSM_X2NEG; break; + case BWRITERSPSM_SIGN: $$.srcmod = BWRITERSPSM_SIGNNEG; break; case BWRITERSPSM_ABS: $$.srcmod = BWRITERSPSM_ABSNEG; break; + case BWRITERSPSM_DZ: + asmparser_message(&asm_ctx, "Line %u: Incompatible source modifiers: NEG and DZ\n", + asm_ctx.line_no); + set_parse_status(&asm_ctx, PARSE_ERR); + break; + case BWRITERSPSM_DW: + asmparser_message(&asm_ctx, "Line %u: Incompatible source modifiers: NEG and DW\n", + asm_ctx.line_no); + set_parse_status(&asm_ctx, PARSE_ERR); + break; default: FIXME("Unhandled combination of NEGATE and %u\n", $4); } $$.swizzle = $5; } + | IMMVAL '-' sreg_name rel_reg swizzle + { + if($1.val != 1.0 || (!$1.integer)) { + asmparser_message(&asm_ctx, "Line %u: Only \"1 - reg\" is valid for D3DSPSM_COMP, " + "%g - reg found\n", asm_ctx.line_no, $1.val); + set_parse_status(&asm_ctx, PARSE_ERR); + } + /* Complement - not compatible with other source modifiers */ + $$.type = $3.type; + $$.regnum = $3.regnum; + $$.srcmod = BWRITERSPSM_COMP; + set_rel_reg(&$$, &$4); + $$.swizzle = $5; + } + | IMMVAL '-' sreg_name rel_reg smod swizzle + { + /* For nicer error reporting */ + if($1.val != 1.0 || (!$1.integer)) { + asmparser_message(&asm_ctx, "Line %u: Only \"1 - reg\" is valid for D3DSPSM_COMP\n", + asm_ctx.line_no); + set_parse_status(&asm_ctx, PARSE_ERR); + } else { + asmparser_message(&asm_ctx, "Line %u: Incompatible source modifiers: D3DSPSM_COMP and %s\n", + asm_ctx.line_no, + debug_print_srcmod($5)); + set_parse_status(&asm_ctx, PARSE_ERR); + } + } | SMOD_NOT sreg_name swizzle { $$.type = $2.type; @@ -1179,7 +1225,27 @@ immsum: IMMVAL $$.val = $1.val + $3.val; } -smod: SMOD_ABS +smod: SMOD_BIAS + { + $$ = BWRITERSPSM_BIAS; + } + | SHIFT_X2 + { + $$ = BWRITERSPSM_X2; + } + | SMOD_SCALEBIAS + { + $$ = BWRITERSPSM_SIGN; + } + | SMOD_DZ + { + $$ = BWRITERSPSM_DZ; + } + | SMOD_DW + { + $$ = BWRITERSPSM_DW; + } + | SMOD_ABS { $$ = BWRITERSPSM_ABS; } diff --git a/dlls/d3dx9_36/asmutils.c b/dlls/d3dx9_36/asmutils.c index 84434cfc04f..092844f13ff 100644 --- a/dlls/d3dx9_36/asmutils.c +++ b/dlls/d3dx9_36/asmutils.c @@ -72,6 +72,15 @@ DWORD d3d9_srcmod(DWORD bwriter_srcmod) { switch(bwriter_srcmod) { case BWRITERSPSM_NONE: return D3DSPSM_NONE; case BWRITERSPSM_NEG: return D3DSPSM_NEG; + case BWRITERSPSM_BIAS: return D3DSPSM_BIAS; + case BWRITERSPSM_BIASNEG: return D3DSPSM_BIASNEG; + case BWRITERSPSM_SIGN: return D3DSPSM_SIGN; + case BWRITERSPSM_SIGNNEG: return D3DSPSM_SIGNNEG; + case BWRITERSPSM_COMP: return D3DSPSM_COMP; + case BWRITERSPSM_X2: return D3DSPSM_X2; + case BWRITERSPSM_X2NEG: return D3DSPSM_X2NEG; + case BWRITERSPSM_DZ: return D3DSPSM_DZ; + case BWRITERSPSM_DW: return D3DSPSM_DW; case BWRITERSPSM_ABS: return D3DSPSM_ABS; case BWRITERSPSM_ABSNEG: return D3DSPSM_ABSNEG; case BWRITERSPSM_NOT: return D3DSPSM_NOT; @@ -222,6 +231,15 @@ DWORD d3d9_opcode(DWORD bwriter_opcode) { const char *debug_print_srcmod(DWORD mod) { switch(mod) { case BWRITERSPSM_NEG: return "D3DSPSM_NEG"; + case BWRITERSPSM_BIAS: return "D3DSPSM_BIAS"; + case BWRITERSPSM_BIASNEG: return "D3DSPSM_BIASNEG"; + case BWRITERSPSM_SIGN: return "D3DSPSM_SIGN"; + case BWRITERSPSM_SIGNNEG: return "D3DSPSM_SIGNNEG"; + case BWRITERSPSM_COMP: return "D3DSPSM_COMP"; + case BWRITERSPSM_X2: return "D3DSPSM_X2"; + case BWRITERSPSM_X2NEG: return "D3DSPSM_X2NEG"; + case BWRITERSPSM_DZ: return "D3DSPSM_DZ"; + case BWRITERSPSM_DW: return "D3DSPSM_DW"; case BWRITERSPSM_ABS: return "D3DSPSM_ABS"; case BWRITERSPSM_ABSNEG: return "D3DSPSM_ABSNEG"; case BWRITERSPSM_NOT: return "D3DSPSM_NOT"; @@ -389,6 +407,42 @@ const char *debug_print_srcreg(const struct shader_reg *reg) { return wine_dbg_sprintf("-%s%s%s", get_regname(reg), debug_print_relarg(reg), debug_print_swizzle(reg->swizzle)); + case BWRITERSPSM_BIAS: + return wine_dbg_sprintf("%s%s_bias%s", get_regname(reg), + debug_print_relarg(reg), + debug_print_swizzle(reg->swizzle)); + case BWRITERSPSM_BIASNEG: + return wine_dbg_sprintf("-%s%s_bias%s", get_regname(reg), + debug_print_relarg(reg), + debug_print_swizzle(reg->swizzle)); + case BWRITERSPSM_SIGN: + return wine_dbg_sprintf("%s%s_bx2%s", get_regname(reg), + debug_print_relarg(reg), + debug_print_swizzle(reg->swizzle)); + case BWRITERSPSM_SIGNNEG: + return wine_dbg_sprintf("-%s%s_bx2%s", get_regname(reg), + debug_print_relarg(reg), + debug_print_swizzle(reg->swizzle)); + case BWRITERSPSM_COMP: + return wine_dbg_sprintf("1 - %s%s%s", get_regname(reg), + debug_print_relarg(reg), + debug_print_swizzle(reg->swizzle)); + case BWRITERSPSM_X2: + return wine_dbg_sprintf("%s%s_x2%s", get_regname(reg), + debug_print_relarg(reg), + debug_print_swizzle(reg->swizzle)); + case BWRITERSPSM_X2NEG: + return wine_dbg_sprintf("-%s%s_x2%s", get_regname(reg), + debug_print_relarg(reg), + debug_print_swizzle(reg->swizzle)); + case BWRITERSPSM_DZ: + return wine_dbg_sprintf("%s%s_dz%s", get_regname(reg), + debug_print_relarg(reg), + debug_print_swizzle(reg->swizzle)); + case BWRITERSPSM_DW: + return wine_dbg_sprintf("%s%s_dw%s", get_regname(reg), + debug_print_relarg(reg), + debug_print_swizzle(reg->swizzle)); case BWRITERSPSM_ABS: return wine_dbg_sprintf("%s%s_abs%s", get_regname(reg), debug_print_relarg(reg),