radeonsi: move barriers out of si_copy_buffer

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31193>
This commit is contained in:
Marek Olšák 2024-08-22 16:33:20 -04:00 committed by Marge Bot
parent 1ee394c34d
commit e805c35986
5 changed files with 22 additions and 11 deletions

View file

@ -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++) {

View file

@ -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;
}

View file

@ -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);

View file

@ -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,

View file

@ -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);