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;
 

Reply via email to