From: Marek Olšák <marek.ol...@amd.com>

Reviewed-by: Alex Deucher <alexander.deuc...@amd.com>
---
 src/gallium/drivers/r600/evergreen_state.c   | 25 +++++++++++--------------
 src/gallium/drivers/r600/r600_hw_context.c   |  4 ++++
 src/gallium/drivers/r600/r600_state.c        | 25 +++++++++++--------------
 src/gallium/drivers/r600/r600_state_common.c |  3 ---
 4 files changed, 26 insertions(+), 31 deletions(-)

diff --git a/src/gallium/drivers/r600/evergreen_state.c 
b/src/gallium/drivers/r600/evergreen_state.c
index 36d3b4b..1ac8914 100644
--- a/src/gallium/drivers/r600/evergreen_state.c
+++ b/src/gallium/drivers/r600/evergreen_state.c
@@ -1287,20 +1287,17 @@ static void evergreen_set_framebuffer_state(struct 
pipe_context *ctx,
        struct r600_texture *rtex;
        uint32_t i, log_samples;
 
-       if (rctx->framebuffer.state.nr_cbufs) {
-               rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE | 
R600_CONTEXT_FLUSH_AND_INV;
-               rctx->b.flags |= R600_CONTEXT_FLUSH_AND_INV_CB |
-                                R600_CONTEXT_FLUSH_AND_INV_CB_META;
-       }
-       if (rctx->framebuffer.state.zsbuf) {
-               rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE | 
R600_CONTEXT_FLUSH_AND_INV;
-               rctx->b.flags |= R600_CONTEXT_FLUSH_AND_INV_DB;
-
-               rtex = (struct 
r600_texture*)rctx->framebuffer.state.zsbuf->texture;
-               if (rtex->htile_buffer) {
-                       rctx->b.flags |= R600_CONTEXT_FLUSH_AND_INV_DB_META;
-               }
-       }
+       /* Flush TC when changing the framebuffer state, because the only
+        * client not using TC that can change textures is the framebuffer.
+        * Other places don't typically have to flush TC.
+        */
+       rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE |
+                        R600_CONTEXT_FLUSH_AND_INV |
+                        R600_CONTEXT_FLUSH_AND_INV_CB |
+                        R600_CONTEXT_FLUSH_AND_INV_CB_META |
+                        R600_CONTEXT_FLUSH_AND_INV_DB |
+                        R600_CONTEXT_FLUSH_AND_INV_DB_META |
+                        R600_CONTEXT_INV_TEX_CACHE;
 
        util_copy_framebuffer_state(&rctx->framebuffer.state, state);
 
diff --git a/src/gallium/drivers/r600/r600_hw_context.c 
b/src/gallium/drivers/r600/r600_hw_context.c
index 04c3cb2..71c2dbb 100644
--- a/src/gallium/drivers/r600/r600_hw_context.c
+++ b/src/gallium/drivers/r600/r600_hw_context.c
@@ -97,6 +97,10 @@ void r600_flush_emit(struct r600_context *rctx)
                return;
        }
 
+       /* Ensure coherency between streamout and shaders. */
+       if (rctx->b.flags & R600_CONTEXT_STREAMOUT_FLUSH)
+               rctx->b.flags |= r600_get_flush_flags(R600_COHERENCY_SHADER);
+
        if (rctx->b.flags & R600_CONTEXT_WAIT_3D_IDLE) {
                wait_until |= S_008040_WAIT_3D_IDLE(1);
        }
diff --git a/src/gallium/drivers/r600/r600_state.c 
b/src/gallium/drivers/r600/r600_state.c
index 9a33ab9..cf7f0b3 100644
--- a/src/gallium/drivers/r600/r600_state.c
+++ b/src/gallium/drivers/r600/r600_state.c
@@ -1099,20 +1099,17 @@ static void r600_set_framebuffer_state(struct 
pipe_context *ctx,
        struct r600_texture *rtex;
        unsigned i;
 
-       if (rctx->framebuffer.state.nr_cbufs) {
-               rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE | 
R600_CONTEXT_FLUSH_AND_INV;
-               rctx->b.flags |= R600_CONTEXT_FLUSH_AND_INV_CB |
-                                R600_CONTEXT_FLUSH_AND_INV_CB_META;
-       }
-       if (rctx->framebuffer.state.zsbuf) {
-               rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE | 
R600_CONTEXT_FLUSH_AND_INV;
-               rctx->b.flags |= R600_CONTEXT_FLUSH_AND_INV_DB;
-
-               rtex = (struct 
r600_texture*)rctx->framebuffer.state.zsbuf->texture;
-               if (rctx->b.chip_class >= R700 && rtex->htile_buffer) {
-                       rctx->b.flags |= R600_CONTEXT_FLUSH_AND_INV_DB_META;
-               }
-       }
+       /* Flush TC when changing the framebuffer state, because the only
+        * client not using TC that can change textures is the framebuffer.
+        * Other places don't typically have to flush TC.
+        */
+       rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE |
+                        R600_CONTEXT_FLUSH_AND_INV |
+                        R600_CONTEXT_FLUSH_AND_INV_CB |
+                        R600_CONTEXT_FLUSH_AND_INV_CB_META |
+                        R600_CONTEXT_FLUSH_AND_INV_DB |
+                        R600_CONTEXT_FLUSH_AND_INV_DB_META |
+                        R600_CONTEXT_INV_TEX_CACHE;
 
        /* Set the new state. */
        util_copy_framebuffer_state(&rctx->framebuffer.state, state);
diff --git a/src/gallium/drivers/r600/r600_state_common.c 
b/src/gallium/drivers/r600/r600_state_common.c
index b3814fb..3f8c7b2 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -533,7 +533,6 @@ static void r600_set_index_buffer(struct pipe_context *ctx,
 void r600_vertex_buffers_dirty(struct r600_context *rctx)
 {
        if (rctx->vertex_buffer_state.dirty_mask) {
-               rctx->b.flags |= R600_CONTEXT_INV_VERTEX_CACHE;
                rctx->vertex_buffer_state.atom.num_dw = (rctx->b.chip_class >= 
EVERGREEN ? 12 : 11) *
                                               
util_bitcount(rctx->vertex_buffer_state.dirty_mask);
                r600_mark_atom_dirty(rctx, &rctx->vertex_buffer_state.atom);
@@ -590,7 +589,6 @@ void r600_sampler_views_dirty(struct r600_context *rctx,
                              struct r600_samplerview_state *state)
 {
        if (state->dirty_mask) {
-               rctx->b.flags |= R600_CONTEXT_INV_TEX_CACHE;
                state->atom.num_dw = (rctx->b.chip_class >= EVERGREEN ? 14 : 
13) *
                                     util_bitcount(state->dirty_mask);
                r600_mark_atom_dirty(rctx, &state->atom);
@@ -1048,7 +1046,6 @@ static void r600_delete_tes_state(struct pipe_context 
*ctx, void *state)
 void r600_constant_buffers_dirty(struct r600_context *rctx, struct 
r600_constbuf_state *state)
 {
        if (state->dirty_mask) {
-               rctx->b.flags |= R600_CONTEXT_INV_CONST_CACHE;
                state->atom.num_dw = rctx->b.chip_class >= EVERGREEN ? 
util_bitcount(state->dirty_mask)*20
                                                                   : 
util_bitcount(state->dirty_mask)*19;
                r600_mark_atom_dirty(rctx, &state->atom);
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to