Merge "gfxstream: host: Linear tiling for QNX Screen buffer" into main
diff --git a/host/vulkan/VkCommonOperations.cpp b/host/vulkan/VkCommonOperations.cpp
index a48d4e2..32089ac 100644
--- a/host/vulkan/VkCommonOperations.cpp
+++ b/host/vulkan/VkCommonOperations.cpp
@@ -1962,6 +1962,8 @@
     imageCi->pQueueFamilyIndices = nullptr;
     imageCi->initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
 
+    auto imageCiChain = vk_make_chain_iterator(imageCi.get());
+
     // Create the image. If external memory is supported, make it external.
     VkExternalMemoryImageCreateInfo extImageCi = {
         VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
@@ -1969,14 +1971,23 @@
         VK_EXT_MEMORY_HANDLE_TYPE_BIT,
     };
 
-    VkExternalMemoryImageCreateInfo* extImageCiPtr = nullptr;
-
     if (sVkEmulation->deviceInfo.supportsExternalMemoryImport ||
         sVkEmulation->deviceInfo.supportsExternalMemoryExport) {
-        extImageCiPtr = &extImageCi;
+        vk_append_struct(&imageCiChain, &extImageCi);
     }
 
-    imageCi->pNext = extImageCiPtr;
+#if defined(__QNX__)
+    VkExternalFormatQNX externalFormatQnx = {
+        .sType = VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_QNX,
+        .pNext = NULL,
+        .externalFormat = 0, /* Do not override screen format */
+    };
+    if (VK_EXT_MEMORY_HANDLE_INVALID != extMemHandle) {
+        vk_append_struct(&imageCiChain, &externalFormatQnx);
+        /* Maintain linear tiling on QNX for downstream display controller interaction */
+        imageCi->tiling = VK_IMAGE_TILING_LINEAR;
+    }
+#endif
 
     auto vk = sVkEmulation->dvk;
 
diff --git a/host/vulkan/cereal/common/vk_struct_id.h b/host/vulkan/cereal/common/vk_struct_id.h
index 0953a43..c6e9804 100644
--- a/host/vulkan/cereal/common/vk_struct_id.h
+++ b/host/vulkan/cereal/common/vk_struct_id.h
@@ -75,6 +75,7 @@
 REGISTER_VK_STRUCT_ID(VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX,
                       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCREEN_BUFFER_FEATURES_QNX);
 REGISTER_VK_STRUCT_ID(VkImportScreenBufferInfoQNX, VK_STRUCTURE_TYPE_IMPORT_SCREEN_BUFFER_INFO_QNX);
+REGISTER_VK_STRUCT_ID(VkExternalFormatQNX, VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_QNX);
 #endif
 
 #undef REGISTER_VK_STRUCT_ID