Mesa (master): radv: clean up fence syncobj code

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Apr 5 08:13:33 UTC 2021


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

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Wed Mar 31 15:43:06 2021 +0200

radv: clean up fence syncobj code

Since RADV requires DRM 3.35+, this code can be simplified.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9953>

---

 src/amd/vulkan/radv_device.c | 120 ++++++-------------------------------------
 src/amd/vulkan/radv_wsi.c    |  10 +---
 2 files changed, 18 insertions(+), 112 deletions(-)

diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 916f8bf18a5..a860b8cba24 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -4096,15 +4096,8 @@ static VkResult radv_alloc_sem_counts(struct radv_device *device,
 		}
 	}
 
-	if (_fence != VK_NULL_HANDLE) {
-		RADV_FROM_HANDLE(radv_fence, fence, _fence);
-
-		struct radv_fence_part *part =
-			fence->temporary.kind != RADV_FENCE_NONE ?
-			&fence->temporary : &fence->permanent;
-		if (part->kind == RADV_FENCE_SYNCOBJ)
-			counts->syncobj_count++;
-	}
+	if (_fence != VK_NULL_HANDLE)
+		counts->syncobj_count++;
 
 	if (counts->syncobj_count || counts->timeline_syncobj_count) {
 		counts->points = (uint64_t *)malloc(
@@ -4159,8 +4152,7 @@ static VkResult radv_alloc_sem_counts(struct radv_device *device,
 		struct radv_fence_part *part =
 			fence->temporary.kind != RADV_FENCE_NONE ?
 			&fence->temporary : &fence->permanent;
-		if (part->kind == RADV_FENCE_SYNCOBJ)
-			counts->syncobj[non_reset_idx++] = part->syncobj;
+		counts->syncobj[non_reset_idx++] = part->syncobj;
 	}
 
 	assert(MAX2(syncobj_idx, non_reset_idx) <= counts->syncobj_count);
@@ -5747,16 +5739,8 @@ static void
 radv_destroy_fence_part(struct radv_device *device,
 			struct radv_fence_part *part)
 {
-	switch (part->kind) {
-	case RADV_FENCE_NONE:
-		break;
-	case RADV_FENCE_SYNCOBJ:
+	if (part->kind != RADV_FENCE_NONE)
 		device->ws->destroy_syncobj(device->ws, part->syncobj);
-		break;
-	default:
-		unreachable("Invalid fence type");
-	}
-
 	part->kind = RADV_FENCE_NONE;
 }
 
@@ -5822,20 +5806,6 @@ void radv_DestroyFence(
 	radv_destroy_fence(device, pAllocator, fence);
 }
 
-static bool radv_all_fences_syncobj(uint32_t fenceCount, const VkFence *pFences)
-{
-	for (uint32_t i = 0; i < fenceCount; ++i) {
-		RADV_FROM_HANDLE(radv_fence, fence, pFences[i]);
-
-		struct radv_fence_part *part =
-			fence->temporary.kind != RADV_FENCE_NONE ?
-			&fence->temporary : &fence->permanent;
-		if (part->kind != RADV_FENCE_SYNCOBJ)
-			return false;
-	}
-	return true;
-}
-
 VkResult radv_WaitForFences(
 	VkDevice                                    _device,
 	uint32_t                                    fenceCount,
@@ -5844,44 +5814,16 @@ VkResult radv_WaitForFences(
 	uint64_t                                    timeout)
 {
 	RADV_FROM_HANDLE(radv_device, device, _device);
+	uint32_t *handles;
 
 	if (radv_device_is_lost(device))
 		return VK_ERROR_DEVICE_LOST;
 
 	timeout = radv_get_absolute_timeout(timeout);
 
-	if (radv_all_fences_syncobj(fenceCount, pFences))
-	{
-		uint32_t *handles = malloc(sizeof(uint32_t) * fenceCount);
-		if (!handles)
-			return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
-
-		for (uint32_t i = 0; i < fenceCount; ++i) {
-			RADV_FROM_HANDLE(radv_fence, fence, pFences[i]);
-
-			struct radv_fence_part *part =
-				fence->temporary.kind != RADV_FENCE_NONE ?
-				&fence->temporary : &fence->permanent;
-
-			assert(part->kind == RADV_FENCE_SYNCOBJ);
-			handles[i] = part->syncobj;
-		}
-
-		bool success = device->ws->wait_syncobj(device->ws, handles, fenceCount, waitAll, timeout);
-
-		free(handles);
-		return success ? VK_SUCCESS : VK_TIMEOUT;
-	}
-
-	if (!waitAll && fenceCount > 1) {
-		while(radv_get_current_time() <= timeout) {
-			for (uint32_t i = 0; i < fenceCount; ++i) {
-				if (radv_GetFenceStatus(_device, pFences[i]) == VK_SUCCESS)
-					return VK_SUCCESS;
-			}
-		}
-		return VK_TIMEOUT;
-	}
+	handles = malloc(sizeof(uint32_t) * fenceCount);
+	if (!handles)
+		return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
 
 	for (uint32_t i = 0; i < fenceCount; ++i) {
 		RADV_FROM_HANDLE(radv_fence, fence, pFences[i]);
@@ -5890,21 +5832,13 @@ VkResult radv_WaitForFences(
 			fence->temporary.kind != RADV_FENCE_NONE ?
 			&fence->temporary : &fence->permanent;
 
-		switch (part->kind) {
-		case RADV_FENCE_NONE:
-			break;
-		case RADV_FENCE_SYNCOBJ:
-			if (!device->ws->wait_syncobj(device->ws,
-						      &part->syncobj, 1, true,
-						      timeout))
-				return VK_TIMEOUT;
-			break;
-		default:
-			unreachable("Invalid fence type");
-		}
+		assert(part->kind == RADV_FENCE_SYNCOBJ);
+		handles[i] = part->syncobj;
 	}
 
-	return VK_SUCCESS;
+	bool success = device->ws->wait_syncobj(device->ws, handles, fenceCount, waitAll, timeout);
+	free(handles);
+	return success ? VK_SUCCESS : VK_TIMEOUT;
 }
 
 VkResult radv_ResetFences(VkDevice _device,
@@ -5927,15 +5861,7 @@ VkResult radv_ResetFences(VkDevice _device,
 		if (fence->temporary.kind != RADV_FENCE_NONE)
 			radv_destroy_fence_part(device, &fence->temporary);
 
-		struct radv_fence_part *part = &fence->permanent;
-
-		switch (part->kind) {
-		case RADV_FENCE_SYNCOBJ:
-			device->ws->reset_syncobj(device->ws, part->syncobj);
-			break;
-		default:
-			unreachable("Invalid fence type");
-		}
+		device->ws->reset_syncobj(device->ws, fence->permanent.syncobj);
 	}
 
 	return VK_SUCCESS;
@@ -5953,21 +5879,9 @@ VkResult radv_GetFenceStatus(VkDevice _device, VkFence _fence)
 	if (radv_device_is_lost(device))
 		return VK_ERROR_DEVICE_LOST;
 
-	switch (part->kind) {
-	case RADV_FENCE_NONE:
-		break;
-	case RADV_FENCE_SYNCOBJ: {
-		bool success = device->ws->wait_syncobj(device->ws,
-							&part->syncobj, 1, true, 0);
-		if (!success)
-			return VK_NOT_READY;
-		break;
-	}
-	default:
-		unreachable("Invalid fence type");
-	}
-
-	return VK_SUCCESS;
+	bool success = device->ws->wait_syncobj(device->ws,
+						&part->syncobj, 1, true, 0);
+	return success ? VK_SUCCESS : VK_NOT_READY;
 }
 
 
diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c
index 2a500f3429c..da3114b0334 100644
--- a/src/amd/vulkan/radv_wsi.c
+++ b/src/amd/vulkan/radv_wsi.c
@@ -265,15 +265,7 @@ VkResult radv_AcquireNextImage2KHR(
 				fence->temporary.kind != RADV_FENCE_NONE ?
 				&fence->temporary : &fence->permanent;
 
-			switch (part->kind) {
-			case RADV_FENCE_NONE:
-				break;
-			case RADV_FENCE_SYNCOBJ:
-				device->ws->signal_syncobj(device->ws, part->syncobj, 0);
-				break;
-			default:
-				unreachable("Invalid WSI fence type");
-			}
+			device->ws->signal_syncobj(device->ws, part->syncobj, 0);
 		}
 		if (semaphore) {
 			struct radv_semaphore_part *part =



More information about the mesa-commit mailing list