From e0a801e796c8c524890795dbebf804df3318e382 Mon Sep 17 00:00:00 2001 From: Francisco Casas Date: Mon, 6 May 2024 23:37:31 -0400 Subject: [PATCH] vkd3d-shader/hlsl: Improve tracking of used components running DCE before. track_object_components_usage() had to be improved to also register derefs on resource stores. It was not doing it because it assumed that for every resource store there was a resource load already, which was true, before calling DCE. --- libs/vkd3d-shader/hlsl_codegen.c | 53 +++++++++++++++++++------------- tests/hlsl/ternary.shader_test | 2 +- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 4af55293..a05b8e3f 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -4248,34 +4248,38 @@ static bool track_object_components_sampler_dim(struct hlsl_ctx *ctx, struct hls return false; } -static bool track_object_components_usage(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, void *context) +static void register_deref_usage(struct hlsl_ctx *ctx, struct hlsl_deref *deref) { - struct hlsl_ir_resource_load *load; - struct hlsl_ir_var *var; - enum hlsl_regset regset; + struct hlsl_ir_var *var = deref->var; + enum hlsl_regset regset = hlsl_deref_get_regset(ctx, deref); unsigned int index; - if (instr->type != HLSL_IR_RESOURCE_LOAD) - return false; + if (!hlsl_regset_index_from_deref(ctx, deref, regset, &index)) + return; - load = hlsl_ir_resource_load(instr); - var = load->resource.var; - - regset = hlsl_deref_get_regset(ctx, &load->resource); - - if (!hlsl_regset_index_from_deref(ctx, &load->resource, regset, &index)) - return false; - - var->objects_usage[regset][index].used = true; - var->bind_count[regset] = max(var->bind_count[regset], index + 1); - if (load->sampler.var) + if (regset <= HLSL_REGSET_LAST_OBJECT) { - var = load->sampler.var; - if (!hlsl_regset_index_from_deref(ctx, &load->sampler, HLSL_REGSET_SAMPLERS, &index)) - return false; + var->objects_usage[regset][index].used = true; + var->bind_count[regset] = max(var->bind_count[regset], index + 1); + } +} - var->objects_usage[HLSL_REGSET_SAMPLERS][index].used = true; - var->bind_count[HLSL_REGSET_SAMPLERS] = max(var->bind_count[HLSL_REGSET_SAMPLERS], index + 1); +static bool track_object_components_usage(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, void *context) +{ + switch (instr->type) + { + case HLSL_IR_RESOURCE_LOAD: + register_deref_usage(ctx, &hlsl_ir_resource_load(instr)->resource); + if (hlsl_ir_resource_load(instr)->sampler.var) + register_deref_usage(ctx, &hlsl_ir_resource_load(instr)->sampler); + break; + + case HLSL_IR_RESOURCE_STORE: + register_deref_usage(ctx, &hlsl_ir_resource_store(instr)->resource); + break; + + default: + break; } return false; @@ -5440,6 +5444,11 @@ int hlsl_emit_bytecode(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry hlsl_transform_ir(ctx, track_object_components_sampler_dim, body, NULL); if (profile->major_version >= 4) hlsl_transform_ir(ctx, lower_combined_samples, body, NULL); + + do + compute_liveness(ctx, entry_func); + while (hlsl_transform_ir(ctx, dce, body, NULL)); + hlsl_transform_ir(ctx, track_object_components_usage, body, NULL); sort_synthetic_separated_samplers_first(ctx); diff --git a/tests/hlsl/ternary.shader_test b/tests/hlsl/ternary.shader_test index 0ac78914..bd68dbc3 100644 --- a/tests/hlsl/ternary.shader_test +++ b/tests/hlsl/ternary.shader_test @@ -318,7 +318,7 @@ probe all rgba (2.0, 3.0, 3.0, 2.0) % Objects can be used, but their types have to be identical. -[pixel shader todo(sm<4)] +[pixel shader] Texture2D t; float4 main() : sv_target