Zebediah Figura : d3dcompiler: Apply type modifiers to the hlsl_type.
Alexandre Julliard
julliard at winehq.org
Fri Mar 13 15:24:45 CDT 2020
Module: wine
Branch: master
Commit: 756ed811c72e692e58def76e76ab19e5418e8d5a
URL: https://source.winehq.org/git/wine.git/?a=commit;h=756ed811c72e692e58def76e76ab19e5418e8d5a
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Fri Mar 13 17:34:56 2020 +0100
d3dcompiler: Apply type modifiers to the hlsl_type.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/d3dcompiler_43/hlsl.y | 96 ++++++++++++++++++++++++++++++----------------
1 file changed, 62 insertions(+), 34 deletions(-)
diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
index 59e0df9d8c..6a5dddf5d4 100644
--- a/dlls/d3dcompiler_43/hlsl.y
+++ b/dlls/d3dcompiler_43/hlsl.y
@@ -168,7 +168,21 @@ static BOOL declare_variable(struct hlsl_ir_var *decl, BOOL local)
return TRUE;
}
-static DWORD add_modifier(DWORD modifiers, DWORD mod, const struct YYLTYPE *loc);
+static DWORD add_modifiers(DWORD modifiers, DWORD mod, const struct source_location loc)
+{
+ if (modifiers & mod)
+ {
+ hlsl_report_message(loc, HLSL_LEVEL_ERROR, "modifier '%s' already specified", debug_modifiers(mod));
+ return modifiers;
+ }
+ if (mod & (HLSL_MODIFIER_ROW_MAJOR | HLSL_MODIFIER_COLUMN_MAJOR)
+ && modifiers & (HLSL_MODIFIER_ROW_MAJOR | HLSL_MODIFIER_COLUMN_MAJOR))
+ {
+ hlsl_report_message(loc, HLSL_LEVEL_ERROR, "more than one matrix majority keyword");
+ return modifiers;
+ }
+ return modifiers | mod;
+}
static BOOL add_type_to_scope(struct hlsl_scope *scope, struct hlsl_type *def)
{
@@ -602,7 +616,7 @@ static struct list *declare_vars(struct hlsl_type *basic_type, DWORD modifiers,
local = FALSE;
}
- if (var->modifiers & HLSL_MODIFIER_CONST && !(var->modifiers & HLSL_STORAGE_UNIFORM) && !v->initializer.args_count)
+ if (type->modifiers & HLSL_MODIFIER_CONST && !(var->modifiers & HLSL_STORAGE_UNIFORM) && !v->initializer.args_count)
{
hlsl_report_message(v->loc, HLSL_LEVEL_ERROR, "const variable without initializer");
free_declaration(var);
@@ -703,6 +717,21 @@ static BOOL add_struct_field(struct list *fields, struct hlsl_struct_field *fiel
return TRUE;
}
+static struct hlsl_type *apply_type_modifiers(struct hlsl_type *type, DWORD *modifiers, struct source_location loc)
+{
+ struct hlsl_type *new_type;
+
+ if (!(*modifiers & HLSL_TYPE_MODIFIERS_MASK))
+ return type;
+
+ if (!(new_type = clone_hlsl_type(type)))
+ return NULL;
+
+ new_type->modifiers = add_modifiers(new_type->modifiers, *modifiers, loc);
+ *modifiers &= ~HLSL_TYPE_MODIFIERS_MASK;
+ return new_type;
+}
+
static struct list *gen_struct_fields(struct hlsl_type *type, DWORD modifiers, struct list *fields)
{
struct parse_variable_def *v, *v_next;
@@ -1301,7 +1330,12 @@ fields_list: /* Empty */
field: var_modifiers type variables_def ';'
{
- $$ = gen_struct_fields($2, $1, $3);
+ struct hlsl_type *type;
+ DWORD modifiers = $1;
+
+ if (!(type = apply_type_modifiers($2, &modifiers, get_location(&@1))))
+ YYABORT;
+ $$ = gen_struct_fields(type, modifiers, $3);
}
| unnamed_struct_spec variables_def ';'
{
@@ -1449,9 +1483,15 @@ param_list: parameter
parameter: input_mods var_modifiers type any_identifier colon_attribute
{
+ struct hlsl_type *type;
+ DWORD modifiers = $2;
+
+ if (!(type = apply_type_modifiers($3, &modifiers, get_location(&@2))))
+ YYABORT;
+
$$.modifiers = $1 ? $1 : HLSL_MODIFIER_IN;
- $$.modifiers |= $2;
- $$.type = $3;
+ $$.modifiers |= modifiers;
+ $$.type = type;
$$.name = $4;
$$.semantic = $5.semantic;
$$.reg_reservation = $5.reg_reservation;
@@ -1639,7 +1679,12 @@ type_spec: any_identifier array
declaration: var_modifiers type variables_def ';'
{
- $$ = declare_vars($2, $1, $3);
+ struct hlsl_type *type;
+ DWORD modifiers = $1;
+
+ if (!(type = apply_type_modifiers($2, &modifiers, get_location(&@1))))
+ YYABORT;
+ $$ = declare_vars(type, modifiers, $3);
}
variables_def_optional: /* Empty */
@@ -1717,47 +1762,47 @@ var_modifiers: /* Empty */
}
| KW_EXTERN var_modifiers
{
- $$ = add_modifier($2, HLSL_STORAGE_EXTERN, &@1);
+ $$ = add_modifiers($2, HLSL_STORAGE_EXTERN, get_location(&@1));
}
| KW_NOINTERPOLATION var_modifiers
{
- $$ = add_modifier($2, HLSL_STORAGE_NOINTERPOLATION, &@1);
+ $$ = add_modifiers($2, HLSL_STORAGE_NOINTERPOLATION, get_location(&@1));
}
| KW_PRECISE var_modifiers
{
- $$ = add_modifier($2, HLSL_MODIFIER_PRECISE, &@1);
+ $$ = add_modifiers($2, HLSL_MODIFIER_PRECISE, get_location(&@1));
}
| KW_SHARED var_modifiers
{
- $$ = add_modifier($2, HLSL_STORAGE_SHARED, &@1);
+ $$ = add_modifiers($2, HLSL_STORAGE_SHARED, get_location(&@1));
}
| KW_GROUPSHARED var_modifiers
{
- $$ = add_modifier($2, HLSL_STORAGE_GROUPSHARED, &@1);
+ $$ = add_modifiers($2, HLSL_STORAGE_GROUPSHARED, get_location(&@1));
}
| KW_STATIC var_modifiers
{
- $$ = add_modifier($2, HLSL_STORAGE_STATIC, &@1);
+ $$ = add_modifiers($2, HLSL_STORAGE_STATIC, get_location(&@1));
}
| KW_UNIFORM var_modifiers
{
- $$ = add_modifier($2, HLSL_STORAGE_UNIFORM, &@1);
+ $$ = add_modifiers($2, HLSL_STORAGE_UNIFORM, get_location(&@1));
}
| KW_VOLATILE var_modifiers
{
- $$ = add_modifier($2, HLSL_STORAGE_VOLATILE, &@1);
+ $$ = add_modifiers($2, HLSL_STORAGE_VOLATILE, get_location(&@1));
}
| KW_CONST var_modifiers
{
- $$ = add_modifier($2, HLSL_MODIFIER_CONST, &@1);
+ $$ = add_modifiers($2, HLSL_MODIFIER_CONST, get_location(&@1));
}
| KW_ROW_MAJOR var_modifiers
{
- $$ = add_modifier($2, HLSL_MODIFIER_ROW_MAJOR, &@1);
+ $$ = add_modifiers($2, HLSL_MODIFIER_ROW_MAJOR, get_location(&@1));
}
| KW_COLUMN_MAJOR var_modifiers
{
- $$ = add_modifier($2, HLSL_MODIFIER_COLUMN_MAJOR, &@1);
+ $$ = add_modifiers($2, HLSL_MODIFIER_COLUMN_MAJOR, get_location(&@1));
}
complex_initializer: initializer_expr
@@ -2486,23 +2531,6 @@ static struct source_location get_location(const struct YYLTYPE *l)
return loc;
}
-static DWORD add_modifier(DWORD modifiers, DWORD mod, const struct YYLTYPE *l)
-{
- if (modifiers & mod)
- {
- hlsl_report_message(get_location(l), HLSL_LEVEL_ERROR,
- "modifier '%s' already specified", debug_modifiers(mod));
- return modifiers;
- }
- if (mod & (HLSL_MODIFIER_ROW_MAJOR | HLSL_MODIFIER_COLUMN_MAJOR)
- && modifiers & (HLSL_MODIFIER_ROW_MAJOR | HLSL_MODIFIER_COLUMN_MAJOR))
- {
- hlsl_report_message(get_location(l), HLSL_LEVEL_ERROR, "more than one matrix majority keyword");
- return modifiers;
- }
- return modifiers | mod;
-}
-
static void dump_function_decl(struct wine_rb_entry *entry, void *context)
{
struct hlsl_ir_function_decl *func = WINE_RB_ENTRY_VALUE(entry, struct hlsl_ir_function_decl, entry);
More information about the wine-cvs
mailing list