From: Francisco Casas fcasas@codeweavers.com
--- libs/vkd3d-shader/hlsl.c | 13 +++++++++++++ libs/vkd3d-shader/hlsl.h | 2 ++ libs/vkd3d-shader/tpf.c | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c index 4ed7712b..92037752 100644 --- a/libs/vkd3d-shader/hlsl.c +++ b/libs/vkd3d-shader/hlsl.c @@ -1068,6 +1068,19 @@ struct hlsl_ir_var *hlsl_new_synthetic_var_named(struct hlsl_ctx *ctx, const cha return var; }
+unsigned int hlsl_var_get_bind_count(const struct hlsl_ir_var *var, enum hlsl_regset regset) +{ + unsigned int i, used_reg_size = 0; + + assert(regset <= HLSL_REGSET_LAST_OBJECT); + for (i = 0; i < var->data_type->reg_size[regset]; ++i) + { + if (var->objects_usage[regset][i].used) + used_reg_size = max(used_reg_size, i + 1); + } + return used_reg_size; +} + static bool type_is_single_reg(const struct hlsl_type *type) { return type->class == HLSL_CLASS_SCALAR || type->class == HLSL_CLASS_VECTOR; diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index fb4bdfa6..dd272ade 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -1189,6 +1189,8 @@ struct hlsl_ir_var *hlsl_new_var(struct hlsl_ctx *ctx, const char *name, struct const struct vkd3d_shader_location *loc, const struct hlsl_semantic *semantic, unsigned int modifiers, const struct hlsl_reg_reservation *reg_reservation);
+unsigned int hlsl_var_get_bind_count(const struct hlsl_ir_var *var, enum hlsl_regset regset); + void hlsl_error(struct hlsl_ctx *ctx, const struct vkd3d_shader_location *loc, enum vkd3d_shader_error error, const char *fmt, ...) VKD3D_PRINTF_FUNC(4, 5); void hlsl_fixme(struct hlsl_ctx *ctx, const struct vkd3d_shader_location *loc, diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index b1027428..e2302857 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -3134,7 +3134,7 @@ static struct extern_resource *sm4_get_extern_resources(struct hlsl_ctx *ctx, un
extern_resources[*count].regset = regset; extern_resources[*count].id = var->regs[regset].id; - extern_resources[*count].bind_count = var->regs[regset].allocation_size; + extern_resources[*count].bind_count = hlsl_var_get_bind_count(var, regset);
++*count; }