#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"
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,
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;
#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)
{
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;
+}