Matteo Bruni : d3dx9: Add instruction modifiers (sm 2.0+) support to the shader assembler.
Alexandre Julliard
julliard at winehq.org
Wed Apr 28 16:35:51 CDT 2010
Module: wine
Branch: master
Commit: 004a30a5c3d5608ef6d168a350f30d843051244c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=004a30a5c3d5608ef6d168a350f30d843051244c
Author: Matteo Bruni <matteo.mystral at gmail.com>
Date: Wed Apr 21 16:15:46 2010 +0200
d3dx9: Add instruction modifiers (sm 2.0+) support to the shader assembler.
---
dlls/d3dx9_36/asmparser.c | 3 ++-
dlls/d3dx9_36/asmshader.l | 5 +++++
dlls/d3dx9_36/asmshader.y | 34 ++++++++++++++++++++++++++++++++++
dlls/d3dx9_36/asmutils.c | 37 +++++++++++++++++++++++++++++++++++++
dlls/d3dx9_36/bytecodewriter.c | 2 ++
dlls/d3dx9_36/d3dx9_36_private.h | 9 +++++++++
6 files changed, 89 insertions(+), 1 deletions(-)
diff --git a/dlls/d3dx9_36/asmparser.c b/dlls/d3dx9_36/asmparser.c
index 1af001b..c810cbb 100644
--- a/dlls/d3dx9_36/asmparser.c
+++ b/dlls/d3dx9_36/asmparser.c
@@ -50,7 +50,8 @@ static void asmparser_instr(struct asm_parser *This, DWORD opcode,
if(!This->shader) return;
- TRACE_(parsed_shader)("%s ", debug_print_opcode(opcode));
+ TRACE_(parsed_shader)("%s%s ", debug_print_opcode(opcode),
+ debug_print_dstmod(mod));
if(dst) {
TRACE_(parsed_shader)("%s", debug_print_dstreg(dst, This->shader->type));
firstreg = FALSE;
diff --git a/dlls/d3dx9_36/asmshader.l b/dlls/d3dx9_36/asmshader.l
index ad1efab..a292505 100644
--- a/dlls/d3dx9_36/asmshader.l
+++ b/dlls/d3dx9_36/asmshader.l
@@ -119,6 +119,11 @@ ps_3_0 {return VER_PS30; }
return COMPONENT;
}
+ /* Output modifiers */
+\_sat {return MOD_SAT; }
+\_pp {return MOD_PP; }
+\_centroid {return MOD_CENTROID; }
+
{COMMA} {return yytext[0]; }
- {return yytext[0]; }
\( {return yytext[0]; }
diff --git a/dlls/d3dx9_36/asmshader.y b/dlls/d3dx9_36/asmshader.y
index e0117c6..18d497e 100644
--- a/dlls/d3dx9_36/asmshader.y
+++ b/dlls/d3dx9_36/asmshader.y
@@ -88,6 +88,11 @@ void set_rel_reg(struct shader_reg *reg, struct rel_reg *rel) {
%token VER_PS2X
%token VER_PS30
+/* Output modifiers */
+%token MOD_SAT
+%token MOD_PP
+%token MOD_CENTROID
+
/* Misc stuff */
%token <component> COMPONENT
@@ -100,6 +105,7 @@ void set_rel_reg(struct shader_reg *reg, struct rel_reg *rel) {
%type <swizzle> swizzle
%type <sw_components> sw_components
%type <modshift> omods
+%type <modshift> omodifier
%type <rel_reg> rel_reg
%type <sregs> sregs
@@ -313,6 +319,34 @@ omods: /* Empty */
$$.mod = 0;
$$.shift = 0;
}
+ | omods omodifier
+ {
+ $$.mod = $1.mod | $2.mod;
+ if($1.shift && $2.shift) {
+ asmparser_message(&asm_ctx, "Line %u: More than one shift flag\n",
+ asm_ctx.line_no);
+ set_parse_status(&asm_ctx, PARSE_ERR);
+ $$.shift = $1.shift;
+ } else {
+ $$.shift = $1.shift | $2.shift;
+ }
+ }
+
+omodifier: MOD_SAT
+ {
+ $$.mod = BWRITERSPDM_SATURATE;
+ $$.shift = 0;
+ }
+ | MOD_PP
+ {
+ $$.mod = BWRITERSPDM_PARTIALPRECISION;
+ $$.shift = 0;
+ }
+ | MOD_CENTROID
+ {
+ $$.mod = BWRITERSPDM_MSAMPCENTROID;
+ $$.shift = 0;
+ }
sregs: sreg
{
diff --git a/dlls/d3dx9_36/asmutils.c b/dlls/d3dx9_36/asmutils.c
index 6fd186a..c3b1737 100644
--- a/dlls/d3dx9_36/asmutils.c
+++ b/dlls/d3dx9_36/asmutils.c
@@ -68,6 +68,16 @@ DWORD d3d9_writemask(DWORD bwriter_writemask) {
return ret;
}
+DWORD d3d9_dstmod(DWORD bwriter_mod) {
+ DWORD ret = 0;
+
+ if(bwriter_mod & BWRITERSPDM_SATURATE) ret |= D3DSPDM_SATURATE;
+ if(bwriter_mod & BWRITERSPDM_PARTIALPRECISION) ret |= D3DSPDM_PARTIALPRECISION;
+ if(bwriter_mod & BWRITERSPDM_MSAMPCENTROID) ret |= D3DSPDM_MSAMPCENTROID;
+
+ return ret;
+}
+
DWORD d3d9_register(DWORD bwriter_register) {
if(bwriter_register == BWRITERSPR_TEMP) return D3DSPR_TEMP;
if(bwriter_register == BWRITERSPR_CONST) return D3DSPR_CONST;
@@ -89,6 +99,33 @@ DWORD d3d9_opcode(DWORD bwriter_opcode) {
}
}
+const char *debug_print_dstmod(DWORD mod) {
+ switch(mod) {
+ case 0:
+ return "";
+
+ case BWRITERSPDM_SATURATE:
+ return "_sat";
+ case BWRITERSPDM_PARTIALPRECISION:
+ return "_pp";
+ case BWRITERSPDM_MSAMPCENTROID:
+ return "_centroid";
+
+ case BWRITERSPDM_SATURATE | BWRITERSPDM_PARTIALPRECISION:
+ return "_sat_pp";
+ case BWRITERSPDM_SATURATE | BWRITERSPDM_MSAMPCENTROID:
+ return "_sat_centroid";
+ case BWRITERSPDM_PARTIALPRECISION | BWRITERSPDM_MSAMPCENTROID:
+ return "_pp_centroid";
+
+ case BWRITERSPDM_SATURATE | BWRITERSPDM_PARTIALPRECISION | BWRITERSPDM_MSAMPCENTROID:
+ return "_sat_pp_centroid";
+
+ default:
+ return "Unexpected modifier\n";
+ }
+}
+
static const char *get_regname(const struct shader_reg *reg, shader_type st) {
switch(reg->type) {
case BWRITERSPR_TEMP:
diff --git a/dlls/d3dx9_36/bytecodewriter.c b/dlls/d3dx9_36/bytecodewriter.c
index f97d2cc..edd3f0f 100644
--- a/dlls/d3dx9_36/bytecodewriter.c
+++ b/dlls/d3dx9_36/bytecodewriter.c
@@ -233,6 +233,8 @@ static void sm_3_dstreg(struct bc_writer *This,
token |= (d3d9reg << D3DSP_REGTYPE_SHIFT2) & D3DSP_REGTYPE_MASK2;
token |= reg->regnum & D3DSP_REGNUM_MASK; /* No shift */
+ token |= d3d9_dstmod(mod);
+
token |= d3d9_writemask(reg->writemask);
put_dword(buffer, token);
}
diff --git a/dlls/d3dx9_36/d3dx9_36_private.h b/dlls/d3dx9_36/d3dx9_36_private.h
index 7146f99..00b43c4 100644
--- a/dlls/d3dx9_36/d3dx9_36_private.h
+++ b/dlls/d3dx9_36/d3dx9_36_private.h
@@ -340,6 +340,7 @@ struct bc_writer {
};
/* Debug utility routines */
+const char *debug_print_dstmod(DWORD mod);
const char *debug_print_dstreg(const struct shader_reg *reg, shader_type st);
const char *debug_print_srcreg(const struct shader_reg *reg, shader_type st);
const char *debug_print_swizzle(DWORD swizzle);
@@ -349,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_dstmod(DWORD bwriter_mod);
DWORD d3d9_register(DWORD bwriter_register);
DWORD d3d9_opcode(DWORD bwriter_opcode);
@@ -377,6 +379,13 @@ typedef enum _BWRITERSHADER_PARAM_REGISTER_TYPE {
#define BWRITERSP_WRITEMASK_3 0x8 /* .w a */
#define BWRITERSP_WRITEMASK_ALL 0xf /* all */
+typedef enum _BWRITERSHADER_PARAM_DSTMOD_TYPE {
+ BWRITERSPDM_NONE = 0,
+ BWRITERSPDM_SATURATE = 1,
+ BWRITERSPDM_PARTIALPRECISION = 2,
+ BWRITERSPDM_MSAMPCENTROID = 4,
+} BWRITERSHADER_PARAM_DSTMOD_TYPE;
+
typedef enum _BWRITERSHADER_PARAM_SRCMOD_TYPE {
BWRITERSPSM_NONE = 0,
} BWRITERSHADER_PARAM_SRCMOD_TYPE;
More information about the wine-cvs
mailing list