Module: Mesa
Branch: master
Commit: d04ab396a54d29948363c3353efa5aaa888076a3
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=d04ab396a54d29948363c3353efa5aaa888076a3

Author: Fredrik Höglund <fred...@kde.org>
Date:   Tue Mar 29 19:52:03 2011 +0200

r600g: implement texture barrier

---

 src/gallium/drivers/r600/evergreen_state.c    |    1 +
 src/gallium/drivers/r600/r600.h               |    1 +
 src/gallium/drivers/r600/r600_pipe.h          |    2 ++
 src/gallium/drivers/r600/r600_state.c         |    8 ++++++++
 src/gallium/winsys/r600/drm/r600_hw_context.c |   17 +++++++++++++++++
 5 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/src/gallium/drivers/r600/evergreen_state.c 
b/src/gallium/drivers/r600/evergreen_state.c
index 7743266..8f93eb8 100644
--- a/src/gallium/drivers/r600/evergreen_state.c
+++ b/src/gallium/drivers/r600/evergreen_state.c
@@ -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)
diff --git a/src/gallium/drivers/r600/r600.h b/src/gallium/drivers/r600/r600.h
index 75b8b50..4256a7e 100644
--- a/src/gallium/drivers/r600/r600.h
+++ b/src/gallium/drivers/r600/r600.h
@@ -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);
diff --git a/src/gallium/drivers/r600/r600_pipe.h 
b/src/gallium/drivers/r600/r600_pipe.h
index 88aff0e..5b26d1f 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -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
  */
diff --git a/src/gallium/drivers/r600/r600_state.c 
b/src/gallium/drivers/r600/r600_state.c
index d3adf03..e202056 100644
--- a/src/gallium/drivers/r600/r600_state.c
+++ b/src/gallium/drivers/r600/r600_state.c
@@ -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)
diff --git a/src/gallium/winsys/r600/drm/r600_hw_context.c 
b/src/gallium/winsys/r600/drm/r600_hw_context.c
index 48bce81..7f8da12 100644
--- a/src/gallium/winsys/r600/drm/r600_hw_context.c
+++ b/src/gallium/winsys/r600/drm/r600_hw_context.c
@@ -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)
 {

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to