OSDN Git Service

r600g: implement texture barrier
authorFredrik Höglund <fredrik@kde.org>
Tue, 29 Mar 2011 17:52:03 +0000 (19:52 +0200)
committerJerome Glisse <jglisse@redhat.com>
Tue, 29 Mar 2011 20:54:19 +0000 (16:54 -0400)
src/gallium/drivers/r600/evergreen_state.c
src/gallium/drivers/r600/r600.h
src/gallium/drivers/r600/r600_pipe.h
src/gallium/drivers/r600/r600_state.c
src/gallium/winsys/r600/drm/r600_hw_context.c

index 7743266..8f93eb8 100644 (file)
@@ -920,6 +920,7 @@ void evergreen_init_state_functions(struct r600_pipe_context *rctx)
        rctx->context.set_viewport_state = evergreen_set_viewport_state;
        rctx->context.sampler_view_destroy = r600_sampler_view_destroy;
        rctx->context.redefine_user_buffer = u_default_redefine_user_buffer;
+       rctx->context.texture_barrier = r600_texture_barrier;
 }
 
 void evergreen_init_config(struct r600_pipe_context *rctx)
index 75b8b50..4256a7e 100644 (file)
@@ -290,6 +290,7 @@ void r600_query_predication(struct r600_context *ctx, struct r600_query *query,
                            int flag_wait);
 void r600_context_emit_fence(struct r600_context *ctx, struct r600_bo *fence,
                              unsigned offset, unsigned value);
+void r600_context_flush_all(struct r600_context *ctx, unsigned flush_flags);
 
 int evergreen_context_init(struct r600_context *ctx, struct radeon *radeon);
 void evergreen_context_draw(struct r600_context *ctx, const struct r600_draw *draw);
index 88aff0e..5b26d1f 100644 (file)
@@ -298,6 +298,8 @@ void r600_set_constant_buffer(struct pipe_context *ctx, uint shader, uint index,
                              struct pipe_resource *buffer);
 void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info);
 
+void r600_texture_barrier(struct pipe_context *ctx);
+
 /*
  * common helpers
  */
index d3adf03..e202056 100644 (file)
@@ -934,6 +934,13 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx,
        }
 }
 
+void r600_texture_barrier(struct pipe_context *ctx)
+{
+       struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
+
+       r600_context_flush_all(&rctx->ctx, S_0085F0_TC_ACTION_ENA(1));
+}
+
 void r600_init_state_functions(struct r600_pipe_context *rctx)
 {
        rctx->context.create_blend_state = r600_create_blend_state;
@@ -974,6 +981,7 @@ void r600_init_state_functions(struct r600_pipe_context *rctx)
        rctx->context.set_viewport_state = r600_set_viewport_state;
        rctx->context.sampler_view_destroy = r600_sampler_view_destroy;
        rctx->context.redefine_user_buffer = u_default_redefine_user_buffer;
+       rctx->context.texture_barrier = r600_texture_barrier;
 }
 
 void r600_init_config(struct r600_pipe_context *rctx)
index 48bce81..7f8da12 100644 (file)
@@ -771,6 +771,23 @@ static void rv6xx_context_surface_base_update(struct r600_context *ctx,
        }
 }
 
+/* Flushes all surfaces */
+void r600_context_flush_all(struct r600_context *ctx, unsigned flush_flags)
+{
+       unsigned ndwords = 5;
+
+       if ((ctx->pm4_dirty_cdwords + ndwords + ctx->pm4_cdwords) > ctx->pm4_ndwords) {
+               /* need to flush */
+               r600_context_flush(ctx);
+       }
+
+       ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_SURFACE_SYNC, 3, ctx->predicate_drawing);
+       ctx->pm4[ctx->pm4_cdwords++] = flush_flags;     /* CP_COHER_CNTL */
+       ctx->pm4[ctx->pm4_cdwords++] = 0xffffffff;      /* CP_COHER_SIZE */
+       ctx->pm4[ctx->pm4_cdwords++] = 0;               /* CP_COHER_BASE */
+       ctx->pm4[ctx->pm4_cdwords++] = 0x0000000A;      /* POLL_INTERVAL */
+}
+
 void r600_context_bo_flush(struct r600_context *ctx, unsigned flush_flags,
                                unsigned flush_mask, struct r600_bo *rbo)
 {