Mesa (master): radv: Add winsys functions for timeline syncobj.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jul 23 17:49:27 UTC 2020


Module: Mesa
Branch: master
Commit: 55d8022878fd11093c861a6386734f88454f21b1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=55d8022878fd11093c861a6386734f88454f21b1

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Thu Jul 16 02:43:32 2020 +0200

radv: Add winsys functions for timeline syncobj.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5600>

---

 src/amd/vulkan/radv_device.c                  |  2 +-
 src/amd/vulkan/radv_radeon_winsys.h           |  5 ++-
 src/amd/vulkan/radv_wsi.c                     |  4 +--
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 52 +++++++++++++++++++++++++--
 4 files changed, 57 insertions(+), 6 deletions(-)

diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index a5a0c73560f..4145e25f5da 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -7325,7 +7325,7 @@ static VkResult radv_import_sync_fd(struct radv_device *device,
 		}
 	} else {
 		if (fd == -1)
-			device->ws->signal_syncobj(device->ws, syncobj_handle);
+			device->ws->signal_syncobj(device->ws, syncobj_handle, 0);
 	}
 
 	if (fd != -1) {
diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h
index 2741870abca..da410e5ef63 100644
--- a/src/amd/vulkan/radv_radeon_winsys.h
+++ b/src/amd/vulkan/radv_radeon_winsys.h
@@ -328,9 +328,12 @@ struct radeon_winsys {
 	void (*destroy_syncobj)(struct radeon_winsys *ws, uint32_t handle);
 
 	void (*reset_syncobj)(struct radeon_winsys *ws, uint32_t handle);
-	void (*signal_syncobj)(struct radeon_winsys *ws, uint32_t handle);
+	void (*signal_syncobj)(struct radeon_winsys *ws, uint32_t handle, uint64_t point);
+	VkResult (*query_syncobj)(struct radeon_winsys *ws, uint32_t handle, uint64_t *point);
 	bool (*wait_syncobj)(struct radeon_winsys *ws, const uint32_t *handles, uint32_t handle_count,
 			     bool wait_all, uint64_t timeout);
+	bool (*wait_timeline_syncobj)(struct radeon_winsys *ws, const uint32_t *handles, const uint64_t *points,
+	                              uint32_t handle_count, bool wait_all, bool available, uint64_t timeout);
 
 	int (*export_syncobj)(struct radeon_winsys *ws, uint32_t syncobj, int *fd);
 	int (*import_syncobj)(struct radeon_winsys *ws, int fd, uint32_t *syncobj);
diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c
index ff05324caf3..0c9c8593783 100644
--- a/src/amd/vulkan/radv_wsi.c
+++ b/src/amd/vulkan/radv_wsi.c
@@ -270,7 +270,7 @@ VkResult radv_AcquireNextImage2KHR(
 				device->ws->signal_fence(part->fence);
 				break;
 			case RADV_FENCE_SYNCOBJ:
-				device->ws->signal_syncobj(device->ws, part->syncobj);
+				device->ws->signal_syncobj(device->ws, part->syncobj, 0);
 				break;
 			default:
 				unreachable("Invalid WSI fence type");
@@ -289,7 +289,7 @@ VkResult radv_AcquireNextImage2KHR(
 			case RADV_SEMAPHORE_TIMELINE:
 				unreachable("WSI only allows binary semaphores.");
 			case RADV_SEMAPHORE_SYNCOBJ:
-				device->ws->signal_syncobj(device->ws, part->syncobj);
+				device->ws->signal_syncobj(device->ws, part->syncobj, 0);
 				break;
 			}
 		}
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
index 4265ca5ad9b..79e5d8daa6d 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
@@ -1832,10 +1832,30 @@ static void radv_amdgpu_reset_syncobj(struct radeon_winsys *_ws,
 }
 
 static void radv_amdgpu_signal_syncobj(struct radeon_winsys *_ws,
-				    uint32_t handle)
+				    uint32_t handle, uint64_t point)
+{
+	struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws);
+	if (point)
+		amdgpu_cs_syncobj_timeline_signal(ws->dev, &handle, &point, 1);
+	else
+		amdgpu_cs_syncobj_signal(ws->dev, &handle, 1);
+}
+
+static VkResult radv_amdgpu_query_syncobj(struct radeon_winsys *_ws,
+                                      uint32_t handle, uint64_t *point)
 {
 	struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws);
-	amdgpu_cs_syncobj_signal(ws->dev, &handle, 1);
+	int ret = amdgpu_cs_syncobj_query(ws->dev, &handle, point, 1);
+	if (ret == 0)
+		return VK_SUCCESS;
+	else if (ret == -ENOMEM)
+		return VK_ERROR_OUT_OF_HOST_MEMORY;
+	else {
+		/* Remaining error are driver internal issues: EFAULT for
+		 * dangling pointers and ENOENT for non-existing syncobj. */
+		fprintf(stderr, "amdgpu: internal error in radv_amdgpu_query_syncobj. (%d)\n", ret);
+		return VK_ERROR_UNKNOWN;
+	}
 }
 
 static bool radv_amdgpu_wait_syncobj(struct radeon_winsys *_ws, const uint32_t *handles,
@@ -1861,6 +1881,32 @@ static bool radv_amdgpu_wait_syncobj(struct radeon_winsys *_ws, const uint32_t *
 	}
 }
 
+static bool radv_amdgpu_wait_timeline_syncobj(struct radeon_winsys *_ws, const uint32_t *handles,
+                                              const uint64_t *points, uint32_t handle_count,
+                                              bool wait_all, bool available, uint64_t timeout)
+{
+	struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws);
+
+	/* The timeouts are signed, while vulkan timeouts are unsigned. */
+	timeout = MIN2(timeout, INT64_MAX);
+
+	int ret = amdgpu_cs_syncobj_timeline_wait(ws->dev, (uint32_t*)handles, (uint64_t*)points,
+	                                          handle_count, timeout,
+	                                          DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT |
+	                                          (wait_all ? DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL : 0) |
+	                                          (available ? DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE : 0),
+	                                          NULL);
+	if (ret == 0) {
+		return true;
+	} else if (ret == -ETIME) {
+		return false;
+	} else {
+		fprintf(stderr, "amdgpu: radv_amdgpu_wait_syncobj failed! (%d)\n", errno);
+		return false;
+	}
+}
+
+
 static int radv_amdgpu_export_syncobj(struct radeon_winsys *_ws,
 				      uint32_t syncobj,
 				      int *fd)
@@ -1923,7 +1969,9 @@ void radv_amdgpu_cs_init_functions(struct radv_amdgpu_winsys *ws)
 	ws->base.destroy_syncobj = radv_amdgpu_destroy_syncobj;
 	ws->base.reset_syncobj = radv_amdgpu_reset_syncobj;
 	ws->base.signal_syncobj = radv_amdgpu_signal_syncobj;
+	ws->base.query_syncobj = radv_amdgpu_query_syncobj;
 	ws->base.wait_syncobj = radv_amdgpu_wait_syncobj;
+	ws->base.wait_timeline_syncobj = radv_amdgpu_wait_timeline_syncobj;
 	ws->base.export_syncobj = radv_amdgpu_export_syncobj;
 	ws->base.import_syncobj = radv_amdgpu_import_syncobj;
 	ws->base.export_syncobj_to_sync_file = radv_amdgpu_export_syncobj_to_sync_file;



More information about the mesa-commit mailing list