From b1d8915440698029e530d799bb1bc1588b2c265e Mon Sep 17 00:00:00 2001 From: Shaun Ren Date: Fri, 21 Mar 2025 17:39:42 -0400 Subject: [PATCH] vkd3d-shader/hlsl: Divert written uniform derefs to temps before copy-propagation passes. The following pixel shader currently triggers an infinite loop during copy propagation, which is fixed by this commit: sampler s; Texture2D t1, t2; float4 main() : sv_target { Texture2D t = t1; t1 = t2; t2 = t; return t1.Sample(s, float2(0, 0)) + t2.Sample(s, float2(0, 0)); } The infinite loop occurs because copy_propagation_transform_object_load() replaces t1 in the resource_load(t1, ...) instruction with t2, t1, t2, ... repeatedly. --- libs/vkd3d-shader/hlsl_codegen.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 20bd3b0d..770c09e3 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -12763,6 +12763,9 @@ static void process_entry_function(struct hlsl_ctx *ctx, hlsl_transform_ir(ctx, lower_resource_load_bias, body, NULL); } + compute_liveness(ctx, entry_func); + transform_derefs(ctx, divert_written_uniform_derefs_to_temp, &entry_func->body); + loop_unrolling_execute(ctx, body); hlsl_run_const_passes(ctx, body); @@ -12773,9 +12776,6 @@ static void process_entry_function(struct hlsl_ctx *ctx, lower_ir(ctx, lower_casts_to_bool, body); lower_ir(ctx, lower_int_dot, body); - compute_liveness(ctx, entry_func); - transform_derefs(ctx, divert_written_uniform_derefs_to_temp, &entry_func->body); - if (hlsl_version_lt(ctx, 4, 0)) hlsl_transform_ir(ctx, lower_separate_samples, body, NULL);