vkd3d-shader/ir: Set merged signature element interpolation mode only from used elements.

This commit is contained in:
Conor McCarthy 2024-01-08 13:52:46 +10:00 committed by Alexandre Julliard
parent 759362b527
commit 83851133c5
Notes: Alexandre Julliard 2024-01-18 23:20:00 +01:00
Approved-by: Henri Verbeet (@hverbeet)
Approved-by: Alexandre Julliard (@julliard)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/536
2 changed files with 13 additions and 1 deletions

View File

@ -840,6 +840,7 @@ static bool shader_signature_merge(struct shader_signature *s, uint8_t range_map
unsigned int i, j, element_count, new_count, register_count;
struct signature_element *elements;
struct signature_element *e, *f;
bool used;
element_count = s->element_count;
if (!(elements = vkd3d_malloc(element_count * sizeof(*elements))))
@ -860,6 +861,8 @@ static bool shader_signature_merge(struct shader_signature *s, uint8_t range_map
if (range_map_get_register_count(range_map, e->register_index, e->mask) > 1)
continue;
used = e->used_mask;
for (; j < element_count; ++j)
{
f = &elements[j];
@ -877,6 +880,16 @@ static bool shader_signature_merge(struct shader_signature *s, uint8_t range_map
e->mask |= f->mask;
e->used_mask |= f->used_mask;
e->semantic_index = min(e->semantic_index, f->semantic_index);
/* The first element may have no interpolation mode if it is unused. Elements which
* actually have different interpolation modes are assigned different registers. */
if (f->used_mask && !used)
{
if (e->interpolation_mode && e->interpolation_mode != f->interpolation_mode)
FIXME("Mismatching interpolation modes %u and %u.\n", e->interpolation_mode, f->interpolation_mode);
else
e->interpolation_mode = f->interpolation_mode;
}
}
}
element_count = new_count;

View File

@ -37943,7 +37943,6 @@ static void test_unused_interpolated_input(void)
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
get_resource_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
todo
check_readback_data_uint(&rb.rb, &box, 0xff00ff00, 0);
release_resource_readback(&rb);