Fixes: f8338ef08953686298bb31315a19e6044325bb49
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- tests/register-reservations.shader_test | 61 +++++++++++++++++++++++++ 1 file changed, 61 insertions(+)
diff --git a/tests/register-reservations.shader_test b/tests/register-reservations.shader_test index 72f68c1e0..f5b3da172 100644 --- a/tests/register-reservations.shader_test +++ b/tests/register-reservations.shader_test @@ -69,6 +69,36 @@ draw quad probe all rgba (1.0, 1.0, 1.0, 99.0)
+% Register reservation with incorrect register type. +[pixel shader todo] +Texture2D unused : register(s0); +Texture2D tex; + +float4 main() : sv_target +{ + return tex.Load(int3(0, 0, 0)); +} + +[test] +todo draw quad +probe all rgba (0.0, 0.0, 0.0, 99.0) + + +% Register reservation with incorrect register type. +[pixel shader todo] +sampler2D unused : register(t0); +Texture2D tex; + +float4 main() : sv_target +{ + return tex.Load(int3(0, 0, 0)); +} + + +[test] +todo draw quad +probe all rgba (0.0, 0.0, 0.0, 99.0) + [pixel shader] Texture2D unused[2][2] : register(t0); Texture2D tex; @@ -81,3 +111,34 @@ float4 main() : sv_target [test] draw quad probe all rgba (4.0, 4.0, 4.0, 99.0) + + +% Overlapping reservations, both overlapping objects are unused. +[pixel shader todo] +Texture2D tex1 : register(t0); +Texture2D tex2 : register(t0); +Texture2D tex3; + +float4 main() : sv_target +{ + return tex3.Load(int3(0, 0, 0)); +} + +[test] +todo draw quad +probe all rgba (1.0, 1.0, 1.0, 99.0) + + +% Overlapping reservations +[pixel shader todo] +Texture2D tex1 : register(t2); +Texture2D tex2 : register(t2); + +float4 main() : sv_target +{ + return tex1.Load(int3(0, 0, 0)); +} + +[test] +todo draw quad +probe all rgba (2.0, 2.0, 2.0, 99.0)
From: Zebediah Figura zfigura@codeweavers.com
--- libs/vkd3d-shader/hlsl_codegen.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 96b4cb660..36b66982f 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -3626,11 +3626,23 @@ static const struct hlsl_ir_var *get_allocated_object(struct hlsl_ctx *ctx, enum
LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, const struct hlsl_ir_var, extern_entry) { - if (!var->regs[regset].allocated) + if (var->reg_reservation.reg_type == get_regset_name(regset) + && var->data_type->reg_size[regset]) + { + /* Vars with a reservation prevent non-reserved vars from being + * bound there even if the reserved vars aren't used. */ + start = var->reg_reservation.reg_index; + count = var->data_type->reg_size[regset]; + } + else if (var->regs[regset].allocated) + { + start = var->regs[regset].id; + count = var->regs[regset].bind_count; + } + else + { continue; - - start = var->regs[regset].id; - count = var->regs[regset].bind_count; + }
if (start <= index && index < start + count) return var;
From: Zebediah Figura zfigura@codeweavers.com
--- libs/vkd3d-shader/hlsl_codegen.c | 7 +++---- tests/register-reservations.shader_test | 8 ++++---- 2 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 36b66982f..37afdc2db 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -2710,11 +2710,10 @@ static void allocate_register_reservations(struct hlsl_ctx *ctx) type_string->buffer, get_regset_name(regset)); hlsl_release_string_buffer(ctx, type_string); } - else + else if (var->regs[regset].bind_count) { var->regs[regset].allocated = true; var->regs[regset].id = var->reg_reservation.reg_index; - var->regs[regset].bind_count = var->data_type->reg_size[regset]; TRACE("Allocated reserved %s to %c%u-%c%u.\n", var->name, var->reg_reservation.reg_type, var->reg_reservation.reg_index, var->reg_reservation.reg_type, var->reg_reservation.reg_index + var->regs[regset].bind_count); @@ -4124,10 +4123,10 @@ int hlsl_emit_bytecode(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry if (TRACE_ON()) rb_for_each_entry(&ctx->functions, dump_function, ctx);
- allocate_register_reservations(ctx); - calculate_resource_register_counts(ctx);
+ allocate_register_reservations(ctx); + allocate_temp_registers(ctx, entry_func); if (profile->major_version < 4) { diff --git a/tests/register-reservations.shader_test b/tests/register-reservations.shader_test index f5b3da172..23d4ae5cd 100644 --- a/tests/register-reservations.shader_test +++ b/tests/register-reservations.shader_test @@ -114,7 +114,7 @@ probe all rgba (4.0, 4.0, 4.0, 99.0)
% Overlapping reservations, both overlapping objects are unused. -[pixel shader todo] +[pixel shader] Texture2D tex1 : register(t0); Texture2D tex2 : register(t0); Texture2D tex3; @@ -125,12 +125,12 @@ float4 main() : sv_target }
[test] -todo draw quad +draw quad probe all rgba (1.0, 1.0, 1.0, 99.0)
% Overlapping reservations -[pixel shader todo] +[pixel shader] Texture2D tex1 : register(t2); Texture2D tex2 : register(t2);
@@ -140,5 +140,5 @@ float4 main() : sv_target }
[test] -todo draw quad +draw quad probe all rgba (2.0, 2.0, 2.0, 99.0)
From: Nikolay Sivov nsivov@codeweavers.com
--- libs/vkd3d-shader/hlsl_codegen.c | 4 ++-- tests/register-reservations.shader_test | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 37afdc2db..765b19074 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -2698,7 +2698,7 @@ static void allocate_register_reservations(struct hlsl_ctx *ctx) continue; regset = hlsl_type_get_regset(var->data_type);
- if (var->reg_reservation.reg_type) + if (var->reg_reservation.reg_type && var->regs[regset].bind_count) { if (var->reg_reservation.reg_type != get_regset_name(regset)) { @@ -2710,7 +2710,7 @@ static void allocate_register_reservations(struct hlsl_ctx *ctx) type_string->buffer, get_regset_name(regset)); hlsl_release_string_buffer(ctx, type_string); } - else if (var->regs[regset].bind_count) + else { var->regs[regset].allocated = true; var->regs[regset].id = var->reg_reservation.reg_index; diff --git a/tests/register-reservations.shader_test b/tests/register-reservations.shader_test index 23d4ae5cd..26f4381d0 100644 --- a/tests/register-reservations.shader_test +++ b/tests/register-reservations.shader_test @@ -70,7 +70,7 @@ probe all rgba (1.0, 1.0, 1.0, 99.0)
% Register reservation with incorrect register type. -[pixel shader todo] +[pixel shader] Texture2D unused : register(s0); Texture2D tex;
@@ -80,12 +80,12 @@ float4 main() : sv_target }
[test] -todo draw quad +draw quad probe all rgba (0.0, 0.0, 0.0, 99.0)
% Register reservation with incorrect register type. -[pixel shader todo] +[pixel shader] sampler2D unused : register(t0); Texture2D tex;
@@ -96,7 +96,7 @@ float4 main() : sv_target
[test] -todo draw quad +draw quad probe all rgba (0.0, 0.0, 0.0, 99.0)
[pixel shader]
This merge request was approved by Zebediah Figura.
This merge request was closed by Giovanni Mascellani.
Merged through !244, closing.