Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> --- src/gallium/drivers/freedreno/freedreno_context.h | 2 ++ src/gallium/drivers/freedreno/freedreno_draw.c | 8 ++++++++ src/gallium/drivers/freedreno/freedreno_resource.c | 8 ++++++++ src/gallium/drivers/freedreno/freedreno_state.c | 24 ++++++++++++++++++++++ 4 files changed, 42 insertions(+)
diff --git a/src/gallium/drivers/freedreno/freedreno_context.h b/src/gallium/drivers/freedreno/freedreno_context.h index 61c4c6d..3a01f1f 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.h +++ b/src/gallium/drivers/freedreno/freedreno_context.h @@ -336,6 +336,7 @@ struct fd_context { FD_DIRTY_STREAMOUT = (1 << 18), FD_DIRTY_UCP = (1 << 19), FD_DIRTY_BLEND_DUAL = (1 << 20), + FD_DIRTY_BUFFERS = (1 << 21), } dirty; struct pipe_blend_state *blend; @@ -358,6 +359,7 @@ struct fd_context { struct pipe_index_buffer indexbuf; struct fd_streamout_stateobj streamout; struct pipe_clip_state ucp; + struct pipe_shader_buffer buffers[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_BUFFERS]; /* GMEM/tile handling fxns: */ void (*emit_tile_init)(struct fd_context *ctx); diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c index 6831a58..097c4f2 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.c +++ b/src/gallium/drivers/freedreno/freedreno_draw.c @@ -165,6 +165,14 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) if (ctx->streamout.targets[i]) resource_written(ctx, ctx->streamout.targets[i]->buffer); + /* Mark shader buffers as being read and written */ + for (i = 0; i < PIPE_MAX_SHADER_BUFFERS; i++) { + resource_used(ctx, ctx->buffers[PIPE_SHADER_VERTEX][i].buffer, + FD_PENDING_READ | FD_PENDING_WRITE); + resource_used(ctx, ctx->buffers[PIPE_SHADER_FRAGMENT][i].buffer, + FD_PENDING_READ | FD_PENDING_WRITE); + } + ctx->num_draws++; prims = u_reduced_prims_for_vertices(info->mode, info->count); diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index 98de096..3b14575 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -68,6 +68,14 @@ fd_invalidate_resource(struct fd_context *ctx, struct pipe_resource *prsc) ctx->dirty |= FD_DIRTY_CONSTBUF; } + /* Buffers */ + for (i = 0; i < 16 && !(ctx->dirty & FD_DIRTY_BUFFERS); i++) { + if (ctx->buffers[PIPE_SHADER_VERTEX][i].buffer == prsc) + ctx->dirty |= FD_DIRTY_BUFFERS; + if (ctx->buffers[PIPE_SHADER_FRAGMENT][i].buffer == prsc) + ctx->dirty |= FD_DIRTY_BUFFERS; + } + /* VBOs */ for (i = 0; i < ctx->vtx.vertexbuf.count && !(ctx->dirty & FD_DIRTY_VTXBUF); i++) { if (ctx->vtx.vertexbuf.vb[i].buffer == prsc) diff --git a/src/gallium/drivers/freedreno/freedreno_state.c b/src/gallium/drivers/freedreno/freedreno_state.c index 685d3a7..aba806b 100644 --- a/src/gallium/drivers/freedreno/freedreno_state.c +++ b/src/gallium/drivers/freedreno/freedreno_state.c @@ -373,6 +373,28 @@ fd_set_stream_output_targets(struct pipe_context *pctx, ctx->dirty |= FD_DIRTY_STREAMOUT; } +static void +fd_set_shader_buffers(struct pipe_context *pctx, unsigned shader, + unsigned start, unsigned nr, + struct pipe_shader_buffer *buffers) +{ + struct fd_context *ctx = fd_context(pctx); + int i; + + for (i = 0; i < nr; i++) { + struct pipe_shader_buffer *buf = &ctx->buffers[shader][start + i]; + struct pipe_resource *res = buffers ? buffers[i].buffer : NULL; + if (buf->buffer != res) + pipe_resource_reference(&buf->buffer, res); + if (res) { + buf->buffer_offset = buffers[i].buffer_offset; + buf->buffer_size = buffers[i].buffer_size; + } + } + + ctx->dirty |= FD_DIRTY_BUFFERS; +} + void fd_state_init(struct pipe_context *pctx) { @@ -405,4 +427,6 @@ fd_state_init(struct pipe_context *pctx) pctx->create_stream_output_target = fd_create_stream_output_target; pctx->stream_output_target_destroy = fd_stream_output_target_destroy; pctx->set_stream_output_targets = fd_set_stream_output_targets; + + pctx->set_shader_buffers = fd_set_shader_buffers; } -- 2.4.9 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev