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

Author: Nicolai Hähnle <[email protected]>
Date:   Fri Aug 25 16:19:56 2017 +0200

radeonsi: fix ARB_transform_feedback_overflow_query on <= VI

The result written by the shader workaround needs to be written back, or
the CP may read stale data.

Fixes: 78476cfe071a ("radeonsi: enable ARB_transform_feedback_overflow_query")
Reviewed-by: Marek Olšák <[email protected]>

---

 src/gallium/drivers/radeon/r600_pipe_common.h | 5 +++++
 src/gallium/drivers/radeon/r600_query.c       | 4 ++++
 src/gallium/drivers/radeonsi/si_pipe.c        | 4 +++-
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h 
b/src/gallium/drivers/radeon/r600_pipe_common.h
index d76d4a1384..9805088bd8 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.h
+++ b/src/gallium/drivers/radeon/r600_pipe_common.h
@@ -454,6 +454,11 @@ struct r600_common_screen {
                 */
                unsigned cp_to_L2;
 
+               /* Context flags to set so that all writes from earlier jobs
+                * that end in L2 are seen by CP.
+                */
+               unsigned L2_to_cp;
+
                /* Context flags to set so that all writes from earlier
                 * compute jobs are seen by L2 clients.
                 */
diff --git a/src/gallium/drivers/radeon/r600_query.c 
b/src/gallium/drivers/radeon/r600_query.c
index eaff39c830..f937612bc1 100644
--- a/src/gallium/drivers/radeon/r600_query.c
+++ b/src/gallium/drivers/radeon/r600_query.c
@@ -1833,6 +1833,10 @@ static void r600_render_condition(struct pipe_context 
*ctx,
                                ctx, query, true, PIPE_QUERY_TYPE_U64, 0,
                                &rquery->workaround_buf->b.b, 
rquery->workaround_offset);
 
+                       /* Settings this in the render cond atom is too late,
+                        * so set it here. */
+                       rctx->flags |= rctx->screen->barrier_flags.L2_to_cp;
+
                        atom->num_dw = 5;
 
                        rctx->render_cond_force_off = old_force_off;
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c 
b/src/gallium/drivers/radeonsi/si_pipe.c
index 18d5806ac8..98d65329e3 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -1078,8 +1078,10 @@ struct pipe_screen *radeonsi_screen_create(struct 
radeon_winsys *ws,
 
        sscreen->b.barrier_flags.cp_to_L2 = SI_CONTEXT_INV_SMEM_L1 |
                                            SI_CONTEXT_INV_VMEM_L1;
-       if (sscreen->b.chip_class <= VI)
+       if (sscreen->b.chip_class <= VI) {
                sscreen->b.barrier_flags.cp_to_L2 |= SI_CONTEXT_INV_GLOBAL_L2;
+               sscreen->b.barrier_flags.L2_to_cp |= 
SI_CONTEXT_WRITEBACK_GLOBAL_L2;
+       }
 
        sscreen->b.barrier_flags.compute_to_L2 = SI_CONTEXT_CS_PARTIAL_FLUSH;
 

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to