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;