diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index f6464819444..fda0eed7053 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -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; diff --git a/src/gallium/frontends/lavapipe/lvp_wsi.c b/src/gallium/frontends/lavapipe/lvp_wsi.c index 39d4f826fa8..333241ac97a 100644 --- a/src/gallium/frontends/lavapipe/lvp_wsi.c +++ b/src/gallium/frontends/lavapipe/lvp_wsi.c @@ -23,6 +23,10 @@ #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; +}