panfrost: Don't make get_index_buffer_bounded per-gen
authorAlyssa Rosenzweig <alyssa@collabora.com>
Mon, 12 Jul 2021 23:20:16 +0000 (19:20 -0400)
committerMarge Bot <eric+marge@anholt.net>
Fri, 23 Jul 2021 20:12:18 +0000 (20:12 +0000)
Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11851>

src/gallium/drivers/panfrost/pan_cmdstream.c
src/gallium/drivers/panfrost/pan_context.h
src/gallium/drivers/panfrost/pan_helpers.c

index c7505df..a7b3e6c 100644 (file)
@@ -81,67 +81,6 @@ panfrost_sample_pattern(unsigned samples)
         }
 }
 
-/* Gets a GPU address for the associated index buffer. Only gauranteed to be
- * good for the duration of the draw (transient), could last longer. Also get
- * the bounds on the index buffer for the range accessed by the draw. We do
- * these operations together because there are natural optimizations which
- * require them to be together. */
-
-static mali_ptr
-panfrost_get_index_buffer_bounded(struct panfrost_batch *batch,
-                                  const struct pipe_draw_info *info,
-                                  const struct pipe_draw_start_count_bias *draw,
-                                  unsigned *min_index, unsigned *max_index)
-{
-        struct panfrost_resource *rsrc = pan_resource(info->index.resource);
-        struct panfrost_context *ctx = batch->ctx;
-        off_t offset = draw->start * info->index_size;
-        bool needs_indices = true;
-        mali_ptr out = 0;
-
-        if (info->index_bounds_valid) {
-                *min_index = info->min_index;
-                *max_index = info->max_index;
-                needs_indices = false;
-        }
-
-        if (!info->has_user_indices) {
-                /* Only resources can be directly mapped */
-                panfrost_batch_read_rsrc(batch, rsrc, PIPE_SHADER_VERTEX);
-                out = rsrc->image.data.bo->ptr.gpu + offset;
-
-                /* Check the cache */
-                needs_indices = !panfrost_minmax_cache_get(rsrc->index_cache,
-                                                           draw->start,
-                                                           draw->count,
-                                                           min_index,
-                                                           max_index);
-        } else {
-                /* Otherwise, we need to upload to transient memory */
-                const uint8_t *ibuf8 = (const uint8_t *) info->index.user;
-                struct panfrost_ptr T =
-                        pan_pool_alloc_aligned(&batch->pool.base,
-                                               draw->count *
-                                               info->index_size,
-                                               info->index_size);
-
-                memcpy(T.cpu, ibuf8 + offset, draw->count * info->index_size);
-                out = T.gpu;
-        }
-
-        if (needs_indices) {
-                /* Fallback */
-                u_vbuf_get_minmax_index(&ctx->base, info, draw, min_index, max_index);
-
-                if (!info->has_user_indices)
-                        panfrost_minmax_cache_add(rsrc->index_cache,
-                                                  draw->start, draw->count,
-                                                  *min_index, *max_index);
-        }
-
-        return out;
-}
-
 static unsigned
 translate_tex_wrap(enum pipe_tex_wrap w, bool using_nearest)
 {
index a9f7963..8ed6696 100644 (file)
@@ -401,6 +401,12 @@ panfrost_shader_compile(struct pipe_screen *pscreen,
 void
 panfrost_analyze_sysvals(struct panfrost_shader_state *ss);
 
+mali_ptr
+panfrost_get_index_buffer_bounded(struct panfrost_batch *batch,
+                                  const struct pipe_draw_info *info,
+                                  const struct pipe_draw_start_count_bias *draw,
+                                  unsigned *min_index, unsigned *max_index);
+
 /* Instancing */
 
 mali_ptr
index ddd0b48..418f29d 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 #include "pan_context.h"
+#include "util/u_vbuf.h"
 
 void
 panfrost_analyze_sysvals(struct panfrost_shader_state *ss)
@@ -77,3 +78,66 @@ panfrost_analyze_sysvals(struct panfrost_shader_state *ss)
         ss->dirty_3d = dirty;
         ss->dirty_shader = dirty_shader;
 }
+
+/* Gets a GPU address for the associated index buffer. Only gauranteed to be
+ * good for the duration of the draw (transient), could last longer. Also get
+ * the bounds on the index buffer for the range accessed by the draw. We do
+ * these operations together because there are natural optimizations which
+ * require them to be together. */
+
+mali_ptr
+panfrost_get_index_buffer_bounded(struct panfrost_batch *batch,
+                                  const struct pipe_draw_info *info,
+                                  const struct pipe_draw_start_count_bias *draw,
+                                  unsigned *min_index, unsigned *max_index)
+{
+        struct panfrost_resource *rsrc = pan_resource(info->index.resource);
+        struct panfrost_context *ctx = batch->ctx;
+        off_t offset = draw->start * info->index_size;
+        bool needs_indices = true;
+        mali_ptr out = 0;
+
+        if (info->index_bounds_valid) {
+                *min_index = info->min_index;
+                *max_index = info->max_index;
+                needs_indices = false;
+        }
+
+        if (!info->has_user_indices) {
+                /* Only resources can be directly mapped */
+                panfrost_batch_read_rsrc(batch, rsrc, PIPE_SHADER_VERTEX);
+                out = rsrc->image.data.bo->ptr.gpu + offset;
+
+                /* Check the cache */
+                needs_indices = !panfrost_minmax_cache_get(rsrc->index_cache,
+                                                           draw->start,
+                                                           draw->count,
+                                                           min_index,
+                                                           max_index);
+        } else {
+                /* Otherwise, we need to upload to transient memory */
+                const uint8_t *ibuf8 = (const uint8_t *) info->index.user;
+                struct panfrost_ptr T =
+                        pan_pool_alloc_aligned(&batch->pool.base,
+                                               draw->count *
+                                               info->index_size,
+                                               info->index_size);
+
+                memcpy(T.cpu, ibuf8 + offset, draw->count * info->index_size);
+                out = T.gpu;
+        }
+
+        if (needs_indices) {
+                /* Fallback */
+                u_vbuf_get_minmax_index(&ctx->base, info, draw, min_index, max_index);
+
+                if (!info->has_user_indices)
+                        panfrost_minmax_cache_add(rsrc->index_cache,
+                                                  draw->start, draw->count,
+                                                  *min_index, *max_index);
+        }
+
+        return out;
+}
+
+