fuchsia: Support BufferCollection FUCHSIAX extension.

We are migrating the buffer collection extension to
a separated extension (VK_FUCHSIA_buffer_collection_x).
This change migrates all existing buffer collection
methods to corresponding FUCHSIAX functions, while we
still keep the old methods for soft transition.

Bug: fxbug.dev/73447
TEST=workstation.x64

Change-Id: I1ce36b6914cf8b0eb3fac157951d0c5ce6f383a6
diff --git a/system/vulkan/goldfish_vulkan.cpp b/system/vulkan/goldfish_vulkan.cpp
index 7387a1f..e72d835 100644
--- a/system/vulkan/goldfish_vulkan.cpp
+++ b/system/vulkan/goldfish_vulkan.cpp
@@ -197,6 +197,8 @@
     return VK_SUCCESS;
 }
 
+// TODO(fxbug.dev/73447): Remove all the *FUCHSIA functions below once we
+// finish migration of buffer collection extension to FUCHSIAX.
 VkResult
 CreateBufferCollectionFUCHSIA(VkDevice /*device*/,
                               const VkBufferCollectionCreateInfoFUCHSIA* /*pInfo*/,
@@ -252,6 +254,63 @@
     AEMU_SCOPED_TRACE("vkstubhal::GetBufferCollectionProperties2FUCHSIA");
     return VK_SUCCESS;
 }
+
+VkResult CreateBufferCollectionFUCHSIAX(
+    VkDevice /*device*/,
+    const VkBufferCollectionCreateInfoFUCHSIAX* /*pInfo*/,
+    const VkAllocationCallbacks* /*pAllocator*/,
+    VkBufferCollectionFUCHSIAX* /*pCollection*/) {
+    AEMU_SCOPED_TRACE("vkstubhal::CreateBufferCollectionFUCHSIAX");
+    return VK_SUCCESS;
+}
+
+void DestroyBufferCollectionFUCHSIAX(
+    VkDevice /*device*/,
+    VkBufferCollectionFUCHSIAX /*collection*/,
+    const VkAllocationCallbacks* /*pAllocator*/) {
+    AEMU_SCOPED_TRACE("vkstubhal::DestroyBufferCollectionFUCHSIAX");
+}
+
+VkResult SetBufferCollectionConstraintsFUCHSIAX(
+    VkDevice /*device*/,
+    VkBufferCollectionFUCHSIAX /*collection*/,
+    const VkImageCreateInfo* /*pImageInfo*/) {
+    AEMU_SCOPED_TRACE("vkstubhal::SetBufferCollectionConstraintsFUCHSIAX");
+    return VK_SUCCESS;
+}
+
+VkResult SetBufferCollectionImageConstraintsFUCHSIAX(
+    VkDevice /*device*/,
+    VkBufferCollectionFUCHSIAX /*collection*/,
+    const VkImageConstraintsInfoFUCHSIAX* /*pImageConstraintsInfo*/) {
+    AEMU_SCOPED_TRACE("vkstubhal::SetBufferCollectionImageConstraintsFUCHSIAX");
+    return VK_SUCCESS;
+}
+
+VkResult SetBufferCollectionBufferConstraintsFUCHSIAX(
+    VkDevice /*device*/,
+    VkBufferCollectionFUCHSIAX /*collection*/,
+    const VkBufferConstraintsInfoFUCHSIAX* /*pBufferConstraintsInfo*/) {
+    AEMU_SCOPED_TRACE(
+        "vkstubhal::SetBufferCollectionBufferConstraintsFUCHSIAX");
+    return VK_SUCCESS;
+}
+
+VkResult GetBufferCollectionPropertiesFUCHSIAX(
+    VkDevice /*device*/,
+    VkBufferCollectionFUCHSIAX /*collection*/,
+    VkBufferCollectionPropertiesFUCHSIAX* /*pProperties*/) {
+    AEMU_SCOPED_TRACE("vkstubhal::GetBufferCollectionPropertiesFUCHSIAX");
+    return VK_SUCCESS;
+}
+
+VkResult GetBufferCollectionProperties2FUCHSIAX(
+    VkDevice /*device*/,
+    VkBufferCollectionFUCHSIAX /*collection*/,
+    VkBufferCollectionProperties2FUCHSIAX* /*pProperties*/) {
+    AEMU_SCOPED_TRACE("vkstubhal::GetBufferCollectionProperties2FUCHSIAX");
+    return VK_SUCCESS;
+}
 #endif
 
 PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance,
@@ -313,6 +372,27 @@
     if (strcmp(name, "vkGetBufferCollectionProperties2FUCHSIA") == 0)
         return reinterpret_cast<PFN_vkVoidFunction>(
             GetBufferCollectionProperties2FUCHSIA);
+    if (strcmp(name, "vkCreateBufferCollectionFUCHSIAX") == 0)
+        return reinterpret_cast<PFN_vkVoidFunction>(
+            CreateBufferCollectionFUCHSIAX);
+    if (strcmp(name, "vkDestroyBufferCollectionFUCHSIAX") == 0)
+        return reinterpret_cast<PFN_vkVoidFunction>(
+            DestroyBufferCollectionFUCHSIAX);
+    if (strcmp(name, "vkSetBufferCollectionConstraintsFUCHSIAX") == 0)
+        return reinterpret_cast<PFN_vkVoidFunction>(
+            SetBufferCollectionConstraintsFUCHSIAX);
+    if (strcmp(name, "vkSetBufferCollectionImageConstraintsFUCHSIAX") == 0)
+        return reinterpret_cast<PFN_vkVoidFunction>(
+            SetBufferCollectionImageConstraintsFUCHSIAX);
+    if (strcmp(name, "vkSetBufferCollectionBufferConstraintsFUCHSIAX") == 0)
+        return reinterpret_cast<PFN_vkVoidFunction>(
+            SetBufferCollectionBufferConstraintsFUCHSIAX);
+    if (strcmp(name, "vkGetBufferCollectionPropertiesFUCHSIAX") == 0)
+        return reinterpret_cast<PFN_vkVoidFunction>(
+            GetBufferCollectionPropertiesFUCHSIAX);
+    if (strcmp(name, "vkGetBufferCollectionProperties2FUCHSIAX") == 0)
+        return reinterpret_cast<PFN_vkVoidFunction>(
+            GetBufferCollectionProperties2FUCHSIAX);
 #endif
     // Return NoOp for entrypoints that should never be called.
     if (strcmp(name, "vkGetPhysicalDeviceFeatures") == 0 ||
@@ -672,6 +752,158 @@
 
     return res;
 }
+
+VKAPI_ATTR
+VkResult CreateBufferCollectionFUCHSIAX(
+    VkDevice device,
+    const VkBufferCollectionCreateInfoFUCHSIAX* pInfo,
+    const VkAllocationCallbacks* pAllocator,
+    VkBufferCollectionFUCHSIAX* pCollection) {
+    AEMU_SCOPED_TRACE("goldfish_vulkan::CreateBufferCollectionFUCHSIAX");
+
+    VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
+
+    if (!hostSupportsVulkan) {
+        return vkstubhal::CreateBufferCollectionFUCHSIAX(
+            device, pInfo, pAllocator, pCollection);
+    }
+
+    VkResult res =
+        goldfish_vk::ResourceTracker::get()
+            ->on_vkCreateBufferCollectionFUCHSIAX(
+                vkEnc, VK_SUCCESS, device, pInfo, pAllocator, pCollection);
+
+    return res;
+}
+
+VKAPI_ATTR
+void DestroyBufferCollectionFUCHSIAX(VkDevice device,
+                                     VkBufferCollectionFUCHSIAX collection,
+                                     const VkAllocationCallbacks* pAllocator) {
+    AEMU_SCOPED_TRACE("goldfish_vulkan::DestroyBufferCollectionFUCHSIAX");
+
+    VK_HOST_CONNECTION()
+
+    if (!hostSupportsVulkan) {
+        vkstubhal::DestroyBufferCollectionFUCHSIAX(device, collection,
+                                                   pAllocator);
+        return;
+    }
+
+    goldfish_vk::ResourceTracker::get()->on_vkDestroyBufferCollectionFUCHSIAX(
+        vkEnc, VK_SUCCESS, device, collection, pAllocator);
+}
+
+VKAPI_ATTR
+VkResult SetBufferCollectionConstraintsFUCHSIAX(
+    VkDevice device,
+    VkBufferCollectionFUCHSIAX collection,
+    const VkImageCreateInfo* pImageInfo) {
+    AEMU_SCOPED_TRACE(
+        "goldfish_vulkan::SetBufferCollectionConstraintsFUCHSIAX");
+
+    VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
+
+    if (!hostSupportsVulkan) {
+        return vkstubhal::SetBufferCollectionConstraintsFUCHSIAX(
+            device, collection, pImageInfo);
+    }
+
+    VkResult res = goldfish_vk::ResourceTracker::get()
+                       ->on_vkSetBufferCollectionConstraintsFUCHSIAX(
+                           vkEnc, VK_SUCCESS, device, collection, pImageInfo);
+
+    return res;
+}
+
+VKAPI_ATTR
+VkResult SetBufferCollectionBufferConstraintsFUCHSIAX(
+    VkDevice device,
+    VkBufferCollectionFUCHSIAX collection,
+    const VkBufferConstraintsInfoFUCHSIAX* pBufferConstraintsInfo) {
+    AEMU_SCOPED_TRACE(
+        "goldfish_vulkan::SetBufferCollectionBufferConstraintsFUCHSIAX");
+
+    VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
+
+    if (!hostSupportsVulkan) {
+        return vkstubhal::SetBufferCollectionBufferConstraintsFUCHSIAX(
+            device, collection, pBufferConstraintsInfo);
+    }
+
+    VkResult res =
+        goldfish_vk::ResourceTracker::get()
+            ->on_vkSetBufferCollectionBufferConstraintsFUCHSIAX(
+                vkEnc, VK_SUCCESS, device, collection, pBufferConstraintsInfo);
+
+    return res;
+}
+
+VKAPI_ATTR
+VkResult SetBufferCollectionImageConstraintsFUCHSIAX(
+    VkDevice device,
+    VkBufferCollectionFUCHSIAX collection,
+    const VkImageConstraintsInfoFUCHSIAX* pImageConstraintsInfo) {
+    AEMU_SCOPED_TRACE(
+        "goldfish_vulkan::SetBufferCollectionBufferConstraintsFUCHSIAX");
+
+    VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
+
+    if (!hostSupportsVulkan) {
+        return vkstubhal::SetBufferCollectionImageConstraintsFUCHSIAX(
+            device, collection, pImageConstraintsInfo);
+    }
+
+    VkResult res =
+        goldfish_vk::ResourceTracker::get()
+            ->on_vkSetBufferCollectionImageConstraintsFUCHSIAX(
+                vkEnc, VK_SUCCESS, device, collection, pImageConstraintsInfo);
+
+    return res;
+}
+
+VKAPI_ATTR
+VkResult GetBufferCollectionPropertiesFUCHSIAX(
+    VkDevice device,
+    VkBufferCollectionFUCHSIAX collection,
+    VkBufferCollectionPropertiesFUCHSIAX* pProperties) {
+    AEMU_SCOPED_TRACE("goldfish_vulkan::GetBufferCollectionPropertiesFUCHSIAX");
+
+    VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
+
+    if (!hostSupportsVulkan) {
+        return vkstubhal::GetBufferCollectionPropertiesFUCHSIAX(
+            device, collection, pProperties);
+    }
+
+    VkResult res = goldfish_vk::ResourceTracker::get()
+                       ->on_vkGetBufferCollectionPropertiesFUCHSIAX(
+                           vkEnc, VK_SUCCESS, device, collection, pProperties);
+
+    return res;
+}
+
+VKAPI_ATTR
+VkResult GetBufferCollectionProperties2FUCHSIAX(
+    VkDevice device,
+    VkBufferCollectionFUCHSIAX collection,
+    VkBufferCollectionProperties2FUCHSIAX* pProperties) {
+    AEMU_SCOPED_TRACE(
+        "goldfish_vulkan::GetBufferCollectionProperties2FUCHSIAX");
+
+    VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
+
+    if (!hostSupportsVulkan) {
+        return vkstubhal::GetBufferCollectionProperties2FUCHSIAX(
+            device, collection, pProperties);
+    }
+
+    VkResult res = goldfish_vk::ResourceTracker::get()
+                       ->on_vkGetBufferCollectionProperties2FUCHSIAX(
+                           vkEnc, VK_SUCCESS, device, collection, pProperties);
+
+    return res;
+}
 #endif
 
 uint64_t currGuestTimeNs() {
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index 3fa037a..621c56c 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -427,12 +427,12 @@
         uint32_t unused;
     };
 
