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

Reply via email to