mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
vkd3d-shader/ir: Set merged signature element interpolation mode only from used elements.
This commit is contained in:
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
@@ -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;
|
unsigned int i, j, element_count, new_count, register_count;
|
||||||
struct signature_element *elements;
|
struct signature_element *elements;
|
||||||
struct signature_element *e, *f;
|
struct signature_element *e, *f;
|
||||||
|
bool used;
|
||||||
|
|
||||||
element_count = s->element_count;
|
element_count = s->element_count;
|
||||||
if (!(elements = vkd3d_malloc(element_count * sizeof(*elements))))
|
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)
|
if (range_map_get_register_count(range_map, e->register_index, e->mask) > 1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
used = e->used_mask;
|
||||||
|
|
||||||
for (; j < element_count; ++j)
|
for (; j < element_count; ++j)
|
||||||
{
|
{
|
||||||
f = &elements[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->mask |= f->mask;
|
||||||
e->used_mask |= f->used_mask;
|
e->used_mask |= f->used_mask;
|
||||||
e->semantic_index = min(e->semantic_index, f->semantic_index);
|
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;
|
element_count = new_count;
|
||||||
|
@@ -37943,7 +37943,6 @@ static void test_unused_interpolated_input(void)
|
|||||||
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
|
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
|
||||||
|
|
||||||
get_resource_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
|
get_resource_readback_with_command_list(context.render_target, 0, &rb, queue, command_list);
|
||||||
todo
|
|
||||||
check_readback_data_uint(&rb.rb, &box, 0xff00ff00, 0);
|
check_readback_data_uint(&rb.rb, &box, 0xff00ff00, 0);
|
||||||
release_resource_readback(&rb);
|
release_resource_readback(&rb);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user