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