From: Conor McCarthy cmccarthy@codeweavers.com
--- libs/vkd3d-shader/ir.c | 13 +++++++++++++ tests/d3d12.c | 1 - 2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index a76e7d274..b7d5c6fe4 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -756,6 +756,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)))) @@ -776,6 +777,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]; @@ -793,6 +796,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; diff --git a/tests/d3d12.c b/tests/d3d12.c index 1a77a9f9c..667406956 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -37611,7 +37611,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);