Mesa (main): anv,wsi: simplify WSI synchronization
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Dec 17 02:11:37 UTC 2021
Module: Mesa
Branch: main
Commit: b00086d393f3618c36674bfb78113148e71a902a
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b00086d393f3618c36674bfb78113148e71a902a
Author: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Date: Wed Dec 15 11:52:44 2021 +0200
anv,wsi: simplify WSI synchronization
Rather than using 2 vfuncs, use one since we've unified the
synchronization framework in the runtime with a single vk_sync object.
v2 (Jason Ekstrand):
- create_sync_for_memory is now in vk_device
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14237>
---
src/intel/vulkan/anv_wsi.c | 47 ++-------------------------------------------
src/vulkan/wsi/wsi_common.c | 31 +++++++++++++++++++++++-------
src/vulkan/wsi/wsi_common.h | 15 +++++++--------
3 files changed, 33 insertions(+), 60 deletions(-)
diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c
index ccf58b9b1d8..df973b65237 100644
--- a/src/intel/vulkan/anv_wsi.c
+++ b/src/intel/vulkan/anv_wsi.c
@@ -36,47 +36,6 @@ anv_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName)
return vk_instance_get_proc_addr_unchecked(&pdevice->instance->vk, pName);
}
-static void
-anv_wsi_signal_semaphore_for_memory(VkDevice _device,
- VkSemaphore _semaphore,
- VkDeviceMemory _memory)
-{
- ANV_FROM_HANDLE(anv_device, device, _device);
- VK_FROM_HANDLE(vk_semaphore, semaphore, _semaphore);
- ANV_FROM_HANDLE(anv_device_memory, memory, _memory);
- ASSERTED VkResult result;
-
- /* Put a BO semaphore with the image BO in the temporary. For BO binary
- * semaphores, we always set EXEC_OBJECT_WRITE so this creates a WaR
- * hazard with the display engine's read to ensure that no one writes to
- * the image before the read is complete.
- */
- vk_semaphore_reset_temporary(&device->vk, semaphore);
-
- result = anv_sync_create_for_bo(device, memory->bo, &semaphore->temporary);
- assert(result == VK_SUCCESS);
-}
-
-static void
-anv_wsi_signal_fence_for_memory(VkDevice _device,
- VkFence _fence,
- VkDeviceMemory _memory)
-{
- ANV_FROM_HANDLE(anv_device, device, _device);
- VK_FROM_HANDLE(vk_fence, fence, _fence);
- ANV_FROM_HANDLE(anv_device_memory, memory, _memory);
- ASSERTED VkResult result;
-
- /* Put a BO fence with the image BO in the temporary. For BO fences, we
- * always just wait until the BO isn't busy and reads from the BO should
- * count as busy.
- */
- vk_fence_reset_temporary(&device->vk, fence);
-
- result = anv_sync_create_for_bo(device, memory->bo, &fence->temporary);
- assert(result == VK_SUCCESS);
-}
-
VkResult
anv_init_wsi(struct anv_physical_device *physical_device)
{
@@ -93,10 +52,8 @@ anv_init_wsi(struct anv_physical_device *physical_device)
return result;
physical_device->wsi_device.supports_modifiers = true;
- physical_device->wsi_device.signal_semaphore_for_memory =
- anv_wsi_signal_semaphore_for_memory;
- physical_device->wsi_device.signal_fence_for_memory =
- anv_wsi_signal_fence_for_memory;
+ physical_device->wsi_device.signal_semaphore_with_memory = true;
+ physical_device->wsi_device.signal_fence_with_memory = true;
physical_device->vk.wsi_device = &physical_device->wsi_device;
diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c
index 2d18d4c62e1..03b094713e3 100644
--- a/src/vulkan/wsi/wsi_common.c
+++ b/src/vulkan/wsi/wsi_common.c
@@ -27,9 +27,11 @@
#include "util/os_file.h"
#include "util/xmlconfig.h"
#include "vk_device.h"
+#include "vk_fence.h"
#include "vk_instance.h"
#include "vk_physical_device.h"
#include "vk_queue.h"
+#include "vk_semaphore.h"
#include "vk_util.h"
#include <time.h>
@@ -620,11 +622,12 @@ wsi_AcquireNextImageKHR(VkDevice _device,
VkResult
wsi_common_acquire_next_image2(const struct wsi_device *wsi,
- VkDevice device,
+ VkDevice _device,
const VkAcquireNextImageInfoKHR *pAcquireInfo,
uint32_t *pImageIndex)
{
VK_FROM_HANDLE(wsi_swapchain, swapchain, pAcquireInfo->swapchain);
+ VK_FROM_HANDLE(vk_device, device, _device);
VkResult result = swapchain->acquire_next_image(swapchain, pAcquireInfo,
pImageIndex);
@@ -637,19 +640,33 @@ wsi_common_acquire_next_image2(const struct wsi_device *wsi,
}
if (pAcquireInfo->semaphore != VK_NULL_HANDLE &&
- wsi->signal_semaphore_for_memory != NULL) {
+ wsi->signal_semaphore_with_memory) {
+ VK_FROM_HANDLE(vk_semaphore, semaphore, pAcquireInfo->semaphore);
struct wsi_image *image =
swapchain->get_wsi_image(swapchain, *pImageIndex);
- wsi->signal_semaphore_for_memory(device, pAcquireInfo->semaphore,
- image->memory);
+
+ vk_semaphore_reset_temporary(device, semaphore);
+ VkResult lresult =
+ device->create_sync_for_memory(device, image->memory,
+ false /* signal_memory */,
+ &semaphore->temporary);
+ if (lresult != VK_SUCCESS)
+ return lresult;
}
if (pAcquireInfo->fence != VK_NULL_HANDLE &&
- wsi->signal_fence_for_memory != NULL) {
+ wsi->signal_fence_with_memory) {
+ VK_FROM_HANDLE(vk_fence, fence, pAcquireInfo->fence);
struct wsi_image *image =
swapchain->get_wsi_image(swapchain, *pImageIndex);
- wsi->signal_fence_for_memory(device, pAcquireInfo->fence,
- image->memory);
+
+ vk_fence_reset_temporary(device, fence);
+ VkResult lresult =
+ device->create_sync_for_memory(device, image->memory,
+ false /* signal_memory */,
+ &fence->temporary);
+ if (lresult != VK_SUCCESS)
+ return lresult;
}
return result;
diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
index 63f21ef698b..d2d0c2612b2 100644
--- a/src/vulkan/wsi/wsi_common.h
+++ b/src/vulkan/wsi/wsi_common.h
@@ -135,19 +135,18 @@ struct wsi_device {
/* Signals the semaphore such that any wait on the semaphore will wait on
* any reads or writes on the give memory object. This is used to
- * implement the semaphore signal operation in vkAcquireNextImage.
+ * implement the semaphore signal operation in vkAcquireNextImage. This
+ * requires the driver to implement vk_device::create_sync_for_memory.
*/
- void (*signal_semaphore_for_memory)(VkDevice device,
- VkSemaphore semaphore,
- VkDeviceMemory memory);
+ bool signal_semaphore_with_memory;
/* Signals the fence such that any wait on the fence will wait on any reads
* or writes on the give memory object. This is used to implement the
- * semaphore signal operation in vkAcquireNextImage.
+ * semaphore signal operation in vkAcquireNextImage. This requires the
+ * driver to implement vk_device::create_sync_for_memory. The resulting
+ * vk_sync must support CPU waits.
*/
- void (*signal_fence_for_memory)(VkDevice device,
- VkFence fence,
- VkDeviceMemory memory);
+ bool signal_fence_with_memory;
/*
* This sets the ownership for a WSI memory object:
More information about the mesa-commit
mailing list