Module: Mesa Branch: main Commit: 74eb5114588b9b4c5fb69c0aa86db929105e1ae8 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=74eb5114588b9b4c5fb69c0aa86db929105e1ae8
Author: Alan Liu <haoping....@amd.com> Date: Mon Dec 11 17:42:26 2023 +0800 radeonsi/vpe: Don't map and unmap emb_buffer every time in process_frame We don't need to map and unmap emb_buffers every time in process_frame. Instead, we can just map the buffers at create_processor and unmap at process_destroy, and reuse the mapped address in process_frame. v2: Remove RADEON_MAP_TEMPORARY flag when calling buffer_map(). Signed-off-by: Alan Liu <haoping....@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26841> --- src/gallium/drivers/radeonsi/si_vpe.c | 22 +++++++++++++++++----- src/gallium/drivers/radeonsi/si_vpe.h | 1 + 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_vpe.c b/src/gallium/drivers/radeonsi/si_vpe.c index 9d31a58eba2..79256c33b22 100755 --- a/src/gallium/drivers/radeonsi/si_vpe.c +++ b/src/gallium/drivers/radeonsi/si_vpe.c @@ -647,11 +647,15 @@ si_vpe_processor_destroy(struct pipe_video_codec *codec) } if (vpeproc->emb_buffers) { for (i = 0; i < vpeproc->bufs_num; i++) { - if (vpeproc->emb_buffers[i].res) + if (vpeproc->emb_buffers[i].res) { + vpeproc->ws->buffer_unmap(vpeproc->ws, vpeproc->emb_buffers[i].res->buf); si_vid_destroy_buffer(&vpeproc->emb_buffers[i]); + } } FREE(vpeproc->emb_buffers); } + if (vpeproc->mapped_cpu_va) + FREE(vpeproc->mapped_cpu_va); vpeproc->bufs_num = 0; SIVPE_DBG(vpeproc->log_level, "Success\n"); @@ -813,9 +817,7 @@ si_vpe_processor_process_frame(struct pipe_video_codec *codec, vpeproc->vpe_build_bufs->cmd_buf.tmz = false; emb_buf = &vpeproc->emb_buffers[vpeproc->cur_buf]; - vpe_ptr = (uint64_t *)vpeproc->ws->buffer_map(vpeproc->ws, emb_buf->res->buf, - &vpeproc->cs, PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY); - vpeproc->vpe_build_bufs->emb_buf.cpu_va = (uintptr_t)vpe_ptr; + vpeproc->vpe_build_bufs->emb_buf.cpu_va = (uintptr_t)vpeproc->mapped_cpu_va[vpeproc->cur_buf]; vpeproc->vpe_build_bufs->emb_buf.gpu_va = vpeproc->ws->buffer_get_virtual_address(emb_buf->res->buf); vpeproc->vpe_build_bufs->emb_buf.size = VPE_EMBBUF_SIZE; vpeproc->vpe_build_bufs->emb_buf.tmz = false; @@ -926,7 +928,6 @@ si_vpe_processor_process_frame(struct pipe_video_codec *codec, vpeproc->cs.current.cdw += (vpeproc->vpe_build_bufs->cmd_buf.size / 4); /* Add embbuf into bo_handle list */ - vpeproc->ws->buffer_unmap(vpeproc->ws, emb_buf->res->buf); vpeproc->ws->cs_add_buffer(&vpeproc->cs, emb_buf->res->buf, RADEON_USAGE_READ | RADEON_USAGE_SYNCHRONIZED, RADEON_DOMAIN_GTT); si_vpe_cs_add_surface_buffer(vpeproc, vpeproc->src_surfaces, RADEON_USAGE_READ); @@ -1067,12 +1068,23 @@ si_vpe_create_processor(struct pipe_context *context, const struct pipe_video_co } else SIVPE_INFO(vpeproc->log_level, "Number of emb_buf is %d\n", vpeproc->bufs_num); + vpeproc->mapped_cpu_va = (void **)CALLOC(vpeproc->bufs_num, sizeof(void *)); + if (!vpeproc->mapped_cpu_va) { + SIVPE_ERR("Can't allocated mapped_cpu_va for emb_buf buffers.\n"); + goto fail; + } + for (i = 0; i < vpeproc->bufs_num; i++) { if (!si_vid_create_buffer(vpeproc->screen, &vpeproc->emb_buffers[i], VPE_EMBBUF_SIZE, PIPE_USAGE_DEFAULT)) { SIVPE_ERR("Can't allocated emb_buf buffers.\n"); goto fail; } si_vid_clear_buffer(context, &vpeproc->emb_buffers[i]); + + vpeproc->mapped_cpu_va[i] = vpeproc->ws->buffer_map(vpeproc->ws, vpeproc->emb_buffers[i].res->buf, + &vpeproc->cs, PIPE_MAP_WRITE); + if (!vpeproc->mapped_cpu_va[i]) + goto fail; } /* Create VPE parameters structure */ diff --git a/src/gallium/drivers/radeonsi/si_vpe.h b/src/gallium/drivers/radeonsi/si_vpe.h index 590f1bd7754..dccd799cbdb 100755 --- a/src/gallium/drivers/radeonsi/si_vpe.h +++ b/src/gallium/drivers/radeonsi/si_vpe.h @@ -56,6 +56,7 @@ struct vpe_video_processor { uint8_t bufs_num; uint8_t cur_buf; struct rvid_buffer *emb_buffers; + void **mapped_cpu_va; struct pipe_fence_handle *process_fence;