[PATCH vkd3d v3 6/6] vkd3d-shader: Allocate constant registers for uniforms.

Zebediah Figura zfigura at codeweavers.com
Thu Apr 8 23:38:27 CDT 2021


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 libs/vkd3d-shader/hlsl_codegen.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
index f7e11565..e254cede 100644
--- a/libs/vkd3d-shader/hlsl_codegen.c
+++ b/libs/vkd3d-shader/hlsl_codegen.c
@@ -840,9 +840,25 @@ static void allocate_const_registers_recurse(struct list *instrs, struct livenes
     }
 }
 
-static void allocate_const_registers(struct hlsl_ir_function_decl *entry_func)
+static void allocate_const_registers(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_func)
 {
     struct liveness liveness = {0};
+    struct hlsl_ir_var *var;
+
+    LIST_FOR_EACH_ENTRY(var, &ctx->globals->vars, struct hlsl_ir_var, scope_entry)
+    {
+        if (var->is_uniform && var->last_read)
+        {
+            if (var->data_type->reg_size > 1)
+                var->reg = allocate_range(&liveness, 1, UINT_MAX, var->data_type->reg_size);
+            else
+            {
+                var->reg = allocate_register(&liveness, 1, UINT_MAX, 4);
+                var->reg.writemask = (1u << var->data_type->dimx) - 1;
+            }
+            TRACE("Allocated %s to %s.\n", var->name, debug_register('c', var->reg, var->data_type));
+        }
+    }
 
     allocate_const_registers_recurse(entry_func->body, &liveness);
 }
@@ -896,7 +912,7 @@ int hlsl_emit_dxbc(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_fun
 
     allocate_temp_registers(entry_func);
     if (ctx->profile->major_version < 4)
-        allocate_const_registers(entry_func);
+        allocate_const_registers(ctx, entry_func);
 
     if (ctx->failed)
         return VKD3D_ERROR_INVALID_SHADER;
-- 
2.31.1




More information about the wine-devel mailing list