From e805c35986a76a8f40b06c4d3512291bb38273a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 22 Aug 2024 16:33:20 -0400 Subject: [PATCH] radeonsi: move barriers out of si_copy_buffer Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/radeon_video.c | 2 ++ src/gallium/drivers/radeonsi/si_blit.c | 6 +++++- src/gallium/drivers/radeonsi/si_buffer.c | 11 +++++++++-- src/gallium/drivers/radeonsi/si_compute_blit.c | 7 +------ src/gallium/drivers/radeonsi/si_test_dma_perf.c | 7 +++++-- 5 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/gallium/drivers/radeonsi/radeon_video.c b/src/gallium/drivers/radeonsi/radeon_video.c index 95bc03bc60a..5d8cfca7369 100644 --- a/src/gallium/drivers/radeonsi/radeon_video.c +++ b/src/gallium/drivers/radeonsi/radeon_video.c @@ -108,6 +108,8 @@ bool si_vid_resize_buffer(struct pipe_context *context, struct radeon_cmdbuf *cs ws->buffer_unmap(ws, new_buf->res->buf); ws->buffer_unmap(ws, old_buf.res->buf); } else { + unsigned flags = SI_OP_SYNC_BEFORE; + si_barrier_before_simple_buffer_op(sctx, flags, &new_buf->res->b.b, &old_buf.res->b.b); if (buf_ofst_info) { uint64_t dst_offset = 0, src_offset = 0; for (int i = 0; i < buf_ofst_info->num_units; i++) { diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index b19337750a6..6dabb5159c5 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -965,7 +965,11 @@ void si_resource_copy_region(struct pipe_context *ctx, struct pipe_resource *dst /* Handle buffers first. */ if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) { - si_copy_buffer(sctx, dst, src, dstx, src_box->x, src_box->width, SI_OP_SYNC_BEFORE_AFTER); + unsigned flags = SI_OP_SYNC_BEFORE_AFTER; + + si_barrier_before_simple_buffer_op(sctx, flags, dst, src); + si_copy_buffer(sctx, dst, src, dstx, src_box->x, src_box->width, flags); + si_barrier_after_simple_buffer_op(sctx, flags, dst, src); return; } diff --git a/src/gallium/drivers/radeonsi/si_buffer.c b/src/gallium/drivers/radeonsi/si_buffer.c index 4917cbdb346..84bf95998a1 100644 --- a/src/gallium/drivers/radeonsi/si_buffer.c +++ b/src/gallium/drivers/radeonsi/si_buffer.c @@ -445,8 +445,12 @@ static void *si_buffer_transfer_map(struct pipe_context *ctx, struct pipe_resour box->width + (box->x % SI_MAP_BUFFER_ALIGNMENT), 256); if (staging) { /* Copy the VRAM buffer to the staging buffer. */ + unsigned flags = SI_OP_SYNC_BEFORE_AFTER; + + si_barrier_before_simple_buffer_op(sctx, flags, &staging->b.b, resource); si_copy_buffer(sctx, &staging->b.b, resource, box->x % SI_MAP_BUFFER_ALIGNMENT, - box->x, box->width, SI_OP_SYNC_BEFORE_AFTER); + box->x, box->width, flags); + si_barrier_after_simple_buffer_op(sctx, flags, &staging->b.b, resource); data = si_buffer_map(sctx, staging, usage & ~PIPE_MAP_UNSYNCHRONIZED); if (!data) { @@ -480,10 +484,13 @@ static void si_buffer_do_flush_region(struct pipe_context *ctx, struct pipe_tran if (stransfer->staging) { unsigned src_offset = stransfer->b.b.offset + transfer->box.x % SI_MAP_BUFFER_ALIGNMENT + (box->x - transfer->box.x); + unsigned flags = SI_OP_SYNC_BEFORE_AFTER; /* Copy the staging buffer into the original one. */ + si_barrier_before_simple_buffer_op(sctx, flags, transfer->resource, &stransfer->staging->b.b); si_copy_buffer(sctx, transfer->resource, &stransfer->staging->b.b, box->x, src_offset, - box->width, SI_OP_SYNC_BEFORE_AFTER); + box->width, flags); + si_barrier_after_simple_buffer_op(sctx, flags, transfer->resource, &stransfer->staging->b.b); } util_range_add(&buf->b.b, &buf->valid_buffer_range, box->x, box->x + box->width); diff --git a/src/gallium/drivers/radeonsi/si_compute_blit.c b/src/gallium/drivers/radeonsi/si_compute_blit.c index 250f66d5029..a4e63502eee 100644 --- a/src/gallium/drivers/radeonsi/si_compute_blit.c +++ b/src/gallium/drivers/radeonsi/si_compute_blit.c @@ -458,16 +458,11 @@ void si_copy_buffer(struct si_context *sctx, struct pipe_resource *dst, struct p if (!size) return; - si_barrier_before_simple_buffer_op(sctx, flags, dst, src); - if (si_compute_clear_copy_buffer(sctx, dst, dst_offset, src, src_offset, size, NULL, 0, flags, - 0, true)) { - si_barrier_after_simple_buffer_op(sctx, flags, dst, src); + 0, true)) return; - } si_cp_dma_copy_buffer(sctx, dst, src, dst_offset, src_offset, size, flags); - si_barrier_after_simple_buffer_op(sctx, flags, dst, src); } void si_compute_shorten_ubyte_buffer(struct si_context *sctx, struct pipe_resource *dst, struct pipe_resource *src, diff --git a/src/gallium/drivers/radeonsi/si_test_dma_perf.c b/src/gallium/drivers/radeonsi/si_test_dma_perf.c index 6f833d1419f..f06afaa62a2 100644 --- a/src/gallium/drivers/radeonsi/si_test_dma_perf.c +++ b/src/gallium/drivers/radeonsi/si_test_dma_perf.c @@ -207,8 +207,11 @@ void si_test_dma_perf(struct si_screen *sscreen) if (method == METHOD_DEFAULT) { if (is_copy) { - si_copy_buffer(sctx, dst, src, dst_offset, src_offset, size, - SI_OP_SYNC_BEFORE_AFTER); + unsigned flags = SI_OP_SYNC_BEFORE_AFTER; + + si_barrier_before_simple_buffer_op(sctx, flags, dst, src); + si_copy_buffer(sctx, dst, src, dst_offset, src_offset, size, flags); + si_barrier_after_simple_buffer_op(sctx, flags, dst, src); } else { sctx->b.clear_buffer(&sctx->b, dst, dst_offset, size, &clear_value, clear_value_size);