mesa: clean up st_indirect_draw_vbo interface and callers
authorMarek Olšák <marek.olsak@amd.com>
Sun, 14 Aug 2022 04:57:11 +0000 (00:57 -0400)
committerMarge Bot <emma+marge@anholt.net>
Mon, 26 Sep 2022 22:58:16 +0000 (22:58 +0000)
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18828>

src/mesa/main/dd.h
src/mesa/main/draw.c
src/mesa/state_tracker/st_draw.c
src/mesa/state_tracker/st_draw.h

index 37e37b7..8806e1a 100644 (file)
@@ -65,7 +65,6 @@ struct gl_transform_feedback_object;
 struct gl_vertex_array_object;
 struct ati_fragment_shader;
 struct util_queue_monitoring;
-struct _mesa_index_buffer;
 struct pipe_draw_info;
 struct pipe_draw_start_count_bias;
 struct pipe_vertex_state;
index 62646fc..3f86e65 100644 (file)
@@ -2217,56 +2217,6 @@ _mesa_DrawTransformFeedbackStreamInstanced(GLenum mode, GLuint name,
 }
 
 
-static void
-_mesa_validated_multidrawarraysindirect(struct gl_context *ctx, GLenum mode,
-                                        GLintptr indirect,
-                                        GLintptr drawcount_offset,
-                                        GLsizei drawcount, GLsizei stride,
-                                        struct gl_buffer_object *drawcount_buffer)
-{
-   /* If drawcount_buffer is set, drawcount is the maximum draw count.*/
-   if (drawcount == 0)
-      return;
-
-   st_indirect_draw_vbo(ctx, mode, ctx->DrawIndirectBuffer, indirect,
-                        drawcount, stride, drawcount_buffer,
-                        drawcount_offset, NULL, false, 0);
-
-   if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
-      _mesa_flush(ctx);
-}
-
-
-static void
-_mesa_validated_multidrawelementsindirect(struct gl_context *ctx,
-                                          GLenum mode, GLenum type,
-                                          GLintptr indirect,
-                                          GLintptr drawcount_offset,
-                                          GLsizei drawcount, GLsizei stride,
-                                          struct gl_buffer_object *drawcount_buffer)
-{
-   /* If drawcount_buffer is set, drawcount is the maximum draw count.*/
-   if (drawcount == 0)
-      return;
-
-   /* NOTE: IndexBufferObj is guaranteed to be a VBO. */
-   struct _mesa_index_buffer ib;
-   ib.count = 0;                /* unknown */
-   ib.obj = ctx->Array.VAO->IndexBufferObj;
-   ib.ptr = NULL;
-   ib.index_size_shift = get_index_size_shift(type);
-
-   st_indirect_draw_vbo(ctx, mode, ctx->DrawIndirectBuffer, indirect,
-                        drawcount, stride, drawcount_buffer,
-                        drawcount_offset, &ib,
-                        ctx->Array._PrimitiveRestart[ib.index_size_shift],
-                        ctx->Array._RestartIndex[ib.index_size_shift]);
-
-   if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
-      _mesa_flush(ctx);
-}
-
-
 /**
  * Like [Multi]DrawArrays/Elements, but they take most arguments from
  * a buffer object.
@@ -2305,8 +2255,7 @@ _mesa_DrawArraysIndirect(GLenum mode, const GLvoid *indirect)
        !_mesa_validate_DrawArraysIndirect(ctx, mode, indirect))
       return;
 
-   _mesa_validated_multidrawarraysindirect(ctx, mode, (GLintptr)indirect,
-                                           0, 1, 16, NULL);
+   st_indirect_draw_vbo(ctx, mode, 0, (GLintptr)indirect, 0, 1, 16);
 }
 
 
@@ -2364,9 +2313,7 @@ _mesa_DrawElementsIndirect(GLenum mode, GLenum type, const GLvoid *indirect)
        !_mesa_validate_DrawElementsIndirect(ctx, mode, type, indirect))
       return;
 
-   _mesa_validated_multidrawelementsindirect(ctx, mode, type,
-                                             (GLintptr)indirect, 0,
-                                             1, 20, NULL);
+   st_indirect_draw_vbo(ctx, mode, type, (GLintptr)indirect, 0, 1, 20);
 }
 
 
@@ -2441,8 +2388,7 @@ _mesa_MultiDrawArraysIndirect(GLenum mode, const GLvoid *indirect,
                                                primcount, stride))
       return;
 
-   _mesa_validated_multidrawarraysindirect(ctx, mode, (GLintptr)indirect, 0,
-                                           primcount, stride, NULL);
+   st_indirect_draw_vbo(ctx, mode, 0, (GLintptr)indirect, 0, primcount, stride);
 }
 
 
@@ -2536,9 +2482,7 @@ _mesa_MultiDrawElementsIndirect(GLenum mode, GLenum type,
                                                  primcount, stride))
       return;
 
-   _mesa_validated_multidrawelementsindirect(ctx, mode, type,
-                                             (GLintptr)indirect, 0, primcount,
-                                             stride, NULL);
+   st_indirect_draw_vbo(ctx, mode, type, (GLintptr)indirect, 0, primcount, stride);
 }
 
 
@@ -2566,9 +2510,8 @@ _mesa_MultiDrawArraysIndirectCountARB(GLenum mode, GLintptr indirect,
                                                     maxdrawcount, stride))
       return;
 
-   _mesa_validated_multidrawarraysindirect(ctx, mode, indirect,
-                                           drawcount_offset, maxdrawcount,
-                                           stride, ctx->ParameterBuffer);
+   st_indirect_draw_vbo(ctx, mode, 0, (GLintptr)indirect, drawcount_offset,
+                        maxdrawcount, stride);
 }
 
 
@@ -2598,9 +2541,8 @@ _mesa_MultiDrawElementsIndirectCountARB(GLenum mode, GLenum type,
                                                       maxdrawcount, stride))
       return;
 
-   _mesa_validated_multidrawelementsindirect(ctx, mode, type, indirect,
-                                             drawcount_offset, maxdrawcount,
-                                             stride, ctx->ParameterBuffer);
+   st_indirect_draw_vbo(ctx, mode, type, (GLintptr)indirect, drawcount_offset,
+                        maxdrawcount, stride);
 }
 
 
index 1fbfc5c..848f04b 100644 (file)
@@ -35,7 +35,7 @@
  *   Keith Whitwell <keithw@vmware.com>
  */
 
-
+#include "main/context.h"
 #include "main/errors.h"
 
 #include "main/image.h"
@@ -234,22 +234,22 @@ rewrite_partial_stride_indirect(struct st_context *st,
 
 void
 st_indirect_draw_vbo(struct gl_context *ctx,
-                     GLuint mode,
-                     struct gl_buffer_object *indirect_data,
-                     GLsizeiptr indirect_offset,
-                     unsigned draw_count,
-                     unsigned stride,
-                     struct gl_buffer_object *indirect_draw_count,
-                     GLsizeiptr indirect_draw_count_offset,
-                     const struct _mesa_index_buffer *ib,
-                     bool primitive_restart,
-                     unsigned restart_index)
+                     GLenum mode, GLenum index_type,
+                     GLintptr indirect_offset,
+                     GLintptr indirect_draw_count_offset,
+                     GLsizei draw_count, GLsizei stride)
 {
+   struct gl_buffer_object *indirect_data = ctx->DrawIndirectBuffer;
+   struct gl_buffer_object *indirect_draw_count = ctx->ParameterBuffer;
    struct st_context *st = st_context(ctx);
    struct pipe_draw_info info;
    struct pipe_draw_indirect_info indirect;
    struct pipe_draw_start_count_bias draw = {0};
 
+   /* If indirect_draw_count is set, drawcount is the maximum draw count.*/
+   if (!draw_count)
+      return;
+
    assert(stride);
    prepare_draw(st, ctx, ST_PIPELINE_RENDER_STATE_MASK, ST_PIPELINE_RENDER);
 
@@ -257,18 +257,30 @@ st_indirect_draw_vbo(struct gl_context *ctx,
    util_draw_init_info(&info);
    info.max_index = ~0u; /* so that u_vbuf can tell that it's unknown */
 
-   if (ib) {
-      struct gl_buffer_object *bufobj = ib->obj;
+   switch (index_type) {
+   case GL_UNSIGNED_BYTE:
+      info.index_size = 1;
+      break;
+   case GL_UNSIGNED_SHORT:
+      info.index_size = 2;
+      break;
+   case GL_UNSIGNED_INT:
+      info.index_size = 4;
+      break;
+   }
+
+   if (info.index_size) {
+      struct gl_buffer_object *bufobj = ctx->Array.VAO->IndexBufferObj;
 
       /* indices are always in a real VBO */
       assert(bufobj);
 
-      info.index_size = 1 << ib->index_size_shift;
       info.index.resource = bufobj->buffer;
-      draw.start = pointer_to_offset(ib->ptr) >> ib->index_size_shift;
+      draw.start = 0;
 
-      info.restart_index = restart_index;
-      info.primitive_restart = primitive_restart;
+      unsigned index_size_shift = util_logbase2(info.index_size);
+      info.restart_index = ctx->Array._RestartIndex[index_size_shift];
+      info.primitive_restart = ctx->Array._PrimitiveRestart[index_size_shift];
    }
 
    info.mode = translate_prim(ctx, mode);
@@ -307,6 +319,9 @@ st_indirect_draw_vbo(struct gl_context *ctx,
       }
       cso_draw_vbo(st->cso_context, &info, 0, &indirect, draw);
    }
+
+   if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
+      _mesa_flush(ctx);
 }
 
 void
index 684d267..f7c279f 100644 (file)
@@ -36,7 +36,6 @@
 
 #include "main/glheader.h"
 
-struct _mesa_index_buffer;
 struct gl_context;
 struct st_context;
 
@@ -89,16 +88,10 @@ st_draw_transform_feedback(struct gl_context *ctx, GLenum mode,
 
 void
 st_indirect_draw_vbo(struct gl_context *ctx,
-                     GLuint mode,
-                     struct gl_buffer_object *indirect_data,
-                     GLsizeiptr indirect_offset,
-                     unsigned draw_count,
-                     unsigned stride,
-                     struct gl_buffer_object *indirect_draw_count,
-                     GLsizeiptr indirect_draw_count_offset,
-                     const struct _mesa_index_buffer *ib,
-                     bool primitive_restart,
-                     unsigned restart_index);
+                     GLenum mode, GLenum index_type,
+                     GLintptr indirect_offset,
+                     GLintptr indirect_draw_count_offset,
+                     GLsizei draw_count, GLsizei stride);
 
 bool
 st_draw_hw_select_prepare_common(struct gl_context *ctx);