[3/3] d3dx9: Add source register modifiers (sm 2+) support to the shader assembler. [try 2]
Matteo Bruni
matteo.mystral at gmail.com
Wed Apr 21 11:09:19 CDT 2010
I believe the winetestbot failures for try 1 were false positives. I'm
ready to be denied though.
-------------- next part --------------
From 870a59f8d6653e89a2f8bd36d275aec661a6240e Mon Sep 17 00:00:00 2001
From: Matteo Bruni <matteo.mystral at gmail.com>
Date: Wed, 21 Apr 2010 16:15:46 +0200
Subject: d3dx9: Add source register modifiers (sm 2+) support to the shader assembler.
---
dlls/d3dx9_36/asmshader.l | 2 ++
dlls/d3dx9_36/asmshader.y | 38 ++++++++++++++++++++++++++++++++++++++
dlls/d3dx9_36/asmutils.c | 31 +++++++++++++++++++++++++++++++
dlls/d3dx9_36/bytecodewriter.c | 1 +
dlls/d3dx9_36/d3dx9_36_private.h | 4 ++++
dlls/d3dx9_36/tests/asm.c | 6 +++---
6 files changed, 79 insertions(+), 3 deletions(-)
diff --git a/dlls/d3dx9_36/asmshader.l b/dlls/d3dx9_36/asmshader.l
index a292505..65ecfa5 100644
--- a/dlls/d3dx9_36/asmshader.l
+++ b/dlls/d3dx9_36/asmshader.l
@@ -129,6 +129,8 @@ ps_3_0 {return VER_PS30; }
\( {return yytext[0]; }
\) {return yytext[0]; }
+\_abs {return SMOD_ABS; }
+
{PREPROCESSORDIRECTIVE} {
/* TODO: update current line information */
TRACE("line info update: %s", yytext);
diff --git a/dlls/d3dx9_36/asmshader.y b/dlls/d3dx9_36/asmshader.y
index 18d497e..2c801fc 100644
--- a/dlls/d3dx9_36/asmshader.y
+++ b/dlls/d3dx9_36/asmshader.y
@@ -45,6 +45,7 @@ void set_rel_reg(struct shader_reg *reg, struct rel_reg *rel) {
%union {
unsigned int regnum;
struct shader_reg reg;
+ DWORD srcmod;
DWORD writemask;
struct {
DWORD writemask;
@@ -93,6 +94,9 @@ void set_rel_reg(struct shader_reg *reg, struct rel_reg *rel) {
%token MOD_PP
%token MOD_CENTROID
+/* Source register modifiers */
+%token SMOD_ABS
+
/* Misc stuff */
%token <component> COMPONENT
@@ -100,6 +104,7 @@ void set_rel_reg(struct shader_reg *reg, struct rel_reg *rel) {
%type <reg> dreg
%type <reg> sreg_name
%type <reg> sreg
+%type <srcmod> smod
%type <writemask> writemask
%type <wm_components> wm_components
%type <swizzle> swizzle
@@ -372,6 +377,34 @@ sreg: sreg_name rel_reg swizzle
$$.srcmod = BWRITERSPSM_NONE;
set_rel_reg(&$$, &$2);
}
+ | sreg_name rel_reg smod swizzle
+ {
+ $$.type = $1.type;
+ $$.regnum = $1.regnum;
+ set_rel_reg(&$$, &$2);
+ $$.srcmod = $3;
+ $$.swizzle = $4;
+ }
+ | '-' sreg_name rel_reg swizzle
+ {
+ $$.type = $2.type;
+ $$.regnum = $2.regnum;
+ $$.srcmod = BWRITERSPSM_NEG;
+ set_rel_reg(&$$, &$3);
+ $$.swizzle = $4;
+ }
+ | '-' sreg_name rel_reg smod swizzle
+ {
+ $$.type = $2.type;
+ $$.regnum = $2.regnum;
+ set_rel_reg(&$$, &$3);
+ switch($4) {
+ case BWRITERSPSM_ABS: $$.srcmod = BWRITERSPSM_ABSNEG; break;
+ default:
+ FIXME("Unhandled combination of NEGATE and %u\n", $4);
+ }
+ $$.swizzle = $5;
+ }
rel_reg: /* empty */
{
@@ -379,6 +412,11 @@ rel_reg: /* empty */
$$.additional_offset = 0;
}
+smod: SMOD_ABS
+ {
+ $$ = BWRITERSPSM_ABS;
+ }
+
sreg_name: REG_TEMP
{
$$.regnum = $1; $$.type = BWRITERSPR_TEMP;
diff --git a/dlls/d3dx9_36/asmutils.c b/dlls/d3dx9_36/asmutils.c
index c3b1737..6a366a4 100644
--- a/dlls/d3dx9_36/asmutils.c
+++ b/dlls/d3dx9_36/asmutils.c
@@ -68,6 +68,18 @@ DWORD d3d9_writemask(DWORD bwriter_writemask) {
return ret;
}
+DWORD d3d9_srcmod(DWORD bwriter_srcmod) {
+ switch(bwriter_srcmod) {
+ case BWRITERSPSM_NONE: return D3DSPSM_NONE;
+ case BWRITERSPSM_NEG: return D3DSPSM_NEG;
+ case BWRITERSPSM_ABS: return D3DSPSM_ABS;
+ case BWRITERSPSM_ABSNEG: return D3DSPSM_ABSNEG;
+ default:
+ FIXME("Unhandled BWRITERSPSM token %u\n", bwriter_srcmod);
+ return 0;
+ }
+}
+
DWORD d3d9_dstmod(DWORD bwriter_mod) {
DWORD ret = 0;
@@ -99,6 +111,16 @@ DWORD d3d9_opcode(DWORD bwriter_opcode) {
}
}
+/* Debug print functions */
+const char *debug_print_srcmod(DWORD mod) {
+ switch(mod) {
+ case BWRITERSPSM_NEG: return "D3DSPSM_NEG";
+ case BWRITERSPSM_ABS: return "D3DSPSM_ABS";
+ case BWRITERSPSM_ABSNEG: return "D3DSPSM_ABSNEG";
+ default: return "Unknown source modifier\n";
+ }
+}
+
const char *debug_print_dstmod(DWORD mod) {
switch(mod) {
case 0:
@@ -196,6 +218,15 @@ const char *debug_print_srcreg(const struct shader_reg *reg, shader_type st) {
case BWRITERSPSM_NONE:
return wine_dbg_sprintf("%s%s", get_regname(reg, st),
debug_print_swizzle(reg->swizzle));
+ case BWRITERSPSM_NEG:
+ return wine_dbg_sprintf("-%s%s", get_regname(reg, st),
+ debug_print_swizzle(reg->swizzle));
+ case BWRITERSPSM_ABS:
+ return wine_dbg_sprintf("%s_abs%s", get_regname(reg, st),
+ debug_print_swizzle(reg->swizzle));
+ case BWRITERSPSM_ABSNEG:
+ return wine_dbg_sprintf("-%s_abs%s", get_regname(reg, st),
+ debug_print_swizzle(reg->swizzle));
}
return "Unknown modifier";
}
diff --git a/dlls/d3dx9_36/bytecodewriter.c b/dlls/d3dx9_36/bytecodewriter.c
index edd3f0f..caf2c4b 100644
--- a/dlls/d3dx9_36/bytecodewriter.c
+++ b/dlls/d3dx9_36/bytecodewriter.c
@@ -217,6 +217,7 @@ static void sm_3_srcreg(struct bc_writer *This,
token |= reg->regnum & D3DSP_REGNUM_MASK;
token |= d3d9_swizzle(reg->swizzle) & D3DVS_SWIZZLE_MASK;
+ token |= d3d9_srcmod(reg->srcmod);
put_dword(buffer, token);
}
diff --git a/dlls/d3dx9_36/d3dx9_36_private.h b/dlls/d3dx9_36/d3dx9_36_private.h
index 00b43c4..dc8c5ad 100644
--- a/dlls/d3dx9_36/d3dx9_36_private.h
+++ b/dlls/d3dx9_36/d3dx9_36_private.h
@@ -350,6 +350,7 @@ const char *debug_print_opcode(DWORD opcode);
/* Utilities for internal->d3d constant mapping */
DWORD d3d9_swizzle(DWORD bwriter_swizzle);
DWORD d3d9_writemask(DWORD bwriter_writemask);
+DWORD d3d9_srcmod(DWORD bwriter_srcmod);
DWORD d3d9_dstmod(DWORD bwriter_mod);
DWORD d3d9_register(DWORD bwriter_register);
DWORD d3d9_opcode(DWORD bwriter_opcode);
@@ -388,6 +389,9 @@ typedef enum _BWRITERSHADER_PARAM_DSTMOD_TYPE {
typedef enum _BWRITERSHADER_PARAM_SRCMOD_TYPE {
BWRITERSPSM_NONE = 0,
+ BWRITERSPSM_NEG,
+ BWRITERSPSM_ABS,
+ BWRITERSPSM_ABSNEG,
} BWRITERSHADER_PARAM_SRCMOD_TYPE;
#define BWRITER_SM1_VS 0xfffe
diff --git a/dlls/d3dx9_36/tests/asm.c b/dlls/d3dx9_36/tests/asm.c
index 6cf8e08..7056ef5 100644
--- a/dlls/d3dx9_36/tests/asm.c
+++ b/dlls/d3dx9_36/tests/asm.c
@@ -1053,11 +1053,11 @@ static void vs_3_0_test(void) {
"add_sat r0, r0, r1\n",
{0xfffe0300, 0x03000002, 0x801f0000, 0x80e40000, 0x80e40001, 0x0000ffff}
},*/
-/* {*/ /* shader 8 */
-/* "vs_3_0\n"
+ { /* shader 8 */
+ "vs_3_0\n"
"mov r2, r1_abs\n",
{0xfffe0300, 0x02000001, 0x800f0002, 0x8be40001, 0x0000ffff}
- },*/
+ },
{ /* shader 9 */
"vs_3_0\n"
"mov r2, r1.xygb\n",
--
1.6.4.4
More information about the wine-patches
mailing list