[Mesa-dev] [RFC 20/21] anv/gem: Add a drm syncobj support
Jason Ekstrand
jason at jlekstrand.net
Fri Apr 14 17:38:07 UTC 2017
---
src/intel/vulkan/anv_gem.c | 79 ++++++++++++++++++++++++++++++++++++++++
src/intel/vulkan/anv_gem_stubs.c | 24 ++++++++++++
src/intel/vulkan/anv_private.h | 4 ++
3 files changed, 107 insertions(+)
diff --git a/src/intel/vulkan/anv_gem.c b/src/intel/vulkan/anv_gem.c
index e331fbb..6db15ba 100644
--- a/src/intel/vulkan/anv_gem.c
+++ b/src/intel/vulkan/anv_gem.c
@@ -449,3 +449,82 @@ anv_gem_sync_file_merge(struct anv_device *device, int fd1, int fd2)
return args.fence;
}
+
+#define DRM_IOCTL_SYNCOBJ_CREATE DRM_IOWR(0xBF, struct drm_syncobj_create_info)
+#define DRM_IOCTL_SYNCOBJ_DESTROY DRM_IOWR(0xC0, struct drm_syncobj_destroy)
+#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD DRM_IOWR(0xC1, struct drm_syncobj_handle)
+#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE DRM_IOWR(0xC2, struct drm_syncobj_handle)
+#define DRM_IOCTL_SYNCOBJ_INFO DRM_IOWR(0xC3, struct drm_syncobj_create_info)
+
+struct drm_syncobj_create_info {
+ __u32 handle;
+ __u32 type;
+ __u32 flags;
+ __u32 pad;
+};
+
+struct drm_syncobj_destroy {
+ __u32 handle;
+ __u32 pad;
+};
+
+struct drm_syncobj_handle {
+ __u32 handle;
+ /** Flags.. only applicable for handle->fd */
+ __u32 flags;
+
+ __s32 fd;
+};
+
+uint32_t
+anv_gem_syncobj_create(struct anv_device *device)
+{
+ struct drm_syncobj_create_info args = {
+ .type = 1 /* SYNC_FILE_TYPE_SEMAPHORE */,
+ .flags = 0,
+ };
+
+ int ret = anv_ioctl(device->fd, DRM_IOCTL_SYNCOBJ_CREATE, &args);
+ if (ret)
+ return 0;
+
+ return args.handle;
+}
+
+void
+anv_gem_syncobj_close(struct anv_device *device, uint32_t handle)
+{
+ struct drm_syncobj_destroy args = {
+ .handle = handle,
+ };
+
+ anv_ioctl(device->fd, DRM_IOCTL_SYNCOBJ_DESTROY, &args);
+}
+
+int
+anv_gem_syncobj_handle_to_fd(struct anv_device *device, uint32_t handle)
+{
+ struct drm_syncobj_handle args = {
+ .handle = handle,
+ };
+
+ int ret = anv_ioctl(device->fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, &args);
+ if (ret)
+ return -1;
+
+ return args.fd;
+}
+
+uint32_t
+anv_gem_syncobj_fd_to_handle(struct anv_device *device, int fd)
+{
+ struct drm_syncobj_handle args = {
+ .fd = fd,
+ };
+
+ int ret = anv_ioctl(device->fd, DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, &args);
+ if (ret)
+ return 0;
+
+ return args.handle;
+}
diff --git a/src/intel/vulkan/anv_gem_stubs.c b/src/intel/vulkan/anv_gem_stubs.c
index d93009f..e3998b9 100644
--- a/src/intel/vulkan/anv_gem_stubs.c
+++ b/src/intel/vulkan/anv_gem_stubs.c
@@ -187,3 +187,27 @@ anv_gem_fd_to_handle(struct anv_device *device, int fd)
{
unreachable("Unused");
}
+
+uint32_t
+anv_gem_syncobj_create(struct anv_device *device)
+{
+ unreachable("Unused");
+}
+
+void
+anv_gem_syncobj_close(struct anv_device *device, uint32_t handle)
+{
+ unreachable("Unused");
+}
+
+int
+anv_gem_syncobj_handle_to_fd(struct anv_device *device, uint32_t handle)
+{
+ unreachable("Unused");
+}
+
+uint32_t
+anv_gem_syncobj_fd_to_handle(struct anv_device *device, int fd)
+{
+ unreachable("Unused");
+}
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index b99c93c..d1406ab 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -802,6 +802,10 @@ int anv_gem_set_domain(struct anv_device *device, uint32_t gem_handle,
int anv_gem_sync_file_merge(struct anv_device *device, int fd1, int fd2);
int anv_gem_set_context_param(struct anv_device *device,
uint64_t param, uint64_t value);
+uint32_t anv_gem_syncobj_create(struct anv_device *device);
+void anv_gem_syncobj_close(struct anv_device *device, uint32_t handle);
+int anv_gem_syncobj_handle_to_fd(struct anv_device *device, uint32_t handle);
+uint32_t anv_gem_syncobj_fd_to_handle(struct anv_device *device, int fd);
VkResult anv_bo_init_new(struct anv_bo *bo, struct anv_device *device, uint64_t size);
--
2.5.0.400.gff86faf
More information about the mesa-dev
mailing list