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 <mar...@gmail.com> wrote: > From: Marek Olšák <marek.ol...@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 <robcl...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev