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

---
 src/gallium/drivers/radeon/r600_pipe_common.c | 39 +++++++++++++++++----------
 1 file changed, 25 insertions(+), 14 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c 
b/src/gallium/drivers/radeon/r600_pipe_common.c
index 052054b..42dc38b 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.c
+++ b/src/gallium/drivers/radeon/r600_pipe_common.c
@@ -103,41 +103,52 @@ void r600_gfx_write_event_eop(struct r600_common_context 
*ctx,
                              unsigned event, unsigned event_flags,
                              unsigned data_sel,
                              struct r600_resource *buf, uint64_t va,
                              uint32_t old_fence, uint32_t new_fence)
 {
        struct radeon_winsys_cs *cs = ctx->gfx.cs;
        unsigned op = EVENT_TYPE(event) |
                      EVENT_INDEX(5) |
                      event_flags;
 
-       if (ctx->chip_class == CIK ||
-           ctx->chip_class == VI) {
-               /* Two EOP events are required to make all engines go idle
-                * (and optional cache flushes executed) before the timestamp
-                * is written.
-                */
+       if (ctx->chip_class >= GFX9) {
+               radeon_emit(cs, PKT3(PKT3_RELEASE_MEM, 6, 0));
+               radeon_emit(cs, op);
+               radeon_emit(cs, EOP_DATA_SEL(data_sel));
+               radeon_emit(cs, va);            /* address lo */
+               radeon_emit(cs, va >> 32);      /* address hi */
+               radeon_emit(cs, new_fence);     /* immediate data lo */
+               radeon_emit(cs, 0); /* immediate data hi */
+               radeon_emit(cs, 0); /* unused */
+       } else {
+               if (ctx->chip_class == CIK ||
+                   ctx->chip_class == VI) {
+                       /* Two EOP events are required to make all engines go 
idle
+                        * (and optional cache flushes executed) before the 
timestamp
+                        * is written.
+                        */
+                       radeon_emit(cs, PKT3(PKT3_EVENT_WRITE_EOP, 4, 0));
+                       radeon_emit(cs, op);
+                       radeon_emit(cs, va);
+                       radeon_emit(cs, ((va >> 32) & 0xffff) | 
EOP_DATA_SEL(data_sel));
+                       radeon_emit(cs, old_fence); /* immediate data */
+                       radeon_emit(cs, 0); /* unused */
+               }
+
                radeon_emit(cs, PKT3(PKT3_EVENT_WRITE_EOP, 4, 0));
                radeon_emit(cs, op);
                radeon_emit(cs, va);
                radeon_emit(cs, ((va >> 32) & 0xffff) | EOP_DATA_SEL(data_sel));
-               radeon_emit(cs, old_fence); /* immediate data */
+               radeon_emit(cs, new_fence); /* immediate data */
                radeon_emit(cs, 0); /* unused */
        }
 
-       radeon_emit(cs, PKT3(PKT3_EVENT_WRITE_EOP, 4, 0));
-       radeon_emit(cs, op);
-       radeon_emit(cs, va);
-       radeon_emit(cs, ((va >> 32) & 0xffff) | EOP_DATA_SEL(data_sel));
-       radeon_emit(cs, new_fence); /* immediate data */
-       radeon_emit(cs, 0); /* unused */
-
        if (buf)
                r600_emit_reloc(ctx, &ctx->gfx, buf, RADEON_USAGE_WRITE,
                                RADEON_PRIO_QUERY);
 }
 
 unsigned r600_gfx_write_fence_dwords(struct r600_common_screen *screen)
 {
        unsigned dwords = 6;
 
        if (screen->chip_class == CIK ||
-- 
2.7.4

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

Reply via email to