intel/gem: Add an intel_gem_supports_dma_buf_sync_file() helper

Acked-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36783>
This commit is contained in:
Faith Ekstrand 2025-08-14 16:18:26 -04:00
parent 8044f16bd6
commit d7416ebc19
2 changed files with 56 additions and 0 deletions

View file

@ -27,6 +27,9 @@
#include "i915/intel_engine.h"
#include "drm-uapi/i915_drm.h"
#include "drm-uapi/dma-buf.h"
#include <fcntl.h>
bool
i915_gem_create_context(int fd, uint32_t *context_id)
@ -309,3 +312,55 @@ i915_gem_can_render_on_fd(int fd)
int val;
return intel_gem_get_param(fd, I915_PARAM_CHIPSET_ID, &val) && val > 0;
}
bool
i915_gem_supports_dma_buf_sync_file(int fd)
{
uint32_t handle = 0;
int err = 0, dma_buf_fd = -1;
struct drm_i915_gem_create gem_create = {
.size = 64 << 10,
};
if (intel_ioctl(fd, DRM_IOCTL_I915_GEM_CREATE, &gem_create))
return false;
handle = gem_create.handle;
struct drm_prime_handle handle_to_fd = {
.handle = handle,
.flags = DRM_CLOEXEC | DRM_RDWR,
};
err = intel_ioctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &handle_to_fd);
if (err)
goto fail;
dma_buf_fd = handle_to_fd.fd;
struct dma_buf_export_sync_file export = {
.flags = DMA_BUF_SYNC_RW,
.fd = -1,
};
err = intel_ioctl(dma_buf_fd, DMA_BUF_IOCTL_EXPORT_SYNC_FILE, &export);
if (err)
goto fail;
struct dma_buf_import_sync_file import = {
.flags = DMA_BUF_SYNC_RW,
.fd = export.fd,
};
err = intel_ioctl(dma_buf_fd, DMA_BUF_IOCTL_IMPORT_SYNC_FILE, &import);
close(export.fd);
fail:
if (dma_buf_fd >= 0)
close(dma_buf_fd);
if (handle != 0) {
struct drm_gem_close gem_close = { .handle = handle };
err = intel_ioctl(fd, DRM_IOCTL_GEM_CLOSE, &gem_close);
assert(err == 0);
}
return !err;
}

View file

@ -50,6 +50,7 @@ i915_gem_create_context_ext(int fd,
bool i915_gem_supports_protected_context(int fd);
bool i915_gem_get_param(int fd, uint32_t param, int *value);
bool i915_gem_can_render_on_fd(int fd);
bool i915_gem_supports_dma_buf_sync_file(int fd);
/**
* A wrapper around DRM_IOCTL_I915_QUERY