mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-22 14:00:37 +02:00
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:
parent
8044f16bd6
commit
d7416ebc19
2 changed files with 56 additions and 0 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue