[Mesa-dev] [PATCH 2/5] freedreno: add support for user index buffers

Rob Clark robdclark at gmail.com
Fri Feb 17 13:14:56 UTC 2017


Haven't had a chance to try this yet, but looks reasonable.  But how
common would it be that a single indexbuf gets re-used for multiple
draws?  I wonder if it would be better to just do the upload in
set_index_buffer() instead?

Also, I might have missed some discussion (have been buried in kernel
stuff lately so haven't been following mesa-dev so much), but what was
the motivation to remove IB upload support from mesa/st?

(Oh, and in patch 1/5, I guess you meant to split the u_helpers and
etnaviv into two separate patches?  not sure if you accidentally
squashed them together?)


BR,
-R

On Fri, Feb 17, 2017 at 5:27 AM, Marek Olšák <maraeo at gmail.com> wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
>  src/gallium/drivers/freedreno/freedreno_draw.c   | 13 +++++++++++++
>  src/gallium/drivers/freedreno/freedreno_screen.c |  2 +-
>  2 files changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c
> index cfe13cd..cb4c063 100644
> --- a/src/gallium/drivers/freedreno/freedreno_draw.c
> +++ b/src/gallium/drivers/freedreno/freedreno_draw.c
> @@ -24,20 +24,21 @@
>   *
>   * Authors:
>   *    Rob Clark <robclark at freedesktop.org>
>   */
>
>  #include "pipe/p_state.h"
>  #include "util/u_string.h"
>  #include "util/u_memory.h"
>  #include "util/u_prim.h"
>  #include "util/u_format.h"
> +#include "util/u_helpers.h"
>
>  #include "freedreno_draw.h"
>  #include "freedreno_context.h"
>  #include "freedreno_state.h"
>  #include "freedreno_resource.h"
>  #include "freedreno_query_hw.h"
>  #include "freedreno_util.h"
>
>  static void
>  resource_read(struct fd_batch *batch, struct pipe_resource *prsc)
> @@ -77,20 +78,29 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
>         /* emulate unsupported primitives: */
>         if (!fd_supported_prim(ctx, info->mode)) {
>                 if (ctx->streamout.num_targets > 0)
>                         debug_error("stream-out with emulated prims");
>                 util_primconvert_save_index_buffer(ctx->primconvert, &ctx->indexbuf);
>                 util_primconvert_save_rasterizer_state(ctx->primconvert, ctx->rasterizer);
>                 util_primconvert_draw_vbo(ctx->primconvert, info);
>                 return;
>         }
>
> +       /* Upload a user index buffer. */
> +       struct pipe_index_buffer ibuffer_saved = {};
> +       if (info->indexed && ctx->indexbuf.user_buffer &&
> +           !util_save_and_upload_index_buffer(pctx, info,
> +                                              &ctx->indexbuf.user_buffer,
> +                                              &ibuffer_saved)) {
> +               return;
> +       }
> +
>         if (ctx->in_blit) {
>                 fd_batch_reset(batch);
>                 ctx->dirty = ~0;
>         }
>
>         batch->blit = ctx->in_blit;
>         batch->back_blit = ctx->in_shadow;
>
>         /* NOTE: needs to be before resource_written(batch->query_buf), otherwise
>          * query_buf may not be created yet.
> @@ -194,20 +204,23 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
>         if (ctx->draw_vbo(ctx, info))
>                 batch->needs_flush = true;
>
>         for (i = 0; i < ctx->streamout.num_targets; i++)
>                 ctx->streamout.offsets[i] += info->count;
>
>         if (fd_mesa_debug & FD_DBG_DDRAW)
>                 ctx->dirty = 0xffffffff;
>
>         fd_batch_check_size(batch);
> +
> +       if (info->indexed && ibuffer_saved.user_buffer)
> +           pctx->set_index_buffer(pctx, &ibuffer_saved);
>  }
>
>  /* Generic clear implementation (partially) using u_blitter: */
>  static void
>  fd_blitter_clear(struct pipe_context *pctx, unsigned buffers,
>                 const union pipe_color_union *color, double depth, unsigned stencil)
>  {
>         struct fd_context *ctx = fd_context(pctx);
>         struct pipe_framebuffer_state *pfb = &ctx->batch->framebuffer;
>         struct blitter_context *blitter = ctx->blitter;
> diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
> index 1122e29..e1b95a6 100644
> --- a/src/gallium/drivers/freedreno/freedreno_screen.c
> +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
> @@ -172,20 +172,21 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>         case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
>         case PIPE_CAP_SEAMLESS_CUBE_MAP:
>         case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
>         case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
>         case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
>         case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
>         case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
>         case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
>         case PIPE_CAP_STRING_MARKER:
>         case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
> +       case PIPE_CAP_USER_INDEX_BUFFERS:
>                 return 1;
>
>         case PIPE_CAP_VERTEXID_NOBASE:
>                 return is_a3xx(screen) || is_a4xx(screen);
>
>         case PIPE_CAP_USER_CONSTANT_BUFFERS:
>                 return is_a4xx(screen) ? 0 : 1;
>
>         case PIPE_CAP_SHADER_STENCIL_EXPORT:
>         case PIPE_CAP_TGSI_TEXCOORD:
> @@ -246,21 +247,20 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>         case PIPE_CAP_GLSL_FEATURE_LEVEL:
>                 if (glsl120)
>                         return 120;
>                 return is_ir3(screen) ? 140 : 120;
>
>         /* Unsupported features. */
>         case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
>         case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
>         case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
>         case PIPE_CAP_USER_VERTEX_BUFFERS:
> -       case PIPE_CAP_USER_INDEX_BUFFERS:
>         case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
>         case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
>         case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
>         case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
>         case PIPE_CAP_TEXTURE_GATHER_SM5:
>         case PIPE_CAP_SAMPLE_SHADING:
>         case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
>         case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
>         case PIPE_CAP_DRAW_INDIRECT:
>         case PIPE_CAP_MULTI_DRAW_INDIRECT:
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list