Module: Mesa Branch: main Commit: 3c2d7cb0d6f2fb5315d6899aff1a48d009fe51fe URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3c2d7cb0d6f2fb5315d6899aff1a48d009fe51fe
Author: Boris Brezillon <[email protected]> Date: Mon Sep 20 13:51:10 2021 +0200 panfrost: Fix collision in the indirect draw shader table Min/max index search shaders are different for the !primitive_restart and primitive_restart. We need to add entries for the primitive restart cases otherwise we might retrieve a wrong shader from the cache. Signed-off-by: Boris Brezillon <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12589> --- src/gallium/drivers/panfrost/ci/deqp-panfrost-g52-fails.txt | 1 - src/panfrost/lib/pan_device.h | 3 +++ src/panfrost/lib/pan_indirect_draw.c | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/panfrost/ci/deqp-panfrost-g52-fails.txt b/src/gallium/drivers/panfrost/ci/deqp-panfrost-g52-fails.txt index c9c0d68cf06..a491e4c562d 100644 --- a/src/gallium/drivers/panfrost/ci/deqp-panfrost-g52-fails.txt +++ b/src/gallium/drivers/panfrost/ci/deqp-panfrost-g52-fails.txt @@ -1,5 +1,4 @@ # The shader assisted indirect draw path is buggy. The shader assisted indirect # draw path is disabled outside of CI due to these conformance issues. -KHR-GLES31.core.draw_indirect.advanced-primitiveRestart-elements,Fail KHR-GLES31.core.draw_indirect.advanced-twoPass-transformFeedback-arrays,Fail KHR-GLES31.core.draw_indirect.advanced-twoPass-transformFeedback-elements,Fail diff --git a/src/panfrost/lib/pan_device.h b/src/panfrost/lib/pan_device.h index fbaa8cc4252..df6661151a9 100644 --- a/src/panfrost/lib/pan_device.h +++ b/src/panfrost/lib/pan_device.h @@ -93,6 +93,9 @@ enum pan_indirect_draw_flags { PAN_INDIRECT_DRAW_MIN_MAX_SEARCH_1B_INDEX = PAN_INDIRECT_DRAW_LAST_FLAG << 1, PAN_INDIRECT_DRAW_MIN_MAX_SEARCH_2B_INDEX, PAN_INDIRECT_DRAW_MIN_MAX_SEARCH_4B_INDEX, + PAN_INDIRECT_DRAW_MIN_MAX_SEARCH_1B_INDEX_PRIM_RESTART, + PAN_INDIRECT_DRAW_MIN_MAX_SEARCH_2B_INDEX_PRIM_RESTART, + PAN_INDIRECT_DRAW_MIN_MAX_SEARCH_3B_INDEX_PRIM_RESTART, PAN_INDIRECT_DRAW_NUM_SHADERS, }; diff --git a/src/panfrost/lib/pan_indirect_draw.c b/src/panfrost/lib/pan_indirect_draw.c index cd99ad4a2b1..c2427463e51 100644 --- a/src/panfrost/lib/pan_indirect_draw.c +++ b/src/panfrost/lib/pan_indirect_draw.c @@ -1076,7 +1076,9 @@ get_shader_id(unsigned flags, unsigned index_size, bool index_min_max_search) return flags; } - return PAN_INDIRECT_DRAW_MIN_MAX_SEARCH_1B_INDEX + + return ((flags & PAN_INDIRECT_DRAW_PRIMITIVE_RESTART) ? + PAN_INDIRECT_DRAW_MIN_MAX_SEARCH_1B_INDEX_PRIM_RESTART : + PAN_INDIRECT_DRAW_MIN_MAX_SEARCH_1B_INDEX) + util_logbase2(index_size); }
