Module: Mesa
Branch: main
Commit: 768017f72b9b14710a54471b50ff3368a640161d
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=768017f72b9b14710a54471b50ff3368a640161d

Author: Yiwei Zhang <[email protected]>
Date:   Wed Feb 15 14:11:02 2023 -0800

venus: refactor image create info pnext tracking

Signed-off-by: Yiwei Zhang <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21379>

---

 src/virtio/vulkan/vn_image.c | 48 +++++++++++++++++++++++++++++---------------
 1 file changed, 32 insertions(+), 16 deletions(-)

diff --git a/src/virtio/vulkan/vn_image.c b/src/virtio/vulkan/vn_image.c
index 7a5fb467273..f0bfdd73ce5 100644
--- a/src/virtio/vulkan/vn_image.c
+++ b/src/virtio/vulkan/vn_image.c
@@ -295,22 +295,38 @@ vn_CreateImage(VkDevice device,
    struct vn_image *img;
    VkResult result;
 
-   const struct wsi_image_create_info *wsi_info =
-      vk_find_struct_const(pCreateInfo->pNext, WSI_IMAGE_CREATE_INFO_MESA);
-   const VkNativeBufferANDROID *anb_info =
-      vk_find_struct_const(pCreateInfo->pNext, NATIVE_BUFFER_ANDROID);
-   const VkExternalMemoryImageCreateInfo *external_info =
-      vk_find_struct_const(pCreateInfo->pNext,
-                           EXTERNAL_MEMORY_IMAGE_CREATE_INFO);
-   const bool ahb_info =
-      external_info &&
-      external_info->handleTypes ==
-         VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
-
-   const VkImageSwapchainCreateInfoKHR *swapchain_info = vk_find_struct_const(
-      pCreateInfo->pNext, IMAGE_SWAPCHAIN_CREATE_INFO_KHR);
-   if (swapchain_info && !swapchain_info->swapchain)
-      swapchain_info = NULL;
+   const struct wsi_image_create_info *wsi_info = NULL;
+   const VkNativeBufferANDROID *anb_info = NULL;
+   const VkImageSwapchainCreateInfoKHR *swapchain_info = NULL;
+   const VkExternalMemoryImageCreateInfo *external_info = NULL;
+   bool ahb_info = false;
+
+   vk_foreach_struct_const(pnext, pCreateInfo->pNext) {
+      switch ((uint32_t)pnext->sType) {
+      case VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA:
+         wsi_info = (void *)pnext;
+         break;
+      case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
+         anb_info = (void *)pnext;
+         break;
+      case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
+         swapchain_info = (void *)pnext;
+         if (!swapchain_info->swapchain)
+            swapchain_info = NULL;
+         break;
+      case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
+         external_info = (void *)pnext;
+         if (!external_info->handleTypes)
+            external_info = NULL;
+         else if (
+            external_info->handleTypes ==
+            VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
+            ahb_info = true;
+         break;
+      default:
+         break;
+      }
+   }
 
    if (wsi_info) {
       result = vn_wsi_create_image(dev, pCreateInfo, wsi_info, alloc, &img);

Reply via email to