Matteo Bruni : d3dcompiler: Parse modifiers.
Alexandre Julliard
julliard at winehq.org
Thu Jun 7 13:39:16 CDT 2012
Module: wine
Branch: master
Commit: 3275cca97025126c7102e632d8f829b1036b8e40
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3275cca97025126c7102e632d8f829b1036b8e40
Author: Matteo Bruni <mbruni at codeweavers.com>
Date: Thu Jun 7 00:19:03 2012 +0200
d3dcompiler: Parse modifiers.
---
dlls/d3dcompiler_43/d3dcompiler_private.h | 14 +++++
dlls/d3dcompiler_43/hlsl.y | 91 +++++++++++++++++++++++++++++
dlls/d3dcompiler_43/utils.c | 37 ++++++++++++
3 files changed, 142 insertions(+), 0 deletions(-)
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index 74d2662..77d81fe 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -694,6 +694,20 @@ struct hlsl_ir_node
unsigned int column;
};
+#define HLSL_STORAGE_EXTERN 0x00000001
+#define HLSL_STORAGE_NOINTERPOLATION 0x00000002
+#define HLSL_MODIFIER_PRECISE 0x00000004
+#define HLSL_STORAGE_SHARED 0x00000008
+#define HLSL_STORAGE_GROUPSHARED 0x00000010
+#define HLSL_STORAGE_STATIC 0x00000020
+#define HLSL_STORAGE_UNIFORM 0x00000040
+#define HLSL_STORAGE_VOLATILE 0x00000080
+#define HLSL_MODIFIER_CONST 0x00000100
+#define HLSL_MODIFIER_ROW_MAJOR 0x00000200
+#define HLSL_MODIFIER_COLUMN_MAJOR 0x00000400
+#define HLSL_MODIFIER_IN 0x00000800
+#define HLSL_MODIFIER_OUT 0x00001000
+
struct hlsl_ir_var
{
struct hlsl_ir_node node;
diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
index e5a2a48..704d5d6 100644
--- a/dlls/d3dcompiler_43/hlsl.y
+++ b/dlls/d3dcompiler_43/hlsl.y
@@ -50,6 +50,8 @@ static void hlsl_error(const char *s)
static void debug_dump_decl(struct hlsl_type *type, DWORD modifiers, const char *declname, unsigned int line_no)
{
TRACE("Line %u: ", line_no);
+ if (modifiers)
+ TRACE("%s ", debug_modifiers(modifiers));
TRACE("%s %s;\n", debug_hlsl_type(type), declname);
}
@@ -58,6 +60,25 @@ static BOOL declare_variable(struct hlsl_ir_var *decl, BOOL local)
BOOL ret;
TRACE("Declaring variable %s.\n", decl->name);
+ if (decl->node.data_type->type == HLSL_CLASS_MATRIX)
+ {
+ if (!(decl->modifiers & (HLSL_MODIFIER_ROW_MAJOR | HLSL_MODIFIER_COLUMN_MAJOR)))
+ {
+ decl->modifiers |= hlsl_ctx.matrix_majority == HLSL_ROW_MAJOR
+ ? HLSL_MODIFIER_ROW_MAJOR : HLSL_MODIFIER_COLUMN_MAJOR;
+ }
+ }
+ if (local)
+ {
+ DWORD invalid = decl->modifiers & (HLSL_STORAGE_EXTERN | HLSL_STORAGE_SHARED
+ | HLSL_STORAGE_GROUPSHARED | HLSL_STORAGE_UNIFORM);
+ if (invalid)
+ {
+ hlsl_message("Line %u: modifier '%s' invalid for local variables.\n",
+ hlsl_ctx.line_no, debug_modifiers(invalid));
+ set_parse_status(&hlsl_ctx.status, PARSE_ERR);
+ }
+ }
ret = add_declaration(hlsl_ctx.cur_scope, decl, local);
if (ret == FALSE)
{
@@ -71,6 +92,26 @@ static BOOL declare_variable(struct hlsl_ir_var *decl, BOOL local)
return TRUE;
}
+static DWORD add_modifier(DWORD modifiers, DWORD mod)
+{
+ if (modifiers & mod)
+ {
+ hlsl_message("Line %u: modifier '%s' already specified.\n",
+ hlsl_ctx.line_no, debug_modifiers(mod));
+ set_parse_status(&hlsl_ctx.status, PARSE_ERR);
+ return modifiers;
+ }
+ if (mod & (HLSL_MODIFIER_ROW_MAJOR | HLSL_MODIFIER_COLUMN_MAJOR)
+ && modifiers & (HLSL_MODIFIER_ROW_MAJOR | HLSL_MODIFIER_COLUMN_MAJOR))
+ {
+ hlsl_message("Line %u: more than one matrix majority keyword.\n",
+ hlsl_ctx.line_no);
+ set_parse_status(&hlsl_ctx.status, PARSE_ERR);
+ return modifiers;
+ }
+ return modifiers | mod;
+}
+
%}
%error-verbose
@@ -298,6 +339,12 @@ declaration: var_modifiers type variables_def ';'
FIXME("Variable with an initializer.\n");
}
+ if (hlsl_ctx.cur_scope == hlsl_ctx.globals)
+ {
+ var->modifiers |= HLSL_STORAGE_UNIFORM;
+ local = FALSE;
+ }
+
ret = declare_variable(var, local);
if (ret == FALSE)
free_declaration(var);
@@ -338,6 +385,50 @@ var_modifiers: /* Empty */
{
$$ = 0;
}
+ | KW_EXTERN var_modifiers
+ {
+ $$ = add_modifier($2, HLSL_STORAGE_EXTERN);
+ }
+ | KW_NOINTERPOLATION var_modifiers
+ {
+ $$ = add_modifier($2, HLSL_STORAGE_NOINTERPOLATION);
+ }
+ | KW_PRECISE var_modifiers
+ {
+ $$ = add_modifier($2, HLSL_MODIFIER_PRECISE);
+ }
+ | KW_SHARED var_modifiers
+ {
+ $$ = add_modifier($2, HLSL_STORAGE_SHARED);
+ }
+ | KW_GROUPSHARED var_modifiers
+ {
+ $$ = add_modifier($2, HLSL_STORAGE_GROUPSHARED);
+ }
+ | KW_STATIC var_modifiers
+ {
+ $$ = add_modifier($2, HLSL_STORAGE_STATIC);
+ }
+ | KW_UNIFORM var_modifiers
+ {
+ $$ = add_modifier($2, HLSL_STORAGE_UNIFORM);
+ }
+ | KW_VOLATILE var_modifiers
+ {
+ $$ = add_modifier($2, HLSL_STORAGE_VOLATILE);
+ }
+ | KW_CONST var_modifiers
+ {
+ $$ = add_modifier($2, HLSL_MODIFIER_CONST);
+ }
+ | KW_ROW_MAJOR var_modifiers
+ {
+ $$ = add_modifier($2, HLSL_MODIFIER_ROW_MAJOR);
+ }
+ | KW_COLUMN_MAJOR var_modifiers
+ {
+ $$ = add_modifier($2, HLSL_MODIFIER_COLUMN_MAJOR);
+ }
%%
diff --git a/dlls/d3dcompiler_43/utils.c b/dlls/d3dcompiler_43/utils.c
index ef22823..33cce05 100644
--- a/dlls/d3dcompiler_43/utils.c
+++ b/dlls/d3dcompiler_43/utils.c
@@ -908,6 +908,43 @@ const char *debug_hlsl_type(const struct hlsl_type *type)
return "unexpected_type";
}
+const char *debug_modifiers(DWORD modifiers)
+{
+ char string[110];
+
+ string[0] = 0;
+ if (modifiers & HLSL_STORAGE_EXTERN)
+ strcat(string, " extern"); /* 7 */
+ if (modifiers & HLSL_STORAGE_NOINTERPOLATION)
+ strcat(string, " nointerpolation"); /* 16 */
+ if (modifiers & HLSL_MODIFIER_PRECISE)
+ strcat(string, " precise"); /* 8 */
+ if (modifiers & HLSL_STORAGE_SHARED)
+ strcat(string, " shared"); /* 7 */
+ if (modifiers & HLSL_STORAGE_GROUPSHARED)
+ strcat(string, " groupshared"); /* 12 */
+ if (modifiers & HLSL_STORAGE_STATIC)
+ strcat(string, " static"); /* 7 */
+ if (modifiers & HLSL_STORAGE_UNIFORM)
+ strcat(string, " uniform"); /* 8 */
+ if (modifiers & HLSL_STORAGE_VOLATILE)
+ strcat(string, " volatile"); /* 9 */
+ if (modifiers & HLSL_MODIFIER_CONST)
+ strcat(string, " const"); /* 6 */
+ if (modifiers & HLSL_MODIFIER_ROW_MAJOR)
+ strcat(string, " row_major"); /* 10 */
+ if (modifiers & HLSL_MODIFIER_COLUMN_MAJOR)
+ strcat(string, " column_major"); /* 13 */
+ if ((modifiers & (HLSL_MODIFIER_IN | HLSL_MODIFIER_OUT)) == (HLSL_MODIFIER_IN | HLSL_MODIFIER_OUT))
+ strcat(string, " inout"); /* 6 */
+ else if (modifiers & HLSL_MODIFIER_IN)
+ strcat(string, " in"); /* 3 */
+ else if (modifiers & HLSL_MODIFIER_OUT)
+ strcat(string, " out"); /* 4 */
+
+ return wine_dbg_sprintf("%s", string[0] ? string + 1 : "");
+}
+
const char *debug_node_type(enum hlsl_ir_node_type type)
{
const char *names[] =
More information about the wine-cvs
mailing list