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