Zebediah Figura : vkd3d-shader: Store variables with external linkage in a dedicated list.

Alexandre Julliard julliard at winehq.org
Tue Apr 20 16:26:15 CDT 2021


Module: vkd3d
Branch: master
Commit: 8f26986615aaef68869a8868273c5b4fc21bdfd4
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=8f26986615aaef68869a8868273c5b4fc21bdfd4

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Thu Apr 15 19:03:44 2021 -0500

vkd3d-shader: Store variables with external linkage in a dedicated list.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d-shader/hlsl.c         |  1 +
 libs/vkd3d-shader/hlsl.h         |  3 ++-
 libs/vkd3d-shader/hlsl_codegen.c | 22 ++++++++++++----------
 3 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c
index 10105ea..50b40d6 100644
--- a/libs/vkd3d-shader/hlsl.c
+++ b/libs/vkd3d-shader/hlsl.c
@@ -1578,6 +1578,7 @@ static bool hlsl_ctx_init(struct hlsl_ctx *ctx, const struct hlsl_profile_info *
     rb_init(&ctx->functions, compare_function_rb);
 
     list_init(&ctx->static_initializers);
+    list_init(&ctx->extern_vars);
 
     return true;
 }
diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h
index 8493f74..3a0bf38 100644
--- a/libs/vkd3d-shader/hlsl.h
+++ b/libs/vkd3d-shader/hlsl.h
@@ -213,7 +213,7 @@ struct hlsl_ir_var
     const char *name;
     const char *semantic;
     const struct hlsl_reg_reservation *reg_reservation;
-    struct list scope_entry, param_entry;
+    struct list scope_entry, param_entry, extern_entry;
 
     unsigned int first_write, last_read;
     struct hlsl_reg reg;
@@ -418,6 +418,7 @@ struct hlsl_ctx
     struct hlsl_scope *cur_scope;
     struct hlsl_scope *globals;
     struct list scopes;
+    struct list extern_vars;
 
     struct list types;
     struct rb_tree functions;
diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
index 9ebd149..12d5988 100644
--- a/libs/vkd3d-shader/hlsl_codegen.c
+++ b/libs/vkd3d-shader/hlsl_codegen.c
@@ -45,7 +45,8 @@ static void prepend_uniform_copy(struct hlsl_ctx *ctx, struct list *instrs, stru
         return;
     }
     vkd3d_string_buffer_release(&ctx->string_buffers, name);
-    list_add_head(&ctx->globals->vars, &const_var->scope_entry);
+    list_add_before(&var->scope_entry, &const_var->scope_entry);
+    list_add_tail(&ctx->extern_vars, &const_var->extern_entry);
     var->is_uniform = 0;
     const_var->is_uniform = 1;
 
@@ -87,7 +88,8 @@ static void prepend_input_copy(struct hlsl_ctx *ctx, struct list *instrs, struct
     }
     vkd3d_string_buffer_release(&ctx->string_buffers, name);
     varying->is_input_varying = 1;
-    list_add_head(&ctx->globals->vars, &varying->scope_entry);
+    list_add_before(&var->scope_entry, &varying->scope_entry);
+    list_add_tail(&ctx->extern_vars, &varying->extern_entry);
 
     if (!(load = hlsl_new_var_load(varying, var->loc)))
     {
@@ -164,7 +166,8 @@ static void append_output_copy(struct hlsl_ctx *ctx, struct list *instrs, struct
     }
     vkd3d_string_buffer_release(&ctx->string_buffers, name);
     varying->is_output_varying = 1;
-    list_add_head(&ctx->globals->vars, &varying->scope_entry);
+    list_add_before(&var->scope_entry, &varying->scope_entry);
+    list_add_tail(&ctx->extern_vars, &varying->extern_entry);
 
     if (!(offset = hlsl_new_uint_constant(ctx, field_offset * 4, var->loc)))
     {
@@ -593,7 +596,7 @@ static void compute_liveness(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl
             var->first_write = var->last_read = 0;
     }
 
-    LIST_FOR_EACH_ENTRY(var, &ctx->globals->vars, struct hlsl_ir_var, scope_entry)
+    LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
     {
         if (var->is_uniform || var->is_input_varying)
             var->first_write = 1;
@@ -601,11 +604,6 @@ static void compute_liveness(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl
             var->last_read = UINT_MAX;
     }
 
-    LIST_FOR_EACH_ENTRY(var, entry_func->parameters, struct hlsl_ir_var, param_entry)
-    {
-        var->first_write = 1;
-    }
-
     if (entry_func->return_var)
         entry_func->return_var->last_read = UINT_MAX;
 
@@ -846,7 +844,7 @@ static void allocate_const_registers(struct hlsl_ctx *ctx, struct hlsl_ir_functi
     struct liveness liveness = {0};
     struct hlsl_ir_var *var;
 
-    LIST_FOR_EACH_ENTRY(var, &ctx->globals->vars, struct hlsl_ir_var, scope_entry)
+    LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
     {
         if (var->is_uniform && var->last_read)
         {
@@ -928,12 +926,16 @@ int hlsl_emit_dxbc(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_fun
 
     LIST_FOR_EACH_ENTRY(var, &ctx->globals->vars, struct hlsl_ir_var, scope_entry)
     {
+        if (var->data_type->type == HLSL_CLASS_OBJECT)
+            list_add_tail(&ctx->extern_vars, &var->extern_entry);
         if (var->is_uniform)
             prepend_uniform_copy(ctx, entry_func->body, var);
     }
 
     LIST_FOR_EACH_ENTRY(var, entry_func->parameters, struct hlsl_ir_var, param_entry)
     {
+        if (var->data_type->type == HLSL_CLASS_OBJECT)
+            list_add_tail(&ctx->extern_vars, &var->extern_entry);
         if (var->is_uniform)
             prepend_uniform_copy(ctx, entry_func->body, var);
         if (var->is_input_varying)




More information about the wine-cvs mailing list