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);
 }
 

Reply via email to