Mesa (master): mesa: don't unroll glMultiDrawElements with user indices for gallium

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Mar 11 19:27:49 UTC 2020


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

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Wed Feb 12 17:49:45 2020 -0500

mesa: don't unroll glMultiDrawElements with user indices for gallium

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3591>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3591>

---

 src/mesa/main/draw.c                   | 18 ++++++++++++------
 src/mesa/main/mtypes.h                 |  3 +++
 src/mesa/state_tracker/st_extensions.c |  3 +++
 3 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c
index c77bbade008..e856d9c5ef3 100644
--- a/src/mesa/main/draw.c
+++ b/src/mesa/main/draw.c
@@ -1216,12 +1216,18 @@ _mesa_validated_multidrawelements(struct gl_context *ctx, GLenum mode,
       }
    }
 
-   /* If the index buffer isn't in a VBO, then treating the application's
-    * subranges of the index buffer as one large index buffer may lead to
-    * us reading unmapped memory.
-    */
-   if (!_mesa_is_bufferobj(ctx->Array.VAO->IndexBufferObj))
-      fallback = GL_TRUE;
+   if (ctx->Const.MultiDrawWithUserIndices) {
+      /* Check whether prim[i].start would overflow. */
+      if (((max_index_ptr - min_index_ptr) >> ib.index_size_shift) > UINT_MAX)
+         fallback = GL_TRUE;
+   } else {
+      /* If the index buffer isn't in a VBO, then treating the application's
+       * subranges of the index buffer as one large index buffer may lead to
+       * us reading unmapped memory.
+       */
+      if (!_mesa_is_bufferobj(ctx->Array.VAO->IndexBufferObj))
+         fallback = GL_TRUE;
+   }
 
    if (!fallback) {
       struct _mesa_prim *prim;
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 7396de5b5d0..c7889668f58 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -4172,6 +4172,9 @@ struct gl_constants
    /** Whether the vertex buffer offset is a signed 32-bit integer. */
    bool VertexBufferOffsetIsInt32;
 
+   /** Whether the driver can handle MultiDrawElements with non-VBO indices. */
+   bool MultiDrawWithUserIndices;
+
    /** GL_ARB_gl_spirv */
    struct spirv_supported_capabilities SpirVCapabilities;
 
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index 7b44c1b4b50..b26d3904b8f 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -569,6 +569,9 @@ void st_init_limits(struct pipe_screen *screen,
 
    c->VertexBufferOffsetIsInt32 =
       screen->get_param(screen, PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET);
+
+   c->MultiDrawWithUserIndices =
+      screen->get_param(screen, PIPE_CAP_DRAW_INFO_START_WITH_USER_INDICES);
 }
 
 



More information about the mesa-commit mailing list