bool has_8bpp_ubwc;
- /* a650 seems to be affected by a bug where flushing CCU color into
- * depth or vice-versa requires a WFI. In particular, clearing a
- * depth attachment (which writes to it as a color attachment) then
- * using it as a normal depth attachment requires a WFI in addition
- * to the expected CCU_FLUSH_COLOR + CCU_INVALIDATE_DEPTH, even
- * though all those operations happen in the same stage. As this is
- * usually the only scenario where a CCU flush doesn't require a WFI
- * we just insert a WFI after every CCU flush.
- *
- * Tests affected include
- * dEQP-VK.renderpass.suballocation.formats.d16_unorm.* in sysmem
- * mode (a few tests flake when the entire series is run).
- */
- bool has_ccu_flush_bug;
-
bool has_lpac;
bool has_getfiberid;
has_tex_filter_cubic = True,
has_separate_chroma_filter = True,
has_sample_locations = True,
- has_ccu_flush_bug = True,
has_8bpp_ubwc = False,
has_dp2acc = True,
has_lrz_dir_tracking = True,
has_tex_filter_cubic = True,
has_separate_chroma_filter = True,
has_sample_locations = True,
- has_ccu_flush_bug = True,
has_cp_reg_write = False,
has_8bpp_ubwc = False,
has_lpac = True,
tu6_emit_event_write(cmd, cs, PC_CCU_INVALIDATE_COLOR);
}
- if (cmd->device->physical_device->info->a6xx.has_ccu_flush_bug)
- tu_cs_emit_wfi(cs);
+ tu_cs_emit_wfi(cs);
}
void
}
if (flushes & TU_CMD_FLAG_WAIT_MEM_WRITES)
tu_cs_emit_pkt7(cs, CP_WAIT_MEM_WRITES, 0);
- if ((flushes & TU_CMD_FLAG_WAIT_FOR_IDLE) ||
- (cmd_buffer->device->physical_device->info->a6xx.has_ccu_flush_bug &&
- (flushes & (TU_CMD_FLAG_CCU_FLUSH_COLOR | TU_CMD_FLAG_CCU_FLUSH_DEPTH))))
+ if (flushes & TU_CMD_FLAG_WAIT_FOR_IDLE)
tu_cs_emit_wfi(cs);
if (flushes & TU_CMD_FLAG_WAIT_FOR_ME)
tu_cs_emit_pkt7(cs, CP_WAIT_FOR_ME, 0);
if (flushes & FD6_WAIT_MEM_WRITES)
OUT_PKT7(ring, CP_WAIT_MEM_WRITES, 0);
- if ((flushes & FD6_WAIT_FOR_IDLE) ||
- (ctx->screen->info->a6xx.has_ccu_flush_bug &&
- (flushes & (FD6_FLUSH_CCU_COLOR | FD6_FLUSH_CCU_DEPTH))))
+ if (flushes & FD6_WAIT_FOR_IDLE)
OUT_PKT7(ring, CP_WAIT_FOR_IDLE, 0);
if (flushes & FD6_WAIT_FOR_ME)
fd6_emit_flushes(batch->ctx, ring,
FD6_FLUSH_CCU_COLOR |
FD6_FLUSH_CCU_DEPTH |
- FD6_FLUSH_CACHE);
+ FD6_FLUSH_CACHE |
+ FD6_WAIT_FOR_IDLE);
}
static void
fd6_emit_flushes(batch->ctx, batch->draw,
FD6_FLUSH_CCU_COLOR |
FD6_FLUSH_CCU_DEPTH |
- FD6_FLUSH_CACHE);
+ FD6_FLUSH_CACHE |
+ FD6_WAIT_FOR_IDLE);
fd_batch_flush(batch);
fd_batch_reference(&batch, NULL);
* sysmem, and we generally assume that GMEM renderpasses leave their
* results in sysmem, so we need to flush manually here.
*/
- fd6_emit_flushes(batch->ctx, ring, FD6_FLUSH_CCU_COLOR);
+ fd6_emit_flushes(batch->ctx, ring,
+ FD6_FLUSH_CCU_COLOR | FD6_WAIT_FOR_IDLE);
}
template void fd6_resolve_tile<A6XX>(struct fd_batch *batch, struct fd_ringbuffer *ring,
fd6_emit_flushes(batch->ctx, batch->draw,
FD6_FLUSH_CCU_COLOR |
FD6_FLUSH_CCU_DEPTH |
- FD6_FLUSH_CACHE);
+ FD6_FLUSH_CACHE |
+ FD6_WAIT_FOR_IDLE);
fd_batch_flush(batch);
fd_batch_reference(&batch, NULL);