Module: vkd3d Branch: master Commit: b01104e47dbc9466c3fc79bf3ae4284a83190de9 URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=b01104e47dbc9466c3fc79bf...
Author: Conor McCarthy cmccarthy@codeweavers.com Date: Sat Jul 24 00:26:01 2021 +1000
vkd3d-shader: Compute XfbOffset for the slot of the specified element.
Fixes NVIDIA HairWorks GPU crash on Metro Exodus, and test failures in test_line_tessellation(). Based on a vkd3d-proton patch by Hans-Kristian Arntzen.
Signed-off-by: Conor McCarthy cmccarthy@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
libs/vkd3d-shader/spirv.c | 6 ++++-- tests/d3d12.c | 2 -- 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 8d5fd73..0407f50 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -4136,13 +4136,15 @@ static void vkd3d_dxbc_compiler_decorate_xfb_output(struct vkd3d_dxbc_compiler * xfb_element = e; break; } - - offset += 4 * e->component_count; }
if (!xfb_element) return;
+ for (i = 0; xfb_element != &xfb_info->elements[i]; ++i) + if (xfb_info->elements[i].output_slot == xfb_element->output_slot) + offset += 4 * xfb_info->elements[i].component_count; + if (xfb_element->component_index || xfb_element->component_count > component_count) { FIXME("Unhandled component range %u, %u.\n", xfb_element->component_index, xfb_element->component_count); diff --git a/tests/d3d12.c b/tests/d3d12.c index 6fd4f67..993acf4 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -28503,13 +28503,11 @@ static void test_line_tessellation(void) data = get_readback_data(&rb, i + 2048 / (2 * sizeof(*data)), 0, 0, 2 * sizeof(*data)); expected = &expected_data[3 * i + 1]; bug_if(is_nvidia_device(context.device)) - todo_if(i != 6) ok(compare_vec4(data, expected, 1), "Got color {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e} at %u.\n", data->x, data->y, data->z, data->w, expected->x, expected->y, expected->z, expected->w, i); ++data; expected = &expected_data[3 * i + 2]; - todo ok(compare_vec4(data, expected, 1), "Got primitive ID {%.8e, %.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e, %.8e} at %u.\n", data->x, data->y, data->z, data->w, expected->x, expected->y, expected->z, expected->w, i);