summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Liu <haoping.liu@amd.com>2023-12-11 17:42:26 +0800
committerMarge Bot <emma+marge@anholt.net>2024-01-11 19:21:17 +0000
commit74eb5114588b9b4c5fb69c0aa86db929105e1ae8 (patch)
tree1579d31764a0b4db954944bcb438b8ad1e5540f5
parent82314a6dad0e97db86fa6d3cac5e96901d5d19ed (diff)
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.liu@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26841>
-rwxr-xr-xsrc/gallium/drivers/radeonsi/si_vpe.c22
-rwxr-xr-xsrc/gallium/drivers/radeonsi/si_vpe.h1
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;