[2/4] d3dx9: Add shift modifiers parsing to the shader assembler.
Matteo Bruni
matteo.mystral at gmail.com
Tue Jul 20 08:11:51 CDT 2010
-------------- next part --------------
From a6ca572a1d10a6568f522ffc16dcf4c6373faba3 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 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 e9d0ea0..e1a32ca 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 cbf0a21..f02cc9e 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 16a5a17..503af1d 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 092844f..369ace0 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) {
+ const char *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 d5ac7e9..f366619 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);
--
1.7.1
More information about the wine-patches
mailing list