[PATCH vkd3d 5/6] vkd3d-shader: Keep track of the buffer in which a variable was defined.

Zebediah Figura zfigura at codeweavers.com
Mon Jun 21 23:37:10 CDT 2021


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 libs/vkd3d-shader/hlsl.c         |  6 ++++++
 libs/vkd3d-shader/hlsl.h         |  2 ++
 libs/vkd3d-shader/hlsl.y         | 16 +++++++++++-----
 libs/vkd3d-shader/hlsl_codegen.c |  1 +
 4 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c
index aa95a431..c36fe602 100644
--- a/libs/vkd3d-shader/hlsl.c
+++ b/libs/vkd3d-shader/hlsl.c
@@ -1599,8 +1599,14 @@ static bool hlsl_ctx_init(struct hlsl_ctx *ctx, const struct hlsl_profile_info *
 
     list_init(&ctx->static_initializers);
     list_init(&ctx->extern_vars);
+
     list_init(&ctx->buffers);
 
+    if (!(ctx->globals_buffer = hlsl_new_buffer(ctx, HLSL_BUFFER_CONSTANT,
+            hlsl_strdup(ctx, "$Globals"), NULL, ctx->location)))
+        return false;
+    ctx->cur_buffer = ctx->globals_buffer;
+
     return true;
 }
 
diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h
index 16ec976a..e2ac0a77 100644
--- a/libs/vkd3d-shader/hlsl.h
+++ b/libs/vkd3d-shader/hlsl.h
@@ -222,6 +222,7 @@ struct hlsl_ir_var
     struct vkd3d_shader_location loc;
     const char *name;
     struct hlsl_semantic semantic;
+    struct hlsl_buffer *buffer;
     unsigned int modifiers;
     struct hlsl_reg_reservation reg_reservation;
     struct list scope_entry, param_entry, extern_entry;
@@ -451,6 +452,7 @@ struct hlsl_ctx
     struct list extern_vars;
 
     struct list buffers;
+    struct hlsl_buffer *cur_buffer, *globals_buffer;
     struct list types;
     struct rb_tree functions;
     const struct hlsl_ir_function_decl *cur_function;
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
index 6f83648a..4355b9a2 100644
--- a/libs/vkd3d-shader/hlsl.y
+++ b/libs/vkd3d-shader/hlsl.y
@@ -1393,6 +1393,8 @@ static struct list *declare_vars(struct hlsl_ctx *ctx, struct hlsl_type *basic_t
             continue;
         }
 
+        var->buffer = ctx->cur_buffer;
+
         if (ctx->cur_scope == ctx->globals)
         {
             local = false;
@@ -1779,7 +1781,7 @@ hlsl_prog:
 
             hlsl_add_function(ctx, $2.name, $2.decl, false);
         }
-    | hlsl_prog buffer_declaration
+    | hlsl_prog buffer_declaration buffer_body
     | hlsl_prog declaration_statement
         {
             if (!list_empty($2))
@@ -1790,17 +1792,21 @@ hlsl_prog:
     | hlsl_prog ';'
 
 buffer_declaration:
-      buffer_type any_identifier colon_attribute '{' declaration_statement_list '}'
+      buffer_type any_identifier colon_attribute
         {
-            struct hlsl_buffer *buffer;
-
             if ($3.semantic.name)
                 hlsl_error(ctx, @3, VKD3D_SHADER_ERROR_HLSL_INVALID_SEMANTIC, "Semantics are not allowed on buffers.");
 
-            if (!(buffer = hlsl_new_buffer(ctx, $1, $2, &$3.reg_reservation, @2)))
+            if (!(ctx->cur_buffer = hlsl_new_buffer(ctx, $1, $2, &$3.reg_reservation, @2)))
                 YYABORT;
         }
 
+buffer_body:
+      '{' declaration_statement_list '}'
+        {
+            ctx->cur_buffer = ctx->globals_buffer;
+        }
+
 buffer_type:
       KW_CBUFFER
         {
diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
index 54c91bf8..068fb167 100644
--- a/libs/vkd3d-shader/hlsl_codegen.c
+++ b/libs/vkd3d-shader/hlsl_codegen.c
@@ -41,6 +41,7 @@ static void prepend_uniform_copy(struct hlsl_ctx *ctx, struct list *instrs, stru
     list_add_tail(&ctx->extern_vars, &uniform->extern_entry);
     uniform->is_uniform = 1;
     uniform->is_param = temp->is_param;
+    uniform->buffer = temp->buffer;
 
     if (!(name = hlsl_get_string_buffer(ctx)))
         return;
-- 
2.32.0




More information about the wine-devel mailing list