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);
