lavapipe: Go back to manually signaling in lvp_AcquireNextImage2()
authorJason Ekstrand <jason.ekstrand@collabora.com>
Wed, 6 Apr 2022 15:50:10 +0000 (10:50 -0500)
committerMarge Bot <emma+marge@anholt.net>
Wed, 6 Apr 2022 18:30:51 +0000 (18:30 +0000)
When porting lavapipe to the common sync framework, I stole the dummy
sync signal_for_memory idea from RADV but didn't actually do it
correctly.  Unless you set wsi_device::signal_semaphore_with_memory and
wsi_device::signal_fence_with_memory, it doesn't actually signal
anything.  If you do set those, it works but also results in dummy
syncs being created for present fences which we see as signals.  We
could choose to just skip those like RADV does but that's too magic.
Instead, have our own AcquireNextImage2() again which sets dummy syncs.

Fixes: 3b547a9b5816 ("lavapipe: Switch to the common sync framework")
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15774>

src/gallium/frontends/lavapipe/lvp_device.c
src/gallium/frontends/lavapipe/lvp_wsi.c

index f646481944423a35f2f8867befa34afd697e45ba..fda0eed7053d338f3fbf1370075eb8534e39806f 100644 (file)
@@ -26,7 +26,6 @@
 #include "pipe-loader/pipe_loader.h"
 #include "git_sha1.h"
 #include "vk_cmd_enqueue_entrypoints.h"
-#include "vk_sync_dummy.h"
 #include "vk_util.h"
 #include "pipe/p_config.h"
 #include "pipe/p_defines.h"
@@ -1463,15 +1462,6 @@ unref_pipeline_layout(struct vk_device *vk_device, VkPipelineLayout _layout)
    lvp_pipeline_layout_unref(device, layout);
 }
 
-static VkResult
-lvp_create_sync_for_memory(struct vk_device *device,
-                           VkDeviceMemory memory,
-                           bool signal_memory,
-                           struct vk_sync **sync_out)
-{
-   return vk_sync_create(device, &vk_sync_dummy_type, 0, 1, sync_out);
-}
-
 VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateDevice(
    VkPhysicalDevice                            physicalDevice,
    const VkDeviceCreateInfo*                   pCreateInfo,
@@ -1516,7 +1506,6 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateDevice(
    device->instance = (struct lvp_instance *)physical_device->vk.instance;
    device->physical_device = physical_device;
 
-   device->vk.create_sync_for_memory = lvp_create_sync_for_memory;
    device->vk.ref_pipeline_layout = ref_pipeline_layout;
    device->vk.unref_pipeline_layout = unref_pipeline_layout;
 
index 39d4f826fa8e416186423073fe793254302d3493..333241ac97a706656395927c632129290910e5bc 100644 (file)
 
 #include "lvp_wsi.h"
 
+#include "vk_fence.h"
+#include "vk_semaphore.h"
+#include "vk_sync_dummy.h"
+
 static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
 lvp_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName)
 {
@@ -55,3 +59,42 @@ lvp_finish_wsi(struct lvp_physical_device *physical_device)
    wsi_device_finish(&physical_device->wsi_device,
                      &physical_device->vk.instance->alloc);
 }
+
+VKAPI_ATTR VkResult VKAPI_CALL lvp_AcquireNextImage2KHR(
+   VkDevice                                     _device,
+   const VkAcquireNextImageInfoKHR*             pAcquireInfo,
+   uint32_t*                                    pImageIndex)
+{
+   LVP_FROM_HANDLE(lvp_device, device, _device);
+   struct lvp_physical_device *pdevice = device->physical_device;
+
+   VkResult result = wsi_common_acquire_next_image2(&pdevice->wsi_device,
+                                                    _device,
+                                                    pAcquireInfo,
+                                                    pImageIndex);
+
+   VK_FROM_HANDLE(vk_fence, fence, pAcquireInfo->fence);
+   VK_FROM_HANDLE(vk_semaphore, sem, pAcquireInfo->semaphore);
+   if (result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR) {
+      VkResult sync_res;
+      if (fence) {
+         vk_fence_reset_temporary(&device->vk, fence);
+         sync_res = vk_sync_create(&device->vk, &vk_sync_dummy_type,
+                                   0 /* flags */, 0 /* initial_value */,
+                                   &fence->temporary);
+         if (sync_res != VK_SUCCESS)
+            return sync_res;
+      }
+
+      if (sem) {
+         vk_semaphore_reset_temporary(&device->vk, sem);
+         sync_res = vk_sync_create(&device->vk, &vk_sync_dummy_type,
+                                   0 /* flags */, 0 /* initial_value */,
+                                   &sem->temporary);
+         if (sync_res != VK_SUCCESS)
+            return sync_res;
+      }
+   }
+
+   return result;
+}