Module: Mesa
Branch: main
Commit: 32fa9bed1223ff3636c39b416d9df9ff28d33389
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=32fa9bed1223ff3636c39b416d9df9ff28d33389

Author: Rob Clark <[email protected]>
Date:   Sat Oct 28 08:17:49 2023 -0700

freedreno/drm: Add BO metadata support

This will be used as a back-channel between vk and gallium to
communicate image layout metadata.

Signed-off-by: Rob Clark <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25945>

---

 src/freedreno/drm/freedreno_bo.c    | 16 ++++++++++++++++
 src/freedreno/drm/freedreno_drmif.h |  2 ++
 src/freedreno/drm/freedreno_priv.h  |  3 +++
 src/freedreno/drm/msm/msm_bo.c      | 38 +++++++++++++++++++++++++++++++++++++
 4 files changed, 59 insertions(+)

diff --git a/src/freedreno/drm/freedreno_bo.c b/src/freedreno/drm/freedreno_bo.c
index 3a52fc56c8d..30410544565 100644
--- a/src/freedreno/drm/freedreno_bo.c
+++ b/src/freedreno/drm/freedreno_bo.c
@@ -602,6 +602,22 @@ fd_bo_is_cached(struct fd_bo *bo)
    return !!(bo->alloc_flags & FD_BO_CACHED_COHERENT);
 }
 
+void
+fd_bo_set_metadata(struct fd_bo *bo, void *metadata, uint32_t metadata_size)
+{
+   if (!bo->funcs->set_metadata)
+      return;
+   bo->funcs->set_metadata(bo, metadata, metadata_size);
+}
+
+int
+fd_bo_get_metadata(struct fd_bo *bo, void *metadata, uint32_t metadata_size)
+{
+   if (!bo->funcs->get_metadata)
+      return -ENOSYS;
+   return bo->funcs->get_metadata(bo, metadata, metadata_size);
+}
+
 void *
 fd_bo_map_os_mmap(struct fd_bo *bo)
 {
diff --git a/src/freedreno/drm/freedreno_drmif.h 
b/src/freedreno/drm/freedreno_drmif.h
index b86b6c570e8..30490b12c30 100644
--- a/src/freedreno/drm/freedreno_drmif.h
+++ b/src/freedreno/drm/freedreno_drmif.h
@@ -309,6 +309,8 @@ void fd_bo_upload(struct fd_bo *bo, void *src, unsigned 
off, unsigned len);
 bool fd_bo_prefer_upload(struct fd_bo *bo, unsigned len);
 int fd_bo_cpu_prep(struct fd_bo *bo, struct fd_pipe *pipe, uint32_t op);
 bool fd_bo_is_cached(struct fd_bo *bo);
+void fd_bo_set_metadata(struct fd_bo *bo, void *metadata, uint32_t 
metadata_size);
+int fd_bo_get_metadata(struct fd_bo *bo, void *metadata, uint32_t 
metadata_size);
 
 #ifdef __cplusplus
 } /* end of extern "C" */
diff --git a/src/freedreno/drm/freedreno_priv.h 
b/src/freedreno/drm/freedreno_priv.h
index 9fd12fa22a1..7f213a243c8 100644
--- a/src/freedreno/drm/freedreno_priv.h
+++ b/src/freedreno/drm/freedreno_priv.h
@@ -455,6 +455,9 @@ struct fd_bo_funcs {
     * Optional, if upload is supported, should upload be preferred?
     */
    bool (*prefer_upload)(struct fd_bo *bo, unsigned len);
+
+   void (*set_metadata)(struct fd_bo *bo, void *metadata, uint32_t 
metadata_size);
+   int (*get_metadata)(struct fd_bo *bo, void *metadata, uint32_t 
metadata_size);
 };
 
 void fd_bo_add_fence(struct fd_bo *bo, struct fd_fence *fence);
diff --git a/src/freedreno/drm/msm/msm_bo.c b/src/freedreno/drm/msm/msm_bo.c
index 424aef1bf40..d0e2991b97c 100644
--- a/src/freedreno/drm/msm/msm_bo.c
+++ b/src/freedreno/drm/msm/msm_bo.c
@@ -136,6 +136,42 @@ msm_bo_set_name(struct fd_bo *bo, const char *fmt, va_list 
ap)
    drmCommandWrite(bo->dev->fd, DRM_MSM_GEM_INFO, &req, sizeof(req));
 }
 
+static void
+msm_bo_set_metadata(struct fd_bo *bo, void *metadata, uint32_t metadata_size)
+{
+   struct drm_msm_gem_info req = {
+      .handle = bo->handle,
+      .info = MSM_INFO_SET_METADATA,
+      .value = (uintptr_t)(void *)metadata,
+      .len = metadata_size,
+   };
+
+   int ret = drmCommandWrite(bo->dev->fd, DRM_MSM_GEM_INFO, &req, sizeof(req));
+   if (ret) {
+      mesa_logw_once("Failed to set BO metadata with DRM_MSM_GEM_INFO: %d",
+                     ret);
+   }
+}
+
+static int
+msm_bo_get_metadata(struct fd_bo *bo, void *metadata, uint32_t metadata_size)
+{
+   struct drm_msm_gem_info req = {
+      .handle = bo->handle,
+      .info = MSM_INFO_GET_METADATA,
+      .value = (uintptr_t)(void *)metadata,
+      .len = metadata_size,
+   };
+
+   int ret = drmCommandWrite(bo->dev->fd, DRM_MSM_GEM_INFO, &req, sizeof(req));
+   if (ret) {
+      mesa_logw_once("Failed to get BO metadata with DRM_MSM_GEM_INFO: %d",
+                     ret);
+   }
+
+   return ret;
+}
+
 static const struct fd_bo_funcs funcs = {
    .offset = msm_bo_offset,
    .map = fd_bo_map_os_mmap,
@@ -143,6 +179,8 @@ static const struct fd_bo_funcs funcs = {
    .madvise = msm_bo_madvise,
    .iova = msm_bo_iova,
    .set_name = msm_bo_set_name,
+   .set_metadata = msm_bo_set_metadata,
+   .get_metadata = msm_bo_get_metadata,
    .dmabuf = fd_bo_dmabuf_drm,
    .destroy = fd_bo_fini_common,
 };

Reply via email to