vkd3d-shader/hlsl: Fix number of components when creating a swizzle in copy-prop.

Otherwise we may create nodes of different dimensions than the ones we
are replacing.

"count" is the number of components of the source deref (without
considering the swizzle), while "instr_component_count" is the actual
number of components of the instruction to be replaced.
This commit is contained in:
Francisco Casas 2023-02-14 19:01:18 -03:00 committed by Alexandre Julliard
parent e7bc634307
commit 2142d31f13
Notes: Alexandre Julliard 2023-02-20 22:45:02 +01: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/96
2 changed files with 4 additions and 1 deletions

View File

@ -2306,6 +2306,9 @@ void hlsl_replace_node(struct hlsl_ir_node *old, struct hlsl_ir_node *new)
{ {
struct hlsl_src *src, *next; struct hlsl_src *src, *next;
assert(old->data_type->dimx == new->data_type->dimx);
assert(old->data_type->dimy == new->data_type->dimy);
LIST_FOR_EACH_ENTRY_SAFE(src, next, &old->uses, struct hlsl_src, entry) LIST_FOR_EACH_ENTRY_SAFE(src, next, &old->uses, struct hlsl_src, entry)
{ {
hlsl_src_remove(src); hlsl_src_remove(src);

View File

@ -1031,7 +1031,7 @@ static bool copy_propagation_replace_with_single_instr(struct hlsl_ctx *ctx,
{ {
struct hlsl_ir_swizzle *swizzle_node; struct hlsl_ir_swizzle *swizzle_node;
if (!(swizzle_node = hlsl_new_swizzle(ctx, ret_swizzle, count, new_instr, &instr->loc))) if (!(swizzle_node = hlsl_new_swizzle(ctx, ret_swizzle, instr_component_count, new_instr, &instr->loc)))
return false; return false;
list_add_before(&instr->entry, &swizzle_node->node.entry); list_add_before(&instr->entry, &swizzle_node->node.entry);
new_instr = &swizzle_node->node; new_instr = &swizzle_node->node;