mesa: remove _mesa_draw_gallium_fallback by adapting st_feedback_draw_vbo
authorMarek Olšák <marek.olsak@amd.com>
Sun, 14 Aug 2022 04:21:30 +0000 (00:21 -0400)
committerMarge Bot <emma+marge@anholt.net>
Mon, 26 Sep 2022 22:58:16 +0000 (22:58 +0000)
This makes st_feedback_draw_vbo implement the DrawGallium.
That's the last users of the fallback functions.

Acked-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/draw.c
src/mesa/main/draw.h
src/mesa/state_tracker/st_cb_feedback.c
src/mesa/state_tracker/st_cb_rasterpos.c
src/mesa/state_tracker/st_draw.h
src/mesa/state_tracker/st_draw_feedback.c

index 62b002e..82277b4 100644 (file)
@@ -963,152 +963,6 @@ get_temp_prims(struct gl_context *ctx, unsigned primcount)
    }
    return ctx->tmp_prims;
 }
-
-/**
- * Called via Driver.DrawGallium. This is a fallback invoking Driver.Draw.
- */
-void
-_mesa_draw_gallium_fallback(struct gl_context *ctx,
-                            struct pipe_draw_info *info,
-                            unsigned drawid_offset,
-                            const struct pipe_draw_start_count_bias *draws,
-                            unsigned num_draws)
-{
-   struct _mesa_index_buffer ib;
-   unsigned index_size = info->index_size;
-   unsigned min_index = 0, max_index = ~0u;
-   bool index_bounds_valid = false;
-
-   if (!info->instance_count)
-      return;
-
-   if (index_size) {
-      if (info->index_bounds_valid) {
-         min_index = info->min_index;
-         max_index = info->max_index;
-         index_bounds_valid = true;
-      }
-   } else {
-      /* The index_bounds_valid field and min/max_index are not used for
-       * non-indexed draw calls (they are undefined), but classic drivers
-       * need the index bounds. They will be computed manually.
-       */
-      index_bounds_valid = true;
-   }
-
-   ib.index_size_shift = util_logbase2(index_size);
-
-   /* Single draw or a fallback for user indices. */
-   if (num_draws == 1) {
-      if (!draws[0].count)
-         return;
-
-      if (index_size) {
-         ib.count = draws[0].count;
-
-         if (info->has_user_indices) {
-            ib.obj = NULL;
-            ib.ptr = (const char*)info->index.user;
-         } else {
-            ib.obj = info->index.gl_bo;
-            ib.ptr = NULL;
-         }
-      }
-
-      struct _mesa_prim prim;
-      prim.mode = info->mode;
-      prim.begin = 1;
-      prim.end = 1;
-      prim.start = draws[0].start;
-      prim.count = draws[0].count;
-      prim.basevertex = index_size ? draws[0].index_bias : 0;
-      prim.draw_id = drawid_offset;
-
-      if (!index_size) {
-         min_index = draws[0].start;
-         max_index = draws[0].start + draws[0].count - 1;
-      }
-
-      st_feedback_draw_vbo(ctx, &prim, 1, index_size ? &ib : NULL,
-                           index_bounds_valid, info->primitive_restart,
-                           info->restart_index, min_index, max_index,
-                           info->instance_count, info->start_instance);
-      return;
-   }
-
-   struct _mesa_prim *prim = get_temp_prims(ctx, num_draws);
-   if (!prim)
-      return;
-
-   unsigned max_count = 0;
-   unsigned num_prims = 0;
-
-   min_index = ~0u;
-   max_index = 0;
-
-   for (unsigned i = 0; i < num_draws; i++) {
-      if (!draws[i].count)
-         continue;
-
-      prim[num_prims].mode = info->mode;
-      prim[num_prims].begin = 1;
-      prim[num_prims].end = 1;
-      prim[num_prims].start = draws[i].start;
-      prim[num_prims].count = draws[i].count;
-      prim[num_prims].basevertex = info->index_size ? draws[i].index_bias : 0;
-      prim[num_prims].draw_id = drawid_offset + (info->increment_draw_id ? i : 0);
-
-      if (!index_size) {
-         min_index = MIN2(min_index, draws[i].start);
-         max_index = MAX2(max_index, draws[i].start + draws[i].count - 1);
-      }
-
-      max_count = MAX2(max_count, prim[num_prims].count);
-      num_prims++;
-   }
-
-   if (info->index_size) {
-      ib.count = max_count;
-      ib.index_size_shift = util_logbase2(index_size);
-
-      if (info->has_user_indices) {
-         ib.obj = NULL;
-         ib.ptr = (const char*)info->index.user;
-      } else {
-         ib.obj = info->index.gl_bo;
-         ib.ptr = NULL;
-      }
-   }
-
-   if (num_prims)
-      st_feedback_draw_vbo(ctx, prim, num_prims, index_size ? &ib : NULL,
-                           index_bounds_valid, info->primitive_restart,
-                           info->restart_index, min_index, max_index,
-                           info->instance_count, info->start_instance);
-}
-
-
-/**
- * Called via Driver.DrawGallium. This is a fallback invoking Driver.Draw.
- */
-void
-_mesa_draw_gallium_multimode_fallback(struct gl_context *ctx,
-                                      struct pipe_draw_info *info,
-                                      const struct pipe_draw_start_count_bias *draws,
-                                      const unsigned char *mode,
-                                      unsigned num_draws)
-{
-   unsigned i, first;
-   /* Find consecutive draws where mode doesn't vary. */
-   for (i = 0, first = 0; i <= num_draws; i++) {
-      if (i == num_draws || mode[i] != mode[first]) {
-         info->mode = mode[first];
-         ctx->Driver.DrawGallium(ctx, info, 0, &draws[first], i - first);
-         first = i;
-      }
-   }
-}
  
 /**
  * Check that element 'j' of the array has reasonable data.
index aa65745..1d5a841 100644 (file)
@@ -88,20 +88,6 @@ _mesa_set_draw_vao(struct gl_context *ctx, struct gl_vertex_array_object *vao,
                    GLbitfield filter);
 
 void
-_mesa_draw_gallium_fallback(struct gl_context *ctx,
-                            struct pipe_draw_info *info,
-                            unsigned drawid_offset,
-                            const struct pipe_draw_start_count_bias *draws,
-                            unsigned num_draws);
-
-void
-_mesa_draw_gallium_multimode_fallback(struct gl_context *ctx,
-                                     struct pipe_draw_info *info,
-                                     const struct pipe_draw_start_count_bias *draws,
-                                     const unsigned char *mode,
-                                     unsigned num_draws);
-
-void
 _mesa_bitmap(struct gl_context *ctx, GLsizei width, GLsizei height,
              GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove,
              const GLubyte *bitmap, struct pipe_resource *tex);
index e937386..e5ae129 100644 (file)
@@ -298,8 +298,8 @@ st_RenderMode(struct gl_context *ctx, GLenum newMode )
             st->selection_stage = draw_glselect_stage(ctx, draw);
          draw_set_rasterize_stage(draw, st->selection_stage);
          /* Plug in new vbo draw function */
-         ctx->Driver.DrawGallium = _mesa_draw_gallium_fallback;
-         ctx->Driver.DrawGalliumMultiMode = _mesa_draw_gallium_multimode_fallback;
+         ctx->Driver.DrawGallium = st_feedback_draw_vbo;
+         ctx->Driver.DrawGalliumMultiMode = st_feedback_draw_vbo_multi_mode;
       }
    }
    else {
@@ -309,8 +309,8 @@ st_RenderMode(struct gl_context *ctx, GLenum newMode )
          st->feedback_stage = draw_glfeedback_stage(ctx, draw);
       draw_set_rasterize_stage(draw, st->feedback_stage);
       /* Plug in new vbo draw function */
-      ctx->Driver.DrawGallium = _mesa_draw_gallium_fallback;
-      ctx->Driver.DrawGalliumMultiMode = _mesa_draw_gallium_multimode_fallback;
+      ctx->Driver.DrawGallium = st_feedback_draw_vbo;
+      ctx->Driver.DrawGalliumMultiMode = st_feedback_draw_vbo_multi_mode;
       /* need to generate/use a vertex program that emits pos/color/tex */
       if (vp)
          st->dirty |= ST_NEW_VERTEX_PROGRAM(st, vp);
index 0dd84fc..044b60d 100644 (file)
@@ -67,7 +67,8 @@ struct rastpos_stage
 
    /* vertex attrib info we can setup once and re-use */
    struct gl_vertex_array_object *VAO;
-   struct _mesa_prim prim;
+   struct pipe_draw_info info;
+   struct pipe_draw_start_count_bias draw;
 };
 
 
@@ -208,11 +209,9 @@ new_draw_rastpos_stage(struct gl_context *ctx, struct draw_context *draw)
                              GL_RGBA, GL_FALSE, GL_FALSE, GL_FALSE, 0);
    _mesa_enable_vertex_array_attrib(ctx, rs->VAO, 0);
 
-   rs->prim.mode = GL_POINTS;
-   rs->prim.begin = 1;
-   rs->prim.end = 1;
-   rs->prim.start = 0;
-   rs->prim.count = 1;
+   rs->info.mode = PIPE_PRIM_POINTS;
+   rs->info.instance_count = 1;
+   rs->draw.count = 1;
 
    return rs;
 }
@@ -267,8 +266,7 @@ st_RasterPos(struct gl_context *ctx, const GLfloat v[4])
       rs->VAO->NewVertexElements = true;
    _mesa_set_draw_vao(ctx, rs->VAO, VERT_BIT_POS);
 
-   /* Draw the point. */
-   st_feedback_draw_vbo(ctx, &rs->prim, 1, NULL, true, false, 0, 0, 1, 1, 0);
+   st_feedback_draw_vbo(ctx, &rs->info, 0, &rs->draw, 1);
 
    /* restore draw's rasterization stage depending on rendermode */
    if (ctx->RenderMode == GL_FEEDBACK) {
index 46ee64d..c0d5cc1 100644 (file)
@@ -48,18 +48,19 @@ void st_destroy_draw( struct st_context *st );
 
 struct draw_context *st_get_draw_context(struct st_context *st);
 
-extern void
+void
 st_feedback_draw_vbo(struct gl_context *ctx,
-                     const struct _mesa_prim *prims,
-                     unsigned nr_prims,
-                     const struct _mesa_index_buffer *ib,
-                    bool index_bounds_valid,
-                     bool primitive_restart,
-                     unsigned restart_index,
-                     unsigned min_index,
-                     unsigned max_index,
-                     unsigned num_instances,
-                     unsigned base_instance);
+                     struct pipe_draw_info *info,
+                     unsigned drawid_offset,
+                     const struct pipe_draw_start_count_bias *draws,
+                     unsigned num_draws);
+
+void
+st_feedback_draw_vbo_multi_mode(struct gl_context *ctx,
+                                struct pipe_draw_info *info,
+                                const struct pipe_draw_start_count_bias *draws,
+                                const unsigned char *mode,
+                                unsigned num_draws);
 
 /**
  * When drawing with VBOs, the addresses specified with
index 8b97d0b..ebadabf 100644 (file)
@@ -93,16 +93,10 @@ set_feedback_vertex_format(struct gl_context *ctx)
  */
 void
 st_feedback_draw_vbo(struct gl_context *ctx,
-                     const struct _mesa_prim *prims,
-                     unsigned nr_prims,
-                     const struct _mesa_index_buffer *ib,
-                    bool index_bounds_valid,
-                     bool primitive_restart,
-                     unsigned restart_index,
-                     unsigned min_index,
-                     unsigned max_index,
-                     unsigned num_instances,
-                     unsigned base_instance)
+                     struct pipe_draw_info *info,
+                     unsigned drawid_offset,
+                     const struct pipe_draw_start_count_bias *draws,
+                     unsigned num_draws)
 {
    struct st_context *st = st_context(ctx);
    struct pipe_context *pipe = st->pipe;
@@ -116,26 +110,18 @@ st_feedback_draw_vbo(struct gl_context *ctx,
    struct pipe_transfer *ib_transfer = NULL;
    GLuint i;
    const void *mapped_indices = NULL;
-   struct pipe_draw_info info;
 
    if (!draw)
       return;
 
-   /* Initialize pipe_draw_info. */
-   info.primitive_restart = false;
-   info.take_index_buffer_ownership = false;
-   info.restart_index = 0;
-   info.view_mask = 0;
-
    st_flush_bitmap_cache(st);
    st_invalidate_readpix_cache(st);
 
    st_validate_state(st, ST_PIPELINE_RENDER);
 
-   if (ib && !index_bounds_valid) {
-      vbo_get_minmax_indices(ctx, prims, ib, &min_index, &max_index, nr_prims,
-                             primitive_restart, restart_index);
-      index_bounds_valid = true;
+   if (info->index_size && info->has_user_indices && !info->index_bounds_valid) {
+      vbo_get_minmax_indices_gallium(ctx, info, draws, num_draws);
+      info->index_bounds_valid = true;
    }
 
    /* must get these after state validation! */
@@ -185,40 +171,18 @@ st_feedback_draw_vbo(struct gl_context *ctx,
    draw_set_vertex_buffers(draw, 0, num_vbuffers, 0, vbuffers);
    draw_set_vertex_elements(draw, vp->num_inputs, velements.velems);
 
-   unsigned start = 0;
-
-   if (ib) {
-      struct gl_buffer_object *bufobj = ib->obj;
-      unsigned index_size = 1 << ib->index_size_shift;
-
-      if (index_size == 0)
-         goto out_unref_vertex;
-
-      if (bufobj && bufobj->Name) {
-         start = pointer_to_offset(ib->ptr) >> ib->index_size_shift;
-         mapped_indices = pipe_buffer_map(pipe, bufobj->buffer,
+   if (info->index_size) {
+      if (info->has_user_indices) {
+         mapped_indices = info->index.user;
+      } else {
+         info->index.resource = info->index.gl_bo->buffer;
+         if (!info->index.resource)
+            return; /* glBufferData wasn't called on the buffer */
+         mapped_indices = pipe_buffer_map(pipe, info->index.resource,
                                           PIPE_MAP_READ, &ib_transfer);
       }
-      else {
-         mapped_indices = ib->ptr;
-      }
 
-      info.index_size = index_size;
-      info.index_bounds_valid = index_bounds_valid;
-      info.min_index = min_index;
-      info.max_index = max_index;
-      info.has_user_indices = true;
-      info.index.user = mapped_indices;
-
-      draw_set_indexes(draw,
-                       (ubyte *) mapped_indices,
-                       index_size, ~0);
-
-      info.primitive_restart = primitive_restart;
-      info.restart_index = restart_index;
-   } else {
-      info.index_size = 0;
-      info.has_user_indices = false;
+      draw_set_indexes(draw, (ubyte *)mapped_indices, info->index_size, ~0);
    }
 
    /* set constant buffer 0 */
@@ -435,29 +399,11 @@ st_feedback_draw_vbo(struct gl_context *ctx,
    }
    draw_set_images(draw, PIPE_SHADER_VERTEX, images, prog->info.num_images);
 
-   info.start_instance = base_instance;
-   info.instance_count = num_instances;
-
    /* draw here */
-   for (i = 0; i < nr_prims; i++) {
-      struct pipe_draw_start_count_bias d;
-
-      d.count = prims[i].count;
-
-      if (!d.count)
-         continue;
-
-      d.start = start + prims[i].start;
-
-      info.mode = prims[i].mode;
-      d.index_bias = prims[i].basevertex;
-      if (!ib) {
-         info.min_index = d.start;
-         info.max_index = d.start + d.count - 1;
-      }
-
-      draw_vbo(draw, &info, prims[i].draw_id, NULL, &d, 1,
-               ctx->TessCtrlProgram.patch_vertices);
+   for (i = 0; i < num_draws; i++) {
+      /* TODO: indirect draws */
+      draw_vbo(draw, info, info->increment_draw_id ? i : 0, NULL,
+               &draws[i], 1, ctx->TessCtrlProgram.patch_vertices);
    }
 
    /* unmap images */
@@ -511,13 +457,12 @@ st_feedback_draw_vbo(struct gl_context *ctx,
    /*
     * unmap vertex/index buffers
     */
-   if (ib) {
+   if (info->index_size) {
       draw_set_indexes(draw, NULL, 0, 0);
       if (ib_transfer)
          pipe_buffer_unmap(pipe, ib_transfer);
    }
 
- out_unref_vertex:
    for (unsigned buf = 0; buf < num_vbuffers; ++buf) {
       if (vb_transfer[buf])
          pipe_buffer_unmap(pipe, vb_transfer[buf]);
@@ -527,3 +472,16 @@ st_feedback_draw_vbo(struct gl_context *ctx,
 
    draw_bind_vertex_shader(draw, NULL);
 }
+
+void
+st_feedback_draw_vbo_multi_mode(struct gl_context *ctx,
+                                struct pipe_draw_info *info,
+                                const struct pipe_draw_start_count_bias *draws,
+                                const unsigned char *mode,
+                                unsigned num_draws)
+{
+   for (unsigned i = 0; i < num_draws; i++) {
+      info->mode = mode[i];
+      st_feedback_draw_vbo(ctx, info, 0, &draws[i], 1);
+   }
+}