From 949eca401254bbad2a884d5612d257b398a60e1c Mon Sep 17 00:00:00 2001 From: Matteo Bruni Date: Tue, 20 Jul 2010 15:01:16 +0200 Subject: [PATCH] d3dx9: Add shift modifiers parsing to the shader assembler. --- dlls/d3dx9_36/asmparser.c | 3 ++- dlls/d3dx9_36/asmshader.l | 5 +++++ dlls/d3dx9_36/asmshader.y | 37 +++++++++++++++++++++++++++++++- dlls/d3dx9_36/asmutils.c | 22 +++++++++++++++++++ dlls/d3dx9_36/d3dx9_36_private.h | 1 + 5 files changed, 66 insertions(+), 2 deletions(-) diff --git a/dlls/d3dx9_36/asmparser.c b/dlls/d3dx9_36/asmparser.c index e9d0ea03ca0..e1a32ca7a54 100644 --- a/dlls/d3dx9_36/asmparser.c +++ b/dlls/d3dx9_36/asmparser.c @@ -232,8 +232,9 @@ static void asmparser_instr(struct asm_parser *This, DWORD opcode, if(!This->shader) return; - TRACE_(parsed_shader)("%s%s%s ", debug_print_opcode(opcode), + TRACE_(parsed_shader)("%s%s%s%s ", debug_print_opcode(opcode), debug_print_dstmod(mod), + debug_print_shift(shift), debug_print_comp(comp)); if(dst) { TRACE_(parsed_shader)("%s", debug_print_dstreg(dst)); diff --git a/dlls/d3dx9_36/asmshader.l b/dlls/d3dx9_36/asmshader.l index cbf0a21c277..f02cc9e2f85 100644 --- a/dlls/d3dx9_36/asmshader.l +++ b/dlls/d3dx9_36/asmshader.l @@ -276,6 +276,11 @@ ps_3_0 {return VER_PS30; } /* Output modifiers */ \_x2 {return SHIFT_X2; } +\_x4 {return SHIFT_X4; } +\_x8 {return SHIFT_X8; } +\_d2 {return SHIFT_D2; } +\_d4 {return SHIFT_D4; } +\_d8 {return SHIFT_D8; } \_sat {return MOD_SAT; } \_pp {return MOD_PP; } \_centroid {return MOD_CENTROID; } diff --git a/dlls/d3dx9_36/asmshader.y b/dlls/d3dx9_36/asmshader.y index 16a5a17b40d..503af1d2131 100644 --- a/dlls/d3dx9_36/asmshader.y +++ b/dlls/d3dx9_36/asmshader.y @@ -199,6 +199,11 @@ void set_rel_reg(struct shader_reg *reg, struct rel_reg *rel) { /* Output modifiers */ %token SHIFT_X2 +%token SHIFT_X4 +%token SHIFT_X8 +%token SHIFT_D2 +%token SHIFT_D4 +%token SHIFT_D8 %token MOD_SAT %token MOD_PP %token MOD_CENTROID @@ -1045,7 +1050,37 @@ omods: /* Empty */ } } -omodifier: MOD_SAT +omodifier: SHIFT_X2 + { + $$.mod = 0; + $$.shift = 1; + } + | SHIFT_X4 + { + $$.mod = 0; + $$.shift = 2; + } + | SHIFT_X8 + { + $$.mod = 0; + $$.shift = 3; + } + | SHIFT_D2 + { + $$.mod = 0; + $$.shift = 15; + } + | SHIFT_D4 + { + $$.mod = 0; + $$.shift = 14; + } + | SHIFT_D8 + { + $$.mod = 0; + $$.shift = 13; + } + | MOD_SAT { $$.mod = BWRITERSPDM_SATURATE; $$.shift = 0; diff --git a/dlls/d3dx9_36/asmutils.c b/dlls/d3dx9_36/asmutils.c index 092844f13ff..09b97ee38e4 100644 --- a/dlls/d3dx9_36/asmutils.c +++ b/dlls/d3dx9_36/asmutils.c @@ -274,6 +274,28 @@ const char *debug_print_dstmod(DWORD mod) { } } +const char *debug_print_shift(DWORD shift) { + static const char * const shiftstrings[] = { + "", + "_x2", + "_x4", + "_x8", + "_x16", + "_x32", + "", + "", + "", + "", + "", + "", + "_d16", + "_d8", + "_d4", + "_d2", + }; + return shiftstrings[shift]; +} + static const char *get_regname(const struct shader_reg *reg) { switch(reg->type) { case BWRITERSPR_TEMP: diff --git a/dlls/d3dx9_36/d3dx9_36_private.h b/dlls/d3dx9_36/d3dx9_36_private.h index d5ac7e9851c..f366619beb4 100644 --- a/dlls/d3dx9_36/d3dx9_36_private.h +++ b/dlls/d3dx9_36/d3dx9_36_private.h @@ -400,6 +400,7 @@ struct bc_writer { /* Debug utility routines */ const char *debug_print_srcmod(DWORD mod); const char *debug_print_dstmod(DWORD mod); +const char *debug_print_shift(DWORD shift); const char *debug_print_dstreg(const struct shader_reg *reg); const char *debug_print_srcreg(const struct shader_reg *reg); const char *debug_print_swizzle(DWORD swizzle);