mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
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.
This commit is contained in:
parent
657e460d11
commit
e0a801e796
Notes:
Alexandre Julliard
2024-05-13 22:57:39 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Elizabeth Figura (@zfigura) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/851
@ -4248,34 +4248,38 @@ static bool track_object_components_sampler_dim(struct hlsl_ctx *ctx, struct hls
|
|||||||
return false;
|
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 = deref->var;
|
||||||
struct hlsl_ir_var *var;
|
enum hlsl_regset regset = hlsl_deref_get_regset(ctx, deref);
|
||||||
enum hlsl_regset regset;
|
|
||||||
unsigned int index;
|
unsigned int index;
|
||||||
|
|
||||||
if (instr->type != HLSL_IR_RESOURCE_LOAD)
|
if (!hlsl_regset_index_from_deref(ctx, deref, regset, &index))
|
||||||
return false;
|
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;
|
|
||||||
|
|
||||||
|
if (regset <= HLSL_REGSET_LAST_OBJECT)
|
||||||
|
{
|
||||||
var->objects_usage[regset][index].used = true;
|
var->objects_usage[regset][index].used = true;
|
||||||
var->bind_count[regset] = max(var->bind_count[regset], index + 1);
|
var->bind_count[regset] = max(var->bind_count[regset], index + 1);
|
||||||
if (load->sampler.var)
|
}
|
||||||
{
|
}
|
||||||
var = load->sampler.var;
|
|
||||||
if (!hlsl_regset_index_from_deref(ctx, &load->sampler, HLSL_REGSET_SAMPLERS, &index))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
var->objects_usage[HLSL_REGSET_SAMPLERS][index].used = true;
|
static bool track_object_components_usage(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, void *context)
|
||||||
var->bind_count[HLSL_REGSET_SAMPLERS] = max(var->bind_count[HLSL_REGSET_SAMPLERS], index + 1);
|
{
|
||||||
|
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;
|
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);
|
hlsl_transform_ir(ctx, track_object_components_sampler_dim, body, NULL);
|
||||||
if (profile->major_version >= 4)
|
if (profile->major_version >= 4)
|
||||||
hlsl_transform_ir(ctx, lower_combined_samples, body, NULL);
|
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);
|
hlsl_transform_ir(ctx, track_object_components_usage, body, NULL);
|
||||||
sort_synthetic_separated_samplers_first(ctx);
|
sort_synthetic_separated_samplers_first(ctx);
|
||||||
|
|
||||||
|
@ -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.
|
% Objects can be used, but their types have to be identical.
|
||||||
|
|
||||||
[pixel shader todo(sm<4)]
|
[pixel shader]
|
||||||
Texture2D t;
|
Texture2D t;
|
||||||
|
|
||||||
float4 main() : sv_target
|
float4 main() : sv_target
|
||||||
|
Loading…
Reference in New Issue
Block a user