mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
vkd3d-shader/hlsl: Also call dce before lowering deref paths.
This commit is contained in:
parent
d1e16514d0
commit
4dedcc5885
Notes:
Alexandre Julliard
2024-04-11 17:02:42 -05:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Zebediah Figura (@zfigura) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/739
@ -3834,6 +3834,22 @@ static void allocate_register_reservations(struct hlsl_ctx *ctx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void deref_mark_last_read(struct hlsl_deref *deref, unsigned int last_read)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
if (hlsl_deref_is_lowered(deref))
|
||||||
|
{
|
||||||
|
if (deref->rel_offset.node)
|
||||||
|
deref->rel_offset.node->last_read = last_read;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (i = 0; i < deref->path_len; ++i)
|
||||||
|
deref->path[i].node->last_read = last_read;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Compute the earliest and latest liveness for each variable. In the case that
|
/* Compute the earliest and latest liveness for each variable. In the case that
|
||||||
* a variable is accessed inside of a loop, we promote its liveness to extend
|
* a variable is accessed inside of a loop, we promote its liveness to extend
|
||||||
* to at least the range of the entire loop. We also do this for nodes, so that
|
* to at least the range of the entire loop. We also do this for nodes, so that
|
||||||
@ -3862,8 +3878,7 @@ static void compute_liveness_recurse(struct hlsl_block *block, unsigned int loop
|
|||||||
if (!var->first_write)
|
if (!var->first_write)
|
||||||
var->first_write = loop_first ? min(instr->index, loop_first) : instr->index;
|
var->first_write = loop_first ? min(instr->index, loop_first) : instr->index;
|
||||||
store->rhs.node->last_read = last_read;
|
store->rhs.node->last_read = last_read;
|
||||||
if (store->lhs.rel_offset.node)
|
deref_mark_last_read(&store->lhs, last_read);
|
||||||
store->lhs.rel_offset.node->last_read = last_read;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case HLSL_IR_EXPR:
|
case HLSL_IR_EXPR:
|
||||||
@ -3890,8 +3905,7 @@ static void compute_liveness_recurse(struct hlsl_block *block, unsigned int loop
|
|||||||
|
|
||||||
var = load->src.var;
|
var = load->src.var;
|
||||||
var->last_read = max(var->last_read, last_read);
|
var->last_read = max(var->last_read, last_read);
|
||||||
if (load->src.rel_offset.node)
|
deref_mark_last_read(&load->src, last_read);
|
||||||
load->src.rel_offset.node->last_read = last_read;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case HLSL_IR_LOOP:
|
case HLSL_IR_LOOP:
|
||||||
@ -3908,14 +3922,12 @@ static void compute_liveness_recurse(struct hlsl_block *block, unsigned int loop
|
|||||||
|
|
||||||
var = load->resource.var;
|
var = load->resource.var;
|
||||||
var->last_read = max(var->last_read, last_read);
|
var->last_read = max(var->last_read, last_read);
|
||||||
if (load->resource.rel_offset.node)
|
deref_mark_last_read(&load->resource, last_read);
|
||||||
load->resource.rel_offset.node->last_read = last_read;
|
|
||||||
|
|
||||||
if ((var = load->sampler.var))
|
if ((var = load->sampler.var))
|
||||||
{
|
{
|
||||||
var->last_read = max(var->last_read, last_read);
|
var->last_read = max(var->last_read, last_read);
|
||||||
if (load->sampler.rel_offset.node)
|
deref_mark_last_read(&load->sampler, last_read);
|
||||||
load->sampler.rel_offset.node->last_read = last_read;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (load->coords.node)
|
if (load->coords.node)
|
||||||
@ -3940,8 +3952,7 @@ static void compute_liveness_recurse(struct hlsl_block *block, unsigned int loop
|
|||||||
|
|
||||||
var = store->resource.var;
|
var = store->resource.var;
|
||||||
var->last_read = max(var->last_read, last_read);
|
var->last_read = max(var->last_read, last_read);
|
||||||
if (store->resource.rel_offset.node)
|
deref_mark_last_read(&store->resource, last_read);
|
||||||
store->resource.rel_offset.node->last_read = last_read;
|
|
||||||
store->coords.node->last_read = last_read;
|
store->coords.node->last_read = last_read;
|
||||||
store->value.node->last_read = last_read;
|
store->value.node->last_read = last_read;
|
||||||
break;
|
break;
|
||||||
@ -5450,6 +5461,10 @@ int hlsl_emit_bytecode(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry
|
|||||||
|
|
||||||
lower_ir(ctx, validate_nonconstant_vector_store_derefs, body);
|
lower_ir(ctx, validate_nonconstant_vector_store_derefs, body);
|
||||||
|
|
||||||
|
do
|
||||||
|
compute_liveness(ctx, entry_func);
|
||||||
|
while (hlsl_transform_ir(ctx, dce, body, NULL));
|
||||||
|
|
||||||
/* TODO: move forward, remove when no longer needed */
|
/* TODO: move forward, remove when no longer needed */
|
||||||
transform_derefs(ctx, replace_deref_path_with_offset, body);
|
transform_derefs(ctx, replace_deref_path_with_offset, body);
|
||||||
while (hlsl_transform_ir(ctx, hlsl_fold_constant_exprs, body, NULL));
|
while (hlsl_transform_ir(ctx, hlsl_fold_constant_exprs, body, NULL));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user