[PATCH vkd3d v2] vkd3d-shader: Compute XfbOffset for the slot of the specified element.

Conor McCarthy cmccarthy at codeweavers.com
Fri Jul 23 09:26:01 CDT 2021


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 at codeweavers.com>
---
 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 33e664cf..229f8662 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -4088,13 +4088,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 3a1a72a8..1d57012c 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -28505,13 +28505,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);
-- 
2.32.0




More information about the wine-devel mailing list