-    struct VkBufferCollectionFUCHSIA_Info {
+    struct VkBufferCollectionFUCHSIAX_Info {
 #ifdef VK_USE_PLATFORM_FUCHSIA
         android::base::Optional<
             fuchsia_sysmem::wire::BufferCollectionConstraints>
             constraints;
-        android::base::Optional<VkBufferCollectionProperties2FUCHSIA>
+        android::base::Optional<VkBufferCollectionProperties2FUCHSIAX>
             properties;
 
         // the index of corresponding createInfo for each image format
@@ -638,10 +638,10 @@
     }
 
 #ifdef VK_USE_PLATFORM_FUCHSIA
-    void unregister_VkBufferCollectionFUCHSIA(
-        VkBufferCollectionFUCHSIA collection) {
+    void unregister_VkBufferCollectionFUCHSIAX(
+        VkBufferCollectionFUCHSIAX collection) {
         AutoLock lock(mLock);
-        info_VkBufferCollectionFUCHSIA.erase(collection);
+        info_VkBufferCollectionFUCHSIAX.erase(collection);
     }
 #endif
 
@@ -1995,11 +1995,13 @@
         return VK_SUCCESS;
     }
 
-    VkResult on_vkCreateBufferCollectionFUCHSIA(
-        void*, VkResult, VkDevice,
-        const VkBufferCollectionCreateInfoFUCHSIA* pInfo,
+    VkResult on_vkCreateBufferCollectionFUCHSIAX(
+        void*,
+        VkResult,
+        VkDevice,
+        const VkBufferCollectionCreateInfoFUCHSIAX* pInfo,
         const VkAllocationCallbacks*,
-        VkBufferCollectionFUCHSIA* pCollection) {
+        VkBufferCollectionFUCHSIAX* pCollection) {
         fidl::ClientEnd<::fuchsia_sysmem::BufferCollectionToken> token_client;
 
         if (pInfo->collectionToken) {
@@ -2039,15 +2041,18 @@
         auto* sysmem_collection =
             new fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>(
                 std::move(collection_client));
-        *pCollection = reinterpret_cast<VkBufferCollectionFUCHSIA>(sysmem_collection);
+        *pCollection =
+            reinterpret_cast<VkBufferCollectionFUCHSIAX>(sysmem_collection);
 
-        register_VkBufferCollectionFUCHSIA(*pCollection);
+        register_VkBufferCollectionFUCHSIAX(*pCollection);
         return VK_SUCCESS;
     }
 
-    void on_vkDestroyBufferCollectionFUCHSIA(
-        void*, VkResult, VkDevice,
-        VkBufferCollectionFUCHSIA collection,
+    void on_vkDestroyBufferCollectionFUCHSIAX(
+        void*,
+        VkResult,
+        VkDevice,
+        VkBufferCollectionFUCHSIAX collection,
         const VkAllocationCallbacks*) {
         auto sysmem_collection = reinterpret_cast<
             fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>*>(collection);
@@ -2056,7 +2061,7 @@
         }
         delete sysmem_collection;
 
-        unregister_VkBufferCollectionFUCHSIA(collection);
+        unregister_VkBufferCollectionFUCHSIAX(collection);
     }
 
     inline fuchsia_sysmem::wire::BufferCollectionConstraints
@@ -2121,7 +2126,7 @@
     }
 
     uint32_t getBufferCollectionConstraintsVulkanBufferUsage(
-        const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo) {
+        const VkBufferConstraintsInfoFUCHSIAX* pBufferConstraintsInfo) {
         uint32_t usage = 0u;
         VkBufferUsageFlags bufferUsage =
             pBufferConstraintsInfo->pBufferCreateInfo->usage;
@@ -2270,9 +2275,9 @@
             createInfos.push_back(*pImageInfo);
         }
 
-        VkImageConstraintsInfoFUCHSIA imageConstraints;
+        VkImageConstraintsInfoFUCHSIAX imageConstraints;
         imageConstraints.sType =
-            VK_STRUCTURE_TYPE_IMAGE_CONSTRAINTS_INFO_FUCHSIA;
+            VK_STRUCTURE_TYPE_IMAGE_CONSTRAINTS_INFO_FUCHSIAX;
         imageConstraints.pNext = nullptr;
         imageConstraints.createInfoCount = createInfos.size();
         imageConstraints.pCreateInfos = createInfos.data();
@@ -2293,7 +2298,7 @@
         VkDevice device,
         VkPhysicalDevice physicalDevice,
         const VkImageCreateInfo* createInfo,
-        const VkImageFormatConstraintsInfoFUCHSIA* formatConstraints,
+        const VkImageFormatConstraintsInfoFUCHSIAX* formatConstraints,
         VkImageTiling tiling,
         fuchsia_sysmem::wire::BufferCollectionConstraints* constraints) {
         // First check if the format, tiling and usage is supported on host.
@@ -2423,10 +2428,12 @@
         VkEncoder* enc,
         VkDevice device,
         fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>* collection,
-        const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo) {
+        const VkImageConstraintsInfoFUCHSIAX* pImageConstraintsInfo) {
         if (!pImageConstraintsInfo ||
-            pImageConstraintsInfo->sType !=
-                VK_STRUCTURE_TYPE_IMAGE_CONSTRAINTS_INFO_FUCHSIA) {
+            (pImageConstraintsInfo->sType !=
+                 VK_STRUCTURE_TYPE_IMAGE_CONSTRAINTS_INFO_FUCHSIAX &&
+             pImageConstraintsInfo->sType !=
+                 VK_STRUCTURE_TYPE_IMAGE_CONSTRAINTS_INFO_FUCHSIA)) {
             ALOGE("%s: invalid pImageConstraintsInfo", __func__);
             return VK_ERROR_INITIALIZATION_FAILED;
         }
@@ -2463,7 +2470,7 @@
         for (uint32_t i = 0; i < pImageConstraintsInfo->createInfoCount; i++) {
             const VkImageCreateInfo* createInfo =
                 &pImageConstraintsInfo->pCreateInfos[i];
-            const VkImageFormatConstraintsInfoFUCHSIA* formatConstraints =
+            const VkImageFormatConstraintsInfoFUCHSIAX* formatConstraints =
                 pImageConstraintsInfo->pFormatConstraints
                     ? &pImageConstraintsInfo->pFormatConstraints[i]
                     : nullptr;
@@ -2505,14 +2512,15 @@
 
         // Set buffer memory constraints based on optimal/linear tiling support
         // and flags.
-        VkImageConstraintsInfoFlagsFUCHSIA flags = pImageConstraintsInfo->flags;
-        if (flags & VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_RARELY_FUCHSIA)
+        VkImageConstraintsInfoFlagsFUCHSIAX flags =
+            pImageConstraintsInfo->flags;
+        if (flags & VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_RARELY_FUCHSIAX)
             constraints.usage.cpu |= fuchsia_sysmem::wire::kCpuUsageRead;
-        if (flags & VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_OFTEN_FUCHSIA)
+        if (flags & VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_OFTEN_FUCHSIAX)
             constraints.usage.cpu |= fuchsia_sysmem::wire::kCpuUsageReadOften;
-        if (flags & VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_RARELY_FUCHSIA)
+        if (flags & VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_RARELY_FUCHSIAX)
             constraints.usage.cpu |= fuchsia_sysmem::wire::kCpuUsageWrite;
-        if (flags & VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_OFTEN_FUCHSIA)
+        if (flags & VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_OFTEN_FUCHSIAX)
             constraints.usage.cpu |= fuchsia_sysmem::wire::kCpuUsageWriteOften;
 
         constraints.has_buffer_memory_constraints = true;
@@ -2521,10 +2529,10 @@
         memory_constraints.ram_domain_supported = true;
         memory_constraints.inaccessible_domain_supported =
             hasOptimalTiling &&
-            !(flags & (VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_RARELY_FUCHSIA |
-                       VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_OFTEN_FUCHSIA |
-                       VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_RARELY_FUCHSIA |
-                       VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_OFTEN_FUCHSIA));
+            !(flags & (VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_RARELY_FUCHSIAX |
+                       VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_OFTEN_FUCHSIAX |
+                       VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_RARELY_FUCHSIAX |
+                       VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_OFTEN_FUCHSIAX));
 
         if (memory_constraints.inaccessible_domain_supported) {
             memory_constraints.heap_permitted_count = 2;
@@ -2555,16 +2563,16 @@
             return VK_ERROR_OUT_OF_DEVICE_MEMORY;
         }
 
-        // copy constraints to info_VkBufferCollectionFUCHSIA if
-        // |collection| is a valid VkBufferCollectionFUCHSIA handle.
+        // copy constraints to info_VkBufferCollectionFUCHSIAX if
+        // |collection| is a valid VkBufferCollectionFUCHSIAX handle.
         AutoLock lock(mLock);
-        VkBufferCollectionFUCHSIA buffer_collection =
-            reinterpret_cast<VkBufferCollectionFUCHSIA>(collection);
-        if (info_VkBufferCollectionFUCHSIA.find(buffer_collection) !=
-            info_VkBufferCollectionFUCHSIA.end()) {
-            info_VkBufferCollectionFUCHSIA[buffer_collection].constraints =
+        VkBufferCollectionFUCHSIAX buffer_collection =
+            reinterpret_cast<VkBufferCollectionFUCHSIAX>(collection);
+        if (info_VkBufferCollectionFUCHSIAX.find(buffer_collection) !=
+            info_VkBufferCollectionFUCHSIAX.end()) {
+            info_VkBufferCollectionFUCHSIAX[buffer_collection].constraints =
                 android::base::makeOptional(std::move(constraints));
-            info_VkBufferCollectionFUCHSIA[buffer_collection].createInfoIndex =
+            info_VkBufferCollectionFUCHSIAX[buffer_collection].createInfoIndex =
                 std::move(createInfoIndex);
         }
 
@@ -2573,7 +2581,7 @@
 
     VkResult setBufferCollectionBufferConstraints(
         fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>* collection,
-        const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo) {
+        const VkBufferConstraintsInfoFUCHSIAX* pBufferConstraintsInfo) {
         if (pBufferConstraintsInfo == nullptr) {
             ALOGE(
                 "setBufferCollectionBufferConstraints: "
@@ -2600,23 +2608,25 @@
             return VK_ERROR_OUT_OF_DEVICE_MEMORY;
         }
 
-        // copy constraints to info_VkBufferCollectionFUCHSIA if
-        // |collection| is a valid VkBufferCollectionFUCHSIA handle.
+        // copy constraints to info_VkBufferCollectionFUCHSIAX if
+        // |collection| is a valid VkBufferCollectionFUCHSIAX handle.
         AutoLock lock(mLock);
-        VkBufferCollectionFUCHSIA buffer_collection =
-            reinterpret_cast<VkBufferCollectionFUCHSIA>(collection);
-        if (info_VkBufferCollectionFUCHSIA.find(buffer_collection) !=
-            info_VkBufferCollectionFUCHSIA.end()) {
-            info_VkBufferCollectionFUCHSIA[buffer_collection].constraints =
+        VkBufferCollectionFUCHSIAX buffer_collection =
+            reinterpret_cast<VkBufferCollectionFUCHSIAX>(collection);
+        if (info_VkBufferCollectionFUCHSIAX.find(buffer_collection) !=
+            info_VkBufferCollectionFUCHSIAX.end()) {
+            info_VkBufferCollectionFUCHSIAX[buffer_collection].constraints =
                 android::base::makeOptional(std::move(constraints));
         }
 
         return VK_SUCCESS;
     }
 
-    VkResult on_vkSetBufferCollectionConstraintsFUCHSIA(
-        void* context, VkResult, VkDevice device,
-        VkBufferCollectionFUCHSIA collection,
+    VkResult on_vkSetBufferCollectionConstraintsFUCHSIAX(
+        void* context,
+        VkResult,
+        VkDevice device,
+        VkBufferCollectionFUCHSIAX collection,
         const VkImageCreateInfo* pImageInfo) {
         VkEncoder* enc = (VkEncoder*)context;
         auto sysmem_collection = reinterpret_cast<
@@ -2624,12 +2634,12 @@
         return setBufferCollectionConstraints(enc, device, sysmem_collection, pImageInfo);
     }
 
-    VkResult on_vkSetBufferCollectionImageConstraintsFUCHSIA(
+    VkResult on_vkSetBufferCollectionImageConstraintsFUCHSIAX(
         void* context,
         VkResult,
         VkDevice device,
-        VkBufferCollectionFUCHSIA collection,
-        const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo) {
+        VkBufferCollectionFUCHSIAX collection,
+        const VkImageConstraintsInfoFUCHSIAX* pImageConstraintsInfo) {
         VkEncoder* enc = (VkEncoder*)context;
         auto sysmem_collection = reinterpret_cast<
             fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>*>(collection);
@@ -2637,28 +2647,28 @@
             enc, device, sysmem_collection, pImageConstraintsInfo);
     }
 
-    VkResult on_vkSetBufferCollectionBufferConstraintsFUCHSIA(
+    VkResult on_vkSetBufferCollectionBufferConstraintsFUCHSIAX(
         void*,
         VkResult,
         VkDevice,
-        VkBufferCollectionFUCHSIA collection,
-        const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo) {
+        VkBufferCollectionFUCHSIAX collection,
+        const VkBufferConstraintsInfoFUCHSIAX* pBufferConstraintsInfo) {
         auto sysmem_collection = reinterpret_cast<
             fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>*>(collection);
         return setBufferCollectionBufferConstraints(sysmem_collection,
                                                     pBufferConstraintsInfo);
     }
 
-    VkResult on_vkGetBufferCollectionPropertiesFUCHSIA(
+    VkResult on_vkGetBufferCollectionPropertiesFUCHSIAX(
         void* context,
         VkResult,
         VkDevice device,
-        VkBufferCollectionFUCHSIA collection,
-        VkBufferCollectionPropertiesFUCHSIA* pProperties) {
-        VkBufferCollectionProperties2FUCHSIA properties2 = {
-            .sType = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES2_FUCHSIA,
+        VkBufferCollectionFUCHSIAX collection,
+        VkBufferCollectionPropertiesFUCHSIAX* pProperties) {
+        VkBufferCollectionProperties2FUCHSIAX properties2 = {
+            .sType = VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES2_FUCHSIAX,
             .pNext = nullptr};
-        auto result = on_vkGetBufferCollectionProperties2FUCHSIA(
+        auto result = on_vkGetBufferCollectionProperties2FUCHSIAX(
             context, VK_SUCCESS, device, collection, &properties2);
         if (result != VK_SUCCESS) {
             return result;
@@ -2670,10 +2680,10 @@
     }
 
     VkResult getBufferCollectionImageCreateInfoIndexLocked(
-        VkBufferCollectionFUCHSIA collection,
+        VkBufferCollectionFUCHSIAX collection,
         fuchsia_sysmem::wire::BufferCollectionInfo2& info,
         uint32_t* outCreateInfoIndex) {
-        if (!info_VkBufferCollectionFUCHSIA[collection]
+        if (!info_VkBufferCollectionFUCHSIAX[collection]
                  .constraints.hasValue()) {
             ALOGE("%s: constraints not set", __func__);
             return VK_ERROR_OUT_OF_DEVICE_MEMORY;
@@ -2685,9 +2695,9 @@
         }
 
         const auto& constraints =
-            *info_VkBufferCollectionFUCHSIA[collection].constraints;
+            *info_VkBufferCollectionFUCHSIAX[collection].constraints;
         const auto& createInfoIndices =
-            info_VkBufferCollectionFUCHSIA[collection].createInfoIndex;
+            info_VkBufferCollectionFUCHSIAX[collection].createInfoIndex;
         const auto& out = info.settings.image_format_constraints;
         bool foundCreateInfo = false;
 
@@ -2740,12 +2750,12 @@
         return VK_ERROR_OUT_OF_DEVICE_MEMORY;
     }
 
-    VkResult on_vkGetBufferCollectionProperties2FUCHSIA(
+    VkResult on_vkGetBufferCollectionProperties2FUCHSIAX(
         void* context,
         VkResult,
         VkDevice device,
-        VkBufferCollectionFUCHSIA collection,
-        VkBufferCollectionProperties2FUCHSIA* pProperties) {
+        VkBufferCollectionFUCHSIAX collection,
+        VkBufferCollectionProperties2FUCHSIAX* pProperties) {
         VkEncoder* enc = (VkEncoder*)context;
         auto sysmem_collection = reinterpret_cast<
             fidl::WireSyncClient<fuchsia_sysmem::BufferCollection>*>(collection);
@@ -2800,18 +2810,18 @@
         auto storeProperties = [this, collection, pProperties]() -> VkResult {
             // store properties to storage
             AutoLock lock(mLock);
-            if (info_VkBufferCollectionFUCHSIA.find(collection) ==
-                info_VkBufferCollectionFUCHSIA.end()) {
+            if (info_VkBufferCollectionFUCHSIAX.find(collection) ==
+                info_VkBufferCollectionFUCHSIAX.end()) {
                 return VK_ERROR_OUT_OF_DEVICE_MEMORY;
             }
 
-            info_VkBufferCollectionFUCHSIA[collection].properties =
+            info_VkBufferCollectionFUCHSIAX[collection].properties =
                 android::base::makeOptional(*pProperties);
 
             // We only do a shallow copy so we should remove all pNext pointers.
-            info_VkBufferCollectionFUCHSIA[collection].properties->pNext =
+            info_VkBufferCollectionFUCHSIAX[collection].properties->pNext =
                 nullptr;
-            info_VkBufferCollectionFUCHSIA[collection]
+            info_VkBufferCollectionFUCHSIAX[collection]
                 .properties->colorSpace.pNext = nullptr;
             return VK_SUCCESS;
         };
@@ -3357,15 +3367,15 @@
 
             const VkImageCreateInfo* pImageCreateInfo = nullptr;
 
-            VkBufferConstraintsInfoFUCHSIA bufferConstraintsInfo = {
+            VkBufferConstraintsInfoFUCHSIAX bufferConstraintsInfo = {
                 .sType =
-                    VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CREATE_INFO_FUCHSIA,
+                    VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CREATE_INFO_FUCHSIAX,
                 .pNext = nullptr,
                 .pBufferCreateInfo = nullptr,
                 .requiredFormatFeatures = 0,
                 .minCount = 1,
             };
-            const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo =
+            const VkBufferConstraintsInfoFUCHSIAX* pBufferConstraintsInfo =
                 nullptr;
 
             if (hasDedicatedImage) {
@@ -4052,8 +4062,18 @@
 #endif
 
 #ifdef VK_USE_PLATFORM_FUCHSIA
-        const VkBufferCollectionImageCreateInfoFUCHSIA* extBufferCollectionPtr =
-            vk_find_struct<VkBufferCollectionImageCreateInfoFUCHSIA>(pCreateInfo);
+        const VkBufferCollectionImageCreateInfoFUCHSIAX*
+            extBufferCollectionPtr =
+                vk_find_struct<VkBufferCollectionImageCreateInfoFUCHSIAX>(
+                    pCreateInfo);
+        if (extBufferCollectionPtr == nullptr) {
+            // TODO(fxbug.dev/73447): remove this once we finish migration to
+            // FUCHSIAX.
+            extBufferCollectionPtr = reinterpret_cast<
+                const VkBufferCollectionImageCreateInfoFUCHSIAX*>(
+                vk_find_struct<VkBufferCollectionImageCreateInfoFUCHSIA>(
+                    pCreateInfo));
+        }
         bool isSysmemBackedMemory = false;
 
         if (extImgCiPtr &&
@@ -5123,8 +5143,16 @@
         }
 
         const auto* extBufferCollectionPtr =
+            vk_find_struct<VkBufferCollectionBufferCreateInfoFUCHSIAX>(
+                pCreateInfo);
+        if (extBufferCollectionPtr == nullptr) {
+            // TODO(fxbug.dev/73447): Remove this once we finish migration to
+            // FUCHSIAX.
+            extBufferCollectionPtr = reinterpret_cast<
+                const VkBufferCollectionBufferCreateInfoFUCHSIAX*>(
                 vk_find_struct<VkBufferCollectionBufferCreateInfoFUCHSIA>(
-                        pCreateInfo);
+                    pCreateInfo));
+        }
 
         if (extBufferCollectionPtr) {
             auto collection = reinterpret_cast<
@@ -7493,8 +7521,10 @@
     const VkBufferCollectionCreateInfoFUCHSIA* pInfo,
     const VkAllocationCallbacks* pAllocator,
     VkBufferCollectionFUCHSIA* pCollection) {
-    return mImpl->on_vkCreateBufferCollectionFUCHSIA(
-        context, input_result, device, pInfo, pAllocator, pCollection);
+    return mImpl->on_vkCreateBufferCollectionFUCHSIAX(
+        context, input_result, device,
+        reinterpret_cast<const VkBufferCollectionCreateInfoFUCHSIAX*>(pInfo),
+        pAllocator, reinterpret_cast<VkBufferCollectionFUCHSIAX*>(pCollection));
 }
 
 void ResourceTracker::on_vkDestroyBufferCollectionFUCHSIA(
@@ -7502,8 +7532,9 @@
         VkDevice device,
         VkBufferCollectionFUCHSIA collection,
         const VkAllocationCallbacks* pAllocator) {
-    return mImpl->on_vkDestroyBufferCollectionFUCHSIA(
-        context, input_result, device, collection, pAllocator);
+    return mImpl->on_vkDestroyBufferCollectionFUCHSIAX(
+        context, input_result, device,
+        reinterpret_cast<VkBufferCollectionFUCHSIAX>(collection), pAllocator);
 }
 
 VkResult ResourceTracker::on_vkSetBufferCollectionConstraintsFUCHSIA(
@@ -7511,17 +7542,22 @@
         VkDevice device,
         VkBufferCollectionFUCHSIA collection,
         const VkImageCreateInfo* pImageInfo) {
-    return mImpl->on_vkSetBufferCollectionConstraintsFUCHSIA(
-        context, input_result, device, collection, pImageInfo);
+    return mImpl->on_vkSetBufferCollectionConstraintsFUCHSIAX(
+        context, input_result, device,
+        reinterpret_cast<VkBufferCollectionFUCHSIAX>(collection), pImageInfo);
 }
 
 VkResult ResourceTracker::on_vkSetBufferCollectionBufferConstraintsFUCHSIA(
-        void* context, VkResult input_result,
-        VkDevice device,
-        VkBufferCollectionFUCHSIA collection,
-        const VkBufferConstraintsInfoFUCHSIA* pBufferDConstraintsInfo) {
-    return mImpl->on_vkSetBufferCollectionBufferConstraintsFUCHSIA(
-        context, input_result, device, collection, pBufferDConstraintsInfo);
+    void* context,
+    VkResult input_result,
+    VkDevice device,
+    VkBufferCollectionFUCHSIA collection,
+    const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo) {
+    return mImpl->on_vkSetBufferCollectionBufferConstraintsFUCHSIAX(
+        context, input_result, device,
+        reinterpret_cast<VkBufferCollectionFUCHSIAX>(collection),
+        reinterpret_cast<const VkBufferConstraintsInfoFUCHSIAX*>(
+            pBufferConstraintsInfo));
 }
 
 VkResult ResourceTracker::on_vkSetBufferCollectionImageConstraintsFUCHSIA(
@@ -7530,8 +7566,11 @@
     VkDevice device,
     VkBufferCollectionFUCHSIA collection,
     const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo) {
-    return mImpl->on_vkSetBufferCollectionImageConstraintsFUCHSIA(
-        context, input_result, device, collection, pImageConstraintsInfo);
+    return mImpl->on_vkSetBufferCollectionImageConstraintsFUCHSIAX(
+        context, input_result, device,
+        reinterpret_cast<VkBufferCollectionFUCHSIAX>(collection),
+        reinterpret_cast<const VkImageConstraintsInfoFUCHSIAX*>(
+            pImageConstraintsInfo));
 }
 
 VkResult ResourceTracker::on_vkGetBufferCollectionPropertiesFUCHSIA(
@@ -7539,8 +7578,10 @@
         VkDevice device,
         VkBufferCollectionFUCHSIA collection,
         VkBufferCollectionPropertiesFUCHSIA* pProperties) {
-    return mImpl->on_vkGetBufferCollectionPropertiesFUCHSIA(
-        context, input_result, device, collection, pProperties);
+    return mImpl->on_vkGetBufferCollectionPropertiesFUCHSIAX(
+        context, input_result, device,
+        reinterpret_cast<VkBufferCollectionFUCHSIAX>(collection),
+        reinterpret_cast<VkBufferCollectionPropertiesFUCHSIAX*>(pProperties));
 }
 
 VkResult ResourceTracker::on_vkGetBufferCollectionProperties2FUCHSIA(
@@ -7549,7 +7590,80 @@
     VkDevice device,
     VkBufferCollectionFUCHSIA collection,
     VkBufferCollectionProperties2FUCHSIA* pProperties) {
-    return mImpl->on_vkGetBufferCollectionProperties2FUCHSIA(
+    return mImpl->on_vkGetBufferCollectionProperties2FUCHSIAX(
+        context, input_result, device,
+        reinterpret_cast<VkBufferCollectionFUCHSIAX>(collection),
+        reinterpret_cast<VkBufferCollectionProperties2FUCHSIAX*>(pProperties));
+}
+
+VkResult ResourceTracker::on_vkCreateBufferCollectionFUCHSIAX(
+    void* context,
+    VkResult input_result,
+    VkDevice device,
+    const VkBufferCollectionCreateInfoFUCHSIAX* pInfo,
+    const VkAllocationCallbacks* pAllocator,
+    VkBufferCollectionFUCHSIAX* pCollection) {
+    return mImpl->on_vkCreateBufferCollectionFUCHSIAX(
+        context, input_result, device, pInfo, pAllocator, pCollection);
+}
+
+void ResourceTracker::on_vkDestroyBufferCollectionFUCHSIAX(
+    void* context,
+    VkResult input_result,
+    VkDevice device,
+    VkBufferCollectionFUCHSIAX collection,
+    const VkAllocationCallbacks* pAllocator) {
+    return mImpl->on_vkDestroyBufferCollectionFUCHSIAX(
+        context, input_result, device, collection, pAllocator);
+}
+
+VkResult ResourceTracker::on_vkSetBufferCollectionConstraintsFUCHSIAX(
+    void* context,
+    VkResult input_result,
+    VkDevice device,
+    VkBufferCollectionFUCHSIAX collection,
+    const VkImageCreateInfo* pImageInfo) {
+    return mImpl->on_vkSetBufferCollectionConstraintsFUCHSIAX(
+        context, input_result, device, collection, pImageInfo);
+}
+
+VkResult ResourceTracker::on_vkSetBufferCollectionBufferConstraintsFUCHSIAX(
+    void* context,
+    VkResult input_result,
+    VkDevice device,
+    VkBufferCollectionFUCHSIAX collection,
+    const VkBufferConstraintsInfoFUCHSIAX* pBufferDConstraintsInfo) {
+    return mImpl->on_vkSetBufferCollectionBufferConstraintsFUCHSIAX(
+        context, input_result, device, collection, pBufferDConstraintsInfo);
+}
+
+VkResult ResourceTracker::on_vkSetBufferCollectionImageConstraintsFUCHSIAX(
+    void* context,
+    VkResult input_result,
+    VkDevice device,
+    VkBufferCollectionFUCHSIAX collection,
+    const VkImageConstraintsInfoFUCHSIAX* pImageConstraintsInfo) {
+    return mImpl->on_vkSetBufferCollectionImageConstraintsFUCHSIAX(
+        context, input_result, device, collection, pImageConstraintsInfo);
+}
+
+VkResult ResourceTracker::on_vkGetBufferCollectionPropertiesFUCHSIAX(
+    void* context,
+    VkResult input_result,
+    VkDevice device,
+    VkBufferCollectionFUCHSIAX collection,
+    VkBufferCollectionPropertiesFUCHSIAX* pProperties) {
+    return mImpl->on_vkGetBufferCollectionPropertiesFUCHSIAX(
+        context, input_result, device, collection, pProperties);
+}
+
+VkResult ResourceTracker::on_vkGetBufferCollectionProperties2FUCHSIAX(
+    void* context,
+    VkResult input_result,
+    VkDevice device,
+    VkBufferCollectionFUCHSIAX collection,
+    VkBufferCollectionProperties2FUCHSIAX* pProperties) {
+    return mImpl->on_vkGetBufferCollectionProperties2FUCHSIAX(
         context, input_result, device, collection, pProperties);
 }
 #endif
diff --git a/system/vulkan_enc/ResourceTracker.h b/system/vulkan_enc/ResourceTracker.h
index 86e4dde..323bee8 100644
--- a/system/vulkan_enc/ResourceTracker.h
+++ b/system/vulkan_enc/ResourceTracker.h
@@ -273,6 +273,8 @@
         void* context, VkResult input_result,
         VkDevice device,
         const VkImportSemaphoreZirconHandleInfoFUCHSIA* pInfo);
+    // TODO(fxbug.dev/73447): Remove all the *FUCHSIA functions below once we
+    // finish migration to FUCHSIAX.
     VkResult on_vkCreateBufferCollectionFUCHSIA(
         void* context, VkResult input_result,
         VkDevice device,
@@ -312,6 +314,49 @@
         VkDevice device,
         VkBufferCollectionFUCHSIA collection,
         VkBufferCollectionProperties2FUCHSIA* pProperties);
+    VkResult on_vkCreateBufferCollectionFUCHSIAX(
+        void* context,
+        VkResult input_result,
+        VkDevice device,
+        const VkBufferCollectionCreateInfoFUCHSIAX* pInfo,
+        const VkAllocationCallbacks* pAllocator,
+        VkBufferCollectionFUCHSIAX* pCollection);
+    void on_vkDestroyBufferCollectionFUCHSIAX(
+        void* context,
+        VkResult input_result,
+        VkDevice device,
+        VkBufferCollectionFUCHSIAX collection,
+        const VkAllocationCallbacks* pAllocator);
+    VkResult on_vkSetBufferCollectionConstraintsFUCHSIAX(
+        void* context,
+        VkResult input_result,
+        VkDevice device,
+        VkBufferCollectionFUCHSIAX collection,
+        const VkImageCreateInfo* pImageInfo);
+    VkResult on_vkSetBufferCollectionBufferConstraintsFUCHSIAX(
+        void* context,
+        VkResult input_result,
+        VkDevice device,
+        VkBufferCollectionFUCHSIAX collection,
+        const VkBufferConstraintsInfoFUCHSIAX* pBufferConstraintsInfo);
+    VkResult on_vkSetBufferCollectionImageConstraintsFUCHSIAX(
+        void* context,
+        VkResult input_result,
+        VkDevice device,
+        VkBufferCollectionFUCHSIAX collection,
+        const VkImageConstraintsInfoFUCHSIAX* pImageConstraintsInfo);
+    VkResult on_vkGetBufferCollectionPropertiesFUCHSIAX(
+        void* context,
+        VkResult input_result,
+        VkDevice device,
+        VkBufferCollectionFUCHSIAX collection,
+        VkBufferCollectionPropertiesFUCHSIAX* pProperties);
+    VkResult on_vkGetBufferCollectionProperties2FUCHSIAX(
+        void* context,
+        VkResult input_result,
+        VkDevice device,
+        VkBufferCollectionFUCHSIAX collection,
+        VkBufferCollectionProperties2FUCHSIAX* pProperties);
 #endif
 
     VkResult on_vkGetAndroidHardwareBufferPropertiesANDROID(
diff --git a/system/vulkan_enc/VulkanHandles.h b/system/vulkan_enc/VulkanHandles.h
index b0f4f6c..b3b7e51 100644
--- a/system/vulkan_enc/VulkanHandles.h
+++ b/system/vulkan_enc/VulkanHandles.h
@@ -74,7 +74,7 @@
 #ifdef VK_USE_PLATFORM_FUCHSIA
 
 #define __GOLDFISH_VK_LIST_NON_DISPATCHABLE_HANDLE_TYPES_FUCHSIA(f) \
-    f(VkBufferCollectionFUCHSIA)
+    f(VkBufferCollectionFUCHSIAX)
 
 #else
 
diff --git a/system/vulkan_enc/goldfish_vk_private_defs.h b/system/vulkan_enc/goldfish_vk_private_defs.h
index bf57d8a..dfeb3c5 100644
--- a/system/vulkan_enc/goldfish_vk_private_defs.h
+++ b/system/vulkan_enc/goldfish_vk_private_defs.h
@@ -498,6 +498,137 @@
     ((VkStructureType)1001004008)
 #endif  // VK_FUCHSIA_buffer_collection
 
+#ifndef VK_FUCHSIA_buffer_collection_x
+
+#define VK_FUCHSIA_buffer_collection_x 1
+VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferCollectionFUCHSIAX)
+#define VK_FUCHSIA_BUFFER_COLLECTION_X_SPEC_VERSION 1
+#define VK_FUCHSIA_BUFFER_COLLECTION_X_EXTENSION_NAME \
+    "VK_FUCHSIA_buffer_collection_x"
+
+typedef enum VkImageFormatConstraintsFlagBitsFUCHSIAX {
+    VK_IMAGE_FORMAT_CONSTRAINTS_FLAG_BITS_MAX_ENUM_FUCHSIAX = 0x7FFFFFFF
+} VkImageFormatConstraintsFlagBitsFUCHSIAX;
+typedef VkFlags VkImageFormatConstraintsFlagsFUCHSIAX;
+
+typedef enum VkImageConstraintsInfoFlagBitsFUCHSIAX {
+    VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_RARELY_FUCHSIAX = 0x00000001,
+    VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_OFTEN_FUCHSIAX = 0x00000002,
+    VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_RARELY_FUCHSIAX = 0x00000004,
+    VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_OFTEN_FUCHSIAX = 0x00000008,
+    VK_IMAGE_CONSTRAINTS_INFO_PROTECTED_OPTIONAL_FUCHSIAX = 0x00000010,
+    VK_IMAGE_CONSTRAINTS_INFO_FLAG_BITS_MAX_ENUM_FUCHSIAX = 0x7FFFFFFF
+} VkImageConstraintsInfoFlagBitsFUCHSIAX;
+typedef VkFlags VkImageConstraintsInfoFlagsFUCHSIAX;
+typedef struct VkBufferCollectionCreateInfoFUCHSIAX {
+    VkStructureType sType;
+    const void* pNext;
+    uint32_t collectionToken;
+} VkBufferCollectionCreateInfoFUCHSIAX;
+
+typedef struct VkImportMemoryBufferCollectionFUCHSIAX {
+    VkStructureType sType;
+    const void* pNext;
+    VkBufferCollectionFUCHSIAX collection;
+    uint32_t index;
+} VkImportMemoryBufferCollectionFUCHSIAX;
+
+typedef struct VkBufferCollectionImageCreateInfoFUCHSIAX {
+    VkStructureType sType;
+    const void* pNext;
+    VkBufferCollectionFUCHSIAX collection;
+    uint32_t index;
+} VkBufferCollectionImageCreateInfoFUCHSIAX;
+
+typedef struct VkBufferConstraintsInfoFUCHSIAX {
+    VkStructureType sType;
+    const void* pNext;
+    const VkBufferCreateInfo* pBufferCreateInfo;
+    VkFormatFeatureFlags requiredFormatFeatures;
+    uint32_t minCount;
+} VkBufferConstraintsInfoFUCHSIAX;
+
+typedef struct VkBufferCollectionBufferCreateInfoFUCHSIAX {
+    VkStructureType sType;
+    const void* pNext;
+    VkBufferCollectionFUCHSIAX collection;
+    uint32_t index;
+} VkBufferCollectionBufferCreateInfoFUCHSIAX;
+
+typedef struct VkBufferCollectionPropertiesFUCHSIAX {
+    VkStructureType sType;
+    void* pNext;
+    uint32_t memoryTypeBits;
+    uint32_t count;
+} VkBufferCollectionPropertiesFUCHSIAX;
+
+typedef struct VkSysmemColorSpaceFUCHSIAX {
+    VkStructureType sType;
+    const void* pNext;
+    uint32_t colorSpace;
+} VkSysmemColorSpaceFUCHSIAX;
+
+typedef struct VkBufferCollectionProperties2FUCHSIAX {
+    VkStructureType sType;
+    void* pNext;
+    uint32_t memoryTypeBits;
+    uint32_t bufferCount;
+    uint32_t createInfoIndex;
+    uint64_t sysmemFormat;
+    VkFormatFeatureFlags formatFeatures;
+    VkSysmemColorSpaceFUCHSIAX colorSpace;
+    VkComponentMapping samplerYcbcrConversionComponents;
+    VkSamplerYcbcrModelConversion suggestedYcbcrModel;
+    VkSamplerYcbcrRange suggestedYcbcrRange;
+    VkChromaLocation suggestedXChromaOffset;
+    VkChromaLocation suggestedYChromaOffset;
+} VkBufferCollectionProperties2FUCHSIAX;
+
+typedef struct VkImageFormatConstraintsInfoFUCHSIAX {
+    VkStructureType sType;
+    const void* pNext;
+    VkFormatFeatureFlags requiredFormatFeatures;
+    VkImageFormatConstraintsFlagsFUCHSIAX flags;
+    uint64_t sysmemFormat;
+    uint32_t colorSpaceCount;
+    const VkSysmemColorSpaceFUCHSIAX* pColorSpaces;
+} VkImageFormatConstraintsInfoFUCHSIAX;
+
+typedef struct VkImageConstraintsInfoFUCHSIAX {
+    VkStructureType sType;
+    const void* pNext;
+    uint32_t createInfoCount;
+    const VkImageCreateInfo* pCreateInfos;
+    const VkImageFormatConstraintsInfoFUCHSIAX* pFormatConstraints;
+    uint32_t minBufferCount;
+    uint32_t maxBufferCount;
+    uint32_t minBufferCountForCamping;
+    uint32_t minBufferCountForDedicatedSlack;
+    uint32_t minBufferCountForSharedSlack;
+    VkImageConstraintsInfoFlagsFUCHSIAX flags;
+} VkImageConstraintsInfoFUCHSIAX;
+
+#define VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CREATE_INFO_FUCHSIAX \
+    ((VkStructureType)1000367000)
+#define VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIAX \
+    ((VkStructureType)1000367004)
+#define VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIAX \
+    ((VkStructureType)1000367005)
+#define VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES_FUCHSIAX \
+    ((VkStructureType)1000367006)
+#define VK_STRUCTURE_TYPE_BUFFER_CONSTRAINTS_INFO_FUCHSIAX \
+    ((VkStructureType)1000367007)
+#define VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIAX \
+    ((VkStructureType)1000367008)
+#define VK_STRUCTURE_TYPE_IMAGE_CONSTRAINTS_INFO_FUCHSIAX \
+    ((VkStructureType)1000367009)
+#define VK_STRUCTURE_TYPE_IMAGE_FORMAT_CONSTRAINTS_INFO_FUCHSIAX \
+    ((VkStructureType)1000367010)
+#define VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES2_FUCHSIAX \
+    ((VkStructureType)1000367011)
+
+#endif  // VK_FUCHSIA_buffer_collection_x
+
 #ifndef VK_FUCHSIA_external_memory
 #define VK_FUCHSIA_external_memory 1
 #define VK_FUCHSIA_EXTERNAL_MEMORY_SPEC_VERSION 1
diff --git a/system/vulkan_enc/vk_struct_id.h b/system/vulkan_enc/vk_struct_id.h
index 5a7328a..f51d8f6 100644
--- a/system/vulkan_enc/vk_struct_id.h
+++ b/system/vulkan_enc/vk_struct_id.h
@@ -47,6 +47,9 @@
 REGISTER_VK_STRUCT_ID(VkImportMemoryZirconHandleInfoFUCHSIA, VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA);
 REGISTER_VK_STRUCT_ID(VkBufferCollectionImageCreateInfoFUCHSIA, VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA);
 REGISTER_VK_STRUCT_ID(VkBufferCollectionBufferCreateInfoFUCHSIA, VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA);
+REGISTER_VK_STRUCT_ID(VkImportMemoryBufferCollectionFUCHSIAX, VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIAX);
+REGISTER_VK_STRUCT_ID(VkBufferCollectionImageCreateInfoFUCHSIAX, VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIAX);
+REGISTER_VK_STRUCT_ID(VkBufferCollectionBufferCreateInfoFUCHSIAX, VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIAX);
 REGISTER_VK_STRUCT_ID(VkSamplerCreateInfo, VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO);
 REGISTER_VK_STRUCT_ID(VkSamplerYcbcrConversionInfo, VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO);
 REGISTER_VK_STRUCT_ID(VkFenceCreateInfo, VK_STRUCTURE_TYPE_FENCE_CREATE_INFO);