Module: vkd3d Branch: master Commit: e0a801e796c8c524890795dbebf804df3318e382 URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/e0a801e796c8c524890795dbebf804...
Author: Francisco Casas fcasas@codeweavers.com Date: Mon May 6 23:37:31 2024 -0400
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 | 51 +++++++++++++++++++++++----------------- tests/hlsl/ternary.shader_test | 2 +- 2 files changed, 31 insertions(+), 22 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; - - 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, deref, regset, &index)) + return;
- if (!hlsl_regset_index_from_deref(ctx, &load->resource, regset, &index)) - return false; + if (regset <= HLSL_REGSET_LAST_OBJECT) + { + var->objects_usage[regset][index].used = true; + var->bind_count[regset] = max(var->bind_count[regset], index + 1); + } +}
- var->objects_usage[regset][index].used = true; - var->bind_count[regset] = max(var->bind_count[regset], index + 1); - if (load->sampler.var) +static bool track_object_components_usage(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, void *context) +{ + switch (instr->type) { - var = load->sampler.var; - if (!hlsl_regset_index_from_deref(ctx, &load->sampler, HLSL_REGSET_SAMPLERS, &index)) - return false; + 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;
- var->objects_usage[HLSL_REGSET_SAMPLERS][index].used = true; - var->bind_count[HLSL_REGSET_SAMPLERS] = max(var->bind_count[HLSL_REGSET_SAMPLERS], index + 1); + 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