gfxstream: host: Linear tiling for QNX Screen buffer

Maintain linear tiling on QNX Screen buffer-backed memory.

BUG=319510663
TEST=trybots

Change-Id: Ic66b4939d209e8b1a21d5517d7720325bf847432
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;