[PATCH 8/8] d3dcompiler: Parse ": register()" syntax.

Matteo Bruni mbruni at codeweavers.com
Tue Jun 16 15:45:44 CDT 2015


---
 dlls/d3dcompiler_43/d3dcompiler_private.h |  17 ++++-
 dlls/d3dcompiler_43/hlsl.y                | 107 ++++++++++++++++++++++++++----
 dlls/d3dcompiler_43/utils.c               |   1 +
 3 files changed, 112 insertions(+), 13 deletions(-)

diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index eb81ea5..2fafa94 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -747,12 +747,19 @@ struct hlsl_ir_node
 
 #define HLSL_MODIFIERS_COMPARISON_MASK (HLSL_MODIFIER_ROW_MAJOR | HLSL_MODIFIER_COLUMN_MAJOR)
 
+struct reg_reservation
+{
+    enum bwritershader_param_register_type type;
+    DWORD regnum;
+};
+
 struct hlsl_ir_var
 {
     struct hlsl_ir_node node;
     const char *name;
     const char *semantic;
     unsigned int modifiers;
+    const struct reg_reservation *reg_reservation;
     struct list scope_entry;
 
     struct hlsl_var_allocation *allocation;
@@ -961,9 +968,16 @@ struct parse_parameter
     struct hlsl_type *type;
     const char *name;
     const char *semantic;
+    const struct reg_reservation *reg_reservation;
     unsigned int modifiers;
 };
 
+struct parse_colon_attribute
+{
+    const char *semantic;
+    struct reg_reservation *reg_reservation;
+};
+
 struct parse_variable_def
 {
     struct list entry;
@@ -971,7 +985,8 @@ struct parse_variable_def
 
     char *name;
     unsigned int array_size;
-    char *semantic;
+    const char *semantic;
+    struct reg_reservation *reg_reservation;
     struct list *initializer;
 };
 
diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
index 80fe0e6..c5f66d6 100644
--- a/dlls/d3dcompiler_43/hlsl.y
+++ b/dlls/d3dcompiler_43/hlsl.y
@@ -597,6 +597,7 @@ static struct list *declare_vars(struct hlsl_type *basic_type, DWORD modifiers,
         var->name = v->name;
         var->modifiers = modifiers;
         var->semantic = v->semantic;
+        var->reg_reservation = v->reg_reservation;
         debug_dump_decl(type, modifiers, v->name, v->loc.line);
 
         if (hlsl_ctx.cur_scope == hlsl_ctx.globals)
@@ -822,6 +823,7 @@ static BOOL add_func_parameter(struct list *list, struct parse_parameter *param,
     decl->node.loc = *loc;
     decl->name = param->name;
     decl->semantic = param->semantic;
+    decl->reg_reservation = param->reg_reservation;
     decl->modifiers = param->modifiers;
 
     if (!add_declaration(hlsl_ctx.cur_scope, decl, FALSE))
@@ -833,6 +835,48 @@ static BOOL add_func_parameter(struct list *list, struct parse_parameter *param,
     return TRUE;
 }
 
+static struct reg_reservation *parse_reg_reservation(const char *reg_string)
+{
+    struct reg_reservation *reg_res;
+    enum bwritershader_param_register_type type;
+    DWORD regnum = 0;
+
+    switch (reg_string[0])
+    {
+        case 'c':
+            type = BWRITERSPR_CONST;
+            break;
+        case 'i':
+            type = BWRITERSPR_CONSTINT;
+            break;
+        case 'b':
+            type = BWRITERSPR_CONSTBOOL;
+            break;
+        case 's':
+            type = BWRITERSPR_SAMPLER;
+            break;
+        default:
+            FIXME("Unsupported register type.\n");
+            return NULL;
+     }
+
+    if (!sscanf(reg_string + 1, "%u", &regnum))
+    {
+        FIXME("Unsupported register reservation syntax.\n");
+        return NULL;
+    }
+
+    reg_res = d3dcompiler_alloc(sizeof(*reg_res));
+    if (!reg_res)
+    {
+        ERR("Out of memory.\n");
+        return NULL;
+    }
+    reg_res->type = type;
+    reg_res->regnum = regnum;
+    return reg_res;
+}
+
 static const struct hlsl_ir_function_decl *get_overloaded_func(struct wine_rb_tree *funcs, char *name,
         struct list *params, BOOL exact_signature)
 {
@@ -879,6 +923,8 @@ static const struct hlsl_ir_function_decl *get_overloaded_func(struct wine_rb_tr
     struct parse_if_body if_body;
     enum parse_unary_op unary_op;
     enum parse_assign_op assign_op;
+    struct reg_reservation *reg_reservation;
+    struct parse_colon_attribute colon_attribute;
 }
 
 %token KW_BLENDSTATE
@@ -1016,7 +1062,9 @@ static const struct hlsl_ir_function_decl *get_overloaded_func(struct wine_rb_tr
 %type <function> func_prototype
 %type <list> fields_list
 %type <parameter> parameter
+%type <colon_attribute> colon_attribute
 %type <name> semantic
+%type <reg_reservation> register_opt
 %type <variable_def> variable_def
 %type <list> variables_def
 %type <list> variables_def_optional
@@ -1224,7 +1272,7 @@ func_declaration:         func_prototype compound_statement
                                 pop_scope(&hlsl_ctx);
                             }
 
-func_prototype:           var_modifiers type var_identifier '(' parameters ')' semantic
+func_prototype:           var_modifiers type var_identifier '(' parameters ')' colon_attribute
                             {
                                 if (get_variable(hlsl_ctx.globals, $3))
                                 {
@@ -1232,12 +1280,17 @@ func_prototype:           var_modifiers type var_identifier '(' parameters ')' s
                                             HLSL_LEVEL_ERROR, "redefinition of '%s'\n", $3);
                                     return 1;
                                 }
-                                if ($2->base_type == HLSL_TYPE_VOID && $7)
+                                if ($2->base_type == HLSL_TYPE_VOID && $7.semantic)
                                 {
                                     hlsl_report_message(hlsl_ctx.source_file, @7.first_line, @7.first_column,
                                             HLSL_LEVEL_ERROR, "void function with a semantic");
                                 }
 
+                                if ($7.reg_reservation)
+                                {
+                                    FIXME("Unexpected register reservation for a function.\n");
+                                    d3dcompiler_free($7.reg_reservation);
+                                }
                                 $$.decl = new_func_decl($2, $5);
                                 if (!$$.decl)
                                 {
@@ -1245,7 +1298,7 @@ func_prototype:           var_modifiers type var_identifier '(' parameters ')' s
                                     return -1;
                                 }
                                 $$.name = $3;
-                                $$.decl->semantic = $7;
+                                $$.decl->semantic = $7.semantic;
                                 set_location(&$$.decl->node.loc, &@3);
                             }
 
@@ -1268,15 +1321,42 @@ scope_start:              /* Empty */
 var_identifier:           VAR_IDENTIFIER
                         | NEW_IDENTIFIER
 
-semantic:                 /* Empty */
+colon_attribute:          /* Empty */
                             {
-                                $$ = NULL;
+                                $$.semantic = NULL;
+                                $$.reg_reservation = NULL;
+                            }
+                        | semantic
+                            {
+                                $$.semantic = $1;
+                                $$.reg_reservation = NULL;
+                            }
+                        | register_opt
+                            {
+                                $$.semantic = NULL;
+                                $$.reg_reservation = $1;
                             }
-                        | ':' any_identifier
+
+semantic:                 ':' any_identifier
                             {
                                 $$ = $2;
                             }
 
+                          /* FIXME: Writemasks */
+register_opt:             ':' KW_REGISTER '(' any_identifier ')'
+                            {
+                                $$ = parse_reg_reservation($4);
+                                d3dcompiler_free($4);
+                            }
+                        | ':' KW_REGISTER '(' any_identifier ',' any_identifier ')'
+                            {
+                                FIXME("Ignoring shader target %s in a register reservation.\n", debugstr_a($4));
+                                d3dcompiler_free($4);
+
+                                $$ = parse_reg_reservation($6);
+                                d3dcompiler_free($6);
+                            }
+
 parameters:               scope_start
                             {
                                 $$ = d3dcompiler_alloc(sizeof(*$$));
@@ -1315,13 +1395,14 @@ param_list:               parameter
                                 }
                             }
 
-parameter:                input_mods var_modifiers type any_identifier semantic
+parameter:                input_mods var_modifiers type any_identifier colon_attribute
                             {
                                 $$.modifiers = $1 ? $1 : HLSL_MODIFIER_IN;
                                 $$.modifiers |= $2;
                                 $$.type = $3;
                                 $$.name = $4;
-                                $$.semantic = $5;
+                                $$.semantic = $5.semantic;
+                                $$.reg_reservation = $5.reg_reservation;
                             }
 
 input_mods:               /* Empty */
@@ -1526,22 +1607,24 @@ variables_def:            variable_def
                                 list_add_tail($$, &$3->entry);
                             }
 
-variable_def:             any_identifier array semantic
+variable_def:             any_identifier array colon_attribute
                             {
                                 $$ = d3dcompiler_alloc(sizeof(*$$));
                                 set_location(&$$->loc, &@1);
                                 $$->name = $1;
                                 $$->array_size = $2;
-                                $$->semantic = $3;
+                                $$->semantic = $3.semantic;
+                                $$->reg_reservation = $3.reg_reservation;
                             }
-                        | any_identifier array semantic '=' complex_initializer
+                        | any_identifier array colon_attribute '=' complex_initializer
                             {
                                 TRACE("Declaration with initializer.\n");
                                 $$ = d3dcompiler_alloc(sizeof(*$$));
                                 set_location(&$$->loc, &@1);
                                 $$->name = $1;
                                 $$->array_size = $2;
-                                $$->semantic = $3;
+                                $$->semantic = $3.semantic;
+                                $$->reg_reservation = $3.reg_reservation;
                                 $$->initializer = $5;
                             }
 
diff --git a/dlls/d3dcompiler_43/utils.c b/dlls/d3dcompiler_43/utils.c
index ff44804..e131d99 100644
--- a/dlls/d3dcompiler_43/utils.c
+++ b/dlls/d3dcompiler_43/utils.c
@@ -802,6 +802,7 @@ void free_declaration(struct hlsl_ir_var *decl)
 {
     d3dcompiler_free((void *)decl->name);
     d3dcompiler_free((void *)decl->semantic);
+    d3dcompiler_free((void *)decl->reg_reservation);
     d3dcompiler_free(decl);
 }
 
-- 
2.3.6




More information about the wine-patches mailing list