mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-15 03:24:47 +00:00
d3dx9: Add ps_1_x source register modifiers to the shader assembler.
This commit is contained in:
parent
a46f80acdc
commit
4c5954eaa4
|
@ -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; }
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Reference in a new issue