Empty merge of sc-v2-dev-plus-aosp-without-vendor@8433047

Bug: 226662282
Merged-In: I57adede47416e28451bbafaab7927314ecd006e6
Change-Id: I5bd04810525985cdcfad7e01f52ff9179be52311
diff --git a/android-emu/android/base/ring_buffer.c b/android-emu/android/base/ring_buffer.c
index 3618b4b..d9dfafa 100644
--- a/android-emu/android/base/ring_buffer.c
+++ b/android-emu/android/base/ring_buffer.c
@@ -42,7 +42,7 @@
 
 #define RING_BUFFER_VERSION 1
 
-static inline void ring_buffer_pause() {
+static inline void ring_buffer_pause(void) {
 #if RING_BUFFER_X86
     _mm_pause();
 #else
diff --git a/system/egl/egl.cpp b/system/egl/egl.cpp
index fc3d0a9..11553e3 100644
--- a/system/egl/egl.cpp
+++ b/system/egl/egl.cpp
@@ -2229,6 +2229,9 @@
 #if PLATFORM_SDK_VERSION >= 28
             case HAL_PIXEL_FORMAT_YCBCR_420_888:
 #endif
+#if PLATFORM_SDK_VERSION >= 30
+            case HAL_PIXEL_FORMAT_YCBCR_P010:
+#endif
                 break;
             case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
                 ALOGW("%s:%d using HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED\n", __func__, __LINE__);
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index 80862a6..a4bf2e7 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -1368,6 +1368,7 @@
             "VK_KHR_image_format_list",
             "VK_KHR_incremental_present",
             "VK_KHR_pipeline_executable_properties",
+            "VK_EXT_queue_family_foreign",
 #if defined(VK_USE_PLATFORM_ANDROID_KHR) || defined(__linux__)
             "VK_KHR_external_semaphore",
             "VK_KHR_external_semaphore_fd",
@@ -1641,6 +1642,19 @@
         }
     }
 
+    void on_vkGetPhysicalDeviceFeatures2(
+        void*,
+        VkPhysicalDevice,
+        VkPhysicalDeviceFeatures2* pFeatures) {
+        if (pFeatures) {
+            VkPhysicalDeviceDeviceMemoryReportFeaturesEXT* memoryReportFeaturesEXT =
+                vk_find_struct<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT>(pFeatures);
+            if (memoryReportFeaturesEXT) {
+                memoryReportFeaturesEXT->deviceMemoryReport = VK_TRUE;
+            }
+        }
+    }
+
     void on_vkGetPhysicalDeviceProperties2(
         void*,
         VkPhysicalDevice,
@@ -7684,6 +7698,7 @@
         for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; ++i) {
             struct goldfish_VkCommandBuffer* cb = as_goldfish_VkCommandBuffer(pCommandBuffers[i]);
             cb->isSecondary = pAllocateInfo->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY;
+            cb->device = device;
         }
 
         return res;
@@ -7826,6 +7841,14 @@
                it->second.enabledExtensions.end();
     }
 
+    VkDevice getDevice(VkCommandBuffer commandBuffer) const {
+        struct goldfish_VkCommandBuffer* cb = as_goldfish_VkCommandBuffer(commandBuffer);
+        if (!cb) {
+            return nullptr;
+        }
+        return cb->device;
+    }
+
     // Resets staging stream for this command buffer and primary command buffers
     // where this command buffer has been recorded. If requested, also clears the pending
     // descriptor sets.
@@ -8007,6 +8030,9 @@
 bool ResourceTracker::hasDeviceExtension(VkDevice device, const std::string &name) const {
     return mImpl->hasDeviceExtension(device, name);
 }
+VkDevice ResourceTracker::getDevice(VkCommandBuffer commandBuffer) const {
+    return mImpl->getDevice(commandBuffer);
+}
 void ResourceTracker::addToCommandPool(VkCommandPool commandPool,
                       uint32_t commandBufferCount,
                       VkCommandBuffer* pCommandBuffers) {
@@ -8105,6 +8131,22 @@
         pProperties);
 }
 
+void ResourceTracker::on_vkGetPhysicalDeviceFeatures2(
+    void* context,
+    VkPhysicalDevice physicalDevice,
+    VkPhysicalDeviceFeatures2* pFeatures) {
+    mImpl->on_vkGetPhysicalDeviceFeatures2(context, physicalDevice,
+        pFeatures);
+}
+
+void ResourceTracker::on_vkGetPhysicalDeviceFeatures2KHR(
+    void* context,
+    VkPhysicalDevice physicalDevice,
+    VkPhysicalDeviceFeatures2* pFeatures) {
+    mImpl->on_vkGetPhysicalDeviceFeatures2(context, physicalDevice,
+        pFeatures);
+}
+
 void ResourceTracker::on_vkGetPhysicalDeviceProperties2(
     void* context,
     VkPhysicalDevice physicalDevice,
diff --git a/system/vulkan_enc/ResourceTracker.h b/system/vulkan_enc/ResourceTracker.h
index 68823d3..e25e75d 100644
--- a/system/vulkan_enc/ResourceTracker.h
+++ b/system/vulkan_enc/ResourceTracker.h
@@ -82,6 +82,14 @@
         VkInstance instance, uint32_t* pPhysicalDeviceCount,
         VkPhysicalDevice* pPhysicalDevices);
 
+    void on_vkGetPhysicalDeviceFeatures2(
+        void* context,
+        VkPhysicalDevice physicalDevice,
+        VkPhysicalDeviceFeatures2* pFeatures);
+    void on_vkGetPhysicalDeviceFeatures2KHR(
+        void* context,
+        VkPhysicalDevice physicalDevice,
+        VkPhysicalDeviceFeatures2* pFeatures);
     void on_vkGetPhysicalDeviceProperties(
         void* context,
         VkPhysicalDevice physicalDevice,
@@ -632,6 +640,7 @@
     uint32_t getApiVersionFromDevice(VkDevice device) const;
     bool hasInstanceExtension(VkInstance instance, const std::string& name) const;
     bool hasDeviceExtension(VkDevice instance, const std::string& name) const;
+    VkDevice getDevice(VkCommandBuffer commandBuffer) const;
     void addToCommandPool(VkCommandPool commandPool,
                           uint32_t commandBufferCount,
                           VkCommandBuffer* pCommandBuffers);
diff --git a/system/vulkan_enc/Resources.h b/system/vulkan_enc/Resources.h
index 67c498e..17043ca 100644
--- a/system/vulkan_enc/Resources.h
+++ b/system/vulkan_enc/Resources.h
@@ -129,6 +129,7 @@
     struct goldfish_vk_object_list* superObjects;
     void* userPtr;
     bool isSecondary;
+    VkDevice device;
 };
 
 } // extern "C"
diff --git a/system/vulkan_enc/VkEncoder.cpp b/system/vulkan_enc/VkEncoder.cpp
index 2fbeb75..f7eef9d 100644
--- a/system/vulkan_enc/VkEncoder.cpp
+++ b/system/vulkan_enc/VkEncoder.cpp
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module VkEncoder
-// (impl) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #include "VkEncoder.h"
 
@@ -11633,6 +11634,7 @@
     {
         transform_fromhost_VkPhysicalDeviceFeatures2(sResourceTracker, (VkPhysicalDeviceFeatures2*)(pFeatures));
     }
+    sResourceTracker->on_vkGetPhysicalDeviceFeatures2(this, physicalDevice, pFeatures);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -17679,6 +17681,7 @@
     {
         transform_fromhost_VkPhysicalDeviceFeatures2(sResourceTracker, (VkPhysicalDeviceFeatures2*)(pFeatures));
     }
+    sResourceTracker->on_vkGetPhysicalDeviceFeatures2KHR(this, physicalDevice, pFeatures);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
diff --git a/system/vulkan_enc/VkEncoder.h b/system/vulkan_enc/VkEncoder.h
index b0e7d8e..c42704b 100644
--- a/system/vulkan_enc/VkEncoder.h
+++ b/system/vulkan_enc/VkEncoder.h
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module VkEncoder
-// (header) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #pragma once
 
diff --git a/system/vulkan_enc/func_table.cpp b/system/vulkan_enc/func_table.cpp
index a267ffb..4e17d42 100644
--- a/system/vulkan_enc/func_table.cpp
+++ b/system/vulkan_enc/func_table.cpp
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module func_table
-// (impl) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #include "func_table.h"
 
