[Mesa-dev] [PATCH] st/mesa: allow glDrawElements to work with GL_SELECT feedback

Brian Paul brianp at vmware.com
Wed Dec 19 13:38:17 UTC 2018


On 12/18/2018 08:50 PM, Ilia Mirkin wrote:
> Not sure if this ever worked, but the current logic for setting the
> min/max index is definitely wrong for indexed draws. While we're at it,
> bring in all the usual logic from the non-indirect drawing path.
> 
> Bugzilla: https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugs.freedesktop.org%2Fshow_bug.cgi%3Fid%3D109086&data=02%7C01%7Cbrianp%40vmware.com%7C6caf58471242445a386a08d665652d9a%7Cb39138ca3cee4b4aa4d6cd83d9dd62f0%7C0%7C0%7C636807882586735220&sdata=ekxW8vXjInP6H7vsVCdLJ4GD9y%2BN8MYpzWYRY87utEA%3D&reserved=0
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
> 
> This makes it more or less mirror st_draw_vbo. As the comment in the
> code says, would be nice to refactor, but ... meh.
> 
> Note that I haven't tested any of the interactions with additional
> features, like primitive restart or instancing or any of that. However I
> don't think that this would make things *worse*.
> 
>   src/mesa/state_tracker/st_draw_feedback.c | 61 +++++++++++++++--------
>   1 file changed, 39 insertions(+), 22 deletions(-)
> 
> diff --git a/src/mesa/state_tracker/st_draw_feedback.c b/src/mesa/state_tracker/st_draw_feedback.c
> index 6ec6d5c16f4..49fdecf7e38 100644
> --- a/src/mesa/state_tracker/st_draw_feedback.c
> +++ b/src/mesa/state_tracker/st_draw_feedback.c
> @@ -84,27 +84,6 @@ set_feedback_vertex_format(struct gl_context *ctx)
>   }
>   
>   
> -/**
> - * Helper for drawing current vertex arrays.
> - */
> -static void
> -draw_arrays(struct draw_context *draw, unsigned mode,
> -            unsigned start, unsigned count)
> -{
> -   struct pipe_draw_info info;
> -
> -   util_draw_init_info(&info);
> -
> -   info.mode = mode;
> -   info.start = start;
> -   info.count = count;
> -   info.min_index = start;
> -   info.max_index = start + count - 1;
> -
> -   draw_vbo(draw, &info);
> -}
> -
> -
>   /**
>    * Called by VBO to draw arrays when in selection or feedback mode and
>    * to implement glRasterPos.
> @@ -136,10 +115,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.vertices_per_patch = ctx->TessCtrlProgram.patch_vertices;
> +   info.indirect = NULL;
> +   info.count_from_stream_output = NULL;
> +   info.restart_index = 0;

Shouldn't we use util_draw_init_info() to make this future-proof?

Looks good otherwise.  Thanks for fixing this!

Reviewed-by: Brian Paul <brianp at vmware.com>


> +
>      st_flush_bitmap_cache(st);
>      st_invalidate_readpix_cache(st);
>   
> @@ -213,9 +200,23 @@ st_feedback_draw_vbo(struct gl_context *ctx,
>            mapped_indices = ib->ptr;
>         }
>   
> +      info.index_size = ib->index_size;
> +      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);
> +
> +      if (ctx->Array._PrimitiveRestart) {
> +         info.primitive_restart = true;
> +         info.restart_index = _mesa_primitive_restart_index(ctx, info.index_size);
> +      }
> +   } else {
> +      info.index_size = 0;
> +      info.has_user_indices = false;
>      }
>   
>      /* set the constant buffer */
> @@ -226,7 +227,23 @@ st_feedback_draw_vbo(struct gl_context *ctx,
>   
>      /* draw here */
>      for (i = 0; i < nr_prims; i++) {
> -      draw_arrays(draw, prims[i].mode, start + prims[i].start, prims[i].count);
> +      info.count = prims[i].count;
> +
> +      if (!info.count)
> +         continue;
> +
> +      info.mode = prims[i].mode;
> +      info.start = start + prims[i].start;
> +      info.start_instance = prims[i].base_instance;
> +      info.instance_count = prims[i].num_instances;
> +      info.index_bias = prims[i].basevertex;
> +      info.drawid = prims[i].draw_id;
> +      if (!ib) {
> +         info.min_index = info.start;
> +         info.max_index = info.start + info.count - 1;
> +      }
> +
> +      draw_vbo(draw, &info);
>      }
>   
>   
> 



More information about the mesa-dev mailing list