Mesa (main): gallium: handle automatic 8bit -> 16bit index buffer rewrites

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 23 03:52:35 UTC 2021


Module: Mesa
Branch: main
Commit: c8e674d4e391a517103b0da6480f1fe0a7c36a11
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c8e674d4e391a517103b0da6480f1fe0a7c36a11

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri May 21 07:09:43 2021 -0400

gallium: handle automatic 8bit -> 16bit index buffer rewrites

this is based on PIPE_FORMAT_R8_UINT format support

Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Reviewed-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10973>

---

 src/gallium/auxiliary/util/u_vbuf.c | 11 ++++++++---
 src/gallium/auxiliary/util/u_vbuf.h |  1 +
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_vbuf.c b/src/gallium/auxiliary/util/u_vbuf.c
index 2d00c16c5e9..afb6db5c668 100644
--- a/src/gallium/auxiliary/util/u_vbuf.c
+++ b/src/gallium/auxiliary/util/u_vbuf.c
@@ -311,6 +311,9 @@ void u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps,
       caps->fallback_always |= caps->rewrite_restart_index;
    }
 
+   if (!screen->is_format_supported(screen, PIPE_FORMAT_R8_UINT, PIPE_BUFFER, 0, 0, PIPE_BIND_INDEX_BUFFER))
+      caps->fallback_always = caps->rewrite_ubyte_ibs = true;
+
    /* OpenGL 2.0 requires a minimum of 16 vertex buffers */
    if (caps->max_vertex_buffers < 16)
       caps->fallback_always = true;
@@ -331,7 +334,7 @@ u_vbuf_create(struct pipe_context *pipe, struct u_vbuf_caps *caps)
 
    mgr->caps = *caps;
    mgr->pipe = pipe;
-   if (caps->rewrite_restart_index) {
+   if (caps->rewrite_ubyte_ibs || caps->rewrite_restart_index) {
       struct primconvert_config cfg;
       cfg.fixed_prim_restart = caps->rewrite_restart_index;
       cfg.primtypes_mask = 0xff;
@@ -1381,6 +1384,7 @@ void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info,
    if (!incompatible_vb_mask &&
        !mgr->ve->incompatible_elem_mask &&
        !user_vb_mask &&
+       (info->index_size != 1 || !mgr->caps.rewrite_ubyte_ibs) &&
        (!info->primitive_restart ||
         info->restart_index == fixed_restart_index ||
         !mgr->caps.rewrite_restart_index)) {
@@ -1662,8 +1666,9 @@ void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info,
    if (mgr->dirty_real_vb_mask)
       u_vbuf_set_driver_vertex_buffers(mgr);
 
-   if (new_info.primitive_restart &&
-       (new_info.restart_index != fixed_restart_index && mgr->caps.rewrite_restart_index)) {
+   if ((new_info.index_size == 1 && mgr->caps.rewrite_ubyte_ibs) ||
+       (new_info.primitive_restart &&
+        (new_info.restart_index != fixed_restart_index && mgr->caps.rewrite_restart_index))) {
       util_primconvert_save_flatshade_first(mgr->pc, mgr->flatshade_first);
       util_primconvert_draw_vbo(mgr->pc, &new_info, drawid_offset, indirect, &new_draw, 1);
    } else
diff --git a/src/gallium/auxiliary/util/u_vbuf.h b/src/gallium/auxiliary/util/u_vbuf.h
index a7360be3fc9..b4a96dc38ce 100644
--- a/src/gallium/auxiliary/util/u_vbuf.h
+++ b/src/gallium/auxiliary/util/u_vbuf.h
@@ -59,6 +59,7 @@ struct u_vbuf_caps {
 
    bool fallback_always;
    bool fallback_only_for_user_vbuffers;
+   bool rewrite_ubyte_ibs;
    bool rewrite_restart_index;
 };
 



More information about the mesa-commit mailing list