radv/gfx10: fix the out-of-bounds check for vertex descriptors
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 18 Dec 2019 12:29:39 +0000 (13:29 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 19 Dec 2019 14:15:30 +0000 (15:15 +0100)
When stride is 0, it should check against the offset not the index.

This fixes black character models with Beat Saber and missing snow
with Dragon Quest.

Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/2233
Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/1975
Cc: <mesa-stable@lists.freedesktop.org>
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3147>

src/amd/vulkan/radv_cmd_buffer.c

index 0c62eacf05cb8deb884125a07f8b08587a3dd1eb..1a7d59bc0539e89d57d4d98bf33c3a1cd93cafdb 100644 (file)
@@ -2415,8 +2415,12 @@ radv_flush_vertex_descriptors(struct radv_cmd_buffer *cmd_buffer,
                                  S_008F0C_DST_SEL_W(V_008F0C_SQ_SEL_W);
 
                        if (cmd_buffer->device->physical_device->rad_info.chip_class >= GFX10) {
+                               /* OOB_SELECT chooses the out-of-bounds check:
+                                * - 1: index >= NUM_RECORDS (Structured)
+                                * - 3: offset >= NUM_RECORDS (Raw)
+                                */
                                desc[3] |= S_008F0C_FORMAT(V_008F0C_IMG_FORMAT_32_UINT) |
-                                          S_008F0C_OOB_SELECT(1) |
+                                          S_008F0C_OOB_SELECT(stride ? 1 : 3) |
                                           S_008F0C_RESOURCE_LEVEL(1);
                        } else {
                                desc[3] |= S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_UINT) |