diff options
-rw-r--r-- | src/amd/vulkan/radv_wsi.c | 42 | ||||
-rw-r--r-- | src/intel/vulkan/anv_wsi.c | 35 | ||||
-rw-r--r-- | src/vulkan/wsi/wsi_common.c | 38 | ||||
-rw-r--r-- | src/vulkan/wsi/wsi_common.h | 12 |
4 files changed, 63 insertions, 64 deletions
diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c index e159b6436e0..d00e0281689 100644 --- a/src/amd/vulkan/radv_wsi.c +++ b/src/amd/vulkan/radv_wsi.c @@ -164,60 +164,34 @@ VkResult radv_CreateSwapchainKHR( VkSwapchainKHR* pSwapchain) { RADV_FROM_HANDLE(radv_device, device, _device); - ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, pCreateInfo->surface); - struct wsi_interface *iface = - device->physical_device->wsi_device.wsi[surface->platform]; - struct wsi_swapchain *swapchain; const VkAllocationCallbacks *alloc; if (pAllocator) alloc = pAllocator; else alloc = &device->alloc; - VkResult result = iface->create_swapchain(surface, _device, - &device->physical_device->wsi_device, - device->physical_device->local_fd, - pCreateInfo, - alloc, - &swapchain); - if (result != VK_SUCCESS) - return result; - - if (pAllocator) - swapchain->alloc = *pAllocator; - else - swapchain->alloc = device->alloc; - - for (unsigned i = 0; i < ARRAY_SIZE(swapchain->fences); i++) - swapchain->fences[i] = VK_NULL_HANDLE; - - *pSwapchain = wsi_swapchain_to_handle(swapchain); - return VK_SUCCESS; + return wsi_common_create_swapchain(&device->physical_device->wsi_device, + radv_device_to_handle(device), + device->physical_device->local_fd, + pCreateInfo, + alloc, + pSwapchain); } void radv_DestroySwapchainKHR( VkDevice _device, - VkSwapchainKHR _swapchain, + VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator) { RADV_FROM_HANDLE(radv_device, device, _device); - RADV_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain); const VkAllocationCallbacks *alloc; - if (!_swapchain) - return; - if (pAllocator) alloc = pAllocator; else alloc = &device->alloc; - for (unsigned i = 0; i < ARRAY_SIZE(swapchain->fences); i++) { - if (swapchain->fences[i] != VK_NULL_HANDLE) - radv_DestroyFence(_device, swapchain->fences[i], pAllocator); - } - - swapchain->destroy(swapchain, alloc); + wsi_common_destroy_swapchain(_device, swapchain, alloc); } VkResult radv_GetSwapchainImagesKHR( diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c index eed378cc74f..62368a10a06 100644 --- a/src/intel/vulkan/anv_wsi.c +++ b/src/intel/vulkan/anv_wsi.c @@ -193,57 +193,32 @@ VkResult anv_CreateSwapchainKHR( VkSwapchainKHR* pSwapchain) { ANV_FROM_HANDLE(anv_device, device, _device); - ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, pCreateInfo->surface); - struct wsi_interface *iface = - device->instance->physicalDevice.wsi_device.wsi[surface->platform]; - struct wsi_swapchain *swapchain; + struct wsi_device *wsi_device = &device->instance->physicalDevice.wsi_device; const VkAllocationCallbacks *alloc; if (pAllocator) alloc = pAllocator; else alloc = &device->alloc; - VkResult result = iface->create_swapchain(surface, _device, - &device->instance->physicalDevice.wsi_device, - device->instance->physicalDevice.local_fd, - pCreateInfo, - alloc, - &swapchain); - if (result != VK_SUCCESS) - return result; - - swapchain->alloc = *alloc; - for (unsigned i = 0; i < ARRAY_SIZE(swapchain->fences); i++) - swapchain->fences[i] = VK_NULL_HANDLE; - - *pSwapchain = wsi_swapchain_to_handle(swapchain); - - return VK_SUCCESS; + return wsi_common_create_swapchain(wsi_device, _device, device->fd, + pCreateInfo, alloc, pSwapchain); } void anv_DestroySwapchainKHR( VkDevice _device, - VkSwapchainKHR _swapchain, + VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator) { ANV_FROM_HANDLE(anv_device, device, _device); - ANV_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain); const VkAllocationCallbacks *alloc; - if (!swapchain) - return; - if (pAllocator) alloc = pAllocator; else alloc = &device->alloc; - for (unsigned i = 0; i < ARRAY_SIZE(swapchain->fences); i++) { - if (swapchain->fences[i] != VK_NULL_HANDLE) - anv_DestroyFence(_device, swapchain->fences[i], pAllocator); - } - swapchain->destroy(swapchain, alloc); + wsi_common_destroy_swapchain(_device, swapchain, alloc); } VkResult anv_GetSwapchainImagesKHR( diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index d420e48a007..69cb71dfdbc 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -115,6 +115,9 @@ fail: void wsi_swapchain_finish(struct wsi_swapchain *chain) { + for (unsigned i = 0; i < ARRAY_SIZE(chain->fences); i++) + chain->wsi->DestroyFence(chain->device, chain->fences[i], &chain->alloc); + for (uint32_t i = 0; i < chain->wsi->queue_family_count; i++) { chain->wsi->DestroyCommandPool(chain->device, chain->cmd_pools[i], &chain->alloc); @@ -485,6 +488,41 @@ wsi_destroy_image(const struct wsi_swapchain *chain, } VkResult +wsi_common_create_swapchain(struct wsi_device *wsi, + VkDevice device, + int fd, + const VkSwapchainCreateInfoKHR *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkSwapchainKHR *pSwapchain) +{ + ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, pCreateInfo->surface); + struct wsi_interface *iface = wsi->wsi[surface->platform]; + struct wsi_swapchain *swapchain; + + VkResult result = iface->create_swapchain(surface, device, wsi, fd, + pCreateInfo, pAllocator, + &swapchain); + if (result != VK_SUCCESS) + return result; + + *pSwapchain = wsi_swapchain_to_handle(swapchain); + + return VK_SUCCESS; +} + +void +wsi_common_destroy_swapchain(VkDevice device, + VkSwapchainKHR _swapchain, + const VkAllocationCallbacks *pAllocator) +{ + WSI_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain); + if (!swapchain) + return; + + swapchain->destroy(swapchain, pAllocator); +} + +VkResult wsi_common_get_images(VkSwapchainKHR _swapchain, uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages) diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index 9ff28e76f33..6ed10b85921 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -221,6 +221,18 @@ wsi_common_get_images(VkSwapchainKHR _swapchain, VkImage *pSwapchainImages); VkResult +wsi_common_create_swapchain(struct wsi_device *wsi, + VkDevice device, + int fd, + const VkSwapchainCreateInfoKHR *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkSwapchainKHR *pSwapchain); +void +wsi_common_destroy_swapchain(VkDevice device, + VkSwapchainKHR swapchain, + const VkAllocationCallbacks *pAllocator); + +VkResult wsi_common_queue_present(const struct wsi_device *wsi, VkDevice device_h, VkQueue queue_h, |