From 393aa3f6c929fdbcaa599597e28a3206aa09dcc2 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 16 Nov 2017 09:56:37 -0800 Subject: [PATCH] vulkan/wsi: Move get_images into common code This moves bits out of all four corners (anv, radv, x11, wayland) and into the wsi common code. We also switch to using an outarray to ensure we get our return code right. Reviewed-by: Dave Airlie Reviewed-by: Chad Versace --- src/amd/vulkan/radv_wsi.c | 7 +++---- src/intel/vulkan/anv_wsi.c | 7 +++---- src/vulkan/wsi/wsi_common.c | 17 +++++++++++++++++ src/vulkan/wsi/wsi_common.h | 9 +++++++-- src/vulkan/wsi/wsi_common_wayland.c | 28 +++++----------------------- src/vulkan/wsi/wsi_common_x11.c | 29 +++++------------------------ 6 files changed, 40 insertions(+), 57 deletions(-) diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c index 054b97bb011..e159b6436e0 100644 --- a/src/amd/vulkan/radv_wsi.c +++ b/src/amd/vulkan/radv_wsi.c @@ -222,13 +222,12 @@ void radv_DestroySwapchainKHR( VkResult radv_GetSwapchainImagesKHR( VkDevice device, - VkSwapchainKHR _swapchain, + VkSwapchainKHR swapchain, uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages) { - RADV_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain); - - return swapchain->get_images(swapchain, pSwapchainImageCount, + return wsi_common_get_images(swapchain, + pSwapchainImageCount, pSwapchainImages); } diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c index 975ad18146c..eed378cc74f 100644 --- a/src/intel/vulkan/anv_wsi.c +++ b/src/intel/vulkan/anv_wsi.c @@ -248,13 +248,12 @@ void anv_DestroySwapchainKHR( VkResult anv_GetSwapchainImagesKHR( VkDevice device, - VkSwapchainKHR _swapchain, + VkSwapchainKHR swapchain, uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages) { - ANV_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain); - - return swapchain->get_images(swapchain, pSwapchainImageCount, + return wsi_common_get_images(swapchain, + pSwapchainImageCount, pSwapchainImages); } diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index e5a9a28d347..ea4920c6fe3 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -507,6 +507,23 @@ wsi_prime_image_blit_to_linear(const struct wsi_swapchain *chain, return chain->wsi->QueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE); } +VkResult +wsi_common_get_images(VkSwapchainKHR _swapchain, + uint32_t *pSwapchainImageCount, + VkImage *pSwapchainImages) +{ + WSI_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain); + VK_OUTARRAY_MAKE(images, pSwapchainImages, pSwapchainImageCount); + + for (uint32_t i = 0; i < swapchain->image_count; i++) { + vk_outarray_append(&images, image) { + *image = swapchain->get_wsi_image(swapchain, i)->image; + } + } + + return vk_outarray_status(&images); +} + VkResult wsi_common_queue_present(const struct wsi_device *wsi, VkDevice device, diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index b47da43e085..892e708671b 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -64,8 +64,8 @@ struct wsi_swapchain { VkResult (*destroy)(struct wsi_swapchain *swapchain, const VkAllocationCallbacks *pAllocator); - VkResult (*get_images)(struct wsi_swapchain *swapchain, - uint32_t *pCount, VkImage *pSwapchainImages); + struct wsi_image *(*get_wsi_image)(struct wsi_swapchain *swapchain, + uint32_t image_index); VkResult (*acquire_next_image)(struct wsi_swapchain *swap_chain, uint64_t timeout, VkSemaphore semaphore, uint32_t *image_index); @@ -216,6 +216,11 @@ VkResult wsi_wl_init_wsi(struct wsi_device *wsi_device, void wsi_wl_finish_wsi(struct wsi_device *wsi_device, const VkAllocationCallbacks *alloc); +VkResult +wsi_common_get_images(VkSwapchainKHR _swapchain, + uint32_t *pSwapchainImageCount, + VkImage *pSwapchainImages); + VkResult wsi_common_queue_present(const struct wsi_device *wsi, VkDevice device_h, diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c index 22c01b2963a..bf60a9be826 100644 --- a/src/vulkan/wsi/wsi_common_wayland.c +++ b/src/vulkan/wsi/wsi_common_wayland.c @@ -582,30 +582,12 @@ struct wsi_wl_swapchain { struct wsi_wl_image images[0]; }; -static VkResult -wsi_wl_swapchain_get_images(struct wsi_swapchain *wsi_chain, - uint32_t *pCount, VkImage *pSwapchainImages) +static struct wsi_image * +wsi_wl_swapchain_get_wsi_image(struct wsi_swapchain *wsi_chain, + uint32_t image_index) { struct wsi_wl_swapchain *chain = (struct wsi_wl_swapchain *)wsi_chain; - uint32_t ret_count; - VkResult result; - - if (pSwapchainImages == NULL) { - *pCount = chain->base.image_count; - return VK_SUCCESS; - } - - result = VK_SUCCESS; - ret_count = chain->base.image_count; - if (chain->base.image_count > *pCount) { - ret_count = *pCount; - result = VK_INCOMPLETE; - } - - for (uint32_t i = 0; i < ret_count; i++) - pSwapchainImages[i] = chain->images[i].base.image; - - return result; + return &chain->images[image_index].base; } static VkResult @@ -832,7 +814,7 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR; chain->base.destroy = wsi_wl_swapchain_destroy; - chain->base.get_images = wsi_wl_swapchain_get_images; + chain->base.get_wsi_image = wsi_wl_swapchain_get_wsi_image; chain->base.acquire_next_image = wsi_wl_swapchain_acquire_next_image; chain->base.queue_present = wsi_wl_swapchain_queue_present; chain->base.present_mode = pCreateInfo->presentMode; diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index 68cb0355612..8860d8edb6e 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -648,30 +648,11 @@ struct x11_swapchain { struct x11_image images[0]; }; -static VkResult -x11_get_images(struct wsi_swapchain *anv_chain, - uint32_t* pCount, VkImage *pSwapchainImages) +static struct wsi_image * +x11_get_wsi_image(struct wsi_swapchain *wsi_chain, uint32_t image_index) { - struct x11_swapchain *chain = (struct x11_swapchain *)anv_chain; - uint32_t ret_count; - VkResult result; - - if (pSwapchainImages == NULL) { - *pCount = chain->base.image_count; - return VK_SUCCESS; - } - - result = VK_SUCCESS; - ret_count = chain->base.image_count; - if (chain->base.image_count > *pCount) { - ret_count = *pCount; - result = VK_INCOMPLETE; - } - - for (uint32_t i = 0; i < ret_count; i++) - pSwapchainImages[i] = chain->images[i].base.image; - - return result; + struct x11_swapchain *chain = (struct x11_swapchain *)wsi_chain; + return &chain->images[image_index].base; } static VkResult @@ -1109,7 +1090,7 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, goto fail_alloc; chain->base.destroy = x11_swapchain_destroy; - chain->base.get_images = x11_get_images; + chain->base.get_wsi_image = x11_get_wsi_image; chain->base.acquire_next_image = x11_acquire_next_image; chain->base.queue_present = x11_queue_present; chain->base.present_mode = pCreateInfo->presentMode; -- 2.30.2