[1/4] d3dx9: Add ps_1_x source register modifiers to the shader assembler.
Matteo Bruni
matteo.mystral at gmail.com
Tue Jul 20 08:11:43 CDT 2010
-------------- next part --------------
From 7201dcf481ff8c59d10811418621efde98ea611d Mon Sep 17 00:00:00 2001
From: Matteo Bruni <matteo.mystral at gmail.com>
Date: Tue, 20 Jul 2010 15:01:16 +0200
Subject: 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 deletions(-)
diff --git a/dlls/d3dx9_36/asmshader.l b/dlls/d3dx9_36/asmshader.l
index e1aac26..cbf0a21 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 501354d..16a5a17 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 84434cf..092844f 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),
--
1.7.1
More information about the wine-patches
mailing list