[PATCH v4 1/6] d3dcompiler: Store some builtin types in the hlsl_ctx structure.

Zebediah Figura z.figura12 at gmail.com
Mon Jun 1 17:58:41 CDT 2020


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
v4: don't add void to the scope

 dlls/d3dcompiler_43/d3dcompiler_private.h |   8 ++
 dlls/d3dcompiler_43/hlsl.y                | 131 +++++++++++-----------
 2 files changed, 75 insertions(+), 64 deletions(-)

diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index 6c2f234c4dd..8e96a4fbcac 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -595,6 +595,7 @@ enum hlsl_sampler_dim
    HLSL_SAMPLER_DIM_2D,
    HLSL_SAMPLER_DIM_3D,
    HLSL_SAMPLER_DIM_CUBE,
+   HLSL_SAMPLER_DIM_MAX = HLSL_SAMPLER_DIM_CUBE
 };
 
 enum hlsl_matrix_majority
@@ -983,6 +984,13 @@ struct hlsl_parse_ctx
     const struct hlsl_ir_function_decl *cur_function;
 
     enum hlsl_matrix_majority matrix_majority;
+
+    struct
+    {
+        struct hlsl_type *scalar[HLSL_TYPE_LAST_SCALAR + 1];
+        struct hlsl_type *sampler[HLSL_SAMPLER_DIM_MAX + 1];
+        struct hlsl_type *Void;
+    } builtin_types;
 };
 
 extern struct hlsl_parse_ctx hlsl_ctx DECLSPEC_HIDDEN;
diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
index 058a627dc27..236fc8c1865 100644
--- a/dlls/d3dcompiler_43/hlsl.y
+++ b/dlls/d3dcompiler_43/hlsl.y
@@ -213,6 +213,15 @@ static void declare_predefined_types(struct hlsl_scope *scope)
     };
     char name[10];
 
+    static const char *const sampler_names[] =
+    {
+        "sampler",
+        "sampler1D",
+        "sampler2D",
+        "sampler3D",
+        "samplerCUBE"
+    };
+
     for (bt = 0; bt <= HLSL_TYPE_LAST_SCALAR; ++bt)
     {
         for (y = 1; y <= 4; ++y)
@@ -234,12 +243,22 @@ static void declare_predefined_types(struct hlsl_scope *scope)
                         sprintf(name, "%s", names[bt]);
                         type = new_hlsl_type(d3dcompiler_strdup(name), HLSL_CLASS_SCALAR, bt, x, y);
                         add_type_to_scope(scope, type);
+                        hlsl_ctx.builtin_types.scalar[bt] = type;
                     }
                 }
             }
         }
     }
 
+    for (bt = 0; bt <= HLSL_SAMPLER_DIM_MAX; ++bt)
+    {
+        type = new_hlsl_type(d3dcompiler_strdup(sampler_names[bt]), HLSL_CLASS_OBJECT, HLSL_TYPE_SAMPLER, 1, 1);
+        type->sampler_dim = bt;
+        hlsl_ctx.builtin_types.sampler[bt] = type;
+    }
+
+    hlsl_ctx.builtin_types.Void = new_hlsl_type(d3dcompiler_strdup("void"), HLSL_CLASS_OBJECT, HLSL_TYPE_VOID, 1, 1);
+
     /* DX8 effects predefined types */
     type = new_hlsl_type(d3dcompiler_strdup("DWORD"), HLSL_CLASS_SCALAR, HLSL_TYPE_INT, 1, 1);
     add_type_to_scope(scope, type);
@@ -548,15 +567,11 @@ static struct hlsl_ir_assignment *make_simple_assignment(struct hlsl_ir_var *lhs
 
 static struct hlsl_ir_constant *new_uint_constant(unsigned int n, const struct source_location loc)
 {
-    struct hlsl_type *type;
     struct hlsl_ir_constant *c;
 
-    if (!(type = new_hlsl_type(d3dcompiler_strdup("uint"), HLSL_CLASS_SCALAR, HLSL_TYPE_UINT, 1, 1)))
-        return NULL;
-
     if (!(c = d3dcompiler_alloc(sizeof(*c))))
         return NULL;
-    init_node(&c->node, HLSL_IR_CONSTANT, type, loc);
+    init_node(&c->node, HLSL_IR_CONSTANT, hlsl_ctx.builtin_types.scalar[HLSL_TYPE_UINT], loc);
     c->v.value.u[0] = n;
     return c;
 }
@@ -1814,60 +1829,48 @@ type:                     base_type
                                 $$ = new_hlsl_type(NULL, HLSL_CLASS_MATRIX, $3->base_type, $5, $7);
                             }
 
-base_type:                KW_VOID
-                            {
-                                $$ = new_hlsl_type(d3dcompiler_strdup("void"), HLSL_CLASS_OBJECT, HLSL_TYPE_VOID, 1, 1);
-                            }
-                        | KW_SAMPLER
-                            {
-                                $$ = new_hlsl_type(d3dcompiler_strdup("sampler"), HLSL_CLASS_OBJECT, HLSL_TYPE_SAMPLER, 1, 1);
-                                $$->sampler_dim = HLSL_SAMPLER_DIM_GENERIC;
-                            }
-                        | KW_SAMPLER1D
-                            {
-                                $$ = new_hlsl_type(d3dcompiler_strdup("sampler1D"), HLSL_CLASS_OBJECT, HLSL_TYPE_SAMPLER, 1, 1);
-                                $$->sampler_dim = HLSL_SAMPLER_DIM_1D;
-                            }
-                        | KW_SAMPLER2D
-                            {
-                                $$ = new_hlsl_type(d3dcompiler_strdup("sampler2D"), HLSL_CLASS_OBJECT, HLSL_TYPE_SAMPLER, 1, 1);
-                                $$->sampler_dim = HLSL_SAMPLER_DIM_2D;
-                            }
-                        | KW_SAMPLER3D
-                            {
-                                $$ = new_hlsl_type(d3dcompiler_strdup("sampler3D"), HLSL_CLASS_OBJECT, HLSL_TYPE_SAMPLER, 1, 1);
-                                $$->sampler_dim = HLSL_SAMPLER_DIM_3D;
-                            }
-                        | KW_SAMPLERCUBE
-                            {
-                                $$ = new_hlsl_type(d3dcompiler_strdup("samplerCUBE"), HLSL_CLASS_OBJECT, HLSL_TYPE_SAMPLER, 1, 1);
-                                $$->sampler_dim = HLSL_SAMPLER_DIM_CUBE;
-                            }
-                        | TYPE_IDENTIFIER
-                            {
-                                struct hlsl_type *type;
+base_type:
 
-                                type = get_type(hlsl_ctx.cur_scope, $1, TRUE);
-                                $$ = type;
-                                d3dcompiler_free($1);
-                            }
-                        | KW_STRUCT TYPE_IDENTIFIER
-                            {
-                                struct hlsl_type *type;
-
-                                type = get_type(hlsl_ctx.cur_scope, $2, TRUE);
-                                if (type->type != HLSL_CLASS_STRUCT)
-                                {
-                                    hlsl_message("Line %u: redefining %s as a structure.\n",
-                                            hlsl_ctx.line_no, $2);
-                                    set_parse_status(&hlsl_ctx.status, PARSE_ERR);
-                                }
-                                else
-                                {
-                                    $$ = type;
-                                }
-                                d3dcompiler_free($2);
-                            }
+      KW_VOID
+        {
+            $$ = hlsl_ctx.builtin_types.Void;
+        }
+    | KW_SAMPLER
+        {
+            $$ = hlsl_ctx.builtin_types.sampler[HLSL_SAMPLER_DIM_GENERIC];
+        }
+    | KW_SAMPLER1D
+        {
+            $$ = hlsl_ctx.builtin_types.sampler[HLSL_SAMPLER_DIM_1D];
+        }
+    | KW_SAMPLER2D
+        {
+            $$ = hlsl_ctx.builtin_types.sampler[HLSL_SAMPLER_DIM_2D];
+        }
+    | KW_SAMPLER3D
+        {
+            $$ = hlsl_ctx.builtin_types.sampler[HLSL_SAMPLER_DIM_3D];
+        }
+    | KW_SAMPLERCUBE
+        {
+            $$ = hlsl_ctx.builtin_types.sampler[HLSL_SAMPLER_DIM_3D];
+        }
+    | TYPE_IDENTIFIER
+        {
+            $$ = get_type(hlsl_ctx.cur_scope, $1, TRUE);
+            d3dcompiler_free($1);
+        }
+    | KW_STRUCT TYPE_IDENTIFIER
+        {
+            $$ = get_type(hlsl_ctx.cur_scope, $2, TRUE);
+            if ($$->type != HLSL_CLASS_STRUCT)
+            {
+                hlsl_message("Line %u: redefining %s as a structure.\n",
+                        hlsl_ctx.line_no, $2);
+                set_parse_status(&hlsl_ctx.status, PARSE_ERR);
+            }
+            d3dcompiler_free($2);
+        }
 
 declaration_statement:    declaration
                         | struct_declaration
@@ -2207,8 +2210,8 @@ primary_expr:             C_FLOAT
                                     ERR("Out of memory.\n");
                                     YYABORT;
                                 }
-                                init_node(&c->node, HLSL_IR_CONSTANT, new_hlsl_type(d3dcompiler_strdup("float"),
-                                        HLSL_CLASS_SCALAR, HLSL_TYPE_FLOAT, 1, 1), get_location(&@1));
+                                init_node(&c->node, HLSL_IR_CONSTANT,
+                                        hlsl_ctx.builtin_types.scalar[HLSL_TYPE_FLOAT], get_location(&@1));
                                 c->v.value.f[0] = $1;
                                 if (!($$ = make_list(&c->node)))
                                     YYABORT;
@@ -2221,8 +2224,8 @@ primary_expr:             C_FLOAT
                                     ERR("Out of memory.\n");
                                     YYABORT;
                                 }
-                                init_node(&c->node, HLSL_IR_CONSTANT, new_hlsl_type(d3dcompiler_strdup("int"),
-                                        HLSL_CLASS_SCALAR, HLSL_TYPE_INT, 1, 1), get_location(&@1));
+                                init_node(&c->node, HLSL_IR_CONSTANT,
+                                        hlsl_ctx.builtin_types.scalar[HLSL_TYPE_INT], get_location(&@1));
                                 c->v.value.i[0] = $1;
                                 if (!($$ = make_list(&c->node)))
                                     YYABORT;
@@ -2235,8 +2238,8 @@ primary_expr:             C_FLOAT
                                     ERR("Out of memory.\n");
                                     YYABORT;
                                 }
-                                init_node(&c->node, HLSL_IR_CONSTANT, new_hlsl_type(d3dcompiler_strdup("bool"),
-                                        HLSL_CLASS_SCALAR, HLSL_TYPE_BOOL, 1, 1), get_location(&@1));
+                                init_node(&c->node, HLSL_IR_CONSTANT,
+                                        hlsl_ctx.builtin_types.scalar[HLSL_TYPE_BOOL], get_location(&@1));
                                 c->v.value.b[0] = $1;
                                 if (!($$ = make_list(&c->node)))
                                     YYABORT;
-- 
2.26.2




More information about the wine-devel mailing list