radv: set EVENT_WRITE_EOP.INT_SEL = wait for write confirmation
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 20 Jun 2018 14:10:56 +0000 (16:10 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 21 Jun 2018 08:31:03 +0000 (10:31 +0200)
Ported from RadeonSI.
Not sure why this is needed but AMDVLK does something similar.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/si_cmd_buffer.c

index d6b073c78387a96061c850277f5fd56b4f0a500d..e350bccae3327e4f70397bda8094efecc0fe7522 100644 (file)
@@ -686,11 +686,17 @@ void si_cs_emit_write_event_eop(struct radeon_cmdbuf *cs,
                EVENT_INDEX(5) |
                event_flags;
        unsigned is_gfx8_mec = is_mec && chip_class < GFX9;
+       unsigned sel = EOP_DATA_SEL(data_sel);
+
+       /* Wait for write confirmation before writing data, but don't send
+        * an interrupt. */
+       if (data_sel != EOP_DATA_SEL_DISCARD)
+               sel |= EOP_INT_SEL(EOP_INT_SEL_SEND_DATA_AFTER_WR_CONFIRM);
 
        if (chip_class >= GFX9 || is_gfx8_mec) {
                radeon_emit(cs, PKT3(PKT3_RELEASE_MEM, is_gfx8_mec ? 5 : 6, predicated));
                radeon_emit(cs, op);
-               radeon_emit(cs, EOP_DATA_SEL(data_sel));
+               radeon_emit(cs, sel);
                radeon_emit(cs, va);            /* address lo */
                radeon_emit(cs, va >> 32);      /* address hi */
                radeon_emit(cs, new_fence);     /* immediate data lo */
@@ -707,7 +713,7 @@ void si_cs_emit_write_event_eop(struct radeon_cmdbuf *cs,
                        radeon_emit(cs, PKT3(PKT3_EVENT_WRITE_EOP, 4, predicated));
                        radeon_emit(cs, op);
                        radeon_emit(cs, va);
-                       radeon_emit(cs, ((va >> 32) & 0xffff) | EOP_DATA_SEL(data_sel));
+                       radeon_emit(cs, ((va >> 32) & 0xffff) | sel);
                        radeon_emit(cs, old_fence); /* immediate data */
                        radeon_emit(cs, 0); /* unused */
                }
@@ -715,7 +721,7 @@ void si_cs_emit_write_event_eop(struct radeon_cmdbuf *cs,
                radeon_emit(cs, PKT3(PKT3_EVENT_WRITE_EOP, 4, predicated));
                radeon_emit(cs, op);
                radeon_emit(cs, va);
-               radeon_emit(cs, ((va >> 32) & 0xffff) | EOP_DATA_SEL(data_sel));
+               radeon_emit(cs, ((va >> 32) & 0xffff) | sel);
                radeon_emit(cs, new_fence); /* immediate data */
                radeon_emit(cs, 0); /* unused */
        }