From 8567d0268267446a9daaf0a670fae76570d03655 Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Tue, 27 Feb 2024 17:59:18 +0100 Subject: [PATCH] tu: Update prim restart state when we switch from/to indexed draw Previously, if first draw call with wasn't indexed but pipeline had primitive restart enabled - primitive restart would be disabled for draw calls, even indexed, that follow. However, prim restart index works in non-indexed draw calls, but since we don't emit fresh PC_RESTART_INDEX for them - they may use stale value if prim restart is enabled for non-indexed draw calls. So we have track the switch between indexed and non-indexed draw calls and emit PC_PRIMITIVE_CNTL_0 for them. Fixes car rear window in Need for Speed: Most Wanted (2012) Signed-off-by: Danylo Piliaiev Part-of: --- src/freedreno/vulkan/tu_cmd_buffer.cc | 9 +++++++++ src/freedreno/vulkan/tu_cmd_buffer.h | 1 + 2 files changed, 10 insertions(+) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index ae2441a64a6..1dab0208b13 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -4904,6 +4904,15 @@ tu6_draw_common(struct tu_cmd_buffer *cmd, dynamic_draw_state_dirty = tu_emit_draw_state(cmd); } + /* Primitive restart value works in non-indexed draws, we have to disable + * prim restart for such draws since we may read stale restart index. + */ + if (cmd->state.last_draw_indexed != indexed) { + cmd->state.last_draw_indexed = indexed; + BITSET_SET(cmd->vk.dynamic_graphics_state.dirty, + MESA_VK_DYNAMIC_IA_PRIMITIVE_RESTART_ENABLE); + } + /* Fill draw stats for autotuner */ rp->drawcall_count++; diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h index 274239db7be..0b2f412ccbd 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h @@ -513,6 +513,7 @@ struct tu_cmd_state struct tu_draw_state lrz_and_depth_plane_state; struct tu_vs_params last_vs_params; + bool last_draw_indexed; struct tu_tess_params tess_params;