@@ -1650,6 +1651,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetDeviceMask(commandBuffer, deviceMask, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetDeviceMask(
+    VkCommandBuffer commandBuffer,
+    uint32_t deviceMask)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);
+    if (resources->getApiVersionFromDevice(device) < VK_API_VERSION_1_1)
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetDeviceMask", "VK_VERSION_1_1");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetDeviceMask");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetDeviceMask(commandBuffer, deviceMask, true /* do lock */);
+}
 static void entry_vkCmdDispatchBase(
     VkCommandBuffer commandBuffer,
     uint32_t baseGroupX,
@@ -1663,6 +1678,25 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDispatchBase(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDispatchBase(
+    VkCommandBuffer commandBuffer,
+    uint32_t baseGroupX,
+    uint32_t baseGroupY,
+    uint32_t baseGroupZ,
+    uint32_t groupCountX,
+    uint32_t groupCountY,
+    uint32_t groupCountZ)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);
+    if (resources->getApiVersionFromDevice(device) < VK_API_VERSION_1_1)
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDispatchBase", "VK_VERSION_1_1");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDispatchBase");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDispatchBase(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ, true /* do lock */);
+}
 static VkResult entry_vkEnumeratePhysicalDeviceGroups(
     VkInstance instance,
     uint32_t* pPhysicalDeviceGroupCount,
@@ -2055,6 +2089,25 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDrawIndirectCount(
+    VkCommandBuffer commandBuffer,
+    VkBuffer buffer,
+    VkDeviceSize offset,
+    VkBuffer countBuffer,
+    VkDeviceSize countBufferOffset,
+    uint32_t maxDrawCount,
+    uint32_t stride)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_VERSION_1_2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDrawIndirectCount", "VK_VERSION_1_2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDrawIndirectCount");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
+}
 static void entry_vkCmdDrawIndexedIndirectCount(
     VkCommandBuffer commandBuffer,
     VkBuffer buffer,
@@ -2068,6 +2121,25 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDrawIndexedIndirectCount(
+    VkCommandBuffer commandBuffer,
+    VkBuffer buffer,
+    VkDeviceSize offset,
+    VkBuffer countBuffer,
+    VkDeviceSize countBufferOffset,
+    uint32_t maxDrawCount,
+    uint32_t stride)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_VERSION_1_2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDrawIndexedIndirectCount", "VK_VERSION_1_2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDrawIndexedIndirectCount");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
+}
 static VkResult entry_vkCreateRenderPass2(
     VkDevice device,
     const VkRenderPassCreateInfo2* pCreateInfo,
@@ -2106,6 +2178,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBeginRenderPass2(commandBuffer, pRenderPassBegin, pSubpassBeginInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBeginRenderPass2(
+    VkCommandBuffer commandBuffer,
+    const VkRenderPassBeginInfo* pRenderPassBegin,
+    const VkSubpassBeginInfo* pSubpassBeginInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_VERSION_1_2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBeginRenderPass2", "VK_VERSION_1_2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBeginRenderPass2");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBeginRenderPass2(commandBuffer, pRenderPassBegin, pSubpassBeginInfo, true /* do lock */);
+}
 static void entry_vkCmdNextSubpass2(
     VkCommandBuffer commandBuffer,
     const VkSubpassBeginInfo* pSubpassBeginInfo,
@@ -2115,6 +2202,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdNextSubpass2(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdNextSubpass2(
+    VkCommandBuffer commandBuffer,
+    const VkSubpassBeginInfo* pSubpassBeginInfo,
+    const VkSubpassEndInfo* pSubpassEndInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_VERSION_1_2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdNextSubpass2", "VK_VERSION_1_2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdNextSubpass2");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdNextSubpass2(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo, true /* do lock */);
+}
 static void entry_vkCmdEndRenderPass2(
     VkCommandBuffer commandBuffer,
     const VkSubpassEndInfo* pSubpassEndInfo)
@@ -2123,6 +2225,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdEndRenderPass2(commandBuffer, pSubpassEndInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdEndRenderPass2(
+    VkCommandBuffer commandBuffer,
+    const VkSubpassEndInfo* pSubpassEndInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_VERSION_1_2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdEndRenderPass2", "VK_VERSION_1_2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdEndRenderPass2");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdEndRenderPass2(commandBuffer, pSubpassEndInfo, true /* do lock */);
+}
 static void entry_vkResetQueryPool(
     VkDevice device,
     VkQueryPool queryPool,
@@ -3034,6 +3150,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBeginVideoCodingKHR(commandBuffer, pBeginInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBeginVideoCodingKHR(
+    VkCommandBuffer commandBuffer,
+    const VkVideoBeginCodingInfoKHR* pBeginInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_video_queue"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBeginVideoCodingKHR", "VK_KHR_video_queue");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBeginVideoCodingKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBeginVideoCodingKHR(commandBuffer, pBeginInfo, true /* do lock */);
+}
 static void entry_vkCmdEndVideoCodingKHR(
     VkCommandBuffer commandBuffer,
     const VkVideoEndCodingInfoKHR* pEndCodingInfo)
@@ -3042,6 +3172,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdEndVideoCodingKHR(commandBuffer, pEndCodingInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdEndVideoCodingKHR(
+    VkCommandBuffer commandBuffer,
+    const VkVideoEndCodingInfoKHR* pEndCodingInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_video_queue"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdEndVideoCodingKHR", "VK_KHR_video_queue");
+    }
+    AEMU_SCOPED_TRACE("vkCmdEndVideoCodingKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdEndVideoCodingKHR(commandBuffer, pEndCodingInfo, true /* do lock */);
+}
 static void entry_vkCmdControlVideoCodingKHR(
     VkCommandBuffer commandBuffer,
     const VkVideoCodingControlInfoKHR* pCodingControlInfo)
@@ -3050,6 +3194,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdControlVideoCodingKHR(commandBuffer, pCodingControlInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdControlVideoCodingKHR(
+    VkCommandBuffer commandBuffer,
+    const VkVideoCodingControlInfoKHR* pCodingControlInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_video_queue"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdControlVideoCodingKHR", "VK_KHR_video_queue");
+    }
+    AEMU_SCOPED_TRACE("vkCmdControlVideoCodingKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdControlVideoCodingKHR(commandBuffer, pCodingControlInfo, true /* do lock */);
+}
 #endif
 #ifdef VK_KHR_video_decode_queue
 static void entry_vkCmdDecodeVideoKHR(
@@ -3060,6 +3218,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDecodeVideoKHR(commandBuffer, pFrameInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDecodeVideoKHR(
+    VkCommandBuffer commandBuffer,
+    const VkVideoDecodeInfoKHR* pFrameInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_video_decode_queue"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDecodeVideoKHR", "VK_KHR_video_decode_queue");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDecodeVideoKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDecodeVideoKHR(commandBuffer, pFrameInfo, true /* do lock */);
+}
 #endif
 #ifdef VK_KHR_dynamic_rendering
 static void entry_vkCmdBeginRenderingKHR(
@@ -3070,6 +3242,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBeginRenderingKHR(commandBuffer, pRenderingInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBeginRenderingKHR(
+    VkCommandBuffer commandBuffer,
+    const VkRenderingInfoKHR* pRenderingInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_dynamic_rendering"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBeginRenderingKHR", "VK_KHR_dynamic_rendering");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBeginRenderingKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBeginRenderingKHR(commandBuffer, pRenderingInfo, true /* do lock */);
+}
 static void entry_vkCmdEndRenderingKHR(
     VkCommandBuffer commandBuffer)
 {
@@ -3077,6 +3263,19 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdEndRenderingKHR(commandBuffer, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdEndRenderingKHR(
+    VkCommandBuffer commandBuffer)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_dynamic_rendering"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdEndRenderingKHR", "VK_KHR_dynamic_rendering");
+    }
+    AEMU_SCOPED_TRACE("vkCmdEndRenderingKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdEndRenderingKHR(commandBuffer, true /* do lock */);
+}
 #endif
 #ifdef VK_KHR_multiview
 #endif
@@ -3182,6 +3381,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetDeviceMaskKHR(commandBuffer, deviceMask, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetDeviceMaskKHR(
+    VkCommandBuffer commandBuffer,
+    uint32_t deviceMask)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_device_group"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetDeviceMaskKHR", "VK_KHR_device_group");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetDeviceMaskKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetDeviceMaskKHR(commandBuffer, deviceMask, true /* do lock */);
+}
 static void entry_vkCmdDispatchBaseKHR(
     VkCommandBuffer commandBuffer,
     uint32_t baseGroupX,
@@ -3195,6 +3408,25 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDispatchBaseKHR(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDispatchBaseKHR(
+    VkCommandBuffer commandBuffer,
+    uint32_t baseGroupX,
+    uint32_t baseGroupY,
+    uint32_t baseGroupZ,
+    uint32_t groupCountX,
+    uint32_t groupCountY,
+    uint32_t groupCountZ)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_device_group"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDispatchBaseKHR", "VK_KHR_device_group");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDispatchBaseKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDispatchBaseKHR(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ, true /* do lock */);
+}
 #endif
 #ifdef VK_KHR_shader_draw_parameters
 #endif
@@ -3503,6 +3735,24 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdPushDescriptorSetKHR(commandBuffer, pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdPushDescriptorSetKHR(
+    VkCommandBuffer commandBuffer,
+    VkPipelineBindPoint pipelineBindPoint,
+    VkPipelineLayout layout,
+    uint32_t set,
+    uint32_t descriptorWriteCount,
+    const VkWriteDescriptorSet* pDescriptorWrites)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_push_descriptor"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdPushDescriptorSetKHR", "VK_KHR_push_descriptor");
+    }
+    AEMU_SCOPED_TRACE("vkCmdPushDescriptorSetKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdPushDescriptorSetKHR(commandBuffer, pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites, true /* do lock */);
+}
 static void entry_vkCmdPushDescriptorSetWithTemplateKHR(
     VkCommandBuffer commandBuffer,
     VkDescriptorUpdateTemplate descriptorUpdateTemplate,
@@ -3514,6 +3764,23 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdPushDescriptorSetWithTemplateKHR(commandBuffer, descriptorUpdateTemplate, layout, set, pData, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdPushDescriptorSetWithTemplateKHR(
+    VkCommandBuffer commandBuffer,
+    VkDescriptorUpdateTemplate descriptorUpdateTemplate,
+    VkPipelineLayout layout,
+    uint32_t set,
+    const void* pData)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_push_descriptor"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdPushDescriptorSetWithTemplateKHR", "VK_KHR_push_descriptor");
+    }
+    AEMU_SCOPED_TRACE("vkCmdPushDescriptorSetWithTemplateKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdPushDescriptorSetWithTemplateKHR(commandBuffer, descriptorUpdateTemplate, layout, set, pData, true /* do lock */);
+}
 #endif
 #ifdef VK_KHR_shader_float16_int8
 #endif
@@ -3641,6 +3908,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBeginRenderPass2KHR(commandBuffer, pRenderPassBegin, pSubpassBeginInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBeginRenderPass2KHR(
+    VkCommandBuffer commandBuffer,
+    const VkRenderPassBeginInfo* pRenderPassBegin,
+    const VkSubpassBeginInfo* pSubpassBeginInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_create_renderpass2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBeginRenderPass2KHR", "VK_KHR_create_renderpass2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBeginRenderPass2KHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBeginRenderPass2KHR(commandBuffer, pRenderPassBegin, pSubpassBeginInfo, true /* do lock */);
+}
 static void entry_vkCmdNextSubpass2KHR(
     VkCommandBuffer commandBuffer,
     const VkSubpassBeginInfo* pSubpassBeginInfo,
@@ -3650,6 +3932,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdNextSubpass2KHR(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdNextSubpass2KHR(
+    VkCommandBuffer commandBuffer,
+    const VkSubpassBeginInfo* pSubpassBeginInfo,
+    const VkSubpassEndInfo* pSubpassEndInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_create_renderpass2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdNextSubpass2KHR", "VK_KHR_create_renderpass2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdNextSubpass2KHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdNextSubpass2KHR(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo, true /* do lock */);
+}
 static void entry_vkCmdEndRenderPass2KHR(
     VkCommandBuffer commandBuffer,
     const VkSubpassEndInfo* pSubpassEndInfo)
@@ -3658,6 +3955,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdEndRenderPass2KHR(commandBuffer, pSubpassEndInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdEndRenderPass2KHR(
+    VkCommandBuffer commandBuffer,
+    const VkSubpassEndInfo* pSubpassEndInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_create_renderpass2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdEndRenderPass2KHR", "VK_KHR_create_renderpass2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdEndRenderPass2KHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdEndRenderPass2KHR(commandBuffer, pSubpassEndInfo, true /* do lock */);
+}
 #endif
 #ifdef VK_KHR_shared_presentable_image
 static VkResult entry_vkGetSwapchainStatusKHR(
@@ -4192,6 +4503,25 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDrawIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDrawIndirectCountKHR(
+    VkCommandBuffer commandBuffer,
+    VkBuffer buffer,
+    VkDeviceSize offset,
+    VkBuffer countBuffer,
+    VkDeviceSize countBufferOffset,
+    uint32_t maxDrawCount,
+    uint32_t stride)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_draw_indirect_count"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDrawIndirectCountKHR", "VK_KHR_draw_indirect_count");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDrawIndirectCountKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDrawIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
+}
 static void entry_vkCmdDrawIndexedIndirectCountKHR(
     VkCommandBuffer commandBuffer,
     VkBuffer buffer,
@@ -4205,6 +4535,25 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDrawIndexedIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDrawIndexedIndirectCountKHR(
+    VkCommandBuffer commandBuffer,
+    VkBuffer buffer,
+    VkDeviceSize offset,
+    VkBuffer countBuffer,
+    VkDeviceSize countBufferOffset,
+    uint32_t maxDrawCount,
+    uint32_t stride)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_draw_indirect_count"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDrawIndexedIndirectCountKHR", "VK_KHR_draw_indirect_count");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDrawIndexedIndirectCountKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDrawIndexedIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
+}
 #endif
 #ifdef VK_KHR_shader_subgroup_extended_types
 #endif
@@ -4328,6 +4677,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetFragmentShadingRateKHR(commandBuffer, pFragmentSize, combinerOps, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetFragmentShadingRateKHR(
+    VkCommandBuffer commandBuffer,
+    const VkExtent2D* pFragmentSize,
+    const VkFragmentShadingRateCombinerOpKHR combinerOps[2])
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_fragment_shading_rate"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetFragmentShadingRateKHR", "VK_KHR_fragment_shading_rate");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetFragmentShadingRateKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetFragmentShadingRateKHR(commandBuffer, pFragmentSize, combinerOps, true /* do lock */);
+}
 #endif
 #ifdef VK_KHR_spirv_1_4
 #endif
@@ -4678,6 +5042,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdEncodeVideoKHR(commandBuffer, pEncodeInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdEncodeVideoKHR(
+    VkCommandBuffer commandBuffer,
+    const VkVideoEncodeInfoKHR* pEncodeInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_video_encode_queue"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdEncodeVideoKHR", "VK_KHR_video_encode_queue");
+    }
+    AEMU_SCOPED_TRACE("vkCmdEncodeVideoKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdEncodeVideoKHR(commandBuffer, pEncodeInfo, true /* do lock */);
+}
 #endif
 #ifdef VK_KHR_synchronization2
 static void entry_vkCmdSetEvent2KHR(
@@ -4689,6 +5067,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetEvent2KHR(commandBuffer, event, pDependencyInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetEvent2KHR(
+    VkCommandBuffer commandBuffer,
+    VkEvent event,
+    const VkDependencyInfoKHR* pDependencyInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_synchronization2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetEvent2KHR", "VK_KHR_synchronization2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetEvent2KHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetEvent2KHR(commandBuffer, event, pDependencyInfo, true /* do lock */);
+}
 static void entry_vkCmdResetEvent2KHR(
     VkCommandBuffer commandBuffer,
     VkEvent event,
@@ -4698,6 +5091,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdResetEvent2KHR(commandBuffer, event, stageMask, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdResetEvent2KHR(
+    VkCommandBuffer commandBuffer,
+    VkEvent event,
+    VkPipelineStageFlags2KHR stageMask)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_synchronization2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdResetEvent2KHR", "VK_KHR_synchronization2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdResetEvent2KHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdResetEvent2KHR(commandBuffer, event, stageMask, true /* do lock */);
+}
 static void entry_vkCmdWaitEvents2KHR(
     VkCommandBuffer commandBuffer,
     uint32_t eventCount,
@@ -4708,6 +5116,22 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdWaitEvents2KHR(commandBuffer, eventCount, pEvents, pDependencyInfos, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdWaitEvents2KHR(
+    VkCommandBuffer commandBuffer,
+    uint32_t eventCount,
+    const VkEvent* pEvents,
+    const VkDependencyInfoKHR* pDependencyInfos)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_synchronization2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdWaitEvents2KHR", "VK_KHR_synchronization2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdWaitEvents2KHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdWaitEvents2KHR(commandBuffer, eventCount, pEvents, pDependencyInfos, true /* do lock */);
+}
 static void entry_vkCmdPipelineBarrier2KHR(
     VkCommandBuffer commandBuffer,
     const VkDependencyInfoKHR* pDependencyInfo)
@@ -4716,6 +5140,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdPipelineBarrier2KHR(commandBuffer, pDependencyInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdPipelineBarrier2KHR(
+    VkCommandBuffer commandBuffer,
+    const VkDependencyInfoKHR* pDependencyInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_synchronization2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdPipelineBarrier2KHR", "VK_KHR_synchronization2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdPipelineBarrier2KHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdPipelineBarrier2KHR(commandBuffer, pDependencyInfo, true /* do lock */);
+}
 static void entry_vkCmdWriteTimestamp2KHR(
     VkCommandBuffer commandBuffer,
     VkPipelineStageFlags2KHR stage,
@@ -4726,6 +5164,22 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdWriteTimestamp2KHR(commandBuffer, stage, queryPool, query, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdWriteTimestamp2KHR(
+    VkCommandBuffer commandBuffer,
+    VkPipelineStageFlags2KHR stage,
+    VkQueryPool queryPool,
+    uint32_t query)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_synchronization2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdWriteTimestamp2KHR", "VK_KHR_synchronization2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdWriteTimestamp2KHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdWriteTimestamp2KHR(commandBuffer, stage, queryPool, query, true /* do lock */);
+}
 static VkResult entry_vkQueueSubmit2KHR(
     VkQueue queue,
     uint32_t submitCount,
@@ -4749,6 +5203,23 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdWriteBufferMarker2AMD(commandBuffer, stage, dstBuffer, dstOffset, marker, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdWriteBufferMarker2AMD(
+    VkCommandBuffer commandBuffer,
+    VkPipelineStageFlags2KHR stage,
+    VkBuffer dstBuffer,
+    VkDeviceSize dstOffset,
+    uint32_t marker)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_synchronization2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdWriteBufferMarker2AMD", "VK_KHR_synchronization2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdWriteBufferMarker2AMD");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdWriteBufferMarker2AMD(commandBuffer, stage, dstBuffer, dstOffset, marker, true /* do lock */);
+}
 static void entry_vkGetQueueCheckpointData2NV(
     VkQueue queue,
     uint32_t* pCheckpointDataCount,
@@ -4774,6 +5245,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdCopyBuffer2KHR(commandBuffer, pCopyBufferInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdCopyBuffer2KHR(
+    VkCommandBuffer commandBuffer,
+    const VkCopyBufferInfo2KHR* pCopyBufferInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_copy_commands2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdCopyBuffer2KHR", "VK_KHR_copy_commands2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdCopyBuffer2KHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdCopyBuffer2KHR(commandBuffer, pCopyBufferInfo, true /* do lock */);
+}
 static void entry_vkCmdCopyImage2KHR(
     VkCommandBuffer commandBuffer,
     const VkCopyImageInfo2KHR* pCopyImageInfo)
@@ -4782,6 +5267,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdCopyImage2KHR(commandBuffer, pCopyImageInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdCopyImage2KHR(
+    VkCommandBuffer commandBuffer,
+    const VkCopyImageInfo2KHR* pCopyImageInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_copy_commands2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdCopyImage2KHR", "VK_KHR_copy_commands2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdCopyImage2KHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdCopyImage2KHR(commandBuffer, pCopyImageInfo, true /* do lock */);
+}
 static void entry_vkCmdCopyBufferToImage2KHR(
     VkCommandBuffer commandBuffer,
     const VkCopyBufferToImageInfo2KHR* pCopyBufferToImageInfo)
@@ -4790,6 +5289,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdCopyBufferToImage2KHR(commandBuffer, pCopyBufferToImageInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdCopyBufferToImage2KHR(
+    VkCommandBuffer commandBuffer,
+    const VkCopyBufferToImageInfo2KHR* pCopyBufferToImageInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_copy_commands2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdCopyBufferToImage2KHR", "VK_KHR_copy_commands2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdCopyBufferToImage2KHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdCopyBufferToImage2KHR(commandBuffer, pCopyBufferToImageInfo, true /* do lock */);
+}
 static void entry_vkCmdCopyImageToBuffer2KHR(
     VkCommandBuffer commandBuffer,
     const VkCopyImageToBufferInfo2KHR* pCopyImageToBufferInfo)
@@ -4798,6 +5311,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdCopyImageToBuffer2KHR(commandBuffer, pCopyImageToBufferInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdCopyImageToBuffer2KHR(
+    VkCommandBuffer commandBuffer,
+    const VkCopyImageToBufferInfo2KHR* pCopyImageToBufferInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_copy_commands2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdCopyImageToBuffer2KHR", "VK_KHR_copy_commands2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdCopyImageToBuffer2KHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdCopyImageToBuffer2KHR(commandBuffer, pCopyImageToBufferInfo, true /* do lock */);
+}
 static void entry_vkCmdBlitImage2KHR(
     VkCommandBuffer commandBuffer,
     const VkBlitImageInfo2KHR* pBlitImageInfo)
@@ -4806,6 +5333,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBlitImage2KHR(commandBuffer, pBlitImageInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBlitImage2KHR(
+    VkCommandBuffer commandBuffer,
+    const VkBlitImageInfo2KHR* pBlitImageInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_copy_commands2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBlitImage2KHR", "VK_KHR_copy_commands2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBlitImage2KHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBlitImage2KHR(commandBuffer, pBlitImageInfo, true /* do lock */);
+}
 static void entry_vkCmdResolveImage2KHR(
     VkCommandBuffer commandBuffer,
     const VkResolveImageInfo2KHR* pResolveImageInfo)
@@ -4814,6 +5355,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdResolveImage2KHR(commandBuffer, pResolveImageInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdResolveImage2KHR(
+    VkCommandBuffer commandBuffer,
+    const VkResolveImageInfo2KHR* pResolveImageInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_copy_commands2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdResolveImage2KHR", "VK_KHR_copy_commands2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdResolveImage2KHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdResolveImage2KHR(commandBuffer, pResolveImageInfo, true /* do lock */);
+}
 #endif
 #ifdef VK_KHR_format_feature_flags2
 #endif
@@ -5074,6 +5629,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDebugMarkerBeginEXT(
+    VkCommandBuffer commandBuffer,
+    const VkDebugMarkerMarkerInfoEXT* pMarkerInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_debug_marker"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDebugMarkerBeginEXT", "VK_EXT_debug_marker");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDebugMarkerBeginEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo, true /* do lock */);
+}
 static void entry_vkCmdDebugMarkerEndEXT(
     VkCommandBuffer commandBuffer)
 {
@@ -5081,6 +5650,19 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDebugMarkerEndEXT(commandBuffer, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDebugMarkerEndEXT(
+    VkCommandBuffer commandBuffer)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_debug_marker"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDebugMarkerEndEXT", "VK_EXT_debug_marker");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDebugMarkerEndEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDebugMarkerEndEXT(commandBuffer, true /* do lock */);
+}
 static void entry_vkCmdDebugMarkerInsertEXT(
     VkCommandBuffer commandBuffer,
     const VkDebugMarkerMarkerInfoEXT* pMarkerInfo)
@@ -5089,6 +5671,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDebugMarkerInsertEXT(
+    VkCommandBuffer commandBuffer,
+    const VkDebugMarkerMarkerInfoEXT* pMarkerInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_debug_marker"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDebugMarkerInsertEXT", "VK_EXT_debug_marker");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDebugMarkerInsertEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo, true /* do lock */);
+}
 #endif
 #ifdef VK_AMD_gcn_shader
 #endif
@@ -5107,6 +5703,24 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBindTransformFeedbackBuffersEXT(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBindTransformFeedbackBuffersEXT(
+    VkCommandBuffer commandBuffer,
+    uint32_t firstBinding,
+    uint32_t bindingCount,
+    const VkBuffer* pBuffers,
+    const VkDeviceSize* pOffsets,
+    const VkDeviceSize* pSizes)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_transform_feedback"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBindTransformFeedbackBuffersEXT", "VK_EXT_transform_feedback");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBindTransformFeedbackBuffersEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBindTransformFeedbackBuffersEXT(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, true /* do lock */);
+}
 static void entry_vkCmdBeginTransformFeedbackEXT(
     VkCommandBuffer commandBuffer,
     uint32_t firstCounterBuffer,
@@ -5118,6 +5732,23 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBeginTransformFeedbackEXT(commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBeginTransformFeedbackEXT(
+    VkCommandBuffer commandBuffer,
+    uint32_t firstCounterBuffer,
+    uint32_t counterBufferCount,
+    const VkBuffer* pCounterBuffers,
+    const VkDeviceSize* pCounterBufferOffsets)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_transform_feedback"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBeginTransformFeedbackEXT", "VK_EXT_transform_feedback");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBeginTransformFeedbackEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBeginTransformFeedbackEXT(commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets, true /* do lock */);
+}
 static void entry_vkCmdEndTransformFeedbackEXT(
     VkCommandBuffer commandBuffer,
     uint32_t firstCounterBuffer,
@@ -5129,6 +5760,23 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdEndTransformFeedbackEXT(commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdEndTransformFeedbackEXT(
+    VkCommandBuffer commandBuffer,
+    uint32_t firstCounterBuffer,
+    uint32_t counterBufferCount,
+    const VkBuffer* pCounterBuffers,
+    const VkDeviceSize* pCounterBufferOffsets)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_transform_feedback"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdEndTransformFeedbackEXT", "VK_EXT_transform_feedback");
+    }
+    AEMU_SCOPED_TRACE("vkCmdEndTransformFeedbackEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdEndTransformFeedbackEXT(commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets, true /* do lock */);
+}
 static void entry_vkCmdBeginQueryIndexedEXT(
     VkCommandBuffer commandBuffer,
     VkQueryPool queryPool,
@@ -5140,6 +5788,23 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBeginQueryIndexedEXT(commandBuffer, queryPool, query, flags, index, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBeginQueryIndexedEXT(
+    VkCommandBuffer commandBuffer,
+    VkQueryPool queryPool,
+    uint32_t query,
+    VkQueryControlFlags flags,
+    uint32_t index)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_transform_feedback"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBeginQueryIndexedEXT", "VK_EXT_transform_feedback");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBeginQueryIndexedEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBeginQueryIndexedEXT(commandBuffer, queryPool, query, flags, index, true /* do lock */);
+}
 static void entry_vkCmdEndQueryIndexedEXT(
     VkCommandBuffer commandBuffer,
     VkQueryPool queryPool,
@@ -5150,6 +5815,22 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdEndQueryIndexedEXT(commandBuffer, queryPool, query, index, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdEndQueryIndexedEXT(
+    VkCommandBuffer commandBuffer,
+    VkQueryPool queryPool,
+    uint32_t query,
+    uint32_t index)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_transform_feedback"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdEndQueryIndexedEXT", "VK_EXT_transform_feedback");
+    }
+    AEMU_SCOPED_TRACE("vkCmdEndQueryIndexedEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdEndQueryIndexedEXT(commandBuffer, queryPool, query, index, true /* do lock */);
+}
 static void entry_vkCmdDrawIndirectByteCountEXT(
     VkCommandBuffer commandBuffer,
     uint32_t instanceCount,
@@ -5163,6 +5844,25 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDrawIndirectByteCountEXT(commandBuffer, instanceCount, firstInstance, counterBuffer, counterBufferOffset, counterOffset, vertexStride, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDrawIndirectByteCountEXT(
+    VkCommandBuffer commandBuffer,
+    uint32_t instanceCount,
+    uint32_t firstInstance,
+    VkBuffer counterBuffer,
+    VkDeviceSize counterBufferOffset,
+    uint32_t counterOffset,
+    uint32_t vertexStride)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_transform_feedback"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDrawIndirectByteCountEXT", "VK_EXT_transform_feedback");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDrawIndirectByteCountEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDrawIndirectByteCountEXT(commandBuffer, instanceCount, firstInstance, counterBuffer, counterBufferOffset, counterOffset, vertexStride, true /* do lock */);
+}
 #endif
 #ifdef VK_NVX_binary_import
 static VkResult entry_vkCreateCuModuleNVX(
@@ -5277,6 +5977,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdCuLaunchKernelNVX(commandBuffer, pLaunchInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdCuLaunchKernelNVX(
+    VkCommandBuffer commandBuffer,
+    const VkCuLaunchInfoNVX* pLaunchInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NVX_binary_import"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdCuLaunchKernelNVX", "VK_NVX_binary_import");
+    }
+    AEMU_SCOPED_TRACE("vkCmdCuLaunchKernelNVX");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdCuLaunchKernelNVX(commandBuffer, pLaunchInfo, true /* do lock */);
+}
 #endif
 #ifdef VK_NVX_image_view_handle
 static uint32_t entry_vkGetImageViewHandleNVX(
@@ -5346,6 +6060,25 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDrawIndirectCountAMD(
+    VkCommandBuffer commandBuffer,
+    VkBuffer buffer,
+    VkDeviceSize offset,
+    VkBuffer countBuffer,
+    VkDeviceSize countBufferOffset,
+    uint32_t maxDrawCount,
+    uint32_t stride)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_AMD_draw_indirect_count"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDrawIndirectCountAMD", "VK_AMD_draw_indirect_count");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDrawIndirectCountAMD");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
+}
 static void entry_vkCmdDrawIndexedIndirectCountAMD(
     VkCommandBuffer commandBuffer,
     VkBuffer buffer,
@@ -5359,6 +6092,25 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDrawIndexedIndirectCountAMD(
+    VkCommandBuffer commandBuffer,
+    VkBuffer buffer,
+    VkDeviceSize offset,
+    VkBuffer countBuffer,
+    VkDeviceSize countBufferOffset,
+    uint32_t maxDrawCount,
+    uint32_t stride)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_AMD_draw_indirect_count"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDrawIndexedIndirectCountAMD", "VK_AMD_draw_indirect_count");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDrawIndexedIndirectCountAMD");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
+}
 #endif
 #ifdef VK_AMD_negative_viewport_height
 #endif
@@ -5515,6 +6267,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBeginConditionalRenderingEXT(commandBuffer, pConditionalRenderingBegin, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBeginConditionalRenderingEXT(
+    VkCommandBuffer commandBuffer,
+    const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_conditional_rendering"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBeginConditionalRenderingEXT", "VK_EXT_conditional_rendering");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBeginConditionalRenderingEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBeginConditionalRenderingEXT(commandBuffer, pConditionalRenderingBegin, true /* do lock */);
+}
 static void entry_vkCmdEndConditionalRenderingEXT(
     VkCommandBuffer commandBuffer)
 {
@@ -5522,6 +6288,19 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdEndConditionalRenderingEXT(commandBuffer, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdEndConditionalRenderingEXT(
+    VkCommandBuffer commandBuffer)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_conditional_rendering"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdEndConditionalRenderingEXT", "VK_EXT_conditional_rendering");
+    }
+    AEMU_SCOPED_TRACE("vkCmdEndConditionalRenderingEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdEndConditionalRenderingEXT(commandBuffer, true /* do lock */);
+}
 #endif
 #ifdef VK_NV_clip_space_w_scaling
 static void entry_vkCmdSetViewportWScalingNV(
@@ -5534,6 +6313,22 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetViewportWScalingNV(commandBuffer, firstViewport, viewportCount, pViewportWScalings, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetViewportWScalingNV(
+    VkCommandBuffer commandBuffer,
+    uint32_t firstViewport,
+    uint32_t viewportCount,
+    const VkViewportWScalingNV* pViewportWScalings)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_clip_space_w_scaling"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetViewportWScalingNV", "VK_NV_clip_space_w_scaling");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetViewportWScalingNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetViewportWScalingNV(commandBuffer, firstViewport, viewportCount, pViewportWScalings, true /* do lock */);
+}
 #endif
 #ifdef VK_EXT_direct_mode_display
 static VkResult entry_vkReleaseDisplayEXT(
@@ -5782,6 +6577,22 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetDiscardRectangleEXT(commandBuffer, firstDiscardRectangle, discardRectangleCount, pDiscardRectangles, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetDiscardRectangleEXT(
+    VkCommandBuffer commandBuffer,
+    uint32_t firstDiscardRectangle,
+    uint32_t discardRectangleCount,
+    const VkRect2D* pDiscardRectangles)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_discard_rectangles"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetDiscardRectangleEXT", "VK_EXT_discard_rectangles");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetDiscardRectangleEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetDiscardRectangleEXT(commandBuffer, firstDiscardRectangle, discardRectangleCount, pDiscardRectangles, true /* do lock */);
+}
 #endif
 #ifdef VK_EXT_conservative_rasterization
 #endif
@@ -5984,6 +6795,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBeginDebugUtilsLabelEXT(commandBuffer, pLabelInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBeginDebugUtilsLabelEXT(
+    VkCommandBuffer commandBuffer,
+    const VkDebugUtilsLabelEXT* pLabelInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_debug_utils"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBeginDebugUtilsLabelEXT", "VK_EXT_debug_utils");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBeginDebugUtilsLabelEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBeginDebugUtilsLabelEXT(commandBuffer, pLabelInfo, true /* do lock */);
+}
 static void entry_vkCmdEndDebugUtilsLabelEXT(
     VkCommandBuffer commandBuffer)
 {
@@ -5991,6 +6816,19 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdEndDebugUtilsLabelEXT(commandBuffer, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdEndDebugUtilsLabelEXT(
+    VkCommandBuffer commandBuffer)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_debug_utils"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdEndDebugUtilsLabelEXT", "VK_EXT_debug_utils");
+    }
+    AEMU_SCOPED_TRACE("vkCmdEndDebugUtilsLabelEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdEndDebugUtilsLabelEXT(commandBuffer, true /* do lock */);
+}
 static void entry_vkCmdInsertDebugUtilsLabelEXT(
     VkCommandBuffer commandBuffer,
     const VkDebugUtilsLabelEXT* pLabelInfo)
@@ -5999,6 +6837,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdInsertDebugUtilsLabelEXT(commandBuffer, pLabelInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdInsertDebugUtilsLabelEXT(
+    VkCommandBuffer commandBuffer,
+    const VkDebugUtilsLabelEXT* pLabelInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_debug_utils"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdInsertDebugUtilsLabelEXT", "VK_EXT_debug_utils");
+    }
+    AEMU_SCOPED_TRACE("vkCmdInsertDebugUtilsLabelEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdInsertDebugUtilsLabelEXT(commandBuffer, pLabelInfo, true /* do lock */);
+}
 static VkResult entry_vkCreateDebugUtilsMessengerEXT(
     VkInstance instance,
     const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
@@ -6110,6 +6962,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetSampleLocationsEXT(commandBuffer, pSampleLocationsInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetSampleLocationsEXT(
+    VkCommandBuffer commandBuffer,
+    const VkSampleLocationsInfoEXT* pSampleLocationsInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_sample_locations"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetSampleLocationsEXT", "VK_EXT_sample_locations");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetSampleLocationsEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetSampleLocationsEXT(commandBuffer, pSampleLocationsInfo, true /* do lock */);
+}
 static void entry_vkGetPhysicalDeviceMultisamplePropertiesEXT(
     VkPhysicalDevice physicalDevice,
     VkSampleCountFlagBits samples,
@@ -6287,6 +7153,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBindShadingRateImageNV(commandBuffer, imageView, imageLayout, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBindShadingRateImageNV(
+    VkCommandBuffer commandBuffer,
+    VkImageView imageView,
+    VkImageLayout imageLayout)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_shading_rate_image"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBindShadingRateImageNV", "VK_NV_shading_rate_image");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBindShadingRateImageNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBindShadingRateImageNV(commandBuffer, imageView, imageLayout, true /* do lock */);
+}
 static void entry_vkCmdSetViewportShadingRatePaletteNV(
     VkCommandBuffer commandBuffer,
     uint32_t firstViewport,
@@ -6297,6 +7178,22 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetViewportShadingRatePaletteNV(commandBuffer, firstViewport, viewportCount, pShadingRatePalettes, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetViewportShadingRatePaletteNV(
+    VkCommandBuffer commandBuffer,
+    uint32_t firstViewport,
+    uint32_t viewportCount,
+    const VkShadingRatePaletteNV* pShadingRatePalettes)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_shading_rate_image"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetViewportShadingRatePaletteNV", "VK_NV_shading_rate_image");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetViewportShadingRatePaletteNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetViewportShadingRatePaletteNV(commandBuffer, firstViewport, viewportCount, pShadingRatePalettes, true /* do lock */);
+}
 static void entry_vkCmdSetCoarseSampleOrderNV(
     VkCommandBuffer commandBuffer,
     VkCoarseSampleOrderTypeNV sampleOrderType,
@@ -6307,6 +7204,22 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetCoarseSampleOrderNV(commandBuffer, sampleOrderType, customSampleOrderCount, pCustomSampleOrders, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetCoarseSampleOrderNV(
+    VkCommandBuffer commandBuffer,
+    VkCoarseSampleOrderTypeNV sampleOrderType,
+    uint32_t customSampleOrderCount,
+    const VkCoarseSampleOrderCustomNV* pCustomSampleOrders)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_shading_rate_image"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetCoarseSampleOrderNV", "VK_NV_shading_rate_image");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetCoarseSampleOrderNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetCoarseSampleOrderNV(commandBuffer, sampleOrderType, customSampleOrderCount, pCustomSampleOrders, true /* do lock */);
+}
 #endif
 #ifdef VK_NV_ray_tracing
 static VkResult entry_vkCreateAccelerationStructureNV(
@@ -6426,6 +7339,27 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBuildAccelerationStructureNV(commandBuffer, pInfo, instanceData, instanceOffset, update, dst, src, scratch, scratchOffset, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBuildAccelerationStructureNV(
+    VkCommandBuffer commandBuffer,
+    const VkAccelerationStructureInfoNV* pInfo,
+    VkBuffer instanceData,
+    VkDeviceSize instanceOffset,
+    VkBool32 update,
+    VkAccelerationStructureNV dst,
+    VkAccelerationStructureNV src,
+    VkBuffer scratch,
+    VkDeviceSize scratchOffset)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_ray_tracing"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBuildAccelerationStructureNV", "VK_NV_ray_tracing");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBuildAccelerationStructureNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBuildAccelerationStructureNV(commandBuffer, pInfo, instanceData, instanceOffset, update, dst, src, scratch, scratchOffset, true /* do lock */);
+}
 static void entry_vkCmdCopyAccelerationStructureNV(
     VkCommandBuffer commandBuffer,
     VkAccelerationStructureNV dst,
@@ -6436,6 +7370,22 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdCopyAccelerationStructureNV(commandBuffer, dst, src, mode, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdCopyAccelerationStructureNV(
+    VkCommandBuffer commandBuffer,
+    VkAccelerationStructureNV dst,
+    VkAccelerationStructureNV src,
+    VkCopyAccelerationStructureModeKHR mode)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_ray_tracing"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdCopyAccelerationStructureNV", "VK_NV_ray_tracing");
+    }
+    AEMU_SCOPED_TRACE("vkCmdCopyAccelerationStructureNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdCopyAccelerationStructureNV(commandBuffer, dst, src, mode, true /* do lock */);
+}
 static void entry_vkCmdTraceRaysNV(
     VkCommandBuffer commandBuffer,
     VkBuffer raygenShaderBindingTableBuffer,
@@ -6457,6 +7407,33 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdTraceRaysNV(commandBuffer, raygenShaderBindingTableBuffer, raygenShaderBindingOffset, missShaderBindingTableBuffer, missShaderBindingOffset, missShaderBindingStride, hitShaderBindingTableBuffer, hitShaderBindingOffset, hitShaderBindingStride, callableShaderBindingTableBuffer, callableShaderBindingOffset, callableShaderBindingStride, width, height, depth, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdTraceRaysNV(
+    VkCommandBuffer commandBuffer,
+    VkBuffer raygenShaderBindingTableBuffer,
+    VkDeviceSize raygenShaderBindingOffset,
+    VkBuffer missShaderBindingTableBuffer,
+    VkDeviceSize missShaderBindingOffset,
+    VkDeviceSize missShaderBindingStride,
+    VkBuffer hitShaderBindingTableBuffer,
+    VkDeviceSize hitShaderBindingOffset,
+    VkDeviceSize hitShaderBindingStride,
+    VkBuffer callableShaderBindingTableBuffer,
+    VkDeviceSize callableShaderBindingOffset,
+    VkDeviceSize callableShaderBindingStride,
+    uint32_t width,
+    uint32_t height,
+    uint32_t depth)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_ray_tracing"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdTraceRaysNV", "VK_NV_ray_tracing");
+    }
+    AEMU_SCOPED_TRACE("vkCmdTraceRaysNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdTraceRaysNV(commandBuffer, raygenShaderBindingTableBuffer, raygenShaderBindingOffset, missShaderBindingTableBuffer, missShaderBindingOffset, missShaderBindingStride, hitShaderBindingTableBuffer, hitShaderBindingOffset, hitShaderBindingStride, callableShaderBindingTableBuffer, callableShaderBindingOffset, callableShaderBindingStride, width, height, depth, true /* do lock */);
+}
 static VkResult entry_vkCreateRayTracingPipelinesNV(
     VkDevice device,
     VkPipelineCache pipelineCache,
@@ -6597,6 +7574,24 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdWriteAccelerationStructuresPropertiesNV(commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdWriteAccelerationStructuresPropertiesNV(
+    VkCommandBuffer commandBuffer,
+    uint32_t accelerationStructureCount,
+    const VkAccelerationStructureNV* pAccelerationStructures,
+    VkQueryType queryType,
+    VkQueryPool queryPool,
+    uint32_t firstQuery)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_ray_tracing"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdWriteAccelerationStructuresPropertiesNV", "VK_NV_ray_tracing");
+    }
+    AEMU_SCOPED_TRACE("vkCmdWriteAccelerationStructuresPropertiesNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdWriteAccelerationStructuresPropertiesNV(commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery, true /* do lock */);
+}
 static VkResult entry_vkCompileDeferredNV(
     VkDevice device,
     VkPipeline pipeline,
@@ -6676,6 +7671,23 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdWriteBufferMarkerAMD(commandBuffer, pipelineStage, dstBuffer, dstOffset, marker, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdWriteBufferMarkerAMD(
+    VkCommandBuffer commandBuffer,
+    VkPipelineStageFlagBits pipelineStage,
+    VkBuffer dstBuffer,
+    VkDeviceSize dstOffset,
+    uint32_t marker)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_AMD_buffer_marker"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdWriteBufferMarkerAMD", "VK_AMD_buffer_marker");
+    }
+    AEMU_SCOPED_TRACE("vkCmdWriteBufferMarkerAMD");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdWriteBufferMarkerAMD(commandBuffer, pipelineStage, dstBuffer, dstOffset, marker, true /* do lock */);
+}
 #endif
 #ifdef VK_AMD_pipeline_compiler_control
 #endif
@@ -6749,6 +7761,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDrawMeshTasksNV(commandBuffer, taskCount, firstTask, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDrawMeshTasksNV(
+    VkCommandBuffer commandBuffer,
+    uint32_t taskCount,
+    uint32_t firstTask)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_mesh_shader"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDrawMeshTasksNV", "VK_NV_mesh_shader");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDrawMeshTasksNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDrawMeshTasksNV(commandBuffer, taskCount, firstTask, true /* do lock */);
+}
 static void entry_vkCmdDrawMeshTasksIndirectNV(
     VkCommandBuffer commandBuffer,
     VkBuffer buffer,
@@ -6760,6 +7787,23 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDrawMeshTasksIndirectNV(commandBuffer, buffer, offset, drawCount, stride, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDrawMeshTasksIndirectNV(
+    VkCommandBuffer commandBuffer,
+    VkBuffer buffer,
+    VkDeviceSize offset,
+    uint32_t drawCount,
+    uint32_t stride)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_mesh_shader"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDrawMeshTasksIndirectNV", "VK_NV_mesh_shader");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDrawMeshTasksIndirectNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDrawMeshTasksIndirectNV(commandBuffer, buffer, offset, drawCount, stride, true /* do lock */);
+}
 static void entry_vkCmdDrawMeshTasksIndirectCountNV(
     VkCommandBuffer commandBuffer,
     VkBuffer buffer,
@@ -6773,6 +7817,25 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDrawMeshTasksIndirectCountNV(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDrawMeshTasksIndirectCountNV(
+    VkCommandBuffer commandBuffer,
+    VkBuffer buffer,
+    VkDeviceSize offset,
+    VkBuffer countBuffer,
+    VkDeviceSize countBufferOffset,
+    uint32_t maxDrawCount,
+    uint32_t stride)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_mesh_shader"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDrawMeshTasksIndirectCountNV", "VK_NV_mesh_shader");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDrawMeshTasksIndirectCountNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDrawMeshTasksIndirectCountNV(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
+}
 #endif
 #ifdef VK_NV_fragment_shader_barycentric
 #endif
@@ -6789,6 +7852,22 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetExclusiveScissorNV(commandBuffer, firstExclusiveScissor, exclusiveScissorCount, pExclusiveScissors, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetExclusiveScissorNV(
+    VkCommandBuffer commandBuffer,
+    uint32_t firstExclusiveScissor,
+    uint32_t exclusiveScissorCount,
+    const VkRect2D* pExclusiveScissors)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_scissor_exclusive"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetExclusiveScissorNV", "VK_NV_scissor_exclusive");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetExclusiveScissorNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetExclusiveScissorNV(commandBuffer, firstExclusiveScissor, exclusiveScissorCount, pExclusiveScissors, true /* do lock */);
+}
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
 static void entry_vkCmdSetCheckpointNV(
@@ -6799,6 +7878,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetCheckpointNV(commandBuffer, pCheckpointMarker, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetCheckpointNV(
+    VkCommandBuffer commandBuffer,
+    const void* pCheckpointMarker)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_device_diagnostic_checkpoints"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetCheckpointNV", "VK_NV_device_diagnostic_checkpoints");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetCheckpointNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetCheckpointNV(commandBuffer, pCheckpointMarker, true /* do lock */);
+}
 static void entry_vkGetQueueCheckpointDataNV(
     VkQueue queue,
     uint32_t* pCheckpointDataCount,
@@ -6866,6 +7959,22 @@
     vkCmdSetPerformanceMarkerINTEL_VkResult_return = vkEnc->vkCmdSetPerformanceMarkerINTEL(commandBuffer, pMarkerInfo, true /* do lock */);
     return vkCmdSetPerformanceMarkerINTEL_VkResult_return;
 }
+static VkResult dynCheck_entry_vkCmdSetPerformanceMarkerINTEL(
+    VkCommandBuffer commandBuffer,
+    const VkPerformanceMarkerInfoINTEL* pMarkerInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_INTEL_performance_query"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetPerformanceMarkerINTEL", "VK_INTEL_performance_query");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetPerformanceMarkerINTEL");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    VkResult vkCmdSetPerformanceMarkerINTEL_VkResult_return = (VkResult)0;
+    vkCmdSetPerformanceMarkerINTEL_VkResult_return = vkEnc->vkCmdSetPerformanceMarkerINTEL(commandBuffer, pMarkerInfo, true /* do lock */);
+    return vkCmdSetPerformanceMarkerINTEL_VkResult_return;
+}
 static VkResult entry_vkCmdSetPerformanceStreamMarkerINTEL(
     VkCommandBuffer commandBuffer,
     const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo)
@@ -6876,6 +7985,22 @@
     vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return = vkEnc->vkCmdSetPerformanceStreamMarkerINTEL(commandBuffer, pMarkerInfo, true /* do lock */);
     return vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return;
 }
+static VkResult dynCheck_entry_vkCmdSetPerformanceStreamMarkerINTEL(
+    VkCommandBuffer commandBuffer,
+    const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_INTEL_performance_query"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetPerformanceStreamMarkerINTEL", "VK_INTEL_performance_query");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetPerformanceStreamMarkerINTEL");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    VkResult vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return = (VkResult)0;
+    vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return = vkEnc->vkCmdSetPerformanceStreamMarkerINTEL(commandBuffer, pMarkerInfo, true /* do lock */);
+    return vkCmdSetPerformanceStreamMarkerINTEL_VkResult_return;
+}
 static VkResult entry_vkCmdSetPerformanceOverrideINTEL(
     VkCommandBuffer commandBuffer,
     const VkPerformanceOverrideInfoINTEL* pOverrideInfo)
@@ -6886,6 +8011,22 @@
     vkCmdSetPerformanceOverrideINTEL_VkResult_return = vkEnc->vkCmdSetPerformanceOverrideINTEL(commandBuffer, pOverrideInfo, true /* do lock */);
     return vkCmdSetPerformanceOverrideINTEL_VkResult_return;
 }
+static VkResult dynCheck_entry_vkCmdSetPerformanceOverrideINTEL(
+    VkCommandBuffer commandBuffer,
+    const VkPerformanceOverrideInfoINTEL* pOverrideInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_INTEL_performance_query"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetPerformanceOverrideINTEL", "VK_INTEL_performance_query");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetPerformanceOverrideINTEL");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    VkResult vkCmdSetPerformanceOverrideINTEL_VkResult_return = (VkResult)0;
+    vkCmdSetPerformanceOverrideINTEL_VkResult_return = vkEnc->vkCmdSetPerformanceOverrideINTEL(commandBuffer, pOverrideInfo, true /* do lock */);
+    return vkCmdSetPerformanceOverrideINTEL_VkResult_return;
+}
 static VkResult entry_vkAcquirePerformanceConfigurationINTEL(
     VkDevice device,
     const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo,
@@ -7244,6 +8385,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetLineStippleEXT(commandBuffer, lineStippleFactor, lineStipplePattern, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetLineStippleEXT(
+    VkCommandBuffer commandBuffer,
+    uint32_t lineStippleFactor,
+    uint16_t lineStipplePattern)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_line_rasterization"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetLineStippleEXT", "VK_EXT_line_rasterization");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetLineStippleEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetLineStippleEXT(commandBuffer, lineStippleFactor, lineStipplePattern, true /* do lock */);
+}
 #endif
 #ifdef VK_EXT_shader_atomic_float
 #endif
@@ -7285,6 +8441,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetCullModeEXT(commandBuffer, cullMode, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetCullModeEXT(
+    VkCommandBuffer commandBuffer,
+    VkCullModeFlags cullMode)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetCullModeEXT", "VK_EXT_extended_dynamic_state");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetCullModeEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetCullModeEXT(commandBuffer, cullMode, true /* do lock */);
+}
 static void entry_vkCmdSetFrontFaceEXT(
     VkCommandBuffer commandBuffer,
     VkFrontFace frontFace)
@@ -7293,6 +8463,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetFrontFaceEXT(commandBuffer, frontFace, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetFrontFaceEXT(
+    VkCommandBuffer commandBuffer,
+    VkFrontFace frontFace)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetFrontFaceEXT", "VK_EXT_extended_dynamic_state");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetFrontFaceEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetFrontFaceEXT(commandBuffer, frontFace, true /* do lock */);
+}
 static void entry_vkCmdSetPrimitiveTopologyEXT(
     VkCommandBuffer commandBuffer,
     VkPrimitiveTopology primitiveTopology)
@@ -7301,6 +8485,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetPrimitiveTopologyEXT(commandBuffer, primitiveTopology, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetPrimitiveTopologyEXT(
+    VkCommandBuffer commandBuffer,
+    VkPrimitiveTopology primitiveTopology)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetPrimitiveTopologyEXT", "VK_EXT_extended_dynamic_state");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetPrimitiveTopologyEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetPrimitiveTopologyEXT(commandBuffer, primitiveTopology, true /* do lock */);
+}
 static void entry_vkCmdSetViewportWithCountEXT(
     VkCommandBuffer commandBuffer,
     uint32_t viewportCount,
@@ -7310,6 +8508,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetViewportWithCountEXT(commandBuffer, viewportCount, pViewports, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetViewportWithCountEXT(
+    VkCommandBuffer commandBuffer,
+    uint32_t viewportCount,
+    const VkViewport* pViewports)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetViewportWithCountEXT", "VK_EXT_extended_dynamic_state");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetViewportWithCountEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetViewportWithCountEXT(commandBuffer, viewportCount, pViewports, true /* do lock */);
+}
 static void entry_vkCmdSetScissorWithCountEXT(
     VkCommandBuffer commandBuffer,
     uint32_t scissorCount,
@@ -7319,6 +8532,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetScissorWithCountEXT(commandBuffer, scissorCount, pScissors, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetScissorWithCountEXT(
+    VkCommandBuffer commandBuffer,
+    uint32_t scissorCount,
+    const VkRect2D* pScissors)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetScissorWithCountEXT", "VK_EXT_extended_dynamic_state");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetScissorWithCountEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetScissorWithCountEXT(commandBuffer, scissorCount, pScissors, true /* do lock */);
+}
 static void entry_vkCmdBindVertexBuffers2EXT(
     VkCommandBuffer commandBuffer,
     uint32_t firstBinding,
@@ -7332,6 +8560,25 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBindVertexBuffers2EXT(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBindVertexBuffers2EXT(
+    VkCommandBuffer commandBuffer,
+    uint32_t firstBinding,
+    uint32_t bindingCount,
+    const VkBuffer* pBuffers,
+    const VkDeviceSize* pOffsets,
+    const VkDeviceSize* pSizes,
+    const VkDeviceSize* pStrides)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBindVertexBuffers2EXT", "VK_EXT_extended_dynamic_state");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBindVertexBuffers2EXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBindVertexBuffers2EXT(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides, true /* do lock */);
+}
 static void entry_vkCmdSetDepthTestEnableEXT(
     VkCommandBuffer commandBuffer,
     VkBool32 depthTestEnable)
@@ -7340,6 +8587,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetDepthTestEnableEXT(commandBuffer, depthTestEnable, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetDepthTestEnableEXT(
+    VkCommandBuffer commandBuffer,
+    VkBool32 depthTestEnable)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetDepthTestEnableEXT", "VK_EXT_extended_dynamic_state");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetDepthTestEnableEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetDepthTestEnableEXT(commandBuffer, depthTestEnable, true /* do lock */);
+}
 static void entry_vkCmdSetDepthWriteEnableEXT(
     VkCommandBuffer commandBuffer,
     VkBool32 depthWriteEnable)
@@ -7348,6 +8609,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetDepthWriteEnableEXT(commandBuffer, depthWriteEnable, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetDepthWriteEnableEXT(
+    VkCommandBuffer commandBuffer,
+    VkBool32 depthWriteEnable)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetDepthWriteEnableEXT", "VK_EXT_extended_dynamic_state");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetDepthWriteEnableEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetDepthWriteEnableEXT(commandBuffer, depthWriteEnable, true /* do lock */);
+}
 static void entry_vkCmdSetDepthCompareOpEXT(
     VkCommandBuffer commandBuffer,
     VkCompareOp depthCompareOp)
@@ -7356,6 +8631,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetDepthCompareOpEXT(commandBuffer, depthCompareOp, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetDepthCompareOpEXT(
+    VkCommandBuffer commandBuffer,
+    VkCompareOp depthCompareOp)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetDepthCompareOpEXT", "VK_EXT_extended_dynamic_state");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetDepthCompareOpEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetDepthCompareOpEXT(commandBuffer, depthCompareOp, true /* do lock */);
+}
 static void entry_vkCmdSetDepthBoundsTestEnableEXT(
     VkCommandBuffer commandBuffer,
     VkBool32 depthBoundsTestEnable)
@@ -7364,6 +8653,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetDepthBoundsTestEnableEXT(commandBuffer, depthBoundsTestEnable, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetDepthBoundsTestEnableEXT(
+    VkCommandBuffer commandBuffer,
+    VkBool32 depthBoundsTestEnable)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetDepthBoundsTestEnableEXT", "VK_EXT_extended_dynamic_state");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetDepthBoundsTestEnableEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetDepthBoundsTestEnableEXT(commandBuffer, depthBoundsTestEnable, true /* do lock */);
+}
 static void entry_vkCmdSetStencilTestEnableEXT(
     VkCommandBuffer commandBuffer,
     VkBool32 stencilTestEnable)
@@ -7372,6 +8675,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetStencilTestEnableEXT(commandBuffer, stencilTestEnable, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetStencilTestEnableEXT(
+    VkCommandBuffer commandBuffer,
+    VkBool32 stencilTestEnable)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetStencilTestEnableEXT", "VK_EXT_extended_dynamic_state");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetStencilTestEnableEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetStencilTestEnableEXT(commandBuffer, stencilTestEnable, true /* do lock */);
+}
 static void entry_vkCmdSetStencilOpEXT(
     VkCommandBuffer commandBuffer,
     VkStencilFaceFlags faceMask,
@@ -7384,6 +8701,24 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetStencilOpEXT(commandBuffer, faceMask, failOp, passOp, depthFailOp, compareOp, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetStencilOpEXT(
+    VkCommandBuffer commandBuffer,
+    VkStencilFaceFlags faceMask,
+    VkStencilOp failOp,
+    VkStencilOp passOp,
+    VkStencilOp depthFailOp,
+    VkCompareOp compareOp)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetStencilOpEXT", "VK_EXT_extended_dynamic_state");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetStencilOpEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetStencilOpEXT(commandBuffer, faceMask, failOp, passOp, depthFailOp, compareOp, true /* do lock */);
+}
 #endif
 #ifdef VK_EXT_shader_atomic_float2
 #endif
@@ -7421,6 +8756,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdPreprocessGeneratedCommandsNV(commandBuffer, pGeneratedCommandsInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdPreprocessGeneratedCommandsNV(
+    VkCommandBuffer commandBuffer,
+    const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_device_generated_commands"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdPreprocessGeneratedCommandsNV", "VK_NV_device_generated_commands");
+    }
+    AEMU_SCOPED_TRACE("vkCmdPreprocessGeneratedCommandsNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdPreprocessGeneratedCommandsNV(commandBuffer, pGeneratedCommandsInfo, true /* do lock */);
+}
 static void entry_vkCmdExecuteGeneratedCommandsNV(
     VkCommandBuffer commandBuffer,
     VkBool32 isPreprocessed,
@@ -7430,6 +8779,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdExecuteGeneratedCommandsNV(commandBuffer, isPreprocessed, pGeneratedCommandsInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdExecuteGeneratedCommandsNV(
+    VkCommandBuffer commandBuffer,
+    VkBool32 isPreprocessed,
+    const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_device_generated_commands"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdExecuteGeneratedCommandsNV", "VK_NV_device_generated_commands");
+    }
+    AEMU_SCOPED_TRACE("vkCmdExecuteGeneratedCommandsNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdExecuteGeneratedCommandsNV(commandBuffer, isPreprocessed, pGeneratedCommandsInfo, true /* do lock */);
+}
 static void entry_vkCmdBindPipelineShaderGroupNV(
     VkCommandBuffer commandBuffer,
     VkPipelineBindPoint pipelineBindPoint,
@@ -7440,6 +8804,22 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBindPipelineShaderGroupNV(commandBuffer, pipelineBindPoint, pipeline, groupIndex, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBindPipelineShaderGroupNV(
+    VkCommandBuffer commandBuffer,
+    VkPipelineBindPoint pipelineBindPoint,
+    VkPipeline pipeline,
+    uint32_t groupIndex)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_device_generated_commands"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBindPipelineShaderGroupNV", "VK_NV_device_generated_commands");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBindPipelineShaderGroupNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBindPipelineShaderGroupNV(commandBuffer, pipelineBindPoint, pipeline, groupIndex, true /* do lock */);
+}
 static VkResult entry_vkCreateIndirectCommandsLayoutNV(
     VkDevice device,
     const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo,
@@ -7660,6 +9040,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetFragmentShadingRateEnumNV(commandBuffer, shadingRate, combinerOps, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetFragmentShadingRateEnumNV(
+    VkCommandBuffer commandBuffer,
+    VkFragmentShadingRateNV shadingRate,
+    const VkFragmentShadingRateCombinerOpKHR combinerOps[2])
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_NV_fragment_shading_rate_enums"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetFragmentShadingRateEnumNV", "VK_NV_fragment_shading_rate_enums");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetFragmentShadingRateEnumNV");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetFragmentShadingRateEnumNV(commandBuffer, shadingRate, combinerOps, true /* do lock */);
+}
 #endif
 #ifdef VK_NV_ray_tracing_motion_blur
 #endif
@@ -7737,6 +9132,23 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetVertexInputEXT(commandBuffer, vertexBindingDescriptionCount, pVertexBindingDescriptions, vertexAttributeDescriptionCount, pVertexAttributeDescriptions, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetVertexInputEXT(
+    VkCommandBuffer commandBuffer,
+    uint32_t vertexBindingDescriptionCount,
+    const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions,
+    uint32_t vertexAttributeDescriptionCount,
+    const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_vertex_input_dynamic_state"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetVertexInputEXT", "VK_EXT_vertex_input_dynamic_state");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetVertexInputEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetVertexInputEXT(commandBuffer, vertexBindingDescriptionCount, pVertexBindingDescriptions, vertexAttributeDescriptionCount, pVertexAttributeDescriptions, true /* do lock */);
+}
 #endif
 #ifdef VK_EXT_physical_device_drm
 #endif
@@ -8024,6 +9436,19 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSubpassShadingHUAWEI(commandBuffer, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSubpassShadingHUAWEI(
+    VkCommandBuffer commandBuffer)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_HUAWEI_subpass_shading"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSubpassShadingHUAWEI", "VK_HUAWEI_subpass_shading");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSubpassShadingHUAWEI");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSubpassShadingHUAWEI(commandBuffer, true /* do lock */);
+}
 #endif
 #ifdef VK_HUAWEI_invocation_mask
 static void entry_vkCmdBindInvocationMaskHUAWEI(
@@ -8035,6 +9460,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBindInvocationMaskHUAWEI(commandBuffer, imageView, imageLayout, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBindInvocationMaskHUAWEI(
+    VkCommandBuffer commandBuffer,
+    VkImageView imageView,
+    VkImageLayout imageLayout)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_HUAWEI_invocation_mask"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBindInvocationMaskHUAWEI", "VK_HUAWEI_invocation_mask");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBindInvocationMaskHUAWEI");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBindInvocationMaskHUAWEI(commandBuffer, imageView, imageLayout, true /* do lock */);
+}
 #endif
 #ifdef VK_NV_external_memory_rdma
 static VkResult entry_vkGetMemoryRemoteAddressNV(
@@ -8074,6 +9514,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetPatchControlPointsEXT(commandBuffer, patchControlPoints, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetPatchControlPointsEXT(
+    VkCommandBuffer commandBuffer,
+    uint32_t patchControlPoints)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetPatchControlPointsEXT", "VK_EXT_extended_dynamic_state2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetPatchControlPointsEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetPatchControlPointsEXT(commandBuffer, patchControlPoints, true /* do lock */);
+}
 static void entry_vkCmdSetRasterizerDiscardEnableEXT(
     VkCommandBuffer commandBuffer,
     VkBool32 rasterizerDiscardEnable)
@@ -8082,6 +9536,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetRasterizerDiscardEnableEXT(commandBuffer, rasterizerDiscardEnable, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetRasterizerDiscardEnableEXT(
+    VkCommandBuffer commandBuffer,
+    VkBool32 rasterizerDiscardEnable)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetRasterizerDiscardEnableEXT", "VK_EXT_extended_dynamic_state2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetRasterizerDiscardEnableEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetRasterizerDiscardEnableEXT(commandBuffer, rasterizerDiscardEnable, true /* do lock */);
+}
 static void entry_vkCmdSetDepthBiasEnableEXT(
     VkCommandBuffer commandBuffer,
     VkBool32 depthBiasEnable)
@@ -8090,6 +9558,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetDepthBiasEnableEXT(commandBuffer, depthBiasEnable, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetDepthBiasEnableEXT(
+    VkCommandBuffer commandBuffer,
+    VkBool32 depthBiasEnable)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetDepthBiasEnableEXT", "VK_EXT_extended_dynamic_state2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetDepthBiasEnableEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetDepthBiasEnableEXT(commandBuffer, depthBiasEnable, true /* do lock */);
+}
 static void entry_vkCmdSetLogicOpEXT(
     VkCommandBuffer commandBuffer,
     VkLogicOp logicOp)
@@ -8098,6 +9580,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetLogicOpEXT(commandBuffer, logicOp, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetLogicOpEXT(
+    VkCommandBuffer commandBuffer,
+    VkLogicOp logicOp)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetLogicOpEXT", "VK_EXT_extended_dynamic_state2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetLogicOpEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetLogicOpEXT(commandBuffer, logicOp, true /* do lock */);
+}
 static void entry_vkCmdSetPrimitiveRestartEnableEXT(
     VkCommandBuffer commandBuffer,
     VkBool32 primitiveRestartEnable)
@@ -8106,6 +9602,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetPrimitiveRestartEnableEXT(commandBuffer, primitiveRestartEnable, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetPrimitiveRestartEnableEXT(
+    VkCommandBuffer commandBuffer,
+    VkBool32 primitiveRestartEnable)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_extended_dynamic_state2"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetPrimitiveRestartEnableEXT", "VK_EXT_extended_dynamic_state2");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetPrimitiveRestartEnableEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetPrimitiveRestartEnableEXT(commandBuffer, primitiveRestartEnable, true /* do lock */);
+}
 #endif
 #ifdef VK_QNX_screen_surface
 static VkResult entry_vkCreateScreenSurfaceQNX(
@@ -8142,6 +9652,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetColorWriteEnableEXT(commandBuffer, attachmentCount, pColorWriteEnables, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetColorWriteEnableEXT(
+    VkCommandBuffer commandBuffer,
+    uint32_t attachmentCount,
+    const VkBool32* pColorWriteEnables)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_color_write_enable"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetColorWriteEnableEXT", "VK_EXT_color_write_enable");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetColorWriteEnableEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetColorWriteEnableEXT(commandBuffer, attachmentCount, pColorWriteEnables, true /* do lock */);
+}
 #endif
 #ifdef VK_GOOGLE_gfxstream
 static VkResult entry_vkRegisterImageColorBufferGOOGLE(
@@ -8274,6 +9799,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkBeginCommandBufferAsyncGOOGLE(commandBuffer, pBeginInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkBeginCommandBufferAsyncGOOGLE(
+    VkCommandBuffer commandBuffer,
+    const VkCommandBufferBeginInfo* pBeginInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkBeginCommandBufferAsyncGOOGLE", "VK_GOOGLE_gfxstream");
+    }
+    AEMU_SCOPED_TRACE("vkBeginCommandBufferAsyncGOOGLE");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkBeginCommandBufferAsyncGOOGLE(commandBuffer, pBeginInfo, true /* do lock */);
+}
 static void entry_vkEndCommandBufferAsyncGOOGLE(
     VkCommandBuffer commandBuffer)
 {
@@ -8281,6 +9820,19 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkEndCommandBufferAsyncGOOGLE(commandBuffer, true /* do lock */);
 }
+static void dynCheck_entry_vkEndCommandBufferAsyncGOOGLE(
+    VkCommandBuffer commandBuffer)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkEndCommandBufferAsyncGOOGLE", "VK_GOOGLE_gfxstream");
+    }
+    AEMU_SCOPED_TRACE("vkEndCommandBufferAsyncGOOGLE");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkEndCommandBufferAsyncGOOGLE(commandBuffer, true /* do lock */);
+}
 static void entry_vkResetCommandBufferAsyncGOOGLE(
     VkCommandBuffer commandBuffer,
     VkCommandBufferResetFlags flags)
@@ -8289,6 +9841,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkResetCommandBufferAsyncGOOGLE(commandBuffer, flags, true /* do lock */);
 }
+static void dynCheck_entry_vkResetCommandBufferAsyncGOOGLE(
+    VkCommandBuffer commandBuffer,
+    VkCommandBufferResetFlags flags)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkResetCommandBufferAsyncGOOGLE", "VK_GOOGLE_gfxstream");
+    }
+    AEMU_SCOPED_TRACE("vkResetCommandBufferAsyncGOOGLE");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkResetCommandBufferAsyncGOOGLE(commandBuffer, flags, true /* do lock */);
+}
 static void entry_vkCommandBufferHostSyncGOOGLE(
     VkCommandBuffer commandBuffer,
     uint32_t needHostSync,
@@ -8298,6 +9864,21 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCommandBufferHostSyncGOOGLE(commandBuffer, needHostSync, sequenceNumber, true /* do lock */);
 }
+static void dynCheck_entry_vkCommandBufferHostSyncGOOGLE(
+    VkCommandBuffer commandBuffer,
+    uint32_t needHostSync,
+    uint32_t sequenceNumber)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCommandBufferHostSyncGOOGLE", "VK_GOOGLE_gfxstream");
+    }
+    AEMU_SCOPED_TRACE("vkCommandBufferHostSyncGOOGLE");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCommandBufferHostSyncGOOGLE(commandBuffer, needHostSync, sequenceNumber, true /* do lock */);
+}
 static VkResult entry_vkCreateImageWithRequirementsGOOGLE(
     VkDevice device,
     const VkImageCreateInfo* pCreateInfo,
@@ -8582,6 +10163,24 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDrawMultiEXT(commandBuffer, drawCount, pVertexInfo, instanceCount, firstInstance, stride, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDrawMultiEXT(
+    VkCommandBuffer commandBuffer,
+    uint32_t drawCount,
+    const VkMultiDrawInfoEXT* pVertexInfo,
+    uint32_t instanceCount,
+    uint32_t firstInstance,
+    uint32_t stride)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_multi_draw"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDrawMultiEXT", "VK_EXT_multi_draw");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDrawMultiEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDrawMultiEXT(commandBuffer, drawCount, pVertexInfo, instanceCount, firstInstance, stride, true /* do lock */);
+}
 static void entry_vkCmdDrawMultiIndexedEXT(
     VkCommandBuffer commandBuffer,
     uint32_t drawCount,
@@ -8595,6 +10194,25 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdDrawMultiIndexedEXT(commandBuffer, drawCount, pIndexInfo, instanceCount, firstInstance, stride, pVertexOffset, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdDrawMultiIndexedEXT(
+    VkCommandBuffer commandBuffer,
+    uint32_t drawCount,
+    const VkMultiDrawIndexedInfoEXT* pIndexInfo,
+    uint32_t instanceCount,
+    uint32_t firstInstance,
+    uint32_t stride,
+    const int32_t* pVertexOffset)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_EXT_multi_draw"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdDrawMultiIndexedEXT", "VK_EXT_multi_draw");
+    }
+    AEMU_SCOPED_TRACE("vkCmdDrawMultiIndexedEXT");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdDrawMultiIndexedEXT(commandBuffer, drawCount, pIndexInfo, instanceCount, firstInstance, stride, pVertexOffset, true /* do lock */);
+}
 #endif
 #ifdef VK_EXT_load_store_op_none
 #endif
@@ -8688,6 +10306,22 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBuildAccelerationStructuresKHR(commandBuffer, infoCount, pInfos, ppBuildRangeInfos, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBuildAccelerationStructuresKHR(
+    VkCommandBuffer commandBuffer,
+    uint32_t infoCount,
+    const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
+    const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_acceleration_structure"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBuildAccelerationStructuresKHR", "VK_KHR_acceleration_structure");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBuildAccelerationStructuresKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBuildAccelerationStructuresKHR(commandBuffer, infoCount, pInfos, ppBuildRangeInfos, true /* do lock */);
+}
 static void entry_vkCmdBuildAccelerationStructuresIndirectKHR(
     VkCommandBuffer commandBuffer,
     uint32_t infoCount,
@@ -8700,6 +10334,24 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdBuildAccelerationStructuresIndirectKHR(commandBuffer, infoCount, pInfos, pIndirectDeviceAddresses, pIndirectStrides, ppMaxPrimitiveCounts, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdBuildAccelerationStructuresIndirectKHR(
+    VkCommandBuffer commandBuffer,
+    uint32_t infoCount,
+    const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
+    const VkDeviceAddress* pIndirectDeviceAddresses,
+    const uint32_t* pIndirectStrides,
+    const uint32_t* const* ppMaxPrimitiveCounts)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_acceleration_structure"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdBuildAccelerationStructuresIndirectKHR", "VK_KHR_acceleration_structure");
+    }
+    AEMU_SCOPED_TRACE("vkCmdBuildAccelerationStructuresIndirectKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdBuildAccelerationStructuresIndirectKHR(commandBuffer, infoCount, pInfos, pIndirectDeviceAddresses, pIndirectStrides, ppMaxPrimitiveCounts, true /* do lock */);
+}
 static VkResult entry_vkBuildAccelerationStructuresKHR(
     VkDevice device,
     VkDeferredOperationKHR deferredOperation,
@@ -8855,6 +10507,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdCopyAccelerationStructureKHR(commandBuffer, pInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdCopyAccelerationStructureKHR(
+    VkCommandBuffer commandBuffer,
+    const VkCopyAccelerationStructureInfoKHR* pInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_acceleration_structure"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdCopyAccelerationStructureKHR", "VK_KHR_acceleration_structure");
+    }
+    AEMU_SCOPED_TRACE("vkCmdCopyAccelerationStructureKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdCopyAccelerationStructureKHR(commandBuffer, pInfo, true /* do lock */);
+}
 static void entry_vkCmdCopyAccelerationStructureToMemoryKHR(
     VkCommandBuffer commandBuffer,
     const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo)
@@ -8863,6 +10529,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdCopyAccelerationStructureToMemoryKHR(commandBuffer, pInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdCopyAccelerationStructureToMemoryKHR(
+    VkCommandBuffer commandBuffer,
+    const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_acceleration_structure"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdCopyAccelerationStructureToMemoryKHR", "VK_KHR_acceleration_structure");
+    }
+    AEMU_SCOPED_TRACE("vkCmdCopyAccelerationStructureToMemoryKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdCopyAccelerationStructureToMemoryKHR(commandBuffer, pInfo, true /* do lock */);
+}
 static void entry_vkCmdCopyMemoryToAccelerationStructureKHR(
     VkCommandBuffer commandBuffer,
     const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo)
@@ -8871,6 +10551,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdCopyMemoryToAccelerationStructureKHR(commandBuffer, pInfo, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdCopyMemoryToAccelerationStructureKHR(
+    VkCommandBuffer commandBuffer,
+    const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_acceleration_structure"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdCopyMemoryToAccelerationStructureKHR", "VK_KHR_acceleration_structure");
+    }
+    AEMU_SCOPED_TRACE("vkCmdCopyMemoryToAccelerationStructureKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdCopyMemoryToAccelerationStructureKHR(commandBuffer, pInfo, true /* do lock */);
+}
 static VkDeviceAddress entry_vkGetAccelerationStructureDeviceAddressKHR(
     VkDevice device,
     const VkAccelerationStructureDeviceAddressInfoKHR* pInfo)
@@ -8908,6 +10602,24 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdWriteAccelerationStructuresPropertiesKHR(commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdWriteAccelerationStructuresPropertiesKHR(
+    VkCommandBuffer commandBuffer,
+    uint32_t accelerationStructureCount,
+    const VkAccelerationStructureKHR* pAccelerationStructures,
+    VkQueryType queryType,
+    VkQueryPool queryPool,
+    uint32_t firstQuery)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_acceleration_structure"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdWriteAccelerationStructuresPropertiesKHR", "VK_KHR_acceleration_structure");
+    }
+    AEMU_SCOPED_TRACE("vkCmdWriteAccelerationStructuresPropertiesKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdWriteAccelerationStructuresPropertiesKHR(commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery, true /* do lock */);
+}
 static void entry_vkGetDeviceAccelerationStructureCompatibilityKHR(
     VkDevice device,
     const VkAccelerationStructureVersionInfoKHR* pVersionInfo,
@@ -8974,6 +10686,26 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdTraceRaysKHR(commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, width, height, depth, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdTraceRaysKHR(
+    VkCommandBuffer commandBuffer,
+    const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
+    const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
+    const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
+    const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
+    uint32_t width,
+    uint32_t height,
+    uint32_t depth)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_ray_tracing_pipeline"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdTraceRaysKHR", "VK_KHR_ray_tracing_pipeline");
+    }
+    AEMU_SCOPED_TRACE("vkCmdTraceRaysKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdTraceRaysKHR(commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, width, height, depth, true /* do lock */);
+}
 static VkResult entry_vkCreateRayTracingPipelinesKHR(
     VkDevice device,
     VkDeferredOperationKHR deferredOperation,
@@ -9054,6 +10786,24 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdTraceRaysIndirectKHR(commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, indirectDeviceAddress, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdTraceRaysIndirectKHR(
+    VkCommandBuffer commandBuffer,
+    const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable,
+    const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable,
+    const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable,
+    const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable,
+    VkDeviceAddress indirectDeviceAddress)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_ray_tracing_pipeline"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdTraceRaysIndirectKHR", "VK_KHR_ray_tracing_pipeline");
+    }
+    AEMU_SCOPED_TRACE("vkCmdTraceRaysIndirectKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdTraceRaysIndirectKHR(commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, indirectDeviceAddress, true /* do lock */);
+}
 static VkDeviceSize entry_vkGetRayTracingShaderGroupStackSizeKHR(
     VkDevice device,
     VkPipeline pipeline,
@@ -9091,6 +10841,20 @@
     auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
     vkEnc->vkCmdSetRayTracingPipelineStackSizeKHR(commandBuffer, pipelineStackSize, true /* do lock */);
 }
+static void dynCheck_entry_vkCmdSetRayTracingPipelineStackSizeKHR(
+    VkCommandBuffer commandBuffer,
+    uint32_t pipelineStackSize)
+{
+    auto resources = ResourceTracker::get();
+    VkDevice device = resources->getDevice(commandBuffer);;
+    if (!resources->hasDeviceExtension(device, "VK_KHR_ray_tracing_pipeline"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkCmdSetRayTracingPipelineStackSizeKHR", "VK_KHR_ray_tracing_pipeline");
+    }
+    AEMU_SCOPED_TRACE("vkCmdSetRayTracingPipelineStackSizeKHR");
+    auto vkEnc = ResourceTracker::getCommandBufferEncoder(commandBuffer);
+    vkEnc->vkCmdSetRayTracingPipelineStackSizeKHR(commandBuffer, pipelineStackSize, true /* do lock */);
+}
 #endif
 #ifdef VK_KHR_ray_query
 #endif
@@ -12059,11 +13823,11 @@
     }
     if (!strcmp(name, "vkCmdSetDeviceMask"))
     {
-        return has1_1OrHigher ? (void*)entry_vkCmdSetDeviceMask : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetDeviceMask;
     }
     if (!strcmp(name, "vkCmdDispatchBase"))
     {
-        return has1_1OrHigher ? (void*)entry_vkCmdDispatchBase : nullptr;
+        return (void*)dynCheck_entry_vkCmdDispatchBase;
     }
     if (!strcmp(name, "vkEnumeratePhysicalDeviceGroups"))
     {
@@ -12157,13 +13921,11 @@
 #ifdef VK_VERSION_1_2
     if (!strcmp(name, "vkCmdDrawIndirectCount"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_VERSION_1_2");
-        return hasExt ? (void*)entry_vkCmdDrawIndirectCount : nullptr;
+        return (void*)dynCheck_entry_vkCmdDrawIndirectCount;
     }
     if (!strcmp(name, "vkCmdDrawIndexedIndirectCount"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_VERSION_1_2");
-        return hasExt ? (void*)entry_vkCmdDrawIndexedIndirectCount : nullptr;
+        return (void*)dynCheck_entry_vkCmdDrawIndexedIndirectCount;
     }
     if (!strcmp(name, "vkCreateRenderPass2"))
     {
@@ -12171,18 +13933,15 @@
     }
     if (!strcmp(name, "vkCmdBeginRenderPass2"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_VERSION_1_2");
-        return hasExt ? (void*)entry_vkCmdBeginRenderPass2 : nullptr;
+        return (void*)dynCheck_entry_vkCmdBeginRenderPass2;
     }
     if (!strcmp(name, "vkCmdNextSubpass2"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_VERSION_1_2");
-        return hasExt ? (void*)entry_vkCmdNextSubpass2 : nullptr;
+        return (void*)dynCheck_entry_vkCmdNextSubpass2;
     }
     if (!strcmp(name, "vkCmdEndRenderPass2"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_VERSION_1_2");
-        return hasExt ? (void*)entry_vkCmdEndRenderPass2 : nullptr;
+        return (void*)dynCheck_entry_vkCmdEndRenderPass2;
     }
     if (!strcmp(name, "vkResetQueryPool"))
     {
@@ -12419,37 +14178,31 @@
     }
     if (!strcmp(name, "vkCmdBeginVideoCodingKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_video_queue");
-        return hasExt ? (void*)entry_vkCmdBeginVideoCodingKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdBeginVideoCodingKHR;
     }
     if (!strcmp(name, "vkCmdEndVideoCodingKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_video_queue");
-        return hasExt ? (void*)entry_vkCmdEndVideoCodingKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdEndVideoCodingKHR;
     }
     if (!strcmp(name, "vkCmdControlVideoCodingKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_video_queue");
-        return hasExt ? (void*)entry_vkCmdControlVideoCodingKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdControlVideoCodingKHR;
     }
 #endif
 #ifdef VK_KHR_video_decode_queue
     if (!strcmp(name, "vkCmdDecodeVideoKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_video_decode_queue");
-        return hasExt ? (void*)entry_vkCmdDecodeVideoKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdDecodeVideoKHR;
     }
 #endif
 #ifdef VK_KHR_dynamic_rendering
     if (!strcmp(name, "vkCmdBeginRenderingKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_dynamic_rendering");
-        return hasExt ? (void*)entry_vkCmdBeginRenderingKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdBeginRenderingKHR;
     }
     if (!strcmp(name, "vkCmdEndRenderingKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_dynamic_rendering");
-        return hasExt ? (void*)entry_vkCmdEndRenderingKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdEndRenderingKHR;
     }
 #endif
 #ifdef VK_KHR_get_physical_device_properties2
@@ -12496,13 +14249,11 @@
     }
     if (!strcmp(name, "vkCmdSetDeviceMaskKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_device_group");
-        return hasExt ? (void*)entry_vkCmdSetDeviceMaskKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetDeviceMaskKHR;
     }
     if (!strcmp(name, "vkCmdDispatchBaseKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_device_group");
-        return hasExt ? (void*)entry_vkCmdDispatchBaseKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdDispatchBaseKHR;
     }
 #endif
 #ifdef VK_KHR_maintenance1
@@ -12575,13 +14326,11 @@
 #ifdef VK_KHR_push_descriptor
     if (!strcmp(name, "vkCmdPushDescriptorSetKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_push_descriptor");
-        return hasExt ? (void*)entry_vkCmdPushDescriptorSetKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdPushDescriptorSetKHR;
     }
     if (!strcmp(name, "vkCmdPushDescriptorSetWithTemplateKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_push_descriptor");
-        return hasExt ? (void*)entry_vkCmdPushDescriptorSetWithTemplateKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdPushDescriptorSetWithTemplateKHR;
     }
 #endif
 #ifdef VK_KHR_descriptor_update_template
@@ -12605,18 +14354,15 @@
     }
     if (!strcmp(name, "vkCmdBeginRenderPass2KHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_create_renderpass2");
-        return hasExt ? (void*)entry_vkCmdBeginRenderPass2KHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdBeginRenderPass2KHR;
     }
     if (!strcmp(name, "vkCmdNextSubpass2KHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_create_renderpass2");
-        return hasExt ? (void*)entry_vkCmdNextSubpass2KHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdNextSubpass2KHR;
     }
     if (!strcmp(name, "vkCmdEndRenderPass2KHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_create_renderpass2");
-        return hasExt ? (void*)entry_vkCmdEndRenderPass2KHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdEndRenderPass2KHR;
     }
 #endif
 #ifdef VK_KHR_shared_presentable_image
@@ -12749,13 +14495,11 @@
 #ifdef VK_KHR_draw_indirect_count
     if (!strcmp(name, "vkCmdDrawIndirectCountKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_draw_indirect_count");
-        return hasExt ? (void*)entry_vkCmdDrawIndirectCountKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdDrawIndirectCountKHR;
     }
     if (!strcmp(name, "vkCmdDrawIndexedIndirectCountKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_draw_indirect_count");
-        return hasExt ? (void*)entry_vkCmdDrawIndexedIndirectCountKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdDrawIndexedIndirectCountKHR;
     }
 #endif
 #ifdef VK_KHR_timeline_semaphore
@@ -12780,8 +14524,7 @@
     }
     if (!strcmp(name, "vkCmdSetFragmentShadingRateKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_fragment_shading_rate");
-        return hasExt ? (void*)entry_vkCmdSetFragmentShadingRateKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetFragmentShadingRateKHR;
     }
 #endif
 #ifdef VK_KHR_present_wait
@@ -12843,35 +14586,29 @@
 #ifdef VK_KHR_video_encode_queue
     if (!strcmp(name, "vkCmdEncodeVideoKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_video_encode_queue");
-        return hasExt ? (void*)entry_vkCmdEncodeVideoKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdEncodeVideoKHR;
     }
 #endif
 #ifdef VK_KHR_synchronization2
     if (!strcmp(name, "vkCmdSetEvent2KHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_synchronization2");
-        return hasExt ? (void*)entry_vkCmdSetEvent2KHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetEvent2KHR;
     }
     if (!strcmp(name, "vkCmdResetEvent2KHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_synchronization2");
-        return hasExt ? (void*)entry_vkCmdResetEvent2KHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdResetEvent2KHR;
     }
     if (!strcmp(name, "vkCmdWaitEvents2KHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_synchronization2");
-        return hasExt ? (void*)entry_vkCmdWaitEvents2KHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdWaitEvents2KHR;
     }
     if (!strcmp(name, "vkCmdPipelineBarrier2KHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_synchronization2");
-        return hasExt ? (void*)entry_vkCmdPipelineBarrier2KHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdPipelineBarrier2KHR;
     }
     if (!strcmp(name, "vkCmdWriteTimestamp2KHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_synchronization2");
-        return hasExt ? (void*)entry_vkCmdWriteTimestamp2KHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdWriteTimestamp2KHR;
     }
     if (!strcmp(name, "vkQueueSubmit2KHR"))
     {
@@ -12880,8 +14617,7 @@
     }
     if (!strcmp(name, "vkCmdWriteBufferMarker2AMD"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_synchronization2");
-        return hasExt ? (void*)entry_vkCmdWriteBufferMarker2AMD : nullptr;
+        return (void*)dynCheck_entry_vkCmdWriteBufferMarker2AMD;
     }
     if (!strcmp(name, "vkGetQueueCheckpointData2NV"))
     {
@@ -12892,33 +14628,27 @@
 #ifdef VK_KHR_copy_commands2
     if (!strcmp(name, "vkCmdCopyBuffer2KHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_copy_commands2");
-        return hasExt ? (void*)entry_vkCmdCopyBuffer2KHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdCopyBuffer2KHR;
     }
     if (!strcmp(name, "vkCmdCopyImage2KHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_copy_commands2");
-        return hasExt ? (void*)entry_vkCmdCopyImage2KHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdCopyImage2KHR;
     }
     if (!strcmp(name, "vkCmdCopyBufferToImage2KHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_copy_commands2");
-        return hasExt ? (void*)entry_vkCmdCopyBufferToImage2KHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdCopyBufferToImage2KHR;
     }
     if (!strcmp(name, "vkCmdCopyImageToBuffer2KHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_copy_commands2");
-        return hasExt ? (void*)entry_vkCmdCopyImageToBuffer2KHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdCopyImageToBuffer2KHR;
     }
     if (!strcmp(name, "vkCmdBlitImage2KHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_copy_commands2");
-        return hasExt ? (void*)entry_vkCmdBlitImage2KHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdBlitImage2KHR;
     }
     if (!strcmp(name, "vkCmdResolveImage2KHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_copy_commands2");
-        return hasExt ? (void*)entry_vkCmdResolveImage2KHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdResolveImage2KHR;
     }
 #endif
 #ifdef VK_KHR_maintenance4
@@ -12978,50 +14708,41 @@
     }
     if (!strcmp(name, "vkCmdDebugMarkerBeginEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_debug_marker");
-        return hasExt ? (void*)entry_vkCmdDebugMarkerBeginEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdDebugMarkerBeginEXT;
     }
     if (!strcmp(name, "vkCmdDebugMarkerEndEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_debug_marker");
-        return hasExt ? (void*)entry_vkCmdDebugMarkerEndEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdDebugMarkerEndEXT;
     }
     if (!strcmp(name, "vkCmdDebugMarkerInsertEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_debug_marker");
-        return hasExt ? (void*)entry_vkCmdDebugMarkerInsertEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdDebugMarkerInsertEXT;
     }
 #endif
 #ifdef VK_EXT_transform_feedback
     if (!strcmp(name, "vkCmdBindTransformFeedbackBuffersEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_transform_feedback");
-        return hasExt ? (void*)entry_vkCmdBindTransformFeedbackBuffersEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdBindTransformFeedbackBuffersEXT;
     }
     if (!strcmp(name, "vkCmdBeginTransformFeedbackEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_transform_feedback");
-        return hasExt ? (void*)entry_vkCmdBeginTransformFeedbackEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdBeginTransformFeedbackEXT;
     }
     if (!strcmp(name, "vkCmdEndTransformFeedbackEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_transform_feedback");
-        return hasExt ? (void*)entry_vkCmdEndTransformFeedbackEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdEndTransformFeedbackEXT;
     }
     if (!strcmp(name, "vkCmdBeginQueryIndexedEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_transform_feedback");
-        return hasExt ? (void*)entry_vkCmdBeginQueryIndexedEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdBeginQueryIndexedEXT;
     }
     if (!strcmp(name, "vkCmdEndQueryIndexedEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_transform_feedback");
-        return hasExt ? (void*)entry_vkCmdEndQueryIndexedEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdEndQueryIndexedEXT;
     }
     if (!strcmp(name, "vkCmdDrawIndirectByteCountEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_transform_feedback");
-        return hasExt ? (void*)entry_vkCmdDrawIndirectByteCountEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdDrawIndirectByteCountEXT;
     }
 #endif
 #ifdef VK_NVX_binary_import
@@ -13043,8 +14764,7 @@
     }
     if (!strcmp(name, "vkCmdCuLaunchKernelNVX"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NVX_binary_import");
-        return hasExt ? (void*)entry_vkCmdCuLaunchKernelNVX : nullptr;
+        return (void*)dynCheck_entry_vkCmdCuLaunchKernelNVX;
     }
 #endif
 #ifdef VK_NVX_image_view_handle
@@ -13060,13 +14780,11 @@
 #ifdef VK_AMD_draw_indirect_count
     if (!strcmp(name, "vkCmdDrawIndirectCountAMD"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_AMD_draw_indirect_count");
-        return hasExt ? (void*)entry_vkCmdDrawIndirectCountAMD : nullptr;
+        return (void*)dynCheck_entry_vkCmdDrawIndirectCountAMD;
     }
     if (!strcmp(name, "vkCmdDrawIndexedIndirectCountAMD"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_AMD_draw_indirect_count");
-        return hasExt ? (void*)entry_vkCmdDrawIndexedIndirectCountAMD : nullptr;
+        return (void*)dynCheck_entry_vkCmdDrawIndexedIndirectCountAMD;
     }
 #endif
 #ifdef VK_AMD_shader_info
@@ -13105,20 +14823,17 @@
 #ifdef VK_EXT_conditional_rendering
     if (!strcmp(name, "vkCmdBeginConditionalRenderingEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_conditional_rendering");
-        return hasExt ? (void*)entry_vkCmdBeginConditionalRenderingEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdBeginConditionalRenderingEXT;
     }
     if (!strcmp(name, "vkCmdEndConditionalRenderingEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_conditional_rendering");
-        return hasExt ? (void*)entry_vkCmdEndConditionalRenderingEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdEndConditionalRenderingEXT;
     }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
     if (!strcmp(name, "vkCmdSetViewportWScalingNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_clip_space_w_scaling");
-        return hasExt ? (void*)entry_vkCmdSetViewportWScalingNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetViewportWScalingNV;
     }
 #endif
 #ifdef VK_EXT_direct_mode_display
@@ -13178,8 +14893,7 @@
 #ifdef VK_EXT_discard_rectangles
     if (!strcmp(name, "vkCmdSetDiscardRectangleEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_discard_rectangles");
-        return hasExt ? (void*)entry_vkCmdSetDiscardRectangleEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetDiscardRectangleEXT;
     }
 #endif
 #ifdef VK_EXT_hdr_metadata
@@ -13260,18 +14974,15 @@
     }
     if (!strcmp(name, "vkCmdBeginDebugUtilsLabelEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_debug_utils");
-        return hasExt ? (void*)entry_vkCmdBeginDebugUtilsLabelEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdBeginDebugUtilsLabelEXT;
     }
     if (!strcmp(name, "vkCmdEndDebugUtilsLabelEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_debug_utils");
-        return hasExt ? (void*)entry_vkCmdEndDebugUtilsLabelEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdEndDebugUtilsLabelEXT;
     }
     if (!strcmp(name, "vkCmdInsertDebugUtilsLabelEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_debug_utils");
-        return hasExt ? (void*)entry_vkCmdInsertDebugUtilsLabelEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdInsertDebugUtilsLabelEXT;
     }
     if (!strcmp(name, "vkCreateDebugUtilsMessengerEXT"))
     {
@@ -13302,8 +15013,7 @@
 #ifdef VK_EXT_sample_locations
     if (!strcmp(name, "vkCmdSetSampleLocationsEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_sample_locations");
-        return hasExt ? (void*)entry_vkCmdSetSampleLocationsEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetSampleLocationsEXT;
     }
     if (!strcmp(name, "vkGetPhysicalDeviceMultisamplePropertiesEXT"))
     {
@@ -13338,18 +15048,15 @@
 #ifdef VK_NV_shading_rate_image
     if (!strcmp(name, "vkCmdBindShadingRateImageNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_shading_rate_image");
-        return hasExt ? (void*)entry_vkCmdBindShadingRateImageNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdBindShadingRateImageNV;
     }
     if (!strcmp(name, "vkCmdSetViewportShadingRatePaletteNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_shading_rate_image");
-        return hasExt ? (void*)entry_vkCmdSetViewportShadingRatePaletteNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetViewportShadingRatePaletteNV;
     }
     if (!strcmp(name, "vkCmdSetCoarseSampleOrderNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_shading_rate_image");
-        return hasExt ? (void*)entry_vkCmdSetCoarseSampleOrderNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetCoarseSampleOrderNV;
     }
 #endif
 #ifdef VK_NV_ray_tracing
@@ -13371,18 +15078,15 @@
     }
     if (!strcmp(name, "vkCmdBuildAccelerationStructureNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_ray_tracing");
-        return hasExt ? (void*)entry_vkCmdBuildAccelerationStructureNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdBuildAccelerationStructureNV;
     }
     if (!strcmp(name, "vkCmdCopyAccelerationStructureNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_ray_tracing");
-        return hasExt ? (void*)entry_vkCmdCopyAccelerationStructureNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdCopyAccelerationStructureNV;
     }
     if (!strcmp(name, "vkCmdTraceRaysNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_ray_tracing");
-        return hasExt ? (void*)entry_vkCmdTraceRaysNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdTraceRaysNV;
     }
     if (!strcmp(name, "vkCreateRayTracingPipelinesNV"))
     {
@@ -13402,8 +15106,7 @@
     }
     if (!strcmp(name, "vkCmdWriteAccelerationStructuresPropertiesNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_ray_tracing");
-        return hasExt ? (void*)entry_vkCmdWriteAccelerationStructuresPropertiesNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdWriteAccelerationStructuresPropertiesNV;
     }
     if (!strcmp(name, "vkCompileDeferredNV"))
     {
@@ -13419,8 +15122,7 @@
 #ifdef VK_AMD_buffer_marker
     if (!strcmp(name, "vkCmdWriteBufferMarkerAMD"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_AMD_buffer_marker");
-        return hasExt ? (void*)entry_vkCmdWriteBufferMarkerAMD : nullptr;
+        return (void*)dynCheck_entry_vkCmdWriteBufferMarkerAMD;
     }
 #endif
 #ifdef VK_EXT_calibrated_timestamps
@@ -13437,32 +15139,27 @@
 #ifdef VK_NV_mesh_shader
     if (!strcmp(name, "vkCmdDrawMeshTasksNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_mesh_shader");
-        return hasExt ? (void*)entry_vkCmdDrawMeshTasksNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdDrawMeshTasksNV;
     }
     if (!strcmp(name, "vkCmdDrawMeshTasksIndirectNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_mesh_shader");
-        return hasExt ? (void*)entry_vkCmdDrawMeshTasksIndirectNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdDrawMeshTasksIndirectNV;
     }
     if (!strcmp(name, "vkCmdDrawMeshTasksIndirectCountNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_mesh_shader");
-        return hasExt ? (void*)entry_vkCmdDrawMeshTasksIndirectCountNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdDrawMeshTasksIndirectCountNV;
     }
 #endif
 #ifdef VK_NV_scissor_exclusive
     if (!strcmp(name, "vkCmdSetExclusiveScissorNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_scissor_exclusive");
-        return hasExt ? (void*)entry_vkCmdSetExclusiveScissorNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetExclusiveScissorNV;
     }
 #endif
 #ifdef VK_NV_device_diagnostic_checkpoints
     if (!strcmp(name, "vkCmdSetCheckpointNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_device_diagnostic_checkpoints");
-        return hasExt ? (void*)entry_vkCmdSetCheckpointNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetCheckpointNV;
     }
     if (!strcmp(name, "vkGetQueueCheckpointDataNV"))
     {
@@ -13481,18 +15178,15 @@
     }
     if (!strcmp(name, "vkCmdSetPerformanceMarkerINTEL"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_INTEL_performance_query");
-        return hasExt ? (void*)entry_vkCmdSetPerformanceMarkerINTEL : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetPerformanceMarkerINTEL;
     }
     if (!strcmp(name, "vkCmdSetPerformanceStreamMarkerINTEL"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_INTEL_performance_query");
-        return hasExt ? (void*)entry_vkCmdSetPerformanceStreamMarkerINTEL : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetPerformanceStreamMarkerINTEL;
     }
     if (!strcmp(name, "vkCmdSetPerformanceOverrideINTEL"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_INTEL_performance_query");
-        return hasExt ? (void*)entry_vkCmdSetPerformanceOverrideINTEL : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetPerformanceOverrideINTEL;
     }
     if (!strcmp(name, "vkAcquirePerformanceConfigurationINTEL"))
     {
@@ -13588,8 +15282,7 @@
 #ifdef VK_EXT_line_rasterization
     if (!strcmp(name, "vkCmdSetLineStippleEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_line_rasterization");
-        return hasExt ? (void*)entry_vkCmdSetLineStippleEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetLineStippleEXT;
     }
 #endif
 #ifdef VK_EXT_host_query_reset
@@ -13601,63 +15294,51 @@
 #ifdef VK_EXT_extended_dynamic_state
     if (!strcmp(name, "vkCmdSetCullModeEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state");
-        return hasExt ? (void*)entry_vkCmdSetCullModeEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetCullModeEXT;
     }
     if (!strcmp(name, "vkCmdSetFrontFaceEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state");
-        return hasExt ? (void*)entry_vkCmdSetFrontFaceEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetFrontFaceEXT;
     }
     if (!strcmp(name, "vkCmdSetPrimitiveTopologyEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state");
-        return hasExt ? (void*)entry_vkCmdSetPrimitiveTopologyEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetPrimitiveTopologyEXT;
     }
     if (!strcmp(name, "vkCmdSetViewportWithCountEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state");
-        return hasExt ? (void*)entry_vkCmdSetViewportWithCountEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetViewportWithCountEXT;
     }
     if (!strcmp(name, "vkCmdSetScissorWithCountEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state");
-        return hasExt ? (void*)entry_vkCmdSetScissorWithCountEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetScissorWithCountEXT;
     }
     if (!strcmp(name, "vkCmdBindVertexBuffers2EXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state");
-        return hasExt ? (void*)entry_vkCmdBindVertexBuffers2EXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdBindVertexBuffers2EXT;
     }
     if (!strcmp(name, "vkCmdSetDepthTestEnableEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state");
-        return hasExt ? (void*)entry_vkCmdSetDepthTestEnableEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetDepthTestEnableEXT;
     }
     if (!strcmp(name, "vkCmdSetDepthWriteEnableEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state");
-        return hasExt ? (void*)entry_vkCmdSetDepthWriteEnableEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetDepthWriteEnableEXT;
     }
     if (!strcmp(name, "vkCmdSetDepthCompareOpEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state");
-        return hasExt ? (void*)entry_vkCmdSetDepthCompareOpEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetDepthCompareOpEXT;
     }
     if (!strcmp(name, "vkCmdSetDepthBoundsTestEnableEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state");
-        return hasExt ? (void*)entry_vkCmdSetDepthBoundsTestEnableEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetDepthBoundsTestEnableEXT;
     }
     if (!strcmp(name, "vkCmdSetStencilTestEnableEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state");
-        return hasExt ? (void*)entry_vkCmdSetStencilTestEnableEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetStencilTestEnableEXT;
     }
     if (!strcmp(name, "vkCmdSetStencilOpEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state");
-        return hasExt ? (void*)entry_vkCmdSetStencilOpEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetStencilOpEXT;
     }
 #endif
 #ifdef VK_NV_device_generated_commands
@@ -13667,18 +15348,15 @@
     }
     if (!strcmp(name, "vkCmdPreprocessGeneratedCommandsNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_device_generated_commands");
-        return hasExt ? (void*)entry_vkCmdPreprocessGeneratedCommandsNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdPreprocessGeneratedCommandsNV;
     }
     if (!strcmp(name, "vkCmdExecuteGeneratedCommandsNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_device_generated_commands");
-        return hasExt ? (void*)entry_vkCmdExecuteGeneratedCommandsNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdExecuteGeneratedCommandsNV;
     }
     if (!strcmp(name, "vkCmdBindPipelineShaderGroupNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_device_generated_commands");
-        return hasExt ? (void*)entry_vkCmdBindPipelineShaderGroupNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdBindPipelineShaderGroupNV;
     }
     if (!strcmp(name, "vkCreateIndirectCommandsLayoutNV"))
     {
@@ -13722,8 +15400,7 @@
 #ifdef VK_NV_fragment_shading_rate_enums
     if (!strcmp(name, "vkCmdSetFragmentShadingRateEnumNV"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_NV_fragment_shading_rate_enums");
-        return hasExt ? (void*)entry_vkCmdSetFragmentShadingRateEnumNV : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetFragmentShadingRateEnumNV;
     }
 #endif
 #ifdef VK_NV_acquire_winrt_display
@@ -13753,8 +15430,7 @@
 #ifdef VK_EXT_vertex_input_dynamic_state
     if (!strcmp(name, "vkCmdSetVertexInputEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_vertex_input_dynamic_state");
-        return hasExt ? (void*)entry_vkCmdSetVertexInputEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetVertexInputEXT;
     }
 #endif
 #ifdef VK_FUCHSIA_external_memory
@@ -13806,15 +15482,13 @@
     }
     if (!strcmp(name, "vkCmdSubpassShadingHUAWEI"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_HUAWEI_subpass_shading");
-        return hasExt ? (void*)entry_vkCmdSubpassShadingHUAWEI : nullptr;
+        return (void*)dynCheck_entry_vkCmdSubpassShadingHUAWEI;
     }
 #endif
 #ifdef VK_HUAWEI_invocation_mask
     if (!strcmp(name, "vkCmdBindInvocationMaskHUAWEI"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_HUAWEI_invocation_mask");
-        return hasExt ? (void*)entry_vkCmdBindInvocationMaskHUAWEI : nullptr;
+        return (void*)dynCheck_entry_vkCmdBindInvocationMaskHUAWEI;
     }
 #endif
 #ifdef VK_NV_external_memory_rdma
@@ -13826,28 +15500,23 @@
 #ifdef VK_EXT_extended_dynamic_state2
     if (!strcmp(name, "vkCmdSetPatchControlPointsEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state2");
-        return hasExt ? (void*)entry_vkCmdSetPatchControlPointsEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetPatchControlPointsEXT;
     }
     if (!strcmp(name, "vkCmdSetRasterizerDiscardEnableEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state2");
-        return hasExt ? (void*)entry_vkCmdSetRasterizerDiscardEnableEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetRasterizerDiscardEnableEXT;
     }
     if (!strcmp(name, "vkCmdSetDepthBiasEnableEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state2");
-        return hasExt ? (void*)entry_vkCmdSetDepthBiasEnableEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetDepthBiasEnableEXT;
     }
     if (!strcmp(name, "vkCmdSetLogicOpEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state2");
-        return hasExt ? (void*)entry_vkCmdSetLogicOpEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetLogicOpEXT;
     }
     if (!strcmp(name, "vkCmdSetPrimitiveRestartEnableEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_extended_dynamic_state2");
-        return hasExt ? (void*)entry_vkCmdSetPrimitiveRestartEnableEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetPrimitiveRestartEnableEXT;
     }
 #endif
 #ifdef VK_QNX_screen_surface
@@ -13865,8 +15534,7 @@
 #ifdef VK_EXT_color_write_enable
     if (!strcmp(name, "vkCmdSetColorWriteEnableEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_color_write_enable");
-        return hasExt ? (void*)entry_vkCmdSetColorWriteEnableEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetColorWriteEnableEXT;
     }
 #endif
 #ifdef VK_GOOGLE_gfxstream
@@ -13888,23 +15556,19 @@
     }
     if (!strcmp(name, "vkBeginCommandBufferAsyncGOOGLE"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_gfxstream");
-        return hasExt ? (void*)entry_vkBeginCommandBufferAsyncGOOGLE : nullptr;
+        return (void*)dynCheck_entry_vkBeginCommandBufferAsyncGOOGLE;
     }
     if (!strcmp(name, "vkEndCommandBufferAsyncGOOGLE"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_gfxstream");
-        return hasExt ? (void*)entry_vkEndCommandBufferAsyncGOOGLE : nullptr;
+        return (void*)dynCheck_entry_vkEndCommandBufferAsyncGOOGLE;
     }
     if (!strcmp(name, "vkResetCommandBufferAsyncGOOGLE"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_gfxstream");
-        return hasExt ? (void*)entry_vkResetCommandBufferAsyncGOOGLE : nullptr;
+        return (void*)dynCheck_entry_vkResetCommandBufferAsyncGOOGLE;
     }
     if (!strcmp(name, "vkCommandBufferHostSyncGOOGLE"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_gfxstream");
-        return hasExt ? (void*)entry_vkCommandBufferHostSyncGOOGLE : nullptr;
+        return (void*)dynCheck_entry_vkCommandBufferHostSyncGOOGLE;
     }
     if (!strcmp(name, "vkCreateImageWithRequirementsGOOGLE"))
     {
@@ -13973,13 +15637,11 @@
 #ifdef VK_EXT_multi_draw
     if (!strcmp(name, "vkCmdDrawMultiEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_multi_draw");
-        return hasExt ? (void*)entry_vkCmdDrawMultiEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdDrawMultiEXT;
     }
     if (!strcmp(name, "vkCmdDrawMultiIndexedEXT"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_EXT_multi_draw");
-        return hasExt ? (void*)entry_vkCmdDrawMultiIndexedEXT : nullptr;
+        return (void*)dynCheck_entry_vkCmdDrawMultiIndexedEXT;
     }
 #endif
 #ifdef VK_EXT_pageable_device_local_memory
@@ -13999,13 +15661,11 @@
     }
     if (!strcmp(name, "vkCmdBuildAccelerationStructuresKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_acceleration_structure");
-        return hasExt ? (void*)entry_vkCmdBuildAccelerationStructuresKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdBuildAccelerationStructuresKHR;
     }
     if (!strcmp(name, "vkCmdBuildAccelerationStructuresIndirectKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_acceleration_structure");
-        return hasExt ? (void*)entry_vkCmdBuildAccelerationStructuresIndirectKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdBuildAccelerationStructuresIndirectKHR;
     }
     if (!strcmp(name, "vkBuildAccelerationStructuresKHR"))
     {
@@ -14029,18 +15689,15 @@
     }
     if (!strcmp(name, "vkCmdCopyAccelerationStructureKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_acceleration_structure");
-        return hasExt ? (void*)entry_vkCmdCopyAccelerationStructureKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdCopyAccelerationStructureKHR;
     }
     if (!strcmp(name, "vkCmdCopyAccelerationStructureToMemoryKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_acceleration_structure");
-        return hasExt ? (void*)entry_vkCmdCopyAccelerationStructureToMemoryKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdCopyAccelerationStructureToMemoryKHR;
     }
     if (!strcmp(name, "vkCmdCopyMemoryToAccelerationStructureKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_acceleration_structure");
-        return hasExt ? (void*)entry_vkCmdCopyMemoryToAccelerationStructureKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdCopyMemoryToAccelerationStructureKHR;
     }
     if (!strcmp(name, "vkGetAccelerationStructureDeviceAddressKHR"))
     {
@@ -14048,8 +15705,7 @@
     }
     if (!strcmp(name, "vkCmdWriteAccelerationStructuresPropertiesKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_acceleration_structure");
-        return hasExt ? (void*)entry_vkCmdWriteAccelerationStructuresPropertiesKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdWriteAccelerationStructuresPropertiesKHR;
     }
     if (!strcmp(name, "vkGetDeviceAccelerationStructureCompatibilityKHR"))
     {
@@ -14063,8 +15719,7 @@
 #ifdef VK_KHR_ray_tracing_pipeline
     if (!strcmp(name, "vkCmdTraceRaysKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_ray_tracing_pipeline");
-        return hasExt ? (void*)entry_vkCmdTraceRaysKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdTraceRaysKHR;
     }
     if (!strcmp(name, "vkCreateRayTracingPipelinesKHR"))
     {
@@ -14076,8 +15731,7 @@
     }
     if (!strcmp(name, "vkCmdTraceRaysIndirectKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_ray_tracing_pipeline");
-        return hasExt ? (void*)entry_vkCmdTraceRaysIndirectKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdTraceRaysIndirectKHR;
     }
     if (!strcmp(name, "vkGetRayTracingShaderGroupStackSizeKHR"))
     {
@@ -14085,8 +15739,7 @@
     }
     if (!strcmp(name, "vkCmdSetRayTracingPipelineStackSizeKHR"))
     {
-        bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_ray_tracing_pipeline");
-        return hasExt ? (void*)entry_vkCmdSetRayTracingPipelineStackSizeKHR : nullptr;
+        return (void*)dynCheck_entry_vkCmdSetRayTracingPipelineStackSizeKHR;
     }
 #endif
     return nullptr;
diff --git a/system/vulkan_enc/func_table.h b/system/vulkan_enc/func_table.h
index 34816ea..17c6286 100644
--- a/system/vulkan_enc/func_table.h
+++ b/system/vulkan_enc/func_table.h
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module func_table
-// (header) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #pragma once
 
diff --git a/system/vulkan_enc/goldfish_vk_counting_guest.cpp b/system/vulkan_enc/goldfish_vk_counting_guest.cpp
index 8b070f6..bf4f9b6 100644
--- a/system/vulkan_enc/goldfish_vk_counting_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_counting_guest.cpp
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_counting_guest
-// (impl) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #include "goldfish_vk_counting_guest.h"
 
diff --git a/system/vulkan_enc/goldfish_vk_counting_guest.h b/system/vulkan_enc/goldfish_vk_counting_guest.h
index 55ea7e6..81d11da 100644
--- a/system/vulkan_enc/goldfish_vk_counting_guest.h
+++ b/system/vulkan_enc/goldfish_vk_counting_guest.h
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_counting_guest
-// (header) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #pragma once
 
diff --git a/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp b/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
index f0fb307..adc2318 100644
--- a/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_deepcopy_guest
-// (impl) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #include "goldfish_vk_deepcopy_guest.h"
 
diff --git a/system/vulkan_enc/goldfish_vk_deepcopy_guest.h b/system/vulkan_enc/goldfish_vk_deepcopy_guest.h
index 37989e8..1728261 100644
--- a/system/vulkan_enc/goldfish_vk_deepcopy_guest.h
+++ b/system/vulkan_enc/goldfish_vk_deepcopy_guest.h
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_deepcopy_guest
-// (header) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #pragma once
 
diff --git a/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp b/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
index 7abd647..69215bc 100644
--- a/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_extension_structs_guest
-// (impl) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #include "goldfish_vk_extension_structs_guest.h"
 
diff --git a/system/vulkan_enc/goldfish_vk_extension_structs_guest.h b/system/vulkan_enc/goldfish_vk_extension_structs_guest.h
index 5c7d486..4bf48b0 100644
--- a/system/vulkan_enc/goldfish_vk_extension_structs_guest.h
+++ b/system/vulkan_enc/goldfish_vk_extension_structs_guest.h
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_extension_structs_guest
-// (header) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #pragma once
 
diff --git a/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp b/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
index a98bf32..53af9ac 100644
--- a/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_handlemap_guest
-// (impl) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #include "goldfish_vk_handlemap_guest.h"
 
diff --git a/system/vulkan_enc/goldfish_vk_handlemap_guest.h b/system/vulkan_enc/goldfish_vk_handlemap_guest.h
index 86eed63..770f009 100644
--- a/system/vulkan_enc/goldfish_vk_handlemap_guest.h
+++ b/system/vulkan_enc/goldfish_vk_handlemap_guest.h
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_handlemap_guest
-// (header) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #pragma once
 
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
index 607fc0a..9a3f9dd 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_marshaling_guest
-// (impl) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #include "goldfish_vk_marshaling_guest.h"
 
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.h b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
index 21901f6..cfa5b43 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.h
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_marshaling_guest
-// (header) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #pragma once
 
diff --git a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
index c25ff93..3b9e0e4 100644
--- a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_reserved_marshaling_guest
-// (impl) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #include "goldfish_vk_reserved_marshaling_guest.h"
 
diff --git a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
index 6b09067..b724bd1 100644
--- a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
+++ b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_reserved_marshaling_guest
-// (header) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #pragma once
 
diff --git a/system/vulkan_enc/goldfish_vk_transform_guest.cpp b/system/vulkan_enc/goldfish_vk_transform_guest.cpp
index d10fba1..c3a690c 100644
--- a/system/vulkan_enc/goldfish_vk_transform_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_transform_guest.cpp
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_transform_guest
-// (impl) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (impl) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #include "goldfish_vk_transform_guest.h"
 
diff --git a/system/vulkan_enc/goldfish_vk_transform_guest.h b/system/vulkan_enc/goldfish_vk_transform_guest.h
index 61030d8..e88bf65 100644
--- a/system/vulkan_enc/goldfish_vk_transform_guest.h
+++ b/system/vulkan_enc/goldfish_vk_transform_guest.h
@@ -14,13 +14,14 @@
 // limitations under the License.
 
 // Autogenerated module goldfish_vk_transform_guest
-// (header) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// (header) generated by registry/vulkan/scripts/genvk.py -registry registry/vulkan/xml/vk.xml cereal -o ../qemu/android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
 // Please do not modify directly;
-// re-run android/scripts/generate-vulkan-sources.sh,
+// re-run gfxstream-protocols/scripts/generate-vulkan-sources.sh,
 // or directly from Python by defining:
-// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
+// VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
-// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+// python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
 
 #pragma once
 
diff --git a/system/vulkan_enc/vk_struct_id.h b/system/vulkan_enc/vk_struct_id.h
index cee3d9d..833ad6d 100644
--- a/system/vulkan_enc/vk_struct_id.h
+++ b/system/vulkan_enc/vk_struct_id.h
@@ -62,6 +62,7 @@
 REGISTER_VK_STRUCT_ID(VkPhysicalDeviceImageFormatInfo2, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2);
 REGISTER_VK_STRUCT_ID(VkPhysicalDeviceExternalImageFormatInfo, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO);
 REGISTER_VK_STRUCT_ID(VkSemaphoreTypeCreateInfo, VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO);
+REGISTER_VK_STRUCT_ID(VkPhysicalDeviceFeatures2, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2);
 REGISTER_VK_STRUCT_ID(VkPhysicalDeviceProperties2, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2);
 REGISTER_VK_STRUCT_ID(VkPhysicalDeviceDeviceMemoryReportFeaturesEXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT);
 REGISTER_VK_STRUCT_ID(VkMemoryAllocateFlagsInfo, VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO);