Merge changes I5923de87,I5c41c558 into main

* changes:
  Enable -Wformat
  Enable -Werror
diff --git a/Android.bp b/Android.bp
index 8496ca3..385351f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -45,7 +45,6 @@
         "include",
         "host",
         "host/gl",
-        "host/gl/glestranslator/include",
         "host/vulkan",
         "utils/include",
     ],
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 47c21f8..766589f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -44,6 +44,12 @@
 
 option(ASTC_CPU_DECODING "Enable decoding ASTC textures on the CPU" OFF)
 
+option(GFXSTREAM_ENABLE_HOST_TRACING "Enable Perfetto trace events on the host" OFF)
+if(GFXSTREAM_ENABLE_HOST_TRACING)
+    add_compile_definitions(GFXSTREAM_BUILD_WITH_TRACING)
+    add_compile_definitions(GFXSTREAM_BUILD_WITH_PERFETTO_SDK)
+endif()
+
 # For now the caller of the cmake script is responsible to create the angle_shader_translator
 # target.
 option(USE_ANGLE_SHADER_PARSER "Build with ANGLE shader parser." OFF)
diff --git a/host/CMakeLists.txt b/host/CMakeLists.txt
index 7abf440..31a6358 100644
--- a/host/CMakeLists.txt
+++ b/host/CMakeLists.txt
@@ -126,9 +126,14 @@
 target_compile_options(
     gfxstream_backend_static
     PRIVATE
-    -Wno-invalid-offsetof
-    -Wno-free-nonheap-object
-    -Wno-attributes
+    -Wall
+    -Wextra
+    -Werror
+    -Wno-missing-field-initializers
+    -Wno-unused-parameter
+    -Wno-unused-private-field
+    -Wno-return-type-c-linkage
+    -Wno-extern-c-compat
     -DGFXSTREAM_ENABLE_HOST_GLES=1
     )
 
diff --git a/host/ColorBuffer.cpp b/host/ColorBuffer.cpp
index 67bed17..345b74b 100644
--- a/host/ColorBuffer.cpp
+++ b/host/ColorBuffer.cpp
@@ -101,11 +101,10 @@
     }
 
 #if GFXSTREAM_ENABLE_HOST_GLES
-    bool b271028352Workaround = emulationGl && strstr(emulationGl->getGlesRenderer().c_str(), "Intel");
     bool vkSnapshotEnabled = emulationVk && emulationVk->getFeatures().VulkanSnapshots.enabled;
 
     if ((!stream || vkSnapshotEnabled) && colorBuffer->mColorBufferGl && colorBuffer->mColorBufferVk &&
-        !b271028352Workaround && shouldAttemptExternalMemorySharing(frameworkFormat)) {
+        shouldAttemptExternalMemorySharing(frameworkFormat)) {
         colorBuffer->touch();
         auto memoryExport = emulationVk->exportColorBufferMemory(handle);
         if (memoryExport) {
diff --git a/host/FrameBuffer.cpp b/host/FrameBuffer.cpp
index 0ceb74c..789c8b7 100644
--- a/host/FrameBuffer.cpp
+++ b/host/FrameBuffer.cpp
@@ -178,11 +178,6 @@
 #endif
 }
 
-AstcEmulationMode getAstcEmulationMode() {
-    return AstcEmulationMode::Gpu;
-//    return AstcEmulationMode::Cpu;
-}
-
 }  // namespace
 
 // |sInitialized| caches the initialized framebuffer state - this way
@@ -360,11 +355,11 @@
 #endif
         };
         fb->m_emulationVk = vk::VkEmulation::create(vkDispatch, callbacks, fb->m_features);
-        if (!fb->m_emulationVk) {
+        if (fb->m_emulationVk) {
+            vk::VkDecoderGlobalState::initialize(fb->m_emulationVk.get());
+        } else {
             ERR("Failed to initialize global Vulkan emulation. Disable the Vulkan support.");
         }
-
-        vk::VkDecoderGlobalState::initialize(fb->m_emulationVk.get());
     }
     if (fb->m_emulationVk) {
         fb->m_vulkanEnabled = true;
@@ -488,7 +483,7 @@
 
     GL_LOG("glvk interop final: %d", fb->m_vulkanInteropSupported);
     vkEmulationFeatures.glInteropSupported = fb->m_vulkanInteropSupported;
-    if (fb->m_features.Vulkan.enabled) {
+    if (fb->m_emulationVk && fb->m_features.Vulkan.enabled) {
         fb->m_emulationVk->initFeatures(std::move(vkEmulationFeatures));
 
         auto* display = fb->m_emulationVk->getDisplay();
@@ -498,7 +493,7 @@
         }
     }
 
-    if (fb->m_useVulkanComposition) {
+    if (fb->m_emulationVk && fb->m_useVulkanComposition) {
         fb->m_compositor = fb->m_emulationVk->getCompositor();
         if (!fb->m_compositor) {
             ERR("Failed to get CompositorVk from VkEmulation.");
@@ -3279,7 +3274,6 @@
         GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << "RenderThreadInfoGl not available.";
     }
     if (!info->currContext) {
-        auto fb = FrameBuffer::getFB();
         uint32_t syncContext;
         uint32_t syncSurface;
         createTrivialContext(0,  // There is no context to share.
diff --git a/host/GlesCompat.h b/host/GlesCompat.h
index 3c57028..f1f56dc 100644
--- a/host/GlesCompat.h
+++ b/host/GlesCompat.h
@@ -19,7 +19,6 @@
 
 typedef unsigned int GLenum;
 typedef int32_t EGLint;
-// typedef void *EGLNativeDisplayType;
 typedef unsigned int EGLNativeWindowType;
 
 namespace gfxstream {
diff --git a/host/PostWorker.cpp b/host/PostWorker.cpp
index b6bc66f..643d2d4 100644
--- a/host/PostWorker.cpp
+++ b/host/PostWorker.cpp
@@ -23,7 +23,6 @@
 #include "FrameBuffer.h"
 #include "RenderThreadInfo.h"
 #include "aemu/base/Tracing.h"
-#include "host-common/GfxstreamFatalError.h"
 #include "host-common/logging.h"
 #include "host-common/misc.h"
 #include "vulkan/VkCommonOperations.h"
@@ -35,25 +34,6 @@
 }
 
 namespace gfxstream {
-namespace {
-
-using emugl::ABORT_REASON_OTHER;
-using emugl::FatalError;
-
-hwc_transform_t getTransformFromRotation(int rotation) {
-    switch (static_cast<int>(rotation / 90)) {
-        case 1:
-            return HWC_TRANSFORM_ROT_270;
-        case 2:
-            return HWC_TRANSFORM_ROT_180;
-        case 3:
-            return HWC_TRANSFORM_ROT_90;
-        default:
-            return HWC_TRANSFORM_NONE;
-    }
-}
-
-}  // namespace
 
 PostWorker::PostWorker(bool mainThreadPostingOnly, FrameBuffer* fb, Compositor* compositor)
     : mFb(fb),
diff --git a/host/PostWorkerGl.cpp b/host/PostWorkerGl.cpp
index f44254e..1bb765f 100644
--- a/host/PostWorkerGl.cpp
+++ b/host/PostWorkerGl.cpp
@@ -221,7 +221,6 @@
     float px = mFb->getPx();
     float py = mFb->getPy();
     int zRot = mFb->getZrot();
-    hwc_transform_t rotation = (hwc_transform_t)0;
 
     // Find the x and y values at the origin when "fully scrolled."
     // Multiply by 2 because the texture goes from -1 to 1, not 0 to 1.
diff --git a/host/RenderControl.cpp b/host/RenderControl.cpp
index 1393e0d..353b275 100644
--- a/host/RenderControl.cpp
+++ b/host/RenderControl.cpp
@@ -1410,8 +1410,6 @@
                                        uint32_t memoryProperty) {
 #define VULKAN_MODE_VULKAN_ONLY 1
 
-    bool modeIsVulkanOnly = mode == VULKAN_MODE_VULKAN_ONLY;
-
     FrameBuffer* fb = FrameBuffer::getFB();
     if (!fb->hasEmulationVk()) {
         ERR("VkEmulation not enabled.");
diff --git a/host/VirtioGpuFrontend.cpp b/host/VirtioGpuFrontend.cpp
index 1a40502..7dacb4f 100644
--- a/host/VirtioGpuFrontend.cpp
+++ b/host/VirtioGpuFrontend.cpp
@@ -806,6 +806,9 @@
     auto& context = contextIt->second;
 
     auto createArgs = context.TakePendingBlob(createBlobArgs->blob_id);
+    if (createArgs) {
+        createArgs->handle = resourceId;
+    }
 
     auto resourceOpt =
         VirtioGpuResource::Create(mFeatures, mPageSize, contextId, resourceId,
diff --git a/host/VirtioGpuResource.cpp b/host/VirtioGpuResource.cpp
index 1212750..5577188 100644
--- a/host/VirtioGpuResource.cpp
+++ b/host/VirtioGpuResource.cpp
@@ -100,7 +100,7 @@
 }
 
 VirtioGpuResourceType GetResourceType(const struct stream_renderer_resource_create_args& args) {
-    if (args.target == PIPE_BUFFER) {
+    if (args.target == PIPE_BUFFER && args.bind == VIRGL_BIND_CUSTOM) {
         return VirtioGpuResourceType::PIPE;
     }
 
@@ -1094,4 +1094,4 @@
 #endif  // #ifdef GFXSTREAM_BUILD_WITH_SNAPSHOT_FRONTEND_SUPPORT
 
 }  // namespace host
-}  // namespace gfxstream
\ No newline at end of file
+}  // namespace gfxstream
diff --git a/host/features/include/gfxstream/host/Features.h b/host/features/include/gfxstream/host/Features.h
index 6c03a70..2eaa0d2 100644
--- a/host/features/include/gfxstream/host/Features.h
+++ b/host/features/include/gfxstream/host/Features.h
@@ -221,8 +221,10 @@
     };
     FeatureInfo BypassVulkanDeviceFeatureOverrides = {
         "BypassVulkanDeviceFeatureOverrides",
-        "We are force disabling (overriding) some vulkan features (private data, uniform inline block etc) which the device may naturally support."
-        "If toggled ON, this flag will cause the host side to not force disable anything and let the device fully advertise supported features.",
+        "We are force disabling (overriding) some vulkan features (private data, uniform inline "
+        "block etc) which the device may naturally support."
+        "If toggled ON, this flag will cause the host side to not force disable anything and let "
+        "the device fully advertise supported features.",
         &map,
     };
     FeatureInfo VulkanAllocateDeviceMemoryOnly = {
@@ -321,7 +323,14 @@
         "device properties for the guest queries.",
         &map,
     };
+    FeatureInfo VulkanRobustness = {
+        "VulkanRobustness",
+        "If enabled, robustness extensions with all supported features will be enabled on "
+        "all created devices. (e.g. VK_EXT_robustness2)",
+        &map,
+    };
 };
+
 struct FeatureDependencyHandler {
     FeatureDependencyHandler(const FeatureSet& set) : featureSetView(set){}
     const FeatureSet& featureSetView;
diff --git a/host/gl/Android.bp b/host/gl/Android.bp
index bf36ed3..5e21ad3 100644
--- a/host/gl/Android.bp
+++ b/host/gl/Android.bp
@@ -38,6 +38,7 @@
         "libgfxstream_host_features",
         "libgfxstream_host_gles1_dec",
         "libgfxstream_host_gles2_dec",
+        "libgfxstream_host_glestranslator_glcommon",
         "libgfxstream_host_glsnapshot",
     ],
 }
diff --git a/host/gl/BUILD.bazel b/host/gl/BUILD.bazel
index a9e771f..0b6ee9f 100644
--- a/host/gl/BUILD.bazel
+++ b/host/gl/BUILD.bazel
@@ -30,9 +30,9 @@
 
 cc_library(
     name = "gl-common-headers",
-    hdrs = glob(["glestranslator/include/**/*.h"]),
+    hdrs = glob(["glestranslator/GLcommon/include/**/*.h"]),
     copts = ["-fno-exceptions"],
-    includes = ["glestranslator/include"],
+    includes = ["glestranslator/GLcommon/include"],
     visibility = ["//visibility:public"],
     deps = ["//hardware/google/gfxstream/host/apigen-codec-common"],
 )
@@ -167,7 +167,6 @@
     srcs = [
         "gl-host-common/opengl/EmuglBackendList.cpp",
         "gl-host-common/opengl/GLProcessPipe.cpp",
-        "gl-host-common/opengl/GpuFrameBridge.cpp",
         "gl-host-common/opengl/OpenglEsPipe.cpp",
         "gl-host-common/opengl/emugl_config.cpp",
         "gl-host-common/opengl/gpuinfo.cpp",
diff --git a/host/gl/CMakeLists.txt b/host/gl/CMakeLists.txt
index 45238f7..d617d17 100644
--- a/host/gl/CMakeLists.txt
+++ b/host/gl/CMakeLists.txt
@@ -40,6 +40,7 @@
         gfxstream_egl_headers
         gles1_dec
         gles2_dec
+        GLcommon
         GLSnapshot
         OpenGLESDispatch)
 
diff --git a/host/gl/ColorBufferGl.cpp b/host/gl/ColorBufferGl.cpp
index c068f12..4e18562 100644
--- a/host/gl/ColorBufferGl.cpp
+++ b/host/gl/ColorBufferGl.cpp
@@ -21,13 +21,13 @@
 
 #include "BorrowedImageGl.h"
 #include "DebugGl.h"
+#include "GLcommon/GLutils.h"
 #include "OpenGLESDispatch/DispatchTables.h"
 #include "OpenGLESDispatch/EGLDispatch.h"
 #include "RenderThreadInfoGl.h"
 #include "TextureDraw.h"
 #include "TextureResize.h"
 #include "gl/YUVConverter.h"
-#include "glestranslator/include/GLcommon/GLutils.h"
 #include "host-common/GfxstreamFatalError.h"
 #include "host-common/opengl/misc.h"
 
diff --git a/host/gl/EmulationGl.cpp b/host/gl/EmulationGl.cpp
index 5158606..e9d9757 100644
--- a/host/gl/EmulationGl.cpp
+++ b/host/gl/EmulationGl.cpp
@@ -461,6 +461,17 @@
     if (s_egl.eglQueryVulkanInteropSupportANDROID) {
         emulationGl->mGlesVulkanInteropSupported = s_egl.eglQueryVulkanInteropSupportANDROID();
     }
+    if (emulationGl->mGlesVulkanInteropSupported) {
+        // Intel: b/271028352 workaround
+        const std::vector<const char*> disallowList = {"Intel", "AMD Radeon Pro WX 3200"};
+        const std::string& glesRenderer = emulationGl->getGlesRenderer();
+        for (const auto& disallowed : disallowList) {
+            if (strstr(glesRenderer.c_str(), disallowed)) {
+                emulationGl->mGlesVulkanInteropSupported = false;
+                break;
+            }
+        }
+    }
 
     emulationGl->mTextureDraw = std::make_unique<TextureDraw>();
     if (!emulationGl->mTextureDraw) {
diff --git a/host/gl/gl-host-common/Android.bp b/host/gl/gl-host-common/Android.bp
index b6976c5..3e34cdd 100644
--- a/host/gl/gl-host-common/Android.bp
+++ b/host/gl/gl-host-common/Android.bp
@@ -38,7 +38,6 @@
         "opengl/EmuglBackendList.cpp",
         "opengl/emugl_config.cpp",
         "opengl/GLProcessPipe.cpp",
-        "opengl/GpuFrameBridge.cpp",
         "opengl/gpuinfo.cpp",
         "opengl/logger.cpp",
         "opengl/misc.cpp",
diff --git a/host/gl/gl-host-common/CMakeLists.txt b/host/gl/gl-host-common/CMakeLists.txt
index e7a3373..a452abc 100644
--- a/host/gl/gl-host-common/CMakeLists.txt
+++ b/host/gl/gl-host-common/CMakeLists.txt
@@ -43,8 +43,6 @@
             opengl/emugl_config.cpp
             # opengl/emugl_config_unittest.cpp
             opengl/GLProcessPipe.cpp
-            opengl/GpuFrameBridge.cpp
-            # opengl/GpuFrameBridge_unittest.cpp
             opengl/gpuinfo.cpp
             # opengl/gpuinfo_unittest.cpp
             opengl/logger.cpp
diff --git a/host/gl/gl-host-common/include/host-common/opengl/GpuFrameBridge.h b/host/gl/gl-host-common/include/host-common/opengl/GpuFrameBridge.h
deleted file mode 100644
index 03bc1d5..0000000
--- a/host/gl/gl-host-common/include/host-common/opengl/GpuFrameBridge.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2015 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#pragma once
-
-#include <cstdint>
-
-class Looper;
-namespace android {
-
-namespace base {
-class Looper;
-}  // namespace base
-
-namespace opengl {
-
-// GpuFrameBridge is a helper class to forward Gpu frame to its clients.
-// Usage is the following:
-// 1) Create a new GpuFrameBridge instance.
-// 2) Register the FrameAvailableCallback if needed.
-// 3) Call getRecordFrame or getRecordFrameAsync to receive frame.
-class GpuFrameBridge {
-public:
-    // Create a new GpuFrameBridge instance.
-    static GpuFrameBridge* create();
-
-    // Destructor
-    virtual ~GpuFrameBridge() {}
-
-    // Post callback (synchronous) specifically for recording purposes.
-    virtual void postRecordFrame(int width, int height, const void* pixels) = 0;
-
-    // Async version of postRecordFrame for use with async readback.
-    // Does not read the frame immediately.
-    virtual void postRecordFrameAsync(int width,
-                                      int height,
-                                      const void* pixels) = 0;
-
-    // Returns the currently displayed frame. This method is designed only for
-    // recording. Returns null if there is no frame available. Make sure to
-    // attach the postFrameRecording() as the callback or you will not get a
-    // valid frame.
-    virtual void* getRecordFrame() = 0;
-
-    // Async version of getRecordFrame.
-    virtual void* getRecordFrameAsync() = 0;
-
-    // Invalidates the recording buffers. Once called, getRecordFrame() and it's
-    // async version will return null until new data has been posted.
-    virtual void invalidateRecordingBuffers() = 0;
-
-    typedef void (*FrameAvailableCallback)(void* opaque);
-
-    virtual void setFrameReceiver(FrameAvailableCallback receiver, void* opaque) = 0;
-
-    virtual void setDisplayId(uint32_t displayId) = 0;
-
-    // virtual void setLooper(android::base::Looper* aLooper) = 0;
-
-protected:
-    GpuFrameBridge() {}
-    GpuFrameBridge(const GpuFrameBridge& other);
-};
-
-}  // namespace opengl
-}  // namespace android
diff --git a/host/gl/gl-host-common/meson.build b/host/gl/gl-host-common/meson.build
index c10f912..d102831 100644
--- a/host/gl/gl-host-common/meson.build
+++ b/host/gl/gl-host-common/meson.build
@@ -6,7 +6,6 @@
   'opengl/EmuglBackendList.cpp',
   'opengl/emugl_config.cpp',
   'opengl/GLProcessPipe.cpp',
-  'opengl/GpuFrameBridge.cpp',
   'opengl/gpuinfo.cpp',
   'opengl/logger.cpp',
   'opengl/misc.cpp',
diff --git a/host/gl/gl-host-common/opengl/GpuFrameBridge.cpp b/host/gl/gl-host-common/opengl/GpuFrameBridge.cpp
deleted file mode 100644
index 717025d..0000000
--- a/host/gl/gl-host-common/opengl/GpuFrameBridge.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-// Copyright (C) 2015 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "host-common/opengl/GpuFrameBridge.h"
-
-#include <stdio.h>   // for printf
-#include <stdlib.h>  // for NULL, free, malloc
-#include <string.h>  // for memcpy
-
-#include <atomic>  // for atomic_bool, memory_o...
-#include <memory>  // for unique_ptr
-
-#include "aemu/base/synchronization/Lock.h"  // for Lock, AutoLock
-#include "aemu/base/synchronization/MessageChannel.h"
-#include "host-common/opengles.h"  // for android_getFlushReadP...
-
-#ifdef _WIN32
-#undef ERROR
-#endif
-
-namespace android {
-namespace opengl {
-
-using android::base::AutoLock;
-using android::base::Lock;
-using android::base::MessageChannel;
-
-namespace {
-
-// A small structure to model a single frame of the GPU display,
-// as passed between the EmuGL and main loop thread.
-struct Frame {
-    int width;
-    int height;
-    void* pixels;
-    bool isValid;
-
-    Frame(int w, int h, const void* pixels)
-        : width(w), height(h), pixels(NULL), isValid(true) {
-        this->pixels = ::malloc(w * 4 * h);
-    }
-
-    ~Frame() { ::free(pixels); }
-};
-
-// Real implementation of GpuFrameBridge interface.
-class Bridge : public GpuFrameBridge {
-public:
-    // Constructor.
-    Bridge()
-        : GpuFrameBridge(),
-          mRecFrame(NULL),
-          mRecTmpFrame(NULL),
-          mRecFrameUpdated(false),
-          mReadPixelsFunc(android_getReadPixelsFunc()),
-          mFlushPixelPipeline(android_getFlushReadPixelPipeline()) {}
-
-    // The gpu bridge receives frames from a buffer that can contain multiple
-    // frames. usually the bridge is one frame behind. This is usually not a
-    // problem when we have a high enough framerate. However it is possible that
-    // the framerate drops really low (even <1). This can result in the bridge
-    // never delivering this "stuck frame".
-    //
-    // As a work around we will flush the reader pipeline if no frames are
-    // delivered within at most 2x kFrameDelayms
-    const long kMinFPS = 24;
-    const long kFrameDelayMs = 1000 / kMinFPS;
-
-    // Destructor
-    virtual ~Bridge() {
-        if (mRecFrame) {
-            delete mRecFrame;
-        }
-        if (mRecTmpFrame) {
-            delete mRecTmpFrame;
-        }
-    }
-
-    // virtual void setLooper(android::base::Looper* aLooper) override {
-    //     mTimer = std::unique_ptr<android::base::Looper::Timer>(
-    //             aLooper->createTimer(_on_frame_notify, this));
-    // }
-
-    void notify() {
-        AutoLock delay(mDelayLock);
-        switch (mDelayCallback) {
-            case FrameDelay::Reschedule:
-                // mTimer->startRelative(kFrameDelayMs);
-                mDelayCallback = FrameDelay::Scheduled;
-                break;
-            case FrameDelay::Scheduled:
-                // mTimer->stop();
-                mDelayCallback = FrameDelay::Firing;
-                delay.unlock();
-                mFlushPixelPipeline(mDisplayId);
-                break;
-            default:
-                assert(false);
-        }
-    }
-
-    // static void _on_frame_notify(void* opaque,
-    //                              android::base::Looper::Timer* timer) {
-    //     Bridge* worker = static_cast<Bridge*>(opaque);
-    //     worker->notify();
-    // }
-
-    // Implementation of the GpuFrameBridge::postRecordFrame() method, must be
-    // called from the EmuGL thread.
-    virtual void postRecordFrame(int width,
-                                 int height,
-                                 const void* pixels) override {
-        postFrame(width, height, pixels, true);
-    }
-
-    virtual void postRecordFrameAsync(int width,
-                                      int height,
-                                      const void* pixels) override {
-        postFrame(width, height, pixels, false);
-    }
-
-    virtual void* getRecordFrame() override {
-        if (mRecFrameUpdated.exchange(false)) {
-            AutoLock lock(mRecLock);
-            memcpy(mRecFrame->pixels, mRecTmpFrame->pixels,
-                   mRecFrame->width * mRecFrame->height * 4);
-            mRecFrame->isValid = true;
-        }
-        return mRecFrame && mRecFrame->isValid ? mRecFrame->pixels : nullptr;
-    }
-
-    virtual void* getRecordFrameAsync() override {
-        if (mRecFrameUpdated.exchange(false)) {
-            AutoLock lock(mRecLock);
-            mReadPixelsFunc(mRecFrame->pixels,
-                            mRecFrame->width * mRecFrame->height * 4,
-                            mDisplayId);
-            mRecFrame->isValid = true;
-        }
-        return mRecFrame && mRecFrame->isValid ? mRecFrame->pixels : nullptr;
-    }
-
-    virtual void invalidateRecordingBuffers() override {
-        {
-            AutoLock lock(mRecLock);
-            // Release the buffers because new recording in the furture may have
-            // different resolution if multi display changes its resolution.
-            if (mRecFrame) {
-                delete mRecFrame;
-                mRecFrame = nullptr;
-            }
-            if (mRecTmpFrame) {
-                delete mRecTmpFrame;
-                mRecTmpFrame = nullptr;
-            }
-        }
-        mRecFrameUpdated.store(false, std::memory_order_release);
-    }
-
-    void setFrameReceiver(FrameAvailableCallback receiver,
-                          void* opaque) override {
-        mReceiver = receiver;
-        mReceiverOpaque = opaque;
-    }
-
-    void postFrame(int width, int height, const void* pixels, bool copy) {
-        {
-            AutoLock lock(mRecLock);
-            if (!mRecFrame) {
-                mRecFrame = new Frame(width, height, pixels);
-            }
-            if (!mRecTmpFrame) {
-                mRecTmpFrame = new Frame(width, height, pixels);
-            }
-            if (copy) {
-                memcpy(mRecTmpFrame->pixels, pixels, width * height * 4);
-            }
-        }
-        mRecFrameUpdated.store(true, std::memory_order_release);
-        if (mReceiver) {
-            mReceiver(mReceiverOpaque);
-            AutoLock delay(mDelayLock);
-            switch (mDelayCallback) {
-                case FrameDelay::NotScheduled:
-                    // mTimer->startRelative(kFrameDelayMs);
-                    mDelayCallback = FrameDelay::Scheduled;
-                    break;
-                case FrameDelay::Firing:
-                    mDelayCallback = FrameDelay::NotScheduled;
-                    break;
-                default:
-                    mDelayCallback = FrameDelay::Reschedule;
-                    break;
-            }
-        }
-    }
-
-    virtual void setDisplayId(uint32_t displayId) override {
-        mDisplayId = displayId;
-    }
-    enum class FrameDelay {
-        NotScheduled = 0,  // No delay timer is scheduled
-        Scheduled,   // A delay timer has been scheduled and will flush the
-                     // pipeline on expiration
-        Reschedule,  // Do not flush the pipeline, but reschedule
-        Firing,      // A callback has been scheduled, nothing needs to happen
-    };
-
-private:
-    FrameAvailableCallback mReceiver = nullptr;
-    void* mReceiverOpaque = nullptr;
-    Lock mRecLock;
-    Frame* mRecFrame;
-    Frame* mRecTmpFrame;
-    std::atomic_bool mRecFrameUpdated;
-    ReadPixelsFunc mReadPixelsFunc = 0;
-    uint32_t mDisplayId = 0;
-    FlushReadPixelPipeline mFlushPixelPipeline = 0;
-
-    // std::unique_ptr<android::base::Looper::Timer> mTimer;
-    Lock mDelayLock;
-    FrameDelay mDelayCallback{FrameDelay::NotScheduled};
-};
-}  // namespace
-// static
-GpuFrameBridge* GpuFrameBridge::create() {
-    return new Bridge();
-}
-
-}  // namespace opengl
-}  // namespace android
diff --git a/host/gl/gl-host-common/opengl/GpuFrameBridge_unittest.cpp b/host/gl/gl-host-common/opengl/GpuFrameBridge_unittest.cpp
deleted file mode 100644
index 03c62dd..0000000
--- a/host/gl/gl-host-common/opengl/GpuFrameBridge_unittest.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (C) 2015 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "android/opengl/GpuFrameBridge.h"
-
-#include "android/base/async/Looper.h"
-#include "android/base/Log.h"
-#include "android/base/memory/ScopedPtr.h"
-
-#include <gtest/gtest.h>
-
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-
-namespace android {
-namespace opengl {
-
-using android::base::ScopedPtr;
-using android::base::Looper;
-
-TEST(GpuFrameBridge, postFrameWithinSingleThread) {
-    GpuFrameBridge* bridge =
-            GpuFrameBridge::create();
-    EXPECT_TRUE(bridge);
-
-    static const unsigned char kFrame0[4] = {
-        0xff, 0x80, 0x40, 0xff,
-    };
-
-    bridge->postRecordFrame(1, 1, kFrame0);
-    unsigned char* pixel = (unsigned char*)bridge->getRecordFrame();
-    for (size_t n = 0; n < sizeof(kFrame0); ++n) {
-        EXPECT_EQ(kFrame0[n], pixel[n]) << "# " << n;
-    }
-}
-
-}  // namespace opengl
-}  // namespace android
diff --git a/host/gl/gl-host-common/opengles.cpp b/host/gl/gl-host-common/opengles.cpp
index b83e959..8da6668 100644
--- a/host/gl/gl-host-common/opengles.cpp
+++ b/host/gl/gl-host-common/opengles.cpp
@@ -14,72 +14,30 @@
 
 #include "host-common/opengles.h"
 
-#include "aemu/base/GLObjectCounter.h"
-#include "aemu/base/files/PathUtils.h"
-#include "aemu/base/files/Stream.h"
-#include "aemu/base/memory/MemoryTracker.h"
-#include "aemu/base/SharedLibrary.h"
-#include "aemu/base/system/System.h"
-#include "host-common/address_space_device.h"
-#include "host-common/address_space_graphics.h"
-#include "host-common/address_space_graphics_types.h"
-#include "host-common/GfxstreamFatalError.h"
-#include "host-common/GoldfishDma.h"
-#include "host-common/logging.h"
-#include "host-common/RefcountPipe.h"
-#include "host-common/FeatureControl.h"
-#include "host-common/globals.h"
-#include "host-common/opengl/emugl_config.h"
-#include "host-common/opengl/GLProcessPipe.h"
-#include "host-common/opengl/logger.h"
-#include "host-common/opengl/gpuinfo.h"
-
-#include "render-utils/render_api_functions.h"
-#include "OpenGLESDispatch/EGLDispatch.h"
-#include "OpenGLESDispatch/GLESv2Dispatch.h"
-
-
 #include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 
 #include <optional>
 
-#define D(...)
-#define DD(...)
+#include "aemu/base/GLObjectCounter.h"
+#include "aemu/base/SharedLibrary.h"
+#include "host-common/address_space_device.h"
+#include "host-common/address_space_graphics.h"
+#include "host-common/address_space_graphics_types.h"
+#include "host-common/GfxstreamFatalError.h"
+#include "host-common/logging.h"
+#include "host-common/opengl/GLProcessPipe.h"
+#include "host-common/opengl/emugl_config.h"
+#include "host-common/opengl/logger.h"
+#include "host-common/opengl/gpuinfo.h"
 
-#define I(fmt, ...)                                     \
-    do {                                                \
-        GFXSTREAM_LOG(stderr, 'I', fmt, ##__VA_ARGS__); \
-    } while (0);
-
-#define E(fmt, ...)                                     \
-    do {                                                \
-        GFXSTREAM_LOG(stderr, 'E', fmt, ##__VA_ARGS__); \
-    } while (0);
-
-
-using android::base::pj;
 using android::base::SharedLibrary;
 using android::emulation::asg::AddressSpaceGraphicsContext;
 using android::emulation::asg::ConsumerCallbacks;
 using android::emulation::asg::ConsumerInterface;
 using emugl::ABORT_REASON_OTHER;
 using emugl::FatalError;
-using gfxstream::gl::EGLDispatch;
-using gfxstream::gl::GLESv2Dispatch;
-
-/* Name of the GLES rendering library we're going to use */
-#define RENDERER_LIB_NAME "libOpenglRender"
-
-/* Declared in "android/globals.h" */
-int  android_gles_fast_pipes = 1;
-
-// Define the Render API function pointers.
-#define FUNCTION_(ret, name, sig, params) \
-        inline ret (*name) sig = NULL;
-LIST_RENDER_API_FUNCTIONS(FUNCTION_)
-#undef FUNCTION_
 
 static bool sOpenglLoggerInitialized = false;
 static bool sRendererUsesSubWindow = false;
@@ -136,7 +94,6 @@
                               int* glesMinorVersion_out)
 {
     if (!sRenderLib) {
-        D("Can't start OpenGLES renderer without support libraries");
         return -1;
     }
 
@@ -146,13 +103,11 @@
 
     const GpuInfoList& gpuList = globalGpuInfoList();
     std::string gpuInfoAsString = gpuList.dump();
-    I("%s: gpu info", __func__);
-    I("%s", gpuInfoAsString.c_str());
+    INFO("%s: gpu info", __func__);
+    INFO("%s", gpuInfoAsString.c_str());
 
     sRenderLib->setRenderer(emuglConfig_get_current_renderer());
     sRenderLib->setAvdInfo(guestPhoneApi, guestApiLevel);
-    // sRenderLib->setCrashReporter(&crashhandler_die_format);
-    // sRenderLib->setFeatureController(&android::featurecontrol::isEnabled);
     sRenderLib->setSyncDevice(goldfish_sync_create_timeline,
             goldfish_sync_create_fence,
             goldfish_sync_timeline_inc,
@@ -169,19 +124,11 @@
     sRenderLib->setVmOps(*vm_operations);
     sRenderLib->setAddressSpaceDeviceControlOps(get_address_space_device_control_ops());
     sRenderLib->setWindowOps(*window_agent, *multi_display_agent);
-    // sRenderLib->setUsageTracker(android::base::CpuUsage::get(),
-    //                             android::base::MemoryTracker::get());
 
     const auto* features = reinterpret_cast<const gfxstream::host::FeatureSet*>(gfxstreamFeatures);
     sRenderer = sRenderLib->initRenderer(width, height, *features, sRendererUsesSubWindow, sEgl2egl);
     android_setOpenglesRenderer(&sRenderer);
 
-    // android::snapshot::Snapshotter::get().addOperationCallback(
-    //         [](android::snapshot::Snapshotter::Operation op,
-    //            android::snapshot::Snapshotter::Stage stage) {
-    //             sRenderer->snapshotOperationCallback(op, stage);
-    //         });
-
     android::emulation::registerOnLastRefCallback(
             sRenderLib->getOnLastColorBufferRef());
 
@@ -237,7 +184,7 @@
     AddressSpaceGraphicsContext::setConsumer(iface);
 
     if (!sRenderer) {
-        D("Can't start OpenGLES renderer?");
+        ERR("Can't start OpenGLES renderer?");
         return -1;
     }
 
@@ -253,8 +200,8 @@
     if (sRenderer) {
         return sRenderer->asyncReadbackSupported();
     } else {
-        D("tried to query async readback support "
-          "before renderer initialized. Likely guest rendering");
+        VERBOSE("tried to query async readback support "
+                "before renderer initialized. Likely guest rendering");
         return false;
     }
 }
@@ -317,14 +264,14 @@
     assert(vendor != NULL && renderer != NULL && version != NULL);
     assert(*vendor == NULL && *renderer == NULL && *version == NULL);
     if (!sRenderer) {
-        D("Can't get OpenGL ES hardware strings when renderer not started");
+        ERR("Can't get OpenGL ES hardware strings when renderer not started");
         return;
     }
 
     const gfxstream::Renderer::HardwareStrings strings = sRenderer->getHardwareStrings();
-    D("OpenGL Vendor=[%s]", strings.vendor.c_str());
-    D("OpenGL Renderer=[%s]", strings.renderer.c_str());
-    D("OpenGL Version=[%s]", strings.version.c_str());
+    INFO("OpenGL Vendor=[%s]", strings.vendor.c_str());
+    INFO("OpenGL Renderer=[%s]", strings.renderer.c_str());
+    INFO("OpenGL Version=[%s]", strings.version.c_str());
 
     /* Special case for the default ES to GL translators: extract the strings
      * of the underlying OpenGL implementation. */
@@ -342,7 +289,7 @@
 
 void android_getOpenglesVersion(int* maj, int* min) {
     sRenderLib->getGlesVersion(maj, min);
-    fprintf(stderr, "%s: maj min %d %d\n", __func__, *maj, *min);
+    INFO("OpenGL ES version major:%d minor:%d", *maj, *min);
 }
 
 void
diff --git a/host/gl/glestranslator/GLcommon/Android.bp b/host/gl/glestranslator/GLcommon/Android.bp
index 5929319..4c1cc99 100644
--- a/host/gl/glestranslator/GLcommon/Android.bp
+++ b/host/gl/glestranslator/GLcommon/Android.bp
@@ -47,4 +47,7 @@
         "TextureData.cpp",
         "TextureUtils.cpp",
     ],
+    export_include_dirs: [
+        "include",
+    ],
 }
diff --git a/host/gl/glestranslator/GLcommon/CMakeLists.txt b/host/gl/glestranslator/GLcommon/CMakeLists.txt
index 0b358f4..b77678e 100644
--- a/host/gl/glestranslator/GLcommon/CMakeLists.txt
+++ b/host/gl/glestranslator/GLcommon/CMakeLists.txt
@@ -25,7 +25,7 @@
     ${GFXSTREAM_REPO_ROOT}/include
     ${GFXSTREAM_REPO_ROOT}/host
     ${GFXSTREAM_REPO_ROOT}/host/apigen-codec-common
-    ${GFXSTREAM_REPO_ROOT}/host/gl/glestranslator/include)
+    ${GFXSTREAM_REPO_ROOT}/host/gl/glestranslator/GLcommon/include)
 target_link_libraries(
     GLcommon PUBLIC
     aemu-base.headers
diff --git a/host/gl/glestranslator/include/GLcommon/FramebufferData.h b/host/gl/glestranslator/GLcommon/include/GLcommon/FramebufferData.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/FramebufferData.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/FramebufferData.h
diff --git a/host/gl/glestranslator/include/GLcommon/GLBackgroundLoader.h b/host/gl/glestranslator/GLcommon/include/GLcommon/GLBackgroundLoader.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/GLBackgroundLoader.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/GLBackgroundLoader.h
diff --git a/host/gl/glestranslator/include/GLcommon/GLDispatch.h b/host/gl/glestranslator/GLcommon/include/GLcommon/GLDispatch.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/GLDispatch.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/GLDispatch.h
diff --git a/host/gl/glestranslator/include/GLcommon/GLESbuffer.h b/host/gl/glestranslator/GLcommon/include/GLcommon/GLESbuffer.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/GLESbuffer.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/GLESbuffer.h
diff --git a/host/gl/glestranslator/include/GLcommon/GLEScontext.h b/host/gl/glestranslator/GLcommon/include/GLcommon/GLEScontext.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/GLEScontext.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/GLEScontext.h
diff --git a/host/gl/glestranslator/include/GLcommon/GLESmacros.h b/host/gl/glestranslator/GLcommon/include/GLcommon/GLESmacros.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/GLESmacros.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/GLESmacros.h
diff --git a/host/gl/glestranslator/include/GLcommon/GLESpointer.h b/host/gl/glestranslator/GLcommon/include/GLcommon/GLESpointer.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/GLESpointer.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/GLESpointer.h
diff --git a/host/gl/glestranslator/include/GLcommon/GLESvalidate.h b/host/gl/glestranslator/GLcommon/include/GLcommon/GLESvalidate.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/GLESvalidate.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/GLESvalidate.h
diff --git a/host/gl/glestranslator/include/GLcommon/GLLibrary.h b/host/gl/glestranslator/GLcommon/include/GLcommon/GLLibrary.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/GLLibrary.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/GLLibrary.h
diff --git a/host/gl/glestranslator/include/GLcommon/GLSnapshotSerializers.h b/host/gl/glestranslator/GLcommon/include/GLcommon/GLSnapshotSerializers.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/GLSnapshotSerializers.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/GLSnapshotSerializers.h
diff --git a/host/gl/glestranslator/include/GLcommon/GLconversion_macros.h b/host/gl/glestranslator/GLcommon/include/GLcommon/GLconversion_macros.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/GLconversion_macros.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/GLconversion_macros.h
diff --git a/host/gl/glestranslator/include/GLcommon/GLutils.h b/host/gl/glestranslator/GLcommon/include/GLcommon/GLutils.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/GLutils.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/GLutils.h
diff --git a/host/gl/glestranslator/include/GLcommon/NamedObject.h b/host/gl/glestranslator/GLcommon/include/GLcommon/NamedObject.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/NamedObject.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/NamedObject.h
diff --git a/host/gl/glestranslator/include/GLcommon/ObjectData.h b/host/gl/glestranslator/GLcommon/include/GLcommon/ObjectData.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/ObjectData.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/ObjectData.h
diff --git a/host/gl/glestranslator/include/GLcommon/ObjectNameSpace.h b/host/gl/glestranslator/GLcommon/include/GLcommon/ObjectNameSpace.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/ObjectNameSpace.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/ObjectNameSpace.h
diff --git a/host/gl/glestranslator/include/GLcommon/PaletteTexture.h b/host/gl/glestranslator/GLcommon/include/GLcommon/PaletteTexture.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/PaletteTexture.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/PaletteTexture.h
diff --git a/host/gl/glestranslator/include/GLcommon/RangeManip.h b/host/gl/glestranslator/GLcommon/include/GLcommon/RangeManip.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/RangeManip.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/RangeManip.h
diff --git a/host/gl/glestranslator/include/GLcommon/SaveableTexture.h b/host/gl/glestranslator/GLcommon/include/GLcommon/SaveableTexture.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/SaveableTexture.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/SaveableTexture.h
diff --git a/host/gl/glestranslator/include/GLcommon/ScopedGLState.h b/host/gl/glestranslator/GLcommon/include/GLcommon/ScopedGLState.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/ScopedGLState.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/ScopedGLState.h
diff --git a/host/gl/glestranslator/include/GLcommon/ShareGroup.h b/host/gl/glestranslator/GLcommon/include/GLcommon/ShareGroup.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/ShareGroup.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/ShareGroup.h
diff --git a/host/gl/glestranslator/include/GLcommon/TextureData.h b/host/gl/glestranslator/GLcommon/include/GLcommon/TextureData.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/TextureData.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/TextureData.h
diff --git a/host/gl/glestranslator/include/GLcommon/TextureUtils.h b/host/gl/glestranslator/GLcommon/include/GLcommon/TextureUtils.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/TextureUtils.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/TextureUtils.h
diff --git a/host/gl/glestranslator/include/GLcommon/TranslatorIfaces.h b/host/gl/glestranslator/GLcommon/include/GLcommon/TranslatorIfaces.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/TranslatorIfaces.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/TranslatorIfaces.h
diff --git a/host/gl/glestranslator/include/GLcommon/rgtc.h b/host/gl/glestranslator/GLcommon/include/GLcommon/rgtc.h
similarity index 100%
rename from host/gl/glestranslator/include/GLcommon/rgtc.h
rename to host/gl/glestranslator/GLcommon/include/GLcommon/rgtc.h
diff --git a/host/tracing/CMakeLists.txt b/host/tracing/CMakeLists.txt
index 62f4284..966814a 100644
--- a/host/tracing/CMakeLists.txt
+++ b/host/tracing/CMakeLists.txt
@@ -1,4 +1,4 @@
-if (NOT TARGET gfxstream-gl-host-common)
+if (NOT TARGET gfxstream_host_tracing)
     add_library(
         gfxstream_host_tracing.headers
         INTERFACE)
@@ -14,4 +14,11 @@
         gfxstream_host_tracing
         PUBLIC
         gfxstream_host_tracing.headers)
+
+    if(GFXSTREAM_ENABLE_HOST_TRACING)
+        target_link_libraries(
+            gfxstream_host_tracing
+            PUBLIC
+            perfetto)
+    endif()
 endif()
diff --git a/host/tracing/include/gfxstream/host/Tracing.h b/host/tracing/include/gfxstream/host/Tracing.h
index d344a99..94cf8f3 100644
--- a/host/tracing/include/gfxstream/host/Tracing.h
+++ b/host/tracing/include/gfxstream/host/Tracing.h
@@ -26,7 +26,11 @@
 
 #ifdef GFXSTREAM_BUILD_WITH_TRACING
 
+#ifdef GFXSTREAM_BUILD_WITH_PERFETTO_SDK
+#include <perfetto.h>
+#else
 #include <perfetto/tracing.h>
+#endif
 
 PERFETTO_DEFINE_CATEGORIES(perfetto::Category(GFXSTREAM_TRACE_DEFAULT_CATEGORY)
                                .SetDescription("Default events")
diff --git a/host/virtio-gpu-gfxstream-renderer.cpp b/host/virtio-gpu-gfxstream-renderer.cpp
index 5c0539d..ac938c2 100644
--- a/host/virtio-gpu-gfxstream-renderer.cpp
+++ b/host/virtio-gpu-gfxstream-renderer.cpp
@@ -729,7 +729,7 @@
         feature_info->enabled = feature_status == "enabled";
         feature_info->reason = "Overridden via STREAM_RENDERER_PARAM_RENDERER_FEATURES";
 
-        stream_renderer_error("Gfxstream feature %s %s", feature_name.c_str(),
+        stream_renderer_info("Gfxstream feature %s %s", feature_name.c_str(),
                               feature_status.c_str());
     }
 
diff --git a/host/vulkan/CMakeLists.txt b/host/vulkan/CMakeLists.txt
index aeb8d6c..487dda9 100644
--- a/host/vulkan/CMakeLists.txt
+++ b/host/vulkan/CMakeLists.txt
@@ -35,6 +35,8 @@
             VulkanStream.cpp
             vk_util.cpp)
 set_source_files_properties(VkDecoder.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-variable)
+set_source_files_properties(VkSubDecoder.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-variable)
+set_source_files_properties(VkDecoderSnapshot.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-variable)
 
 target_link_libraries(gfxstream-vulkan-server PUBLIC
         OpenglRender_vulkan_cereal
@@ -62,7 +64,17 @@
 if (NOT MSVC)
     target_compile_options(gfxstream-vulkan-server PRIVATE -fvisibility=hidden)
 endif()
-target_compile_options(gfxstream-vulkan-server PRIVATE -Wno-unused-value -Wno-return-type -Wno-return-type-c-linkage)
+target_compile_options(gfxstream-vulkan-server
+    PRIVATE
+    -Wall
+    -Wextra
+    -Werror
+    -Wno-missing-field-initializers
+    -Wno-unused-parameter
+    -Wno-unused-private-field
+    -Wno-return-type-c-linkage
+    -Wno-extern-c-compat
+    )
 
 target_include_directories(gfxstream-vulkan-server
                            PUBLIC
@@ -72,6 +84,7 @@
                            ${GFXSTREAM_REPO_ROOT}
                            ${GFXSTREAM_REPO_ROOT}/include
                            ${GFXSTREAM_REPO_ROOT}/host
+                           ${GFXSTREAM_REPO_ROOT}/host/tracing
                            ${GFXSTREAM_REPO_ROOT}/host/vulkan
                            ${GFXSTREAM_REPO_ROOT}/host/vulkan/cereal/common
                            ${GFXSTREAM_REPO_ROOT}/host/apigen-codec-common
diff --git a/host/vulkan/CompositorVk.cpp b/host/vulkan/CompositorVk.cpp
index 27865f9..7617622 100644
--- a/host/vulkan/CompositorVk.cpp
+++ b/host/vulkan/CompositorVk.cpp
@@ -108,7 +108,8 @@
       m_height(height) {
     if (vkImageView == VK_NULL_HANDLE) {
         GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER))
-            << "CompositorVk found empty image view handle when creating RenderTarget.";
+            << "CompositorVk found empty image view handle when creating RenderTarget. Image: "
+            << m_vkImage << " Dimensions: " << m_width << "x" << m_height;
     }
 
     const VkFramebufferCreateInfo framebufferCi = {
@@ -1319,6 +1320,7 @@
     std::shared_future<PerFrameResources*> composeCompleteFutureForResources =
         std::async(std::launch::deferred, [composeCompleteFence, frameResources, traceId,
                                            this]() mutable {
+            (void)traceId;
             GFXSTREAM_TRACE_EVENT(GFXSTREAM_TRACE_DEFAULT_CATEGORY, "Wait for compose fence",
                                   GFXSTREAM_TRACE_FLOW(traceId));
 
diff --git a/host/vulkan/VkAndroidNativeBuffer.cpp b/host/vulkan/VkAndroidNativeBuffer.cpp
index d7436e4..54d53c4 100644
--- a/host/vulkan/VkAndroidNativeBuffer.cpp
+++ b/host/vulkan/VkAndroidNativeBuffer.cpp
@@ -32,7 +32,7 @@
 namespace gfxstream {
 namespace vk {
 
-#define VK_ANB_ERR(fmt, ...) INFO(fmt, ##__VA_ARGS__);
+#define VK_ANB_ERR(fmt, ...) ERR(fmt, ##__VA_ARGS__);
 
 #define ENABLE_VK_ANB_DEBUG 0
 
@@ -201,6 +201,10 @@
                 importedColorBufferInfo.height);
             return nullptr;
         }
+
+        // Update create flags to match the color buffer imported
+        createImageCi.flags = importedColorBufferInfo.imageCreateInfoShallow.flags;
+
         const auto& importedColorBufferMemoryInfo = importedColorBufferInfo.memory;
 
         // VkBindImageMemorySwapchainInfoKHR may be included from the guest but
@@ -235,6 +239,18 @@
 
         vk->vkGetImageMemoryRequirements(out->mDevice, out->mImage, &out->mImageMemoryRequirements);
 
+        if (out->mImageMemoryRequirements.size > importedColorBufferMemoryInfo.size) {
+            VK_ANB_ERR(
+                "Failed to prepare ANB image: attempted to import memory that is not large enough "
+                "for the VkImage: image memory requirements size:%llu vs actual memory size:%llu, "
+                "CB: %u, %s, %ux%u",
+                out->mImageMemoryRequirements.size, importedColorBufferMemoryInfo.size,
+                importedColorBufferHandle, string_VkFormat(createImageCi.format),
+                createImageCi.extent.width, createImageCi.extent.height);
+
+            return nullptr;
+        }
+
         if (out->mImageMemoryRequirements.size < importedColorBufferMemoryInfo.size) {
             out->mImageMemoryRequirements.size = importedColorBufferMemoryInfo.size;
         }
@@ -551,6 +567,7 @@
     mEverAcquired = true;
 
     if (firstTimeSetup) {
+        mLastUsedQueueFamilyIndex = defaultQueueFamilyIndex;
         VkSubmitInfo submitInfo = {
             VK_STRUCTURE_TYPE_SUBMIT_INFO,
             0,
@@ -567,6 +584,11 @@
         return VK_SUCCESS;
     }
 
+    if (mLastUsedQueueFamilyIndex == INVALID_QUEUE_FAMILY_INDEX) {
+        ERR("AndroidNativeBufferInfo missing last used queue.");
+        return VK_ERROR_INITIALIZATION_FAILED;
+    }
+
     // Setup queue state for this queue family index.
     auto queueFamilyIndex = mLastUsedQueueFamilyIndex;
     if (queueFamilyIndex >= mQueueStates.size()) {
@@ -818,6 +840,7 @@
     std::lock_guard<std::mutex> qLock(*queueMutex);
     VK_CHECK(vk->vkQueueSubmit(queueState.queue, 1, &submitInfo, qsriFence));
     auto waitForQsriFenceTask = [this, vk, device = mDevice, qsriFence, traceId] {
+        (void)traceId;
         GFXSTREAM_TRACE_EVENT(GFXSTREAM_TRACE_DEFAULT_CATEGORY, "Wait for QSRI fence",
                               GFXSTREAM_TRACE_FLOW(traceId));
 
diff --git a/host/vulkan/VkAndroidNativeBuffer.h b/host/vulkan/VkAndroidNativeBuffer.h
index 907ac4c..b6340be 100644
--- a/host/vulkan/VkAndroidNativeBuffer.h
+++ b/host/vulkan/VkAndroidNativeBuffer.h
@@ -140,7 +140,8 @@
     // mode (reflected in this struct's |sharingMode| field),
     // this part doesn't really matter.
     bool mEverSynced = false;
-    uint32_t mLastUsedQueueFamilyIndex = -1;
+    static constexpr uint32_t INVALID_QUEUE_FAMILY_INDEX = std::numeric_limits<uint32_t>::max();
+    uint32_t mLastUsedQueueFamilyIndex = INVALID_QUEUE_FAMILY_INDEX;
 
     // On first acquire, we might use a different queue family
     // to initially set the semaphore/fence to be signaled.
diff --git a/host/vulkan/VkCommonOperations.cpp b/host/vulkan/VkCommonOperations.cpp
index 11d3f73..5b304fc 100644
--- a/host/vulkan/VkCommonOperations.cpp
+++ b/host/vulkan/VkCommonOperations.cpp
@@ -74,8 +74,6 @@
 constexpr size_t kPageBits = 12;
 constexpr size_t kPageSize = 1u << kPageBits;
 
-static int kMaxDebugMarkerAnnotations = 10;
-
 static std::optional<std::string> sMemoryLogPath = std::nullopt;
 
 const char* string_AstcEmulationMode(AstcEmulationMode mode) {
@@ -573,6 +571,11 @@
         {VK_FORMAT_B8G8R8A8_UNORM,
          VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT},
 
+        {VK_FORMAT_B4G4R4A4_UNORM_PACK16,
+         VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT},
+        {VK_FORMAT_R4G4B4A4_UNORM_PACK16,
+         VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT},
+
         {VK_FORMAT_R8_UNORM,
          VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT},
         {VK_FORMAT_R16_UNORM,
@@ -745,7 +748,7 @@
 
         // Prefer discrete GPUs, then integrated and then others..
         const int deviceType = deviceInfo.physdevProps.deviceType;
-        deviceScore += deviceTypeScoreTable[deviceInfo.physdevProps.deviceType];
+        deviceScore += deviceTypeScoreTable[deviceType];
 
         // Prefer higher level of Vulkan API support, restrict version numbers to
         // common limits to ensure an always increasing scoring change
@@ -1222,6 +1225,15 @@
                 vk_append_struct(&features2Chain, &privateDataFeatures);
             }
 
+            VkPhysicalDeviceRobustness2FeaturesEXT robustness2Features = {
+                .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT};
+            const bool robustnessRequested = emulation->mFeatures.VulkanRobustness.enabled;
+            const bool robustnessSupported =
+                extensionsSupported(deviceExts, {VK_EXT_ROBUSTNESS_2_EXTENSION_NAME});
+            if (robustnessRequested && robustnessSupported) {
+                vk_append_struct(&features2Chain, &robustness2Features);
+            }
+
             emulation->mGetPhysicalDeviceFeatures2Func(physicalDevices[i], &features2);
 
             deviceInfos[i].supportsSamplerYcbcrConversion =
@@ -1232,6 +1244,15 @@
 
             deviceInfos[i].supportsPrivateData = (privateDataFeatures.privateData == VK_TRUE);
 
+            // Enable robustness only when requested
+            if (robustnessRequested && robustnessSupported) {
+                deviceInfos[i].robustness2Features = vk_make_orphan_copy(robustness2Features);
+            } else if (robustnessRequested) {
+                WARN(
+                    "VulkanRobustness was requested but the "
+                    "VK_EXT_robustness2 extension is not supported.");
+            }
+
 #if defined(__QNX__)
             deviceInfos[i].supportsExternalMemoryImport =
                 extMemScreenBufferFeatures.screenBufferImport == VK_TRUE;
@@ -1360,6 +1381,10 @@
     }
 #endif
 
+    if (emulation->mDeviceInfo.robustness2Features) {
+        selectedDeviceExtensionNames_.emplace(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
+    }
+
     std::vector<const char*> selectedDeviceExtensionNames(selectedDeviceExtensionNames_.begin(),
                                                           selectedDeviceExtensionNames_.end());
 
@@ -1424,6 +1449,14 @@
             "VK_NV_device_diagnostic_checkpoints extension is not supported.");
     }
 
+    VkPhysicalDeviceRobustness2FeaturesEXT r2features = {};
+    if (emulation->mDeviceInfo.robustness2Features) {
+        r2features = *emulation->mDeviceInfo.robustness2Features;
+        INFO("Enabling VK_EXT_robustness2 (%d %d %d).", r2features.robustBufferAccess2,
+             r2features.robustImageAccess2, r2features.nullDescriptor);
+        vk_append_struct(&deviceCiChain, &r2features);
+    }
+
     ivk->vkCreateDevice(emulation->mPhysicalDevice, &dCi, nullptr, &emulation->mDevice);
 
     if (res != VK_SUCCESS) {
@@ -1650,7 +1683,7 @@
     INFO("    useVulkanComposition: %s", features.useVulkanComposition ? "true" : "false");
     INFO("    useVulkanNativeSwapchain: %s", features.useVulkanNativeSwapchain ? "true" : "false");
     INFO("    enable guestRenderDoc: %s", features.guestRenderDoc ? "true" : "false");
-    INFO("    ASTC LDR emulation mode: %d", features.astcLdrEmulationMode);
+    INFO("    ASTC LDR emulation mode: %s", string_AstcEmulationMode(features.astcLdrEmulationMode));
     INFO("    enable ETC2 emulation: %s", features.enableEtc2Emulation ? "true" : "false");
     INFO("    enable Ycbcr emulation: %s", features.enableYcbcrEmulation ? "true" : "false");
     INFO("    guestVulkanOnly: %s", features.guestVulkanOnly ? "true" : "false");
@@ -1759,6 +1792,10 @@
     return mDeviceInfo.supportsExternalMemoryHostProps;
 }
 
+std::optional<VkPhysicalDeviceRobustness2FeaturesEXT> VkEmulation::getRobustness2Features() const {
+    return mDeviceInfo.robustness2Features;
+}
+
 VkPhysicalDeviceExternalMemoryHostPropertiesEXT VkEmulation::externalMemoryHostProperties() const {
     return mDeviceInfo.externalMemoryHostProps;
 }
@@ -1959,8 +1996,8 @@
         VkResult allocRes = vk->vkAllocateMemory(mDevice, &allocInfo, nullptr, &info->memory);
 
         if (allocRes != VK_SUCCESS) {
-            VERBOSE("allocExternalMemory: failed in vkAllocateMemory: %s",
-                    string_VkResult(allocRes));
+            VERBOSE("%s: failed in vkAllocateMemory: %s",
+                    __func__, string_VkResult(allocRes));
             break;
         }
 
@@ -1969,7 +2006,7 @@
             VkResult mapRes =
                 vk->vkMapMemory(mDevice, info->memory, 0, info->size, 0, &info->mappedPtr);
             if (mapRes != VK_SUCCESS) {
-                VERBOSE("allocExternalMemory: failed in vkMapMemory: %s", string_VkResult(mapRes));
+                VERBOSE("%s: failed in vkMapMemory: %s", __func__, string_VkResult(mapRes));
                 break;
             }
         }
@@ -1994,14 +2031,14 @@
         } else {
             allocationAttempts.push_back(info->memory);
 
-            VERBOSE("allocExternalMemory: attempt #%zu failed; deviceAlignment: %" PRIu64
+            VERBOSE("%s: attempt #%zu failed; deviceAlignment: %" PRIu64
                     ", mappedPtrPageOffset: %" PRIu64,
-                    allocationAttempts.size(), deviceAlignment.valueOr(0), mappedPtrPageOffset);
+                    __func__, allocationAttempts.size(), deviceAlignment.valueOr(0), mappedPtrPageOffset);
 
             if (allocationAttempts.size() >= kMaxAllocationAttempts) {
                 VERBOSE(
-                    "allocExternalMemory: unable to allocate memory with CPU mapped ptr aligned to "
-                    "page");
+                    "%s: unable to allocate memory with CPU mapped ptr aligned to "
+                    "page", __func__);
                 break;
             }
         }
@@ -2080,8 +2117,8 @@
 #endif
 
     if (exportRes != VK_SUCCESS || !validHandle) {
-        WARN("allocExternalMemory: Failed to get external memory, result: %s",
-             string_VkResult(exportRes));
+        WARN("%s: Failed to get external memory, result: %s",
+             __func__, string_VkResult(exportRes));
         return false;
     }
 
@@ -2230,7 +2267,7 @@
             // b/281550953
             // RGB8 is not supported on many vulkan drivers.
             // Try RGBA8 instead.
-            // Note: copyImageData() performs channel conversion for this case.
+            // Note: updateColorBufferFromBytesLocked() performs channel conversion for this case.
             return VK_FORMAT_R8G8B8A8_UNORM;
         case GL_RGB565:
             return VK_FORMAT_R5G6B5_UNORM_PACK16;
@@ -2241,8 +2278,19 @@
             return VK_FORMAT_R8G8B8A8_UNORM;
         case GL_RGB5_A1_OES:
             return VK_FORMAT_A1R5G5B5_UNORM_PACK16;
-        case GL_RGBA4_OES:
+        case GL_RGBA4_OES: {
+            // TODO: add R4G4B4A4 support to lavapipe, and check support programmatically
+            const bool lavapipe =
+                (android::base::getEnvironmentVariable("ANDROID_EMU_VK_ICD").compare("lavapipe") ==
+                 0);
+            if (lavapipe) {
+                // RGBA4 is not supported on lavapipe, use more widely available BGRA4 instead.
+                // Note: updateColorBufferFromBytesLocked() performs channel conversion for this
+                // case.
+                return VK_FORMAT_B4G4R4A4_UNORM_PACK16;
+            }
             return VK_FORMAT_R4G4B4A4_UNORM_PACK16;
+        }
         case GL_RGB10_A2:
         case GL_UNSIGNED_INT_10_10_10_2_OES:
             return VK_FORMAT_A2R10G10B10_UNORM_PACK32;
@@ -2537,7 +2585,6 @@
     auto infoPtr = &mColorBuffers[colorBufferHandle];
 
     VkFormat vkFormat;
-    bool glCompatible = (infoPtr->frameworkFormat == FRAMEWORK_FORMAT_GL_COMPATIBLE);
     switch (infoPtr->frameworkFormat) {
         case FrameworkFormat::FRAMEWORK_FORMAT_GL_COMPATIBLE:
             vkFormat = glFormat2VkFormat(infoPtr->internalFormat);
@@ -2656,15 +2703,16 @@
 
     const VkFormat imageVkFormat = infoPtr->imageCreateInfoShallow.format;
     VERBOSE(
-        "ColorBuffer %d, dimensions: %dx%d, format: %s, "
-        "allocation size and type index: %lu, %d, "
-        "allocated memory property: %d, "
-        "requested memory property: %d",
+        "ColorBuffer %u, %ux%u, %s, "
+        "Memory [size: %llu, type: %d, props: %u / %u]",
         colorBufferHandle, infoPtr->width, infoPtr->height, string_VkFormat(imageVkFormat),
         infoPtr->memory.size, infoPtr->memory.typeIndex,
         mDeviceInfo.memProps.memoryTypes[infoPtr->memory.typeIndex].propertyFlags,
         infoPtr->memoryProperty);
 
+    const bool isHostVisible = (infoPtr->memoryProperty & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
+    Optional<uint64_t> deviceAlignment =
+        (!extMemHandleInfo && isHostVisible) ? Optional<uint64_t>(memReqs.alignment) : kNullopt;
     Optional<VkImage> dedicatedImage = useDedicated ? Optional<VkImage>(infoPtr->image) : kNullopt;
     if (extMemHandleInfo) {
         VkMemoryDedicatedAllocateInfo dedicatedInfo = {
@@ -2687,9 +2735,6 @@
 
         infoPtr->externalMemoryCompatible = true;
     } else {
-        bool isHostVisible = infoPtr->memoryProperty & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
-        Optional<uint64_t> deviceAlignment =
-            isHostVisible ? Optional<uint64_t>(memReqs.alignment) : kNullopt;
         bool allocRes = allocExternalMemory(vk, &infoPtr->memory, true /*actuallyExternal*/,
                                             deviceAlignment, kNullopt, dedicatedImage);
         if (!allocRes) {
@@ -2701,8 +2746,13 @@
     }
 
     infoPtr->memory.pageOffset = reinterpret_cast<uint64_t>(infoPtr->memory.mappedPtr) % kPageSize;
-    infoPtr->memory.bindOffset =
-        infoPtr->memory.pageOffset ? kPageSize - infoPtr->memory.pageOffset : 0u;
+    if (deviceAlignment.hasValue()) {
+        infoPtr->memory.bindOffset =
+            infoPtr->memory.pageOffset ? kPageSize - infoPtr->memory.pageOffset : 0u;
+    } else {
+        // Allocated as aligned..
+        infoPtr->memory.bindOffset = 0;
+    }
 
     VkResult bindImageMemoryRes = vk->vkBindImageMemory(
         mDevice, infoPtr->image, infoPtr->memory.memory, infoPtr->memory.bindOffset);
@@ -3185,6 +3235,20 @@
     }
 }
 
+static void convertRgba4ToBGRA4Pixels(void* dst, const void* src, uint32_t w, uint32_t h) {
+    const size_t pixelCount = w * h;
+    const uint16_t* srcPixels = reinterpret_cast<const uint16_t*>(src);
+    uint16_t* dstPixels = reinterpret_cast<uint16_t*>(dst);
+    for (size_t i = 0; i < pixelCount; ++i) {
+        const uint16_t rgba4_pixel = srcPixels[i];
+        const uint8_t red = (rgba4_pixel >> 12) & 0xF;
+        const uint8_t green = (rgba4_pixel >> 8) & 0xF;
+        const uint8_t blue = (rgba4_pixel >> 4) & 0xF;
+        const uint8_t alpha = rgba4_pixel & 0xF;
+        dstPixels[i] = (blue << 12) | (green << 8) | (red << 4) | alpha;
+    }
+}
+
 bool VkEmulation::updateColorBufferFromBytesLocked(uint32_t colorBufferHandle, uint32_t x,
                                                    uint32_t y, uint32_t w, uint32_t h,
                                                    const void* pixels, size_t inputPixelsSize) {
@@ -3207,9 +3271,10 @@
         return false;
     }
 
+    const VkFormat creationFormat = colorBufferInfo->imageCreateInfoShallow.format;
     VkDeviceSize dstBufferSize = 0;
     std::vector<VkBufferImageCopy> bufferImageCopies;
-    if (!getFormatTransferInfo(colorBufferInfo->imageCreateInfoShallow.format,
+    if (!getFormatTransferInfo(creationFormat,
                                colorBufferInfo->imageCreateInfoShallow.extent.width,
                                colorBufferInfo->imageCreateInfoShallow.extent.height,
                                &dstBufferSize, &bufferImageCopies)) {
@@ -3224,10 +3289,11 @@
             colorBufferHandle, dstBufferSize, stagingBufferSize);
         return false;
     }
-
-    bool isThreeByteRgb =
+    const bool isRGBA4onBGRA4 = (colorBufferInfo->internalFormat == GL_RGBA4_OES) &&
+                          (creationFormat == VK_FORMAT_B4G4R4A4_UNORM_PACK16);
+    const bool isThreeByteRgb =
         (colorBufferInfo->internalFormat == GL_RGB || colorBufferInfo->internalFormat == GL_RGB8);
-    size_t expectedInputSize = (isThreeByteRgb ? dstBufferSize / 4 * 3 : dstBufferSize);
+    const size_t expectedInputSize = (isThreeByteRgb ? dstBufferSize / 4 * 3 : dstBufferSize);
 
     if (inputPixelsSize != 0 && inputPixelsSize != expectedInputSize) {
         ERR("Unexpected contents size when trying to update ColorBuffer:%d, "
@@ -3243,6 +3309,8 @@
         // an incompatible choice of 4-byte backing VK_FORMAT_R8G8B8A8_UNORM.
         // b/281550953
         convertRgbToRgbaPixels(stagingBufferPtr, pixels, w, h);
+    } else if(isRGBA4onBGRA4) {
+        convertRgba4ToBGRA4Pixels(stagingBufferPtr, pixels, w, h);
     } else {
         std::memcpy(stagingBufferPtr, pixels, dstBufferSize);
     }
diff --git a/host/vulkan/VkCommonOperations.h b/host/vulkan/VkCommonOperations.h
index bb50ca3..9e14b4d 100644
--- a/host/vulkan/VkCommonOperations.h
+++ b/host/vulkan/VkCommonOperations.h
@@ -126,6 +126,8 @@
 
     bool supportsExternalMemoryHostProperties() const;
 
+    std::optional<VkPhysicalDeviceRobustness2FeaturesEXT> getRobustness2Features() const;
+
     VkPhysicalDeviceExternalMemoryHostPropertiesEXT externalMemoryHostProperties() const;
 
     bool isGuestVulkanOnly() const;
@@ -472,6 +474,9 @@
 #else
         PFN_vkGetMemoryFdKHR getMemoryHandleFunc = nullptr;
 #endif
+
+        // Set only if requested and supported
+        std::optional<VkPhysicalDeviceRobustness2FeaturesEXT> robustness2Features;
     };
 
     uint32_t getValidMemoryTypeIndex(uint32_t requiredMemoryTypeBits,
diff --git a/host/vulkan/VkDecoder.cpp b/host/vulkan/VkDecoder.cpp
index 5a72ca0..acf441f 100644
--- a/host/vulkan/VkDecoder.cpp
+++ b/host/vulkan/VkDecoder.cpp
@@ -56,6 +56,8 @@
 #include "host-common/logging.h"
 #include "render-utils/IOStream.h"
 #define MAX_PACKET_LENGTH (400 * 1024 * 1024)  // 400MB
+#define CC_LIKELY(exp) (__builtin_expect(!!(exp), true))
+#define CC_UNLIKELY(exp) (__builtin_expect(!!(exp), false))
 
 namespace gfxstream {
 namespace vk {
@@ -262,7 +264,7 @@
                             ioStream, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pInstance);
                 }
-                VkResult vkCreateInstance_VkResult_return = (VkResult)0;
+                VkResult vkCreateInstance_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
                 vkCreateInstance_VkResult_return = m_state->on_vkCreateInstance(
                     &m_pool, snapshotApiCallInfo, pCreateInfo, pAllocator, pInstance);
                 if ((vkCreateInstance_VkResult_return) == VK_ERROR_DEVICE_LOST)
@@ -296,6 +298,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkInstance*)&instance = (VkInstance)(VkInstance)((VkInstance)(*&cgen_var_0));
+                auto vk = dispatch_VkInstance(instance);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
@@ -314,7 +317,10 @@
                     fprintf(stderr, "stream %p: call vkDestroyInstance 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)instance, (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyInstance(&m_pool, snapshotApiCallInfo, instance, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyInstance(&m_pool, snapshotApiCallInfo, instance,
+                                                  pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyInstance(&m_pool, snapshotApiCallInfo, packet,
@@ -336,6 +342,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkInstance*)&instance = (VkInstance)(VkInstance)((VkInstance)(*&cgen_var_0));
+                auto vk = dispatch_VkInstance(instance);
                 // Begin manual dispatchable handle unboxing for pPhysicalDeviceCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
@@ -378,9 +385,13 @@
                             (unsigned long long)pPhysicalDeviceCount,
                             (unsigned long long)pPhysicalDevices);
                 }
-                VkResult vkEnumeratePhysicalDevices_VkResult_return = (VkResult)0;
-                vkEnumeratePhysicalDevices_VkResult_return = m_state->on_vkEnumeratePhysicalDevices(
-                    &m_pool, snapshotApiCallInfo, instance, pPhysicalDeviceCount, pPhysicalDevices);
+                VkResult vkEnumeratePhysicalDevices_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkEnumeratePhysicalDevices_VkResult_return =
+                        m_state->on_vkEnumeratePhysicalDevices(&m_pool, snapshotApiCallInfo,
+                                                               instance, pPhysicalDeviceCount,
+                                                               pPhysicalDevices);
+                }
                 if ((vkEnumeratePhysicalDevices_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkEnumeratePhysicalDevices_VkResult_return, opcode,
@@ -432,6 +443,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // Begin manual dispatchable handle unboxing for pFeatures;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pFeatures, sizeof(VkPhysicalDeviceFeatures));
@@ -447,8 +459,10 @@
                             ioStream, (unsigned long long)physicalDevice,
                             (unsigned long long)pFeatures);
                 }
-                m_state->on_vkGetPhysicalDeviceFeatures(&m_pool, snapshotApiCallInfo,
-                                                        physicalDevice, pFeatures);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceFeatures(&m_pool, snapshotApiCallInfo,
+                                                            physicalDevice, pFeatures);
+                }
                 vkStream->unsetHandleMapping();
                 if (pFeatures) {
                     transform_fromhost_VkPhysicalDeviceFeatures(
@@ -478,6 +492,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 memcpy((VkFormat*)&format, *readStreamPtrPtr, sizeof(VkFormat));
                 *readStreamPtrPtr += sizeof(VkFormat);
                 // Begin manual dispatchable handle unboxing for pFormatProperties;
@@ -497,8 +512,10 @@
                             ioStream, (unsigned long long)physicalDevice,
                             (unsigned long long)format, (unsigned long long)pFormatProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceFormatProperties(
-                    &m_pool, snapshotApiCallInfo, physicalDevice, format, pFormatProperties);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceFormatProperties(
+                        &m_pool, snapshotApiCallInfo, physicalDevice, format, pFormatProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pFormatProperties) {
                     transform_fromhost_VkFormatProperties(m_state,
@@ -533,6 +550,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 memcpy((VkFormat*)&format, *readStreamPtrPtr, sizeof(VkFormat));
                 *readStreamPtrPtr += sizeof(VkFormat);
                 memcpy((VkImageType*)&type, *readStreamPtrPtr, sizeof(VkImageType));
@@ -563,11 +581,14 @@
                             (unsigned long long)tiling, (unsigned long long)usage,
                             (unsigned long long)flags, (unsigned long long)pImageFormatProperties);
                 }
-                VkResult vkGetPhysicalDeviceImageFormatProperties_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceImageFormatProperties_VkResult_return =
-                    m_state->on_vkGetPhysicalDeviceImageFormatProperties(
-                        &m_pool, snapshotApiCallInfo, physicalDevice, format, type, tiling, usage,
-                        flags, pImageFormatProperties);
+                VkResult vkGetPhysicalDeviceImageFormatProperties_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetPhysicalDeviceImageFormatProperties_VkResult_return =
+                        m_state->on_vkGetPhysicalDeviceImageFormatProperties(
+                            &m_pool, snapshotApiCallInfo, physicalDevice, format, type, tiling,
+                            usage, flags, pImageFormatProperties);
+                }
                 if ((vkGetPhysicalDeviceImageFormatProperties_VkResult_return) ==
                     VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
@@ -605,6 +626,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // Begin manual dispatchable handle unboxing for pProperties;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pProperties, sizeof(VkPhysicalDeviceProperties));
@@ -621,8 +643,10 @@
                             ioStream, (unsigned long long)physicalDevice,
                             (unsigned long long)pProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceProperties(&m_pool, snapshotApiCallInfo,
-                                                          physicalDevice, pProperties);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceProperties(&m_pool, snapshotApiCallInfo,
+                                                              physicalDevice, pProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pProperties) {
                     transform_fromhost_VkPhysicalDeviceProperties(
@@ -653,6 +677,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // Begin manual dispatchable handle unboxing for pQueueFamilyPropertyCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
@@ -698,9 +723,11 @@
                             (unsigned long long)pQueueFamilyPropertyCount,
                             (unsigned long long)pQueueFamilyProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceQueueFamilyProperties(
-                    &m_pool, snapshotApiCallInfo, physicalDevice, pQueueFamilyPropertyCount,
-                    pQueueFamilyProperties);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceQueueFamilyProperties(
+                        &m_pool, snapshotApiCallInfo, physicalDevice, pQueueFamilyPropertyCount,
+                        pQueueFamilyProperties);
+                }
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
@@ -750,6 +777,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // Begin manual dispatchable handle unboxing for pMemoryProperties;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryProperties,
@@ -767,8 +795,10 @@
                             ioStream, (unsigned long long)physicalDevice,
                             (unsigned long long)pMemoryProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceMemoryProperties(&m_pool, snapshotApiCallInfo,
-                                                                physicalDevice, pMemoryProperties);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceMemoryProperties(
+                        &m_pool, snapshotApiCallInfo, physicalDevice, pMemoryProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pMemoryProperties) {
                     transform_fromhost_VkPhysicalDeviceMemoryProperties(
@@ -808,8 +838,10 @@
                 }
                 PFN_vkVoidFunction vkGetInstanceProcAddr_PFN_vkVoidFunction_return =
                     (PFN_vkVoidFunction)0;
-                vkGetInstanceProcAddr_PFN_vkVoidFunction_return =
-                    vk->vkGetInstanceProcAddr(unboxed_instance, pName);
+                if (CC_LIKELY(vk)) {
+                    vkGetInstanceProcAddr_PFN_vkVoidFunction_return =
+                        vk->vkGetInstanceProcAddr(unboxed_instance, pName);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetInstanceProcAddr_PFN_vkVoidFunction_return,
                                 sizeof(PFN_vkVoidFunction));
@@ -844,8 +876,10 @@
                 }
                 PFN_vkVoidFunction vkGetDeviceProcAddr_PFN_vkVoidFunction_return =
                     (PFN_vkVoidFunction)0;
-                vkGetDeviceProcAddr_PFN_vkVoidFunction_return =
-                    vk->vkGetDeviceProcAddr(unboxed_device, pName);
+                if (CC_LIKELY(vk)) {
+                    vkGetDeviceProcAddr_PFN_vkVoidFunction_return =
+                        vk->vkGetDeviceProcAddr(unboxed_device, pName);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetDeviceProcAddr_PFN_vkVoidFunction_return,
                                 sizeof(PFN_vkVoidFunction));
@@ -872,6 +906,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkDeviceCreateInfo));
                 reservedunmarshal_VkDeviceCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                      (VkDeviceCreateInfo*)(pCreateInfo),
@@ -907,9 +942,12 @@
                             (unsigned long long)pCreateInfo, (unsigned long long)pAllocator,
                             (unsigned long long)pDevice);
                 }
-                VkResult vkCreateDevice_VkResult_return = (VkResult)0;
-                vkCreateDevice_VkResult_return = m_state->on_vkCreateDevice(
-                    &m_pool, snapshotApiCallInfo, physicalDevice, pCreateInfo, pAllocator, pDevice);
+                VkResult vkCreateDevice_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateDevice_VkResult_return =
+                        m_state->on_vkCreateDevice(&m_pool, snapshotApiCallInfo, physicalDevice,
+                                                   pCreateInfo, pAllocator, pDevice);
+                }
                 if ((vkCreateDevice_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateDevice_VkResult_return, opcode, context);
@@ -942,6 +980,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
@@ -960,7 +999,9 @@
                     fprintf(stderr, "stream %p: call vkDestroyDevice 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)device, (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyDevice(&m_pool, snapshotApiCallInfo, device, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyDevice(&m_pool, snapshotApiCallInfo, device, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyDevice(&m_pool, snapshotApiCallInfo, packet,
@@ -1032,10 +1073,11 @@
                             ioStream, (unsigned long long)pLayerName,
                             (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
                 }
-                VkResult vkEnumerateInstanceExtensionProperties_VkResult_return = (VkResult)0;
+                VkResult vkEnumerateInstanceExtensionProperties_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
                 vkEnumerateInstanceExtensionProperties_VkResult_return =
-                    m_vk->vkEnumerateInstanceExtensionProperties(pLayerName, pPropertyCount,
-                                                                 pProperties);
+                    m_state->on_vkEnumerateInstanceExtensionProperties(
+                        &m_pool, snapshotApiCallInfo, pLayerName, pPropertyCount, pProperties);
                 if ((vkEnumerateInstanceExtensionProperties_VkResult_return) ==
                     VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
@@ -1095,6 +1137,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 if (vkReadStream->getFeatureBits() &
                     VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
                     // WARNING PTR CHECK
@@ -1151,11 +1194,14 @@
                             (unsigned long long)pLayerName, (unsigned long long)pPropertyCount,
                             (unsigned long long)pProperties);
                 }
-                VkResult vkEnumerateDeviceExtensionProperties_VkResult_return = (VkResult)0;
-                vkEnumerateDeviceExtensionProperties_VkResult_return =
-                    m_state->on_vkEnumerateDeviceExtensionProperties(&m_pool, snapshotApiCallInfo,
-                                                                     physicalDevice, pLayerName,
-                                                                     pPropertyCount, pProperties);
+                VkResult vkEnumerateDeviceExtensionProperties_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkEnumerateDeviceExtensionProperties_VkResult_return =
+                        m_state->on_vkEnumerateDeviceExtensionProperties(
+                            &m_pool, snapshotApiCallInfo, physicalDevice, pLayerName,
+                            pPropertyCount, pProperties);
+                }
                 if ((vkEnumerateDeviceExtensionProperties_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkEnumerateDeviceExtensionProperties_VkResult_return,
@@ -1246,7 +1292,8 @@
                             ioStream, (unsigned long long)pPropertyCount,
                             (unsigned long long)pProperties);
                 }
-                VkResult vkEnumerateInstanceLayerProperties_VkResult_return = (VkResult)0;
+                VkResult vkEnumerateInstanceLayerProperties_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
                 vkEnumerateInstanceLayerProperties_VkResult_return =
                     m_vk->vkEnumerateInstanceLayerProperties(pPropertyCount, pProperties);
                 if ((vkEnumerateInstanceLayerProperties_VkResult_return) == VK_ERROR_DEVICE_LOST)
@@ -1349,10 +1396,13 @@
                         ioStream, (unsigned long long)physicalDevice,
                         (unsigned long long)pPropertyCount, (unsigned long long)pProperties);
                 }
-                VkResult vkEnumerateDeviceLayerProperties_VkResult_return = (VkResult)0;
-                vkEnumerateDeviceLayerProperties_VkResult_return =
-                    vk->vkEnumerateDeviceLayerProperties(unboxed_physicalDevice, pPropertyCount,
-                                                         pProperties);
+                VkResult vkEnumerateDeviceLayerProperties_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkEnumerateDeviceLayerProperties_VkResult_return =
+                        vk->vkEnumerateDeviceLayerProperties(unboxed_physicalDevice, pPropertyCount,
+                                                             pProperties);
+                }
                 if ((vkEnumerateDeviceLayerProperties_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkEnumerateDeviceLayerProperties_VkResult_return,
@@ -1409,6 +1459,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 memcpy((uint32_t*)&queueFamilyIndex, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&queueIndex, *readStreamPtrPtr, sizeof(uint32_t));
@@ -1426,8 +1477,10 @@
                         ioStream, (unsigned long long)device, (unsigned long long)queueFamilyIndex,
                         (unsigned long long)queueIndex, (unsigned long long)pQueue);
                 }
-                m_state->on_vkGetDeviceQueue(&m_pool, snapshotApiCallInfo, device, queueFamilyIndex,
-                                             queueIndex, pQueue);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetDeviceQueue(&m_pool, snapshotApiCallInfo, device,
+                                                 queueFamilyIndex, queueIndex, pQueue);
+                }
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_2;
                 static_assert(8 == sizeof(VkQueue),
@@ -1456,6 +1509,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 memcpy((uint32_t*)&submitCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pSubmits,
@@ -1478,9 +1532,11 @@
                             ioStream, (unsigned long long)queue, (unsigned long long)submitCount,
                             (unsigned long long)pSubmits, (unsigned long long)fence);
                 }
-                VkResult vkQueueSubmit_VkResult_return = (VkResult)0;
-                vkQueueSubmit_VkResult_return = m_state->on_vkQueueSubmit(
-                    &m_pool, snapshotApiCallInfo, queue, submitCount, pSubmits, fence);
+                VkResult vkQueueSubmit_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkQueueSubmit_VkResult_return = m_state->on_vkQueueSubmit(
+                        &m_pool, snapshotApiCallInfo, queue, submitCount, pSubmits, fence);
+                }
                 if ((vkQueueSubmit_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkQueueSubmit_VkResult_return, opcode, context);
@@ -1506,15 +1562,18 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 if (m_logCalls) {
                     fprintf(stderr, "stream %p: call vkQueueWaitIdle 0x%llx \n", ioStream,
                             (unsigned long long)queue);
                 }
                 if (m_queueSubmitWithCommandsEnabled)
                     seqnoPtr->fetch_add(1, std::memory_order_seq_cst);
-                VkResult vkQueueWaitIdle_VkResult_return = (VkResult)0;
-                vkQueueWaitIdle_VkResult_return =
-                    m_state->on_vkQueueWaitIdle(&m_pool, snapshotApiCallInfo, queue);
+                VkResult vkQueueWaitIdle_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkQueueWaitIdle_VkResult_return =
+                        m_state->on_vkQueueWaitIdle(&m_pool, snapshotApiCallInfo, queue);
+                }
                 if ((vkQueueWaitIdle_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkQueueWaitIdle_VkResult_return, opcode, context);
@@ -1547,8 +1606,10 @@
                 }
                 if (m_queueSubmitWithCommandsEnabled)
                     seqnoPtr->fetch_add(1, std::memory_order_seq_cst);
-                VkResult vkDeviceWaitIdle_VkResult_return = (VkResult)0;
-                vkDeviceWaitIdle_VkResult_return = vk->vkDeviceWaitIdle(unboxed_device);
+                VkResult vkDeviceWaitIdle_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkDeviceWaitIdle_VkResult_return = vk->vkDeviceWaitIdle(unboxed_device);
+                }
                 if ((vkDeviceWaitIdle_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkDeviceWaitIdle_VkResult_return, opcode, context);
@@ -1575,6 +1636,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pAllocateInfo, sizeof(const VkMemoryAllocateInfo));
                 reservedunmarshal_VkMemoryAllocateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                        (VkMemoryAllocateInfo*)(pAllocateInfo),
@@ -1611,9 +1673,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pAllocateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pMemory);
                 }
-                VkResult vkAllocateMemory_VkResult_return = (VkResult)0;
-                vkAllocateMemory_VkResult_return = m_state->on_vkAllocateMemory(
-                    &m_pool, snapshotApiCallInfo, device, pAllocateInfo, pAllocator, pMemory);
+                VkResult vkAllocateMemory_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkAllocateMemory_VkResult_return = m_state->on_vkAllocateMemory(
+                        &m_pool, snapshotApiCallInfo, device, pAllocateInfo, pAllocator, pMemory);
+                }
                 if ((vkAllocateMemory_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(
@@ -1652,6 +1716,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for memory;
                 VkDeviceMemory boxed_memory_preserve;
                 uint64_t cgen_var_1;
@@ -1680,7 +1745,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)memory,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkFreeMemory(&m_pool, snapshotApiCallInfo, device, memory, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkFreeMemory(&m_pool, snapshotApiCallInfo, device, memory,
+                                             pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkFreeMemory(&m_pool, snapshotApiCallInfo, packet,
@@ -1706,6 +1774,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -1736,9 +1805,11 @@
                         (unsigned long long)offset, (unsigned long long)size,
                         (unsigned long long)flags, (unsigned long long)ppData);
                 }
-                VkResult vkMapMemory_VkResult_return = (VkResult)0;
-                vkMapMemory_VkResult_return = m_state->on_vkMapMemory(
-                    &m_pool, snapshotApiCallInfo, device, memory, offset, size, flags, ppData);
+                VkResult vkMapMemory_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkMapMemory_VkResult_return = m_state->on_vkMapMemory(
+                        &m_pool, snapshotApiCallInfo, device, memory, offset, size, flags, ppData);
+                }
                 if ((vkMapMemory_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkMapMemory_VkResult_return, opcode, context);
                 vkStream->unsetHandleMapping();
@@ -1769,6 +1840,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -1778,7 +1850,9 @@
                     fprintf(stderr, "stream %p: call vkUnmapMemory 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)device, (unsigned long long)memory);
                 }
-                m_state->on_vkUnmapMemory(&m_pool, snapshotApiCallInfo, device, memory);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkUnmapMemory(&m_pool, snapshotApiCallInfo, device, memory);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkUnmapMemory(&m_pool, snapshotApiCallInfo, packet,
@@ -1863,9 +1937,11 @@
                         packetLen += 8 + readStream;
                     }
                 }
-                VkResult vkFlushMappedMemoryRanges_VkResult_return = (VkResult)0;
-                vkFlushMappedMemoryRanges_VkResult_return =
-                    vk->vkFlushMappedMemoryRanges(unboxed_device, memoryRangeCount, pMemoryRanges);
+                VkResult vkFlushMappedMemoryRanges_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkFlushMappedMemoryRanges_VkResult_return = vk->vkFlushMappedMemoryRanges(
+                        unboxed_device, memoryRangeCount, pMemoryRanges);
+                }
                 if ((vkFlushMappedMemoryRanges_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkFlushMappedMemoryRanges_VkResult_return, opcode,
@@ -1920,9 +1996,13 @@
                         ioStream, (unsigned long long)device, (unsigned long long)memoryRangeCount,
                         (unsigned long long)pMemoryRanges);
                 }
-                VkResult vkInvalidateMappedMemoryRanges_VkResult_return = (VkResult)0;
-                vkInvalidateMappedMemoryRanges_VkResult_return = vk->vkInvalidateMappedMemoryRanges(
-                    unboxed_device, memoryRangeCount, pMemoryRanges);
+                VkResult vkInvalidateMappedMemoryRanges_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkInvalidateMappedMemoryRanges_VkResult_return =
+                        vk->vkInvalidateMappedMemoryRanges(unboxed_device, memoryRangeCount,
+                                                           pMemoryRanges);
+                }
                 if ((vkInvalidateMappedMemoryRanges_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkInvalidateMappedMemoryRanges_VkResult_return, opcode,
@@ -1992,7 +2072,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)memory,
                             (unsigned long long)pCommittedMemoryInBytes);
                 }
-                vk->vkGetDeviceMemoryCommitment(unboxed_device, memory, pCommittedMemoryInBytes);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetDeviceMemoryCommitment(unboxed_device, memory,
+                                                    pCommittedMemoryInBytes);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write((VkDeviceSize*)pCommittedMemoryInBytes, sizeof(VkDeviceSize));
                 vkStream->commitWrite();
@@ -2018,6 +2101,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -2035,9 +2119,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)buffer,
                             (unsigned long long)memory, (unsigned long long)memoryOffset);
                 }
-                VkResult vkBindBufferMemory_VkResult_return = (VkResult)0;
-                vkBindBufferMemory_VkResult_return = m_state->on_vkBindBufferMemory(
-                    &m_pool, snapshotApiCallInfo, device, buffer, memory, memoryOffset);
+                VkResult vkBindBufferMemory_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkBindBufferMemory_VkResult_return = m_state->on_vkBindBufferMemory(
+                        &m_pool, snapshotApiCallInfo, device, buffer, memory, memoryOffset);
+                }
                 if ((vkBindBufferMemory_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkBindBufferMemory_VkResult_return, opcode, context);
@@ -2066,6 +2152,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -2083,9 +2170,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)image,
                             (unsigned long long)memory, (unsigned long long)memoryOffset);
                 }
-                VkResult vkBindImageMemory_VkResult_return = (VkResult)0;
-                vkBindImageMemory_VkResult_return = m_state->on_vkBindImageMemory(
-                    &m_pool, snapshotApiCallInfo, device, image, memory, memoryOffset);
+                VkResult vkBindImageMemory_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkBindImageMemory_VkResult_return = m_state->on_vkBindImageMemory(
+                        &m_pool, snapshotApiCallInfo, device, image, memory, memoryOffset);
+                }
                 if ((vkBindImageMemory_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkBindImageMemory_VkResult_return, opcode, context);
@@ -2113,6 +2202,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -2133,8 +2223,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)buffer,
                             (unsigned long long)pMemoryRequirements);
                 }
-                m_state->on_vkGetBufferMemoryRequirements(&m_pool, snapshotApiCallInfo, device,
-                                                          buffer, pMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetBufferMemoryRequirements(&m_pool, snapshotApiCallInfo, device,
+                                                              buffer, pMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 if (pMemoryRequirements) {
                     transform_fromhost_VkMemoryRequirements(
@@ -2164,6 +2256,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -2184,8 +2277,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)image,
                             (unsigned long long)pMemoryRequirements);
                 }
-                m_state->on_vkGetImageMemoryRequirements(&m_pool, snapshotApiCallInfo, device,
-                                                         image, pMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetImageMemoryRequirements(&m_pool, snapshotApiCallInfo, device,
+                                                             image, pMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 if (pMemoryRequirements) {
                     transform_fromhost_VkMemoryRequirements(
@@ -2271,9 +2366,11 @@
                             (unsigned long long)pSparseMemoryRequirementCount,
                             (unsigned long long)pSparseMemoryRequirements);
                 }
-                vk->vkGetImageSparseMemoryRequirements(unboxed_device, image,
-                                                       pSparseMemoryRequirementCount,
-                                                       pSparseMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetImageSparseMemoryRequirements(unboxed_device, image,
+                                                           pSparseMemoryRequirementCount,
+                                                           pSparseMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
@@ -2391,9 +2488,11 @@
                             (unsigned long long)tiling, (unsigned long long)pPropertyCount,
                             (unsigned long long)pProperties);
                 }
-                vk->vkGetPhysicalDeviceSparseImageFormatProperties(unboxed_physicalDevice, format,
-                                                                   type, samples, usage, tiling,
-                                                                   pPropertyCount, pProperties);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetPhysicalDeviceSparseImageFormatProperties(
+                        unboxed_physicalDevice, format, type, samples, usage, tiling,
+                        pPropertyCount, pProperties);
+                }
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPropertyCount;
@@ -2444,6 +2543,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 memcpy((uint32_t*)&bindInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pBindInfo,
@@ -2469,9 +2569,11 @@
                             ioStream, (unsigned long long)queue, (unsigned long long)bindInfoCount,
                             (unsigned long long)pBindInfo, (unsigned long long)fence);
                 }
-                VkResult vkQueueBindSparse_VkResult_return = (VkResult)0;
-                vkQueueBindSparse_VkResult_return = m_state->on_vkQueueBindSparse(
-                    &m_pool, snapshotApiCallInfo, queue, bindInfoCount, pBindInfo, fence);
+                VkResult vkQueueBindSparse_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkQueueBindSparse_VkResult_return = m_state->on_vkQueueBindSparse(
+                        &m_pool, snapshotApiCallInfo, queue, bindInfoCount, pBindInfo, fence);
+                }
                 if ((vkQueueBindSparse_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkQueueBindSparse_VkResult_return, opcode, context);
@@ -2499,6 +2601,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkFenceCreateInfo));
                 reservedunmarshal_VkFenceCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                     (VkFenceCreateInfo*)(pCreateInfo),
@@ -2532,9 +2635,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pFence);
                 }
-                VkResult vkCreateFence_VkResult_return = (VkResult)0;
-                vkCreateFence_VkResult_return = m_state->on_vkCreateFence(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pFence);
+                VkResult vkCreateFence_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateFence_VkResult_return = m_state->on_vkCreateFence(
+                        &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pFence);
+                }
                 if ((vkCreateFence_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateFence_VkResult_return, opcode, context);
@@ -2570,6 +2675,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for fence;
                 VkFence boxed_fence_preserve;
                 uint64_t cgen_var_1;
@@ -2597,7 +2703,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)fence,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyFence(&m_pool, snapshotApiCallInfo, device, fence, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyFence(&m_pool, snapshotApiCallInfo, device, fence,
+                                               pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyFence(&m_pool, snapshotApiCallInfo, packet,
@@ -2620,6 +2729,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 memcpy((uint32_t*)&fenceCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pFences, ((fenceCount)) * sizeof(const VkFence));
@@ -2638,9 +2748,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)fenceCount,
                             (unsigned long long)pFences);
                 }
-                VkResult vkResetFences_VkResult_return = (VkResult)0;
-                vkResetFences_VkResult_return = m_state->on_vkResetFences(
-                    &m_pool, snapshotApiCallInfo, device, fenceCount, pFences);
+                VkResult vkResetFences_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkResetFences_VkResult_return = m_state->on_vkResetFences(
+                        &m_pool, snapshotApiCallInfo, device, fenceCount, pFences);
+                }
                 if ((vkResetFences_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkResetFences_VkResult_return, opcode, context);
@@ -2667,6 +2779,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -2675,9 +2788,11 @@
                     fprintf(stderr, "stream %p: call vkGetFenceStatus 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)device, (unsigned long long)fence);
                 }
-                VkResult vkGetFenceStatus_VkResult_return = (VkResult)0;
-                vkGetFenceStatus_VkResult_return =
-                    m_state->on_vkGetFenceStatus(&m_pool, snapshotApiCallInfo, device, fence);
+                VkResult vkGetFenceStatus_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetFenceStatus_VkResult_return =
+                        m_state->on_vkGetFenceStatus(&m_pool, snapshotApiCallInfo, device, fence);
+                }
                 if ((vkGetFenceStatus_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetFenceStatus_VkResult_return, opcode, context);
@@ -2707,6 +2822,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 memcpy((uint32_t*)&fenceCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pFences, ((fenceCount)) * sizeof(const VkFence));
@@ -2733,9 +2849,12 @@
                 }
                 if (m_queueSubmitWithCommandsEnabled)
                     seqnoPtr->fetch_add(1, std::memory_order_seq_cst);
-                VkResult vkWaitForFences_VkResult_return = (VkResult)0;
-                vkWaitForFences_VkResult_return = m_state->on_vkWaitForFences(
-                    &m_pool, snapshotApiCallInfo, device, fenceCount, pFences, waitAll, timeout);
+                VkResult vkWaitForFences_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkWaitForFences_VkResult_return =
+                        m_state->on_vkWaitForFences(&m_pool, snapshotApiCallInfo, device,
+                                                    fenceCount, pFences, waitAll, timeout);
+                }
                 if ((vkWaitForFences_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkWaitForFences_VkResult_return, opcode, context);
@@ -2763,6 +2882,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkSemaphoreCreateInfo));
                 reservedunmarshal_VkSemaphoreCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                         (VkSemaphoreCreateInfo*)(pCreateInfo),
@@ -2798,9 +2918,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pSemaphore);
                 }
-                VkResult vkCreateSemaphore_VkResult_return = (VkResult)0;
-                vkCreateSemaphore_VkResult_return = m_state->on_vkCreateSemaphore(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pSemaphore);
+                VkResult vkCreateSemaphore_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateSemaphore_VkResult_return = m_state->on_vkCreateSemaphore(
+                        &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pSemaphore);
+                }
                 if ((vkCreateSemaphore_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateSemaphore_VkResult_return, opcode, context);
@@ -2838,6 +2960,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for semaphore;
                 VkSemaphore boxed_semaphore_preserve;
                 uint64_t cgen_var_1;
@@ -2865,8 +2988,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)semaphore,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroySemaphore(&m_pool, snapshotApiCallInfo, device, semaphore,
-                                               pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroySemaphore(&m_pool, snapshotApiCallInfo, device, semaphore,
+                                                   pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroySemaphore(&m_pool, snapshotApiCallInfo, packet,
@@ -2926,9 +3051,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pEvent);
                 }
-                VkResult vkCreateEvent_VkResult_return = (VkResult)0;
-                vkCreateEvent_VkResult_return =
-                    vk->vkCreateEvent(unboxed_device, pCreateInfo, pAllocator, pEvent);
+                VkResult vkCreateEvent_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateEvent_VkResult_return =
+                        vk->vkCreateEvent(unboxed_device, pCreateInfo, pAllocator, pEvent);
+                }
                 if ((vkCreateEvent_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateEvent_VkResult_return, opcode, context);
@@ -2995,7 +3122,9 @@
                             ioStream, (unsigned long long)device, (unsigned long long)event,
                             (unsigned long long)pAllocator);
                 }
-                vk->vkDestroyEvent(unboxed_device, event, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    vk->vkDestroyEvent(unboxed_device, event, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyEvent(&m_pool, snapshotApiCallInfo, packet,
@@ -3029,8 +3158,10 @@
                     fprintf(stderr, "stream %p: call vkGetEventStatus 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)device, (unsigned long long)event);
                 }
-                VkResult vkGetEventStatus_VkResult_return = (VkResult)0;
-                vkGetEventStatus_VkResult_return = vk->vkGetEventStatus(unboxed_device, event);
+                VkResult vkGetEventStatus_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetEventStatus_VkResult_return = vk->vkGetEventStatus(unboxed_device, event);
+                }
                 if ((vkGetEventStatus_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetEventStatus_VkResult_return, opcode, context);
@@ -3067,8 +3198,10 @@
                     fprintf(stderr, "stream %p: call vkSetEvent 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)device, (unsigned long long)event);
                 }
-                VkResult vkSetEvent_VkResult_return = (VkResult)0;
-                vkSetEvent_VkResult_return = vk->vkSetEvent(unboxed_device, event);
+                VkResult vkSetEvent_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkSetEvent_VkResult_return = vk->vkSetEvent(unboxed_device, event);
+                }
                 if ((vkSetEvent_VkResult_return) == VK_ERROR_DEVICE_LOST) m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkSetEvent_VkResult_return, opcode, context);
                 vkStream->unsetHandleMapping();
@@ -3103,8 +3236,10 @@
                     fprintf(stderr, "stream %p: call vkResetEvent 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)device, (unsigned long long)event);
                 }
-                VkResult vkResetEvent_VkResult_return = (VkResult)0;
-                vkResetEvent_VkResult_return = vk->vkResetEvent(unboxed_device, event);
+                VkResult vkResetEvent_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkResetEvent_VkResult_return = vk->vkResetEvent(unboxed_device, event);
+                }
                 if ((vkResetEvent_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkResetEvent_VkResult_return, opcode, context);
@@ -3171,9 +3306,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pQueryPool);
                 }
-                VkResult vkCreateQueryPool_VkResult_return = (VkResult)0;
-                vkCreateQueryPool_VkResult_return =
-                    vk->vkCreateQueryPool(unboxed_device, pCreateInfo, pAllocator, pQueryPool);
+                VkResult vkCreateQueryPool_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateQueryPool_VkResult_return =
+                        vk->vkCreateQueryPool(unboxed_device, pCreateInfo, pAllocator, pQueryPool);
+                }
                 if ((vkCreateQueryPool_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateQueryPool_VkResult_return, opcode, context);
@@ -3242,7 +3379,9 @@
                             ioStream, (unsigned long long)device, (unsigned long long)queryPool,
                             (unsigned long long)pAllocator);
                 }
-                vk->vkDestroyQueryPool(unboxed_device, queryPool, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    vk->vkDestroyQueryPool(unboxed_device, queryPool, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyQueryPool(&m_pool, snapshotApiCallInfo, packet,
@@ -3304,10 +3443,12 @@
                             (unsigned long long)dataSize, (unsigned long long)pData,
                             (unsigned long long)stride, (unsigned long long)flags);
                 }
-                VkResult vkGetQueryPoolResults_VkResult_return = (VkResult)0;
-                vkGetQueryPoolResults_VkResult_return =
-                    vk->vkGetQueryPoolResults(unboxed_device, queryPool, firstQuery, queryCount,
-                                              dataSize, pData, stride, flags);
+                VkResult vkGetQueryPoolResults_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetQueryPoolResults_VkResult_return =
+                        vk->vkGetQueryPoolResults(unboxed_device, queryPool, firstQuery, queryCount,
+                                                  dataSize, pData, stride, flags);
+                }
                 if ((vkGetQueryPoolResults_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetQueryPoolResults_VkResult_return, opcode,
@@ -3338,6 +3479,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkBufferCreateInfo));
                 reservedunmarshal_VkBufferCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                      (VkBufferCreateInfo*)(pCreateInfo),
@@ -3372,9 +3514,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pBuffer);
                 }
-                VkResult vkCreateBuffer_VkResult_return = (VkResult)0;
-                vkCreateBuffer_VkResult_return = m_state->on_vkCreateBuffer(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pBuffer);
+                VkResult vkCreateBuffer_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateBuffer_VkResult_return = m_state->on_vkCreateBuffer(
+                        &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pBuffer);
+                }
                 if ((vkCreateBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateBuffer_VkResult_return, opcode, context);
@@ -3411,6 +3555,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for buffer;
                 VkBuffer boxed_buffer_preserve;
                 uint64_t cgen_var_1;
@@ -3438,8 +3583,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)buffer,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyBuffer(&m_pool, snapshotApiCallInfo, device, buffer,
-                                            pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyBuffer(&m_pool, snapshotApiCallInfo, device, buffer,
+                                                pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyBuffer(&m_pool, snapshotApiCallInfo, packet,
@@ -3502,9 +3649,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pView);
                 }
-                VkResult vkCreateBufferView_VkResult_return = (VkResult)0;
-                vkCreateBufferView_VkResult_return =
-                    vk->vkCreateBufferView(unboxed_device, pCreateInfo, pAllocator, pView);
+                VkResult vkCreateBufferView_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateBufferView_VkResult_return =
+                        vk->vkCreateBufferView(unboxed_device, pCreateInfo, pAllocator, pView);
+                }
                 if ((vkCreateBufferView_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateBufferView_VkResult_return, opcode, context);
@@ -3573,7 +3722,9 @@
                             ioStream, (unsigned long long)device, (unsigned long long)bufferView,
                             (unsigned long long)pAllocator);
                 }
-                vk->vkDestroyBufferView(unboxed_device, bufferView, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    vk->vkDestroyBufferView(unboxed_device, bufferView, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyBufferView(&m_pool, snapshotApiCallInfo, packet,
@@ -3597,6 +3748,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkImageCreateInfo));
                 reservedunmarshal_VkImageCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                     (VkImageCreateInfo*)(pCreateInfo),
@@ -3631,9 +3783,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pImage);
                 }
-                VkResult vkCreateImage_VkResult_return = (VkResult)0;
-                vkCreateImage_VkResult_return = m_state->on_vkCreateImage(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pImage);
+                VkResult vkCreateImage_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateImage_VkResult_return = m_state->on_vkCreateImage(
+                        &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pImage);
+                }
                 if ((vkCreateImage_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateImage_VkResult_return, opcode, context);
@@ -3669,6 +3823,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for image;
                 VkImage boxed_image_preserve;
                 uint64_t cgen_var_1;
@@ -3696,7 +3851,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)image,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyImage(&m_pool, snapshotApiCallInfo, device, image, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyImage(&m_pool, snapshotApiCallInfo, device, image,
+                                               pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyImage(&m_pool, snapshotApiCallInfo, packet,
@@ -3752,7 +3910,9 @@
                             ioStream, (unsigned long long)device, (unsigned long long)image,
                             (unsigned long long)pSubresource, (unsigned long long)pLayout);
                 }
-                vk->vkGetImageSubresourceLayout(unboxed_device, image, pSubresource, pLayout);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetImageSubresourceLayout(unboxed_device, image, pSubresource, pLayout);
+                }
                 vkStream->unsetHandleMapping();
                 if (pLayout) {
                     transform_fromhost_VkSubresourceLayout(m_state,
@@ -3783,6 +3943,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkImageViewCreateInfo));
                 reservedunmarshal_VkImageViewCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                         (VkImageViewCreateInfo*)(pCreateInfo),
@@ -3818,9 +3979,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pView);
                 }
-                VkResult vkCreateImageView_VkResult_return = (VkResult)0;
-                vkCreateImageView_VkResult_return = m_state->on_vkCreateImageView(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pView);
+                VkResult vkCreateImageView_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateImageView_VkResult_return = m_state->on_vkCreateImageView(
+                        &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pView);
+                }
                 if ((vkCreateImageView_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateImageView_VkResult_return, opcode, context);
@@ -3857,6 +4020,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for imageView;
                 VkImageView boxed_imageView_preserve;
                 uint64_t cgen_var_1;
@@ -3884,8 +4048,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)imageView,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyImageView(&m_pool, snapshotApiCallInfo, device, imageView,
-                                               pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyImageView(&m_pool, snapshotApiCallInfo, device, imageView,
+                                                   pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyImageView(&m_pool, snapshotApiCallInfo, packet,
@@ -3910,6 +4076,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkShaderModuleCreateInfo));
                 reservedunmarshal_VkShaderModuleCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                            (VkShaderModuleCreateInfo*)(pCreateInfo),
@@ -3946,9 +4113,12 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pShaderModule);
                 }
-                VkResult vkCreateShaderModule_VkResult_return = (VkResult)0;
-                vkCreateShaderModule_VkResult_return = m_state->on_vkCreateShaderModule(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pShaderModule);
+                VkResult vkCreateShaderModule_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateShaderModule_VkResult_return =
+                        m_state->on_vkCreateShaderModule(&m_pool, snapshotApiCallInfo, device,
+                                                         pCreateInfo, pAllocator, pShaderModule);
+                }
                 if ((vkCreateShaderModule_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateShaderModule_VkResult_return, opcode, context);
@@ -4018,8 +4188,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)shaderModule,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyShaderModule(&m_pool, snapshotApiCallInfo, device,
-                                                  shaderModule, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyShaderModule(&m_pool, snapshotApiCallInfo, device,
+                                                      shaderModule, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyShaderModule(
@@ -4044,6 +4216,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkPipelineCacheCreateInfo));
                 reservedunmarshal_VkPipelineCacheCreateInfo(
                     vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
@@ -4080,9 +4253,12 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pPipelineCache);
                 }
-                VkResult vkCreatePipelineCache_VkResult_return = (VkResult)0;
-                vkCreatePipelineCache_VkResult_return = m_state->on_vkCreatePipelineCache(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pPipelineCache);
+                VkResult vkCreatePipelineCache_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreatePipelineCache_VkResult_return =
+                        m_state->on_vkCreatePipelineCache(&m_pool, snapshotApiCallInfo, device,
+                                                          pCreateInfo, pAllocator, pPipelineCache);
+                }
                 if ((vkCreatePipelineCache_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreatePipelineCache_VkResult_return, opcode,
@@ -4122,6 +4298,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for pipelineCache;
                 VkPipelineCache boxed_pipelineCache_preserve;
                 uint64_t cgen_var_1;
@@ -4151,8 +4328,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pipelineCache,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyPipelineCache(&m_pool, snapshotApiCallInfo, device,
-                                                   pipelineCache, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyPipelineCache(&m_pool, snapshotApiCallInfo, device,
+                                                       pipelineCache, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyPipelineCache(
@@ -4214,9 +4393,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pipelineCache,
                             (unsigned long long)pDataSize, (unsigned long long)pData);
                 }
-                VkResult vkGetPipelineCacheData_VkResult_return = (VkResult)0;
-                vkGetPipelineCacheData_VkResult_return =
-                    vk->vkGetPipelineCacheData(unboxed_device, pipelineCache, pDataSize, pData);
+                VkResult vkGetPipelineCacheData_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetPipelineCacheData_VkResult_return =
+                        vk->vkGetPipelineCacheData(unboxed_device, pipelineCache, pDataSize, pData);
+                }
                 if ((vkGetPipelineCacheData_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetPipelineCacheData_VkResult_return, opcode,
@@ -4289,9 +4470,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)dstCache,
                             (unsigned long long)srcCacheCount, (unsigned long long)pSrcCaches);
                 }
-                VkResult vkMergePipelineCaches_VkResult_return = (VkResult)0;
-                vkMergePipelineCaches_VkResult_return =
-                    vk->vkMergePipelineCaches(unboxed_device, dstCache, srcCacheCount, pSrcCaches);
+                VkResult vkMergePipelineCaches_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkMergePipelineCaches_VkResult_return = vk->vkMergePipelineCaches(
+                        unboxed_device, dstCache, srcCacheCount, pSrcCaches);
+                }
                 if ((vkMergePipelineCaches_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkMergePipelineCaches_VkResult_return, opcode,
@@ -4324,6 +4507,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -4380,10 +4564,13 @@
                             (unsigned long long)createInfoCount, (unsigned long long)pCreateInfos,
                             (unsigned long long)pAllocator, (unsigned long long)pPipelines);
                 }
-                VkResult vkCreateGraphicsPipelines_VkResult_return = (VkResult)0;
-                vkCreateGraphicsPipelines_VkResult_return = m_state->on_vkCreateGraphicsPipelines(
-                    &m_pool, snapshotApiCallInfo, device, pipelineCache, createInfoCount,
-                    pCreateInfos, pAllocator, pPipelines);
+                VkResult vkCreateGraphicsPipelines_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateGraphicsPipelines_VkResult_return =
+                        m_state->on_vkCreateGraphicsPipelines(&m_pool, snapshotApiCallInfo, device,
+                                                              pipelineCache, createInfoCount,
+                                                              pCreateInfos, pAllocator, pPipelines);
+                }
                 if ((vkCreateGraphicsPipelines_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateGraphicsPipelines_VkResult_return, opcode,
@@ -4429,6 +4616,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -4485,10 +4673,12 @@
                             (unsigned long long)createInfoCount, (unsigned long long)pCreateInfos,
                             (unsigned long long)pAllocator, (unsigned long long)pPipelines);
                 }
-                VkResult vkCreateComputePipelines_VkResult_return = (VkResult)0;
-                vkCreateComputePipelines_VkResult_return = m_state->on_vkCreateComputePipelines(
-                    &m_pool, snapshotApiCallInfo, device, pipelineCache, createInfoCount,
-                    pCreateInfos, pAllocator, pPipelines);
+                VkResult vkCreateComputePipelines_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateComputePipelines_VkResult_return = m_state->on_vkCreateComputePipelines(
+                        &m_pool, snapshotApiCallInfo, device, pipelineCache, createInfoCount,
+                        pCreateInfos, pAllocator, pPipelines);
+                }
                 if ((vkCreateComputePipelines_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateComputePipelines_VkResult_return, opcode,
@@ -4531,6 +4721,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for pipeline;
                 VkPipeline boxed_pipeline_preserve;
                 uint64_t cgen_var_1;
@@ -4558,8 +4749,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pipeline,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyPipeline(&m_pool, snapshotApiCallInfo, device, pipeline,
-                                              pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyPipeline(&m_pool, snapshotApiCallInfo, device, pipeline,
+                                                  pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyPipeline(&m_pool, snapshotApiCallInfo, packet,
@@ -4584,6 +4777,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkPipelineLayoutCreateInfo));
                 reservedunmarshal_VkPipelineLayoutCreateInfo(
                     vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
@@ -4620,9 +4814,12 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pPipelineLayout);
                 }
-                VkResult vkCreatePipelineLayout_VkResult_return = (VkResult)0;
-                vkCreatePipelineLayout_VkResult_return = m_state->on_vkCreatePipelineLayout(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pPipelineLayout);
+                VkResult vkCreatePipelineLayout_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreatePipelineLayout_VkResult_return = m_state->on_vkCreatePipelineLayout(
+                        &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator,
+                        pPipelineLayout);
+                }
                 if ((vkCreatePipelineLayout_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreatePipelineLayout_VkResult_return, opcode,
@@ -4694,11 +4891,13 @@
                             ioStream, (unsigned long long)device,
                             (unsigned long long)pipelineLayout, (unsigned long long)pAllocator);
                 }
-                std::function<void()> delayed_remove_callback = [device, pipelineLayout,
+                std::function<void()> delayed_remove_callback = [vk, device, pipelineLayout,
                                                                  pAllocator]() {
                     auto m_state = VkDecoderGlobalState::get();
-                    m_state->on_vkDestroyPipelineLayout(nullptr, nullptr, device, pipelineLayout,
-                                                        pAllocator);
+                    if (CC_LIKELY(vk)) {
+                        m_state->on_vkDestroyPipelineLayout(nullptr, nullptr, device,
+                                                            pipelineLayout, pAllocator);
+                    }
                 };
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
@@ -4725,6 +4924,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkSamplerCreateInfo));
                 reservedunmarshal_VkSamplerCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                       (VkSamplerCreateInfo*)(pCreateInfo),
@@ -4760,9 +4960,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pSampler);
                 }
-                VkResult vkCreateSampler_VkResult_return = (VkResult)0;
-                vkCreateSampler_VkResult_return = m_state->on_vkCreateSampler(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pSampler);
+                VkResult vkCreateSampler_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateSampler_VkResult_return = m_state->on_vkCreateSampler(
+                        &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pSampler);
+                }
                 if ((vkCreateSampler_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateSampler_VkResult_return, opcode, context);
@@ -4799,6 +5001,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for sampler;
                 VkSampler boxed_sampler_preserve;
                 uint64_t cgen_var_1;
@@ -4826,8 +5029,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)sampler,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroySampler(&m_pool, snapshotApiCallInfo, device, sampler,
-                                             pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroySampler(&m_pool, snapshotApiCallInfo, device, sampler,
+                                                 pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroySampler(&m_pool, snapshotApiCallInfo, packet,
@@ -4852,6 +5057,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo,
                                     sizeof(const VkDescriptorSetLayoutCreateInfo));
                 reservedunmarshal_VkDescriptorSetLayoutCreateInfo(
@@ -4891,10 +5097,13 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pSetLayout);
                 }
-                VkResult vkCreateDescriptorSetLayout_VkResult_return = (VkResult)0;
-                vkCreateDescriptorSetLayout_VkResult_return =
-                    m_state->on_vkCreateDescriptorSetLayout(&m_pool, snapshotApiCallInfo, device,
-                                                            pCreateInfo, pAllocator, pSetLayout);
+                VkResult vkCreateDescriptorSetLayout_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateDescriptorSetLayout_VkResult_return =
+                        m_state->on_vkCreateDescriptorSetLayout(&m_pool, snapshotApiCallInfo,
+                                                                device, pCreateInfo, pAllocator,
+                                                                pSetLayout);
+                }
                 if ((vkCreateDescriptorSetLayout_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateDescriptorSetLayout_VkResult_return, opcode,
@@ -4935,6 +5144,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for descriptorSetLayout;
                 VkDescriptorSetLayout boxed_descriptorSetLayout_preserve;
                 uint64_t cgen_var_1;
@@ -4966,8 +5176,10 @@
                             (unsigned long long)descriptorSetLayout,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyDescriptorSetLayout(&m_pool, snapshotApiCallInfo, device,
-                                                         descriptorSetLayout, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyDescriptorSetLayout(&m_pool, snapshotApiCallInfo, device,
+                                                             descriptorSetLayout, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyDescriptorSetLayout(
@@ -4992,6 +5204,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkDescriptorPoolCreateInfo));
                 reservedunmarshal_VkDescriptorPoolCreateInfo(
                     vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
@@ -5028,9 +5241,12 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pDescriptorPool);
                 }
-                VkResult vkCreateDescriptorPool_VkResult_return = (VkResult)0;
-                vkCreateDescriptorPool_VkResult_return = m_state->on_vkCreateDescriptorPool(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pDescriptorPool);
+                VkResult vkCreateDescriptorPool_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateDescriptorPool_VkResult_return = m_state->on_vkCreateDescriptorPool(
+                        &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator,
+                        pDescriptorPool);
+                }
                 if ((vkCreateDescriptorPool_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateDescriptorPool_VkResult_return, opcode,
@@ -5070,6 +5286,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for descriptorPool;
                 VkDescriptorPool boxed_descriptorPool_preserve;
                 uint64_t cgen_var_1;
@@ -5099,8 +5316,10 @@
                             ioStream, (unsigned long long)device,
                             (unsigned long long)descriptorPool, (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyDescriptorPool(&m_pool, snapshotApiCallInfo, device,
-                                                    descriptorPool, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyDescriptorPool(&m_pool, snapshotApiCallInfo, device,
+                                                        descriptorPool, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyDescriptorPool(
@@ -5124,6 +5343,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -5137,9 +5357,11 @@
                             ioStream, (unsigned long long)device,
                             (unsigned long long)descriptorPool, (unsigned long long)flags);
                 }
-                VkResult vkResetDescriptorPool_VkResult_return = (VkResult)0;
-                vkResetDescriptorPool_VkResult_return = m_state->on_vkResetDescriptorPool(
-                    &m_pool, snapshotApiCallInfo, device, descriptorPool, flags);
+                VkResult vkResetDescriptorPool_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkResetDescriptorPool_VkResult_return = m_state->on_vkResetDescriptorPool(
+                        &m_pool, snapshotApiCallInfo, device, descriptorPool, flags);
+                }
                 if ((vkResetDescriptorPool_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkResetDescriptorPool_VkResult_return, opcode,
@@ -5168,6 +5390,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pAllocateInfo,
                                     sizeof(const VkDescriptorSetAllocateInfo));
                 reservedunmarshal_VkDescriptorSetAllocateInfo(
@@ -5198,9 +5421,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pAllocateInfo,
                             (unsigned long long)pDescriptorSets);
                 }
-                VkResult vkAllocateDescriptorSets_VkResult_return = (VkResult)0;
-                vkAllocateDescriptorSets_VkResult_return = m_state->on_vkAllocateDescriptorSets(
-                    &m_pool, snapshotApiCallInfo, device, pAllocateInfo, pDescriptorSets);
+                VkResult vkAllocateDescriptorSets_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkAllocateDescriptorSets_VkResult_return = m_state->on_vkAllocateDescriptorSets(
+                        &m_pool, snapshotApiCallInfo, device, pAllocateInfo, pDescriptorSets);
+                }
                 if ((vkAllocateDescriptorSets_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkAllocateDescriptorSets_VkResult_return, opcode,
@@ -5246,6 +5471,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -5289,10 +5515,12 @@
                             (unsigned long long)descriptorSetCount,
                             (unsigned long long)pDescriptorSets);
                 }
-                VkResult vkFreeDescriptorSets_VkResult_return = (VkResult)0;
-                vkFreeDescriptorSets_VkResult_return = m_state->on_vkFreeDescriptorSets(
-                    &m_pool, snapshotApiCallInfo, device, descriptorPool, descriptorSetCount,
-                    pDescriptorSets);
+                VkResult vkFreeDescriptorSets_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkFreeDescriptorSets_VkResult_return = m_state->on_vkFreeDescriptorSets(
+                        &m_pool, snapshotApiCallInfo, device, descriptorPool, descriptorSetCount,
+                        pDescriptorSets);
+                }
                 if ((vkFreeDescriptorSets_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkFreeDescriptorSets_VkResult_return, opcode, context);
@@ -5324,6 +5552,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 memcpy((uint32_t*)&descriptorWriteCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pDescriptorWrites,
@@ -5364,9 +5593,11 @@
                             (unsigned long long)descriptorCopyCount,
                             (unsigned long long)pDescriptorCopies);
                 }
-                m_state->on_vkUpdateDescriptorSets(&m_pool, snapshotApiCallInfo, device,
-                                                   descriptorWriteCount, pDescriptorWrites,
-                                                   descriptorCopyCount, pDescriptorCopies);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkUpdateDescriptorSets(&m_pool, snapshotApiCallInfo, device,
+                                                       descriptorWriteCount, pDescriptorWrites,
+                                                       descriptorCopyCount, pDescriptorCopies);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkUpdateDescriptorSets(
@@ -5391,6 +5622,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkFramebufferCreateInfo));
                 reservedunmarshal_VkFramebufferCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                           (VkFramebufferCreateInfo*)(pCreateInfo),
@@ -5427,9 +5659,12 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pFramebuffer);
                 }
-                VkResult vkCreateFramebuffer_VkResult_return = (VkResult)0;
-                vkCreateFramebuffer_VkResult_return = m_state->on_vkCreateFramebuffer(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pFramebuffer);
+                VkResult vkCreateFramebuffer_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateFramebuffer_VkResult_return =
+                        m_state->on_vkCreateFramebuffer(&m_pool, snapshotApiCallInfo, device,
+                                                        pCreateInfo, pAllocator, pFramebuffer);
+                }
                 if ((vkCreateFramebuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateFramebuffer_VkResult_return, opcode, context);
@@ -5468,6 +5703,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for framebuffer;
                 VkFramebuffer boxed_framebuffer_preserve;
                 uint64_t cgen_var_1;
@@ -5496,8 +5732,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)framebuffer,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyFramebuffer(&m_pool, snapshotApiCallInfo, device, framebuffer,
-                                                 pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyFramebuffer(&m_pool, snapshotApiCallInfo, device,
+                                                     framebuffer, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyFramebuffer(
@@ -5522,6 +5760,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkRenderPassCreateInfo));
                 reservedunmarshal_VkRenderPassCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                          (VkRenderPassCreateInfo*)(pCreateInfo),
@@ -5558,9 +5797,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pRenderPass);
                 }
-                VkResult vkCreateRenderPass_VkResult_return = (VkResult)0;
-                vkCreateRenderPass_VkResult_return = m_state->on_vkCreateRenderPass(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pRenderPass);
+                VkResult vkCreateRenderPass_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateRenderPass_VkResult_return = m_state->on_vkCreateRenderPass(
+                        &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pRenderPass);
+                }
                 if ((vkCreateRenderPass_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateRenderPass_VkResult_return, opcode, context);
@@ -5598,6 +5839,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for renderPass;
                 VkRenderPass boxed_renderPass_preserve;
                 uint64_t cgen_var_1;
@@ -5626,8 +5868,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)renderPass,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyRenderPass(&m_pool, snapshotApiCallInfo, device, renderPass,
-                                                pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyRenderPass(&m_pool, snapshotApiCallInfo, device,
+                                                    renderPass, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyRenderPass(&m_pool, snapshotApiCallInfo, packet,
@@ -5673,7 +5917,9 @@
                             ioStream, (unsigned long long)device, (unsigned long long)renderPass,
                             (unsigned long long)pGranularity);
                 }
-                vk->vkGetRenderAreaGranularity(unboxed_device, renderPass, pGranularity);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetRenderAreaGranularity(unboxed_device, renderPass, pGranularity);
+                }
                 vkStream->unsetHandleMapping();
                 if (pGranularity) {
                     transform_fromhost_VkExtent2D(m_state, (VkExtent2D*)(pGranularity));
@@ -5703,6 +5949,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkCommandPoolCreateInfo));
                 reservedunmarshal_VkCommandPoolCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                           (VkCommandPoolCreateInfo*)(pCreateInfo),
@@ -5739,9 +5986,12 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pCommandPool);
                 }
-                VkResult vkCreateCommandPool_VkResult_return = (VkResult)0;
-                vkCreateCommandPool_VkResult_return = m_state->on_vkCreateCommandPool(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pCommandPool);
+                VkResult vkCreateCommandPool_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateCommandPool_VkResult_return =
+                        m_state->on_vkCreateCommandPool(&m_pool, snapshotApiCallInfo, device,
+                                                        pCreateInfo, pAllocator, pCommandPool);
+                }
                 if ((vkCreateCommandPool_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateCommandPool_VkResult_return, opcode, context);
@@ -5780,6 +6030,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for commandPool;
                 VkCommandPool boxed_commandPool_preserve;
                 uint64_t cgen_var_1;
@@ -5808,8 +6059,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)commandPool,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyCommandPool(&m_pool, snapshotApiCallInfo, device, commandPool,
-                                                 pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyCommandPool(&m_pool, snapshotApiCallInfo, device,
+                                                     commandPool, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyCommandPool(
@@ -5833,6 +6086,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -5846,9 +6100,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)commandPool,
                             (unsigned long long)flags);
                 }
-                VkResult vkResetCommandPool_VkResult_return = (VkResult)0;
-                vkResetCommandPool_VkResult_return = m_state->on_vkResetCommandPool(
-                    &m_pool, snapshotApiCallInfo, device, commandPool, flags);
+                VkResult vkResetCommandPool_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkResetCommandPool_VkResult_return = m_state->on_vkResetCommandPool(
+                        &m_pool, snapshotApiCallInfo, device, commandPool, flags);
+                }
                 if ((vkResetCommandPool_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkResetCommandPool_VkResult_return, opcode, context);
@@ -5876,6 +6132,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pAllocateInfo,
                                     sizeof(const VkCommandBufferAllocateInfo));
                 reservedunmarshal_VkCommandBufferAllocateInfo(
@@ -5906,9 +6163,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pAllocateInfo,
                             (unsigned long long)pCommandBuffers);
                 }
-                VkResult vkAllocateCommandBuffers_VkResult_return = (VkResult)0;
-                vkAllocateCommandBuffers_VkResult_return = m_state->on_vkAllocateCommandBuffers(
-                    &m_pool, snapshotApiCallInfo, device, pAllocateInfo, pCommandBuffers);
+                VkResult vkAllocateCommandBuffers_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkAllocateCommandBuffers_VkResult_return = m_state->on_vkAllocateCommandBuffers(
+                        &m_pool, snapshotApiCallInfo, device, pAllocateInfo, pCommandBuffers);
+                }
                 if ((vkAllocateCommandBuffers_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkAllocateCommandBuffers_VkResult_return, opcode,
@@ -5950,6 +6209,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -5992,8 +6252,11 @@
                             (unsigned long long)commandBufferCount,
                             (unsigned long long)pCommandBuffers);
                 }
-                m_state->on_vkFreeCommandBuffers(&m_pool, snapshotApiCallInfo, device, commandPool,
-                                                 commandBufferCount, pCommandBuffers);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkFreeCommandBuffers(&m_pool, snapshotApiCallInfo, device,
+                                                     commandPool, commandBufferCount,
+                                                     pCommandBuffers);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkFreeCommandBuffers(
@@ -6021,6 +6284,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 vkReadStream->alloc((void**)&pBeginInfo, sizeof(const VkCommandBufferBeginInfo));
                 reservedunmarshal_VkCommandBufferBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                            (VkCommandBufferBeginInfo*)(pBeginInfo),
@@ -6034,9 +6298,11 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pBeginInfo);
                 }
-                VkResult vkBeginCommandBuffer_VkResult_return = (VkResult)0;
-                vkBeginCommandBuffer_VkResult_return = m_state->on_vkBeginCommandBuffer(
-                    &m_pool, snapshotApiCallInfo, commandBuffer, pBeginInfo, context);
+                VkResult vkBeginCommandBuffer_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkBeginCommandBuffer_VkResult_return = m_state->on_vkBeginCommandBuffer(
+                        &m_pool, snapshotApiCallInfo, commandBuffer, pBeginInfo, context);
+                }
                 if ((vkBeginCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkBeginCommandBuffer_VkResult_return, opcode, context);
@@ -6063,13 +6329,16 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 if (m_logCalls) {
                     fprintf(stderr, "stream %p: call vkEndCommandBuffer 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer);
                 }
-                VkResult vkEndCommandBuffer_VkResult_return = (VkResult)0;
-                vkEndCommandBuffer_VkResult_return = m_state->on_vkEndCommandBuffer(
-                    &m_pool, snapshotApiCallInfo, commandBuffer, context);
+                VkResult vkEndCommandBuffer_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkEndCommandBuffer_VkResult_return = m_state->on_vkEndCommandBuffer(
+                        &m_pool, snapshotApiCallInfo, commandBuffer, context);
+                }
                 if ((vkEndCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkEndCommandBuffer_VkResult_return, opcode, context);
@@ -6097,6 +6366,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 memcpy((VkCommandBufferResetFlags*)&flags, *readStreamPtrPtr,
                        sizeof(VkCommandBufferResetFlags));
                 *readStreamPtrPtr += sizeof(VkCommandBufferResetFlags);
@@ -6104,9 +6374,11 @@
                     fprintf(stderr, "stream %p: call vkResetCommandBuffer 0x%llx 0x%llx \n",
                             ioStream, (unsigned long long)commandBuffer, (unsigned long long)flags);
                 }
-                VkResult vkResetCommandBuffer_VkResult_return = (VkResult)0;
-                vkResetCommandBuffer_VkResult_return = m_state->on_vkResetCommandBuffer(
-                    &m_pool, snapshotApiCallInfo, commandBuffer, flags);
+                VkResult vkResetCommandBuffer_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkResetCommandBuffer_VkResult_return = m_state->on_vkResetCommandBuffer(
+                        &m_pool, snapshotApiCallInfo, commandBuffer, flags);
+                }
                 if ((vkResetCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkResetCommandBuffer_VkResult_return, opcode, context);
@@ -6135,6 +6407,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr,
                        sizeof(VkPipelineBindPoint));
                 *readStreamPtrPtr += sizeof(VkPipelineBindPoint);
@@ -6147,8 +6420,10 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pipelineBindPoint, (unsigned long long)pipeline);
                 }
-                m_state->on_vkCmdBindPipeline(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                              pipelineBindPoint, pipeline);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdBindPipeline(&m_pool, snapshotApiCallInfo, commandBuffer,
+                                                  pipelineBindPoint, pipeline);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBindPipeline(&m_pool, snapshotApiCallInfo, packet,
@@ -6198,8 +6473,10 @@
                             (unsigned long long)firstViewport, (unsigned long long)viewportCount,
                             (unsigned long long)pViewports);
                 }
-                vk->vkCmdSetViewport(unboxed_commandBuffer, firstViewport, viewportCount,
-                                     pViewports);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetViewport(unboxed_commandBuffer, firstViewport, viewportCount,
+                                         pViewports);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetViewport(&m_pool, snapshotApiCallInfo, packet,
@@ -6248,7 +6525,10 @@
                             (unsigned long long)firstScissor, (unsigned long long)scissorCount,
                             (unsigned long long)pScissors);
                 }
-                vk->vkCmdSetScissor(unboxed_commandBuffer, firstScissor, scissorCount, pScissors);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetScissor(unboxed_commandBuffer, firstScissor, scissorCount,
+                                        pScissors);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetScissor(&m_pool, snapshotApiCallInfo, packet,
@@ -6280,7 +6560,9 @@
                     fprintf(stderr, "stream %p: call vkCmdSetLineWidth 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer, (unsigned long long)lineWidth);
                 }
-                vk->vkCmdSetLineWidth(unboxed_commandBuffer, lineWidth);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetLineWidth(unboxed_commandBuffer, lineWidth);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetLineWidth(&m_pool, snapshotApiCallInfo, packet,
@@ -6321,8 +6603,10 @@
                             (unsigned long long)depthBiasClamp,
                             (unsigned long long)depthBiasSlopeFactor);
                 }
-                vk->vkCmdSetDepthBias(unboxed_commandBuffer, depthBiasConstantFactor,
-                                      depthBiasClamp, depthBiasSlopeFactor);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthBias(unboxed_commandBuffer, depthBiasConstantFactor,
+                                          depthBiasClamp, depthBiasSlopeFactor);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetDepthBias(
@@ -6355,7 +6639,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)blendConstants);
                 }
-                vk->vkCmdSetBlendConstants(unboxed_commandBuffer, blendConstants);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetBlendConstants(unboxed_commandBuffer, blendConstants);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetBlendConstants(&m_pool, snapshotApiCallInfo,
@@ -6391,7 +6677,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)minDepthBounds, (unsigned long long)maxDepthBounds);
                 }
-                vk->vkCmdSetDepthBounds(unboxed_commandBuffer, minDepthBounds, maxDepthBounds);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthBounds(unboxed_commandBuffer, minDepthBounds, maxDepthBounds);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetDepthBounds(&m_pool, snapshotApiCallInfo, packet,
@@ -6429,7 +6717,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)faceMask, (unsigned long long)compareMask);
                 }
-                vk->vkCmdSetStencilCompareMask(unboxed_commandBuffer, faceMask, compareMask);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetStencilCompareMask(unboxed_commandBuffer, faceMask, compareMask);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetStencilCompareMask(
@@ -6467,7 +6757,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)faceMask, (unsigned long long)writeMask);
                 }
-                vk->vkCmdSetStencilWriteMask(unboxed_commandBuffer, faceMask, writeMask);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetStencilWriteMask(unboxed_commandBuffer, faceMask, writeMask);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetStencilWriteMask(&m_pool, snapshotApiCallInfo,
@@ -6505,7 +6797,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)faceMask, (unsigned long long)reference);
                 }
-                vk->vkCmdSetStencilReference(unboxed_commandBuffer, faceMask, reference);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetStencilReference(unboxed_commandBuffer, faceMask, reference);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetStencilReference(&m_pool, snapshotApiCallInfo,
@@ -6534,6 +6828,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 memcpy((VkPipelineBindPoint*)&pipelineBindPoint, *readStreamPtrPtr,
                        sizeof(VkPipelineBindPoint));
                 *readStreamPtrPtr += sizeof(VkPipelineBindPoint);
@@ -6577,10 +6872,12 @@
                             (unsigned long long)dynamicOffsetCount,
                             (unsigned long long)pDynamicOffsets);
                 }
-                m_state->on_vkCmdBindDescriptorSets(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                                    pipelineBindPoint, layout, firstSet,
-                                                    descriptorSetCount, pDescriptorSets,
-                                                    dynamicOffsetCount, pDynamicOffsets);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdBindDescriptorSets(&m_pool, snapshotApiCallInfo, commandBuffer,
+                                                        pipelineBindPoint, layout, firstSet,
+                                                        descriptorSetCount, pDescriptorSets,
+                                                        dynamicOffsetCount, pDynamicOffsets);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBindDescriptorSets(
@@ -6623,7 +6920,9 @@
                             ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer,
                             (unsigned long long)offset, (unsigned long long)indexType);
                 }
-                vk->vkCmdBindIndexBuffer(unboxed_commandBuffer, buffer, offset, indexType);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBindIndexBuffer(unboxed_commandBuffer, buffer, offset, indexType);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBindIndexBuffer(&m_pool, snapshotApiCallInfo, packet,
@@ -6680,8 +6979,10 @@
                             (unsigned long long)firstBinding, (unsigned long long)bindingCount,
                             (unsigned long long)pBuffers, (unsigned long long)pOffsets);
                 }
-                vk->vkCmdBindVertexBuffers(unboxed_commandBuffer, firstBinding, bindingCount,
-                                           pBuffers, pOffsets);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBindVertexBuffers(unboxed_commandBuffer, firstBinding, bindingCount,
+                                               pBuffers, pOffsets);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBindVertexBuffers(
@@ -6724,8 +7025,10 @@
                             (unsigned long long)vertexCount, (unsigned long long)instanceCount,
                             (unsigned long long)firstVertex, (unsigned long long)firstInstance);
                 }
-                vk->vkCmdDraw(unboxed_commandBuffer, vertexCount, instanceCount, firstVertex,
-                              firstInstance);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDraw(unboxed_commandBuffer, vertexCount, instanceCount, firstVertex,
+                                  firstInstance);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdDraw(&m_pool, snapshotApiCallInfo, packet, packetLen,
@@ -6774,8 +7077,10 @@
                             (unsigned long long)firstIndex, (unsigned long long)vertexOffset,
                             (unsigned long long)firstInstance);
                 }
-                vk->vkCmdDrawIndexed(unboxed_commandBuffer, indexCount, instanceCount, firstIndex,
-                                     vertexOffset, firstInstance);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDrawIndexed(unboxed_commandBuffer, indexCount, instanceCount,
+                                         firstIndex, vertexOffset, firstInstance);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdDrawIndexed(
@@ -6822,7 +7127,9 @@
                         (unsigned long long)offset, (unsigned long long)drawCount,
                         (unsigned long long)stride);
                 }
-                vk->vkCmdDrawIndirect(unboxed_commandBuffer, buffer, offset, drawCount, stride);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDrawIndirect(unboxed_commandBuffer, buffer, offset, drawCount, stride);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdDrawIndirect(&m_pool, snapshotApiCallInfo, packet,
@@ -6869,8 +7176,10 @@
                             (unsigned long long)offset, (unsigned long long)drawCount,
                             (unsigned long long)stride);
                 }
-                vk->vkCmdDrawIndexedIndirect(unboxed_commandBuffer, buffer, offset, drawCount,
-                                             stride);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDrawIndexedIndirect(unboxed_commandBuffer, buffer, offset, drawCount,
+                                                 stride);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdDrawIndexedIndirect(
@@ -6909,7 +7218,9 @@
                             (unsigned long long)groupCountX, (unsigned long long)groupCountY,
                             (unsigned long long)groupCountZ);
                 }
-                vk->vkCmdDispatch(unboxed_commandBuffer, groupCountX, groupCountY, groupCountZ);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDispatch(unboxed_commandBuffer, groupCountX, groupCountY, groupCountZ);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdDispatch(&m_pool, snapshotApiCallInfo, packet,
@@ -6947,7 +7258,9 @@
                             ioStream, (unsigned long long)commandBuffer, (unsigned long long)buffer,
                             (unsigned long long)offset);
                 }
-                vk->vkCmdDispatchIndirect(unboxed_commandBuffer, buffer, offset);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDispatchIndirect(unboxed_commandBuffer, buffer, offset);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdDispatchIndirect(&m_pool, snapshotApiCallInfo, packet,
@@ -7004,8 +7317,10 @@
                             (unsigned long long)srcBuffer, (unsigned long long)dstBuffer,
                             (unsigned long long)regionCount, (unsigned long long)pRegions);
                 }
-                vk->vkCmdCopyBuffer(unboxed_commandBuffer, srcBuffer, dstBuffer, regionCount,
-                                    pRegions);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdCopyBuffer(unboxed_commandBuffer, srcBuffer, dstBuffer, regionCount,
+                                        pRegions);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdCopyBuffer(&m_pool, snapshotApiCallInfo, packet,
@@ -7032,6 +7347,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -7065,9 +7381,11 @@
                             (unsigned long long)dstImage, (unsigned long long)dstImageLayout,
                             (unsigned long long)regionCount, (unsigned long long)pRegions);
                 }
-                m_state->on_vkCmdCopyImage(&m_pool, snapshotApiCallInfo, commandBuffer, srcImage,
-                                           srcImageLayout, dstImage, dstImageLayout, regionCount,
-                                           pRegions);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdCopyImage(&m_pool, snapshotApiCallInfo, commandBuffer,
+                                               srcImage, srcImageLayout, dstImage, dstImageLayout,
+                                               regionCount, pRegions);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdCopyImage(
@@ -7134,8 +7452,10 @@
                             (unsigned long long)regionCount, (unsigned long long)pRegions,
                             (unsigned long long)filter);
                 }
-                vk->vkCmdBlitImage(unboxed_commandBuffer, srcImage, srcImageLayout, dstImage,
-                                   dstImageLayout, regionCount, pRegions, filter);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBlitImage(unboxed_commandBuffer, srcImage, srcImageLayout, dstImage,
+                                       dstImageLayout, regionCount, pRegions, filter);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBlitImage(
@@ -7162,6 +7482,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -7196,9 +7517,11 @@
                             (unsigned long long)dstImageLayout, (unsigned long long)regionCount,
                             (unsigned long long)pRegions);
                 }
-                m_state->on_vkCmdCopyBufferToImage(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                                   srcBuffer, dstImage, dstImageLayout, regionCount,
-                                                   pRegions, context);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdCopyBufferToImage(&m_pool, snapshotApiCallInfo, commandBuffer,
+                                                       srcBuffer, dstImage, dstImageLayout,
+                                                       regionCount, pRegions, context);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdCopyBufferToImage(
@@ -7225,6 +7548,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -7259,9 +7583,11 @@
                             (unsigned long long)dstBuffer, (unsigned long long)regionCount,
                             (unsigned long long)pRegions);
                 }
-                m_state->on_vkCmdCopyImageToBuffer(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                                   srcImage, srcImageLayout, dstBuffer, regionCount,
-                                                   pRegions);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdCopyImageToBuffer(&m_pool, snapshotApiCallInfo, commandBuffer,
+                                                       srcImage, srcImageLayout, dstBuffer,
+                                                       regionCount, pRegions);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdCopyImageToBuffer(
@@ -7309,7 +7635,10 @@
                         (unsigned long long)dstOffset, (unsigned long long)dataSize,
                         (unsigned long long)pData);
                 }
-                vk->vkCmdUpdateBuffer(unboxed_commandBuffer, dstBuffer, dstOffset, dataSize, pData);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdUpdateBuffer(unboxed_commandBuffer, dstBuffer, dstOffset, dataSize,
+                                          pData);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdUpdateBuffer(&m_pool, snapshotApiCallInfo, packet,
@@ -7355,7 +7684,9 @@
                             (unsigned long long)dstBuffer, (unsigned long long)dstOffset,
                             (unsigned long long)size, (unsigned long long)data);
                 }
-                vk->vkCmdFillBuffer(unboxed_commandBuffer, dstBuffer, dstOffset, size, data);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdFillBuffer(unboxed_commandBuffer, dstBuffer, dstOffset, size, data);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdFillBuffer(&m_pool, snapshotApiCallInfo, packet,
@@ -7420,8 +7751,10 @@
                             (unsigned long long)imageLayout, (unsigned long long)pColor,
                             (unsigned long long)rangeCount, (unsigned long long)pRanges);
                 }
-                vk->vkCmdClearColorImage(unboxed_commandBuffer, image, imageLayout, pColor,
-                                         rangeCount, pRanges);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdClearColorImage(unboxed_commandBuffer, image, imageLayout, pColor,
+                                             rangeCount, pRanges);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdClearColorImage(
@@ -7488,8 +7821,10 @@
                             (unsigned long long)imageLayout, (unsigned long long)pDepthStencil,
                             (unsigned long long)rangeCount, (unsigned long long)pRanges);
                 }
-                vk->vkCmdClearDepthStencilImage(unboxed_commandBuffer, image, imageLayout,
-                                                pDepthStencil, rangeCount, pRanges);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdClearDepthStencilImage(unboxed_commandBuffer, image, imageLayout,
+                                                    pDepthStencil, rangeCount, pRanges);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdClearDepthStencilImage(
@@ -7553,8 +7888,10 @@
                             (unsigned long long)attachmentCount, (unsigned long long)pAttachments,
                             (unsigned long long)rectCount, (unsigned long long)pRects);
                 }
-                vk->vkCmdClearAttachments(unboxed_commandBuffer, attachmentCount, pAttachments,
-                                          rectCount, pRects);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdClearAttachments(unboxed_commandBuffer, attachmentCount, pAttachments,
+                                              rectCount, pRects);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdClearAttachments(
@@ -7620,8 +7957,10 @@
                             (unsigned long long)dstImage, (unsigned long long)dstImageLayout,
                             (unsigned long long)regionCount, (unsigned long long)pRegions);
                 }
-                vk->vkCmdResolveImage(unboxed_commandBuffer, srcImage, srcImageLayout, dstImage,
-                                      dstImageLayout, regionCount, pRegions);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdResolveImage(unboxed_commandBuffer, srcImage, srcImageLayout, dstImage,
+                                          dstImageLayout, regionCount, pRegions);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdResolveImage(
@@ -7659,7 +7998,9 @@
                             ioStream, (unsigned long long)commandBuffer, (unsigned long long)event,
                             (unsigned long long)stageMask);
                 }
-                vk->vkCmdSetEvent(unboxed_commandBuffer, event, stageMask);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetEvent(unboxed_commandBuffer, event, stageMask);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetEvent(&m_pool, snapshotApiCallInfo, packet,
@@ -7697,7 +8038,9 @@
                             ioStream, (unsigned long long)commandBuffer, (unsigned long long)event,
                             (unsigned long long)stageMask);
                 }
-                vk->vkCmdResetEvent(unboxed_commandBuffer, event, stageMask);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdResetEvent(unboxed_commandBuffer, event, stageMask);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdResetEvent(&m_pool, snapshotApiCallInfo, packet,
@@ -7812,10 +8155,12 @@
                             (unsigned long long)imageMemoryBarrierCount,
                             (unsigned long long)pImageMemoryBarriers);
                 }
-                vk->vkCmdWaitEvents(unboxed_commandBuffer, eventCount, pEvents, srcStageMask,
-                                    dstStageMask, memoryBarrierCount, pMemoryBarriers,
-                                    bufferMemoryBarrierCount, pBufferMemoryBarriers,
-                                    imageMemoryBarrierCount, pImageMemoryBarriers);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdWaitEvents(unboxed_commandBuffer, eventCount, pEvents, srcStageMask,
+                                        dstStageMask, memoryBarrierCount, pMemoryBarriers,
+                                        bufferMemoryBarrierCount, pBufferMemoryBarriers,
+                                        imageMemoryBarrierCount, pImageMemoryBarriers);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdWaitEvents(
@@ -7848,6 +8193,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 memcpy((VkPipelineStageFlags*)&srcStageMask, *readStreamPtrPtr,
                        sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
@@ -7918,10 +8264,13 @@
                             (unsigned long long)imageMemoryBarrierCount,
                             (unsigned long long)pImageMemoryBarriers);
                 }
-                m_state->on_vkCmdPipelineBarrier(
-                    &m_pool, snapshotApiCallInfo, commandBuffer, srcStageMask, dstStageMask,
-                    dependencyFlags, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
-                    pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdPipelineBarrier(
+                        &m_pool, snapshotApiCallInfo, commandBuffer, srcStageMask, dstStageMask,
+                        dependencyFlags, memoryBarrierCount, pMemoryBarriers,
+                        bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount,
+                        pImageMemoryBarriers);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdPipelineBarrier(
@@ -7967,7 +8316,9 @@
                         ioStream, (unsigned long long)commandBuffer, (unsigned long long)queryPool,
                         (unsigned long long)query, (unsigned long long)flags);
                 }
-                vk->vkCmdBeginQuery(unboxed_commandBuffer, queryPool, query, flags);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBeginQuery(unboxed_commandBuffer, queryPool, query, flags);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBeginQuery(&m_pool, snapshotApiCallInfo, packet,
@@ -8005,7 +8356,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)queryPool, (unsigned long long)query);
                 }
-                vk->vkCmdEndQuery(unboxed_commandBuffer, queryPool, query);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndQuery(unboxed_commandBuffer, queryPool, query);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdEndQuery(&m_pool, snapshotApiCallInfo, packet,
@@ -8048,7 +8401,10 @@
                             (unsigned long long)queryPool, (unsigned long long)firstQuery,
                             (unsigned long long)queryCount);
                 }
-                vk->vkCmdResetQueryPool(unboxed_commandBuffer, queryPool, firstQuery, queryCount);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdResetQueryPool(unboxed_commandBuffer, queryPool, firstQuery,
+                                            queryCount);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdResetQueryPool(&m_pool, snapshotApiCallInfo, packet,
@@ -8093,7 +8449,9 @@
                             (unsigned long long)pipelineStage, (unsigned long long)queryPool,
                             (unsigned long long)query);
                 }
-                vk->vkCmdWriteTimestamp(unboxed_commandBuffer, pipelineStage, queryPool, query);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdWriteTimestamp(unboxed_commandBuffer, pipelineStage, queryPool, query);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdWriteTimestamp(&m_pool, snapshotApiCallInfo, packet,
@@ -8154,8 +8512,10 @@
                             (unsigned long long)dstOffset, (unsigned long long)stride,
                             (unsigned long long)flags);
                 }
-                vk->vkCmdCopyQueryPoolResults(unboxed_commandBuffer, queryPool, firstQuery,
-                                              queryCount, dstBuffer, dstOffset, stride, flags);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdCopyQueryPoolResults(unboxed_commandBuffer, queryPool, firstQuery,
+                                                  queryCount, dstBuffer, dstOffset, stride, flags);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdCopyQueryPoolResults(
@@ -8208,8 +8568,10 @@
                             (unsigned long long)stageFlags, (unsigned long long)offset,
                             (unsigned long long)size, (unsigned long long)pValues);
                 }
-                vk->vkCmdPushConstants(unboxed_commandBuffer, layout, stageFlags, offset, size,
-                                       pValues);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdPushConstants(unboxed_commandBuffer, layout, stageFlags, offset, size,
+                                           pValues);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdPushConstants(&m_pool, snapshotApiCallInfo, packet,
@@ -8233,6 +8595,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 vkReadStream->alloc((void**)&pRenderPassBegin, sizeof(const VkRenderPassBeginInfo));
                 reservedunmarshal_VkRenderPassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                         (VkRenderPassBeginInfo*)(pRenderPassBegin),
@@ -8248,8 +8611,10 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pRenderPassBegin, (unsigned long long)contents);
                 }
-                m_state->on_vkCmdBeginRenderPass(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                                 pRenderPassBegin, contents);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdBeginRenderPass(&m_pool, snapshotApiCallInfo, commandBuffer,
+                                                     pRenderPassBegin, contents);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBeginRenderPass(&m_pool, snapshotApiCallInfo, packet,
@@ -8281,7 +8646,9 @@
                     fprintf(stderr, "stream %p: call vkCmdNextSubpass 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer, (unsigned long long)contents);
                 }
-                vk->vkCmdNextSubpass(unboxed_commandBuffer, contents);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdNextSubpass(unboxed_commandBuffer, contents);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdNextSubpass(&m_pool, snapshotApiCallInfo, packet,
@@ -8309,7 +8676,9 @@
                     fprintf(stderr, "stream %p: call vkCmdEndRenderPass 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer);
                 }
-                vk->vkCmdEndRenderPass(unboxed_commandBuffer);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndRenderPass(unboxed_commandBuffer);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdEndRenderPass(&m_pool, snapshotApiCallInfo, packet,
@@ -8332,6 +8701,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 memcpy((uint32_t*)&commandBufferCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pCommandBuffers,
@@ -8353,8 +8723,10 @@
                             (unsigned long long)commandBufferCount,
                             (unsigned long long)pCommandBuffers);
                 }
-                m_state->on_vkCmdExecuteCommands(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                                 commandBufferCount, pCommandBuffers);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdExecuteCommands(&m_pool, snapshotApiCallInfo, commandBuffer,
+                                                     commandBufferCount, pCommandBuffers);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdExecuteCommands(&m_pool, snapshotApiCallInfo, packet,
@@ -8381,7 +8753,7 @@
                     fprintf(stderr, "stream %p: call vkEnumerateInstanceVersion 0x%llx \n",
                             ioStream, (unsigned long long)pApiVersion);
                 }
-                VkResult vkEnumerateInstanceVersion_VkResult_return = (VkResult)0;
+                VkResult vkEnumerateInstanceVersion_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
                 vkEnumerateInstanceVersion_VkResult_return = m_state->on_vkEnumerateInstanceVersion(
                     &m_pool, snapshotApiCallInfo, pApiVersion);
                 if ((vkEnumerateInstanceVersion_VkResult_return) == VK_ERROR_DEVICE_LOST)
@@ -8413,6 +8785,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 memcpy((uint32_t*)&bindInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pBindInfos,
@@ -8433,9 +8806,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)bindInfoCount,
                             (unsigned long long)pBindInfos);
                 }
-                VkResult vkBindBufferMemory2_VkResult_return = (VkResult)0;
-                vkBindBufferMemory2_VkResult_return = m_state->on_vkBindBufferMemory2(
-                    &m_pool, snapshotApiCallInfo, device, bindInfoCount, pBindInfos);
+                VkResult vkBindBufferMemory2_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkBindBufferMemory2_VkResult_return = m_state->on_vkBindBufferMemory2(
+                        &m_pool, snapshotApiCallInfo, device, bindInfoCount, pBindInfos);
+                }
                 if ((vkBindBufferMemory2_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkBindBufferMemory2_VkResult_return, opcode, context);
@@ -8463,6 +8838,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 memcpy((uint32_t*)&bindInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pBindInfos,
@@ -8483,9 +8859,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)bindInfoCount,
                             (unsigned long long)pBindInfos);
                 }
-                VkResult vkBindImageMemory2_VkResult_return = (VkResult)0;
-                vkBindImageMemory2_VkResult_return = m_state->on_vkBindImageMemory2(
-                    &m_pool, snapshotApiCallInfo, device, bindInfoCount, pBindInfos);
+                VkResult vkBindImageMemory2_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkBindImageMemory2_VkResult_return = m_state->on_vkBindImageMemory2(
+                        &m_pool, snapshotApiCallInfo, device, bindInfoCount, pBindInfos);
+                }
                 if ((vkBindImageMemory2_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkBindImageMemory2_VkResult_return, opcode, context);
@@ -8539,8 +8917,11 @@
                             (unsigned long long)remoteDeviceIndex,
                             (unsigned long long)pPeerMemoryFeatures);
                 }
-                vk->vkGetDeviceGroupPeerMemoryFeatures(unboxed_device, heapIndex, localDeviceIndex,
-                                                       remoteDeviceIndex, pPeerMemoryFeatures);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetDeviceGroupPeerMemoryFeatures(unboxed_device, heapIndex,
+                                                           localDeviceIndex, remoteDeviceIndex,
+                                                           pPeerMemoryFeatures);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures,
                                 sizeof(VkPeerMemoryFeatureFlags));
@@ -8575,7 +8956,9 @@
                     fprintf(stderr, "stream %p: call vkCmdSetDeviceMask 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer, (unsigned long long)deviceMask);
                 }
-                vk->vkCmdSetDeviceMask(unboxed_commandBuffer, deviceMask);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDeviceMask(unboxed_commandBuffer, deviceMask);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetDeviceMask(&m_pool, snapshotApiCallInfo, packet,
@@ -8626,8 +9009,10 @@
                             (unsigned long long)baseGroupZ, (unsigned long long)groupCountX,
                             (unsigned long long)groupCountY, (unsigned long long)groupCountZ);
                 }
-                vk->vkCmdDispatchBase(unboxed_commandBuffer, baseGroupX, baseGroupY, baseGroupZ,
-                                      groupCountX, groupCountY, groupCountZ);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDispatchBase(unboxed_commandBuffer, baseGroupX, baseGroupY, baseGroupZ,
+                                          groupCountX, groupCountY, groupCountZ);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdDispatchBase(
@@ -8650,6 +9035,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkInstance*)&instance = (VkInstance)(VkInstance)((VkInstance)(*&cgen_var_0));
+                auto vk = dispatch_VkInstance(instance);
                 // Begin manual dispatchable handle unboxing for pPhysicalDeviceGroupCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
@@ -8698,11 +9084,14 @@
                         (unsigned long long)pPhysicalDeviceGroupCount,
                         (unsigned long long)pPhysicalDeviceGroupProperties);
                 }
-                VkResult vkEnumeratePhysicalDeviceGroups_VkResult_return = (VkResult)0;
-                vkEnumeratePhysicalDeviceGroups_VkResult_return =
-                    m_state->on_vkEnumeratePhysicalDeviceGroups(&m_pool, snapshotApiCallInfo,
-                                                                instance, pPhysicalDeviceGroupCount,
-                                                                pPhysicalDeviceGroupProperties);
+                VkResult vkEnumeratePhysicalDeviceGroups_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkEnumeratePhysicalDeviceGroups_VkResult_return =
+                        m_state->on_vkEnumeratePhysicalDeviceGroups(
+                            &m_pool, snapshotApiCallInfo, instance, pPhysicalDeviceGroupCount,
+                            pPhysicalDeviceGroupProperties);
+                }
                 if ((vkEnumeratePhysicalDeviceGroups_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkEnumeratePhysicalDeviceGroups_VkResult_return,
@@ -8761,6 +9150,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkImageMemoryRequirementsInfo2));
                 reservedunmarshal_VkImageMemoryRequirementsInfo2(
                     vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
@@ -8785,8 +9175,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pInfo,
                             (unsigned long long)pMemoryRequirements);
                 }
-                m_state->on_vkGetImageMemoryRequirements2(&m_pool, snapshotApiCallInfo, device,
-                                                          pInfo, pMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetImageMemoryRequirements2(&m_pool, snapshotApiCallInfo, device,
+                                                              pInfo, pMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 if (pMemoryRequirements) {
                     transform_fromhost_VkMemoryRequirements2(
@@ -8816,6 +9208,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkBufferMemoryRequirementsInfo2));
                 reservedunmarshal_VkBufferMemoryRequirementsInfo2(
                     vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
@@ -8841,8 +9234,10 @@
                         ioStream, (unsigned long long)device, (unsigned long long)pInfo,
                         (unsigned long long)pMemoryRequirements);
                 }
-                m_state->on_vkGetBufferMemoryRequirements2(&m_pool, snapshotApiCallInfo, device,
-                                                           pInfo, pMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetBufferMemoryRequirements2(&m_pool, snapshotApiCallInfo, device,
+                                                               pInfo, pMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 if (pMemoryRequirements) {
                     transform_fromhost_VkMemoryRequirements2(
@@ -8933,9 +9328,11 @@
                             (unsigned long long)pSparseMemoryRequirementCount,
                             (unsigned long long)pSparseMemoryRequirements);
                 }
-                vk->vkGetImageSparseMemoryRequirements2(unboxed_device, pInfo,
-                                                        pSparseMemoryRequirementCount,
-                                                        pSparseMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetImageSparseMemoryRequirements2(unboxed_device, pInfo,
+                                                            pSparseMemoryRequirementCount,
+                                                            pSparseMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
@@ -8988,6 +9385,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // Begin manual dispatchable handle unboxing for pFeatures;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pFeatures, sizeof(VkPhysicalDeviceFeatures2));
@@ -9003,8 +9401,10 @@
                             ioStream, (unsigned long long)physicalDevice,
                             (unsigned long long)pFeatures);
                 }
-                m_state->on_vkGetPhysicalDeviceFeatures2(&m_pool, snapshotApiCallInfo,
-                                                         physicalDevice, pFeatures);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceFeatures2(&m_pool, snapshotApiCallInfo,
+                                                             physicalDevice, pFeatures);
+                }
                 vkStream->unsetHandleMapping();
                 if (pFeatures) {
                     transform_fromhost_VkPhysicalDeviceFeatures2(
@@ -9033,6 +9433,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // Begin manual dispatchable handle unboxing for pProperties;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pProperties, sizeof(VkPhysicalDeviceProperties2));
@@ -9049,8 +9450,10 @@
                             ioStream, (unsigned long long)physicalDevice,
                             (unsigned long long)pProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceProperties2(&m_pool, snapshotApiCallInfo,
-                                                           physicalDevice, pProperties);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceProperties2(&m_pool, snapshotApiCallInfo,
+                                                               physicalDevice, pProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pProperties) {
                     transform_fromhost_VkPhysicalDeviceProperties2(
@@ -9081,6 +9484,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 memcpy((VkFormat*)&format, *readStreamPtrPtr, sizeof(VkFormat));
                 *readStreamPtrPtr += sizeof(VkFormat);
                 // Begin manual dispatchable handle unboxing for pFormatProperties;
@@ -9100,8 +9504,10 @@
                             ioStream, (unsigned long long)physicalDevice,
                             (unsigned long long)format, (unsigned long long)pFormatProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceFormatProperties2(
-                    &m_pool, snapshotApiCallInfo, physicalDevice, format, pFormatProperties);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceFormatProperties2(
+                        &m_pool, snapshotApiCallInfo, physicalDevice, format, pFormatProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pFormatProperties) {
                     transform_fromhost_VkFormatProperties2(
@@ -9132,6 +9538,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 vkReadStream->alloc((void**)&pImageFormatInfo,
                                     sizeof(const VkPhysicalDeviceImageFormatInfo2));
                 reservedunmarshal_VkPhysicalDeviceImageFormatInfo2(
@@ -9160,11 +9567,14 @@
                             (unsigned long long)pImageFormatInfo,
                             (unsigned long long)pImageFormatProperties);
                 }
-                VkResult vkGetPhysicalDeviceImageFormatProperties2_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceImageFormatProperties2_VkResult_return =
-                    m_state->on_vkGetPhysicalDeviceImageFormatProperties2(
-                        &m_pool, snapshotApiCallInfo, physicalDevice, pImageFormatInfo,
-                        pImageFormatProperties);
+                VkResult vkGetPhysicalDeviceImageFormatProperties2_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetPhysicalDeviceImageFormatProperties2_VkResult_return =
+                        m_state->on_vkGetPhysicalDeviceImageFormatProperties2(
+                            &m_pool, snapshotApiCallInfo, physicalDevice, pImageFormatInfo,
+                            pImageFormatProperties);
+                }
                 if ((vkGetPhysicalDeviceImageFormatProperties2_VkResult_return) ==
                     VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
@@ -9204,6 +9614,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // Begin manual dispatchable handle unboxing for pQueueFamilyPropertyCount;
                 vkReadStream->unsetHandleMapping();
                 // WARNING PTR CHECK
@@ -9249,9 +9660,11 @@
                             (unsigned long long)pQueueFamilyPropertyCount,
                             (unsigned long long)pQueueFamilyProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceQueueFamilyProperties2(
-                    &m_pool, snapshotApiCallInfo, physicalDevice, pQueueFamilyPropertyCount,
-                    pQueueFamilyProperties);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceQueueFamilyProperties2(
+                        &m_pool, snapshotApiCallInfo, physicalDevice, pQueueFamilyPropertyCount,
+                        pQueueFamilyProperties);
+                }
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
@@ -9301,6 +9714,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // Begin manual dispatchable handle unboxing for pMemoryProperties;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryProperties,
@@ -9318,8 +9732,10 @@
                             ioStream, (unsigned long long)physicalDevice,
                             (unsigned long long)pMemoryProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceMemoryProperties2(&m_pool, snapshotApiCallInfo,
-                                                                 physicalDevice, pMemoryProperties);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceMemoryProperties2(
+                        &m_pool, snapshotApiCallInfo, physicalDevice, pMemoryProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pMemoryProperties) {
                     transform_fromhost_VkPhysicalDeviceMemoryProperties2(
@@ -9407,8 +9823,10 @@
                             (unsigned long long)pFormatInfo, (unsigned long long)pPropertyCount,
                             (unsigned long long)pProperties);
                 }
-                vk->vkGetPhysicalDeviceSparseImageFormatProperties2(
-                    unboxed_physicalDevice, pFormatInfo, pPropertyCount, pProperties);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetPhysicalDeviceSparseImageFormatProperties2(
+                        unboxed_physicalDevice, pFormatInfo, pPropertyCount, pProperties);
+                }
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPropertyCount;
@@ -9474,7 +9892,9 @@
                             ioStream, (unsigned long long)device, (unsigned long long)commandPool,
                             (unsigned long long)flags);
                 }
-                vk->vkTrimCommandPool(unboxed_device, commandPool, flags);
+                if (CC_LIKELY(vk)) {
+                    vk->vkTrimCommandPool(unboxed_device, commandPool, flags);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkTrimCommandPool(&m_pool, snapshotApiCallInfo, packet,
@@ -9496,6 +9916,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pQueueInfo, sizeof(const VkDeviceQueueInfo2));
                 reservedunmarshal_VkDeviceQueueInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                      (VkDeviceQueueInfo2*)(pQueueInfo),
@@ -9515,8 +9936,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pQueueInfo,
                             (unsigned long long)pQueue);
                 }
-                m_state->on_vkGetDeviceQueue2(&m_pool, snapshotApiCallInfo, device, pQueueInfo,
-                                              pQueue);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetDeviceQueue2(&m_pool, snapshotApiCallInfo, device, pQueueInfo,
+                                                  pQueue);
+                }
                 vkStream->unsetHandleMapping();
                 uint64_t cgen_var_2;
                 static_assert(8 == sizeof(VkQueue),
@@ -9545,6 +9968,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo,
                                     sizeof(const VkSamplerYcbcrConversionCreateInfo));
                 reservedunmarshal_VkSamplerYcbcrConversionCreateInfo(
@@ -9584,11 +10008,14 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pYcbcrConversion);
                 }
-                VkResult vkCreateSamplerYcbcrConversion_VkResult_return = (VkResult)0;
-                vkCreateSamplerYcbcrConversion_VkResult_return =
-                    m_state->on_vkCreateSamplerYcbcrConversion(&m_pool, snapshotApiCallInfo, device,
-                                                               pCreateInfo, pAllocator,
-                                                               pYcbcrConversion);
+                VkResult vkCreateSamplerYcbcrConversion_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateSamplerYcbcrConversion_VkResult_return =
+                        m_state->on_vkCreateSamplerYcbcrConversion(&m_pool, snapshotApiCallInfo,
+                                                                   device, pCreateInfo, pAllocator,
+                                                                   pYcbcrConversion);
+                }
                 if ((vkCreateSamplerYcbcrConversion_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateSamplerYcbcrConversion_VkResult_return, opcode,
@@ -9629,6 +10056,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for ycbcrConversion;
                 VkSamplerYcbcrConversion boxed_ycbcrConversion_preserve;
                 uint64_t cgen_var_1;
@@ -9660,8 +10088,10 @@
                         ioStream, (unsigned long long)device, (unsigned long long)ycbcrConversion,
                         (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroySamplerYcbcrConversion(&m_pool, snapshotApiCallInfo, device,
-                                                            ycbcrConversion, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroySamplerYcbcrConversion(
+                        &m_pool, snapshotApiCallInfo, device, ycbcrConversion, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroySamplerYcbcrConversion(
@@ -9686,6 +10116,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo,
                                     sizeof(const VkDescriptorUpdateTemplateCreateInfo));
                 reservedunmarshal_VkDescriptorUpdateTemplateCreateInfo(
@@ -9727,11 +10158,14 @@
                             (unsigned long long)pAllocator,
                             (unsigned long long)pDescriptorUpdateTemplate);
                 }
-                VkResult vkCreateDescriptorUpdateTemplate_VkResult_return = (VkResult)0;
-                vkCreateDescriptorUpdateTemplate_VkResult_return =
-                    m_state->on_vkCreateDescriptorUpdateTemplate(&m_pool, snapshotApiCallInfo,
-                                                                 device, pCreateInfo, pAllocator,
-                                                                 pDescriptorUpdateTemplate);
+                VkResult vkCreateDescriptorUpdateTemplate_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateDescriptorUpdateTemplate_VkResult_return =
+                        m_state->on_vkCreateDescriptorUpdateTemplate(
+                            &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator,
+                            pDescriptorUpdateTemplate);
+                }
                 if ((vkCreateDescriptorUpdateTemplate_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateDescriptorUpdateTemplate_VkResult_return,
@@ -9773,6 +10207,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for
                 // descriptorUpdateTemplate;
                 VkDescriptorUpdateTemplate boxed_descriptorUpdateTemplate_preserve;
@@ -9807,8 +10242,10 @@
                         (unsigned long long)descriptorUpdateTemplate,
                         (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyDescriptorUpdateTemplate(&m_pool, snapshotApiCallInfo, device,
-                                                              descriptorUpdateTemplate, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyDescriptorUpdateTemplate(
+                        &m_pool, snapshotApiCallInfo, device, descriptorUpdateTemplate, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyDescriptorUpdateTemplate(
@@ -9864,8 +10301,10 @@
                             (unsigned long long)descriptorUpdateTemplate,
                             (unsigned long long)pData);
                 }
-                vk->vkUpdateDescriptorSetWithTemplate(unboxed_device, descriptorSet,
-                                                      descriptorUpdateTemplate, pData);
+                if (CC_LIKELY(vk)) {
+                    vk->vkUpdateDescriptorSetWithTemplate(unboxed_device, descriptorSet,
+                                                          descriptorUpdateTemplate, pData);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkUpdateDescriptorSetWithTemplate(
@@ -9924,8 +10363,10 @@
                             (unsigned long long)pExternalBufferInfo,
                             (unsigned long long)pExternalBufferProperties);
                 }
-                vk->vkGetPhysicalDeviceExternalBufferProperties(
-                    unboxed_physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetPhysicalDeviceExternalBufferProperties(
+                        unboxed_physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pExternalBufferProperties) {
                     m_state->transformImpl_VkExternalBufferProperties_fromhost(
@@ -9990,8 +10431,10 @@
                             (unsigned long long)pExternalFenceInfo,
                             (unsigned long long)pExternalFenceProperties);
                 }
-                vk->vkGetPhysicalDeviceExternalFenceProperties(
-                    unboxed_physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetPhysicalDeviceExternalFenceProperties(
+                        unboxed_physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pExternalFenceProperties) {
                     transform_fromhost_VkExternalFenceProperties(
@@ -10023,6 +10466,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 vkReadStream->alloc((void**)&pExternalSemaphoreInfo,
                                     sizeof(const VkPhysicalDeviceExternalSemaphoreInfo));
                 reservedunmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
@@ -10053,9 +10497,11 @@
                             (unsigned long long)pExternalSemaphoreInfo,
                             (unsigned long long)pExternalSemaphoreProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceExternalSemaphoreProperties(
-                    &m_pool, snapshotApiCallInfo, physicalDevice, pExternalSemaphoreInfo,
-                    pExternalSemaphoreProperties);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceExternalSemaphoreProperties(
+                        &m_pool, snapshotApiCallInfo, physicalDevice, pExternalSemaphoreInfo,
+                        pExternalSemaphoreProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pExternalSemaphoreProperties) {
                     transform_fromhost_VkExternalSemaphoreProperties(
@@ -10115,7 +10561,9 @@
                         ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                         (unsigned long long)pSupport);
                 }
-                vk->vkGetDescriptorSetLayoutSupport(unboxed_device, pCreateInfo, pSupport);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetDescriptorSetLayoutSupport(unboxed_device, pCreateInfo, pSupport);
+                }
                 vkStream->unsetHandleMapping();
                 if (pSupport) {
                     transform_fromhost_VkDescriptorSetLayoutSupport(
@@ -10180,8 +10628,10 @@
                             (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount,
                             (unsigned long long)stride);
                 }
-                vk->vkCmdDrawIndirectCount(unboxed_commandBuffer, buffer, offset, countBuffer,
-                                           countBufferOffset, maxDrawCount, stride);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDrawIndirectCount(unboxed_commandBuffer, buffer, offset, countBuffer,
+                                               countBufferOffset, maxDrawCount, stride);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdDrawIndirectCount(
@@ -10237,9 +10687,11 @@
                             (unsigned long long)countBufferOffset, (unsigned long long)maxDrawCount,
                             (unsigned long long)stride);
                 }
-                vk->vkCmdDrawIndexedIndirectCount(unboxed_commandBuffer, buffer, offset,
-                                                  countBuffer, countBufferOffset, maxDrawCount,
-                                                  stride);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDrawIndexedIndirectCount(unboxed_commandBuffer, buffer, offset,
+                                                      countBuffer, countBufferOffset, maxDrawCount,
+                                                      stride);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdDrawIndexedIndirectCount(
@@ -10263,6 +10715,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkRenderPassCreateInfo2));
                 reservedunmarshal_VkRenderPassCreateInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                           (VkRenderPassCreateInfo2*)(pCreateInfo),
@@ -10299,9 +10752,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pRenderPass);
                 }
-                VkResult vkCreateRenderPass2_VkResult_return = (VkResult)0;
-                vkCreateRenderPass2_VkResult_return = m_state->on_vkCreateRenderPass2(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pRenderPass);
+                VkResult vkCreateRenderPass2_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateRenderPass2_VkResult_return = m_state->on_vkCreateRenderPass2(
+                        &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pRenderPass);
+                }
                 if ((vkCreateRenderPass2_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateRenderPass2_VkResult_return, opcode, context);
@@ -10340,6 +10795,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 vkReadStream->alloc((void**)&pRenderPassBegin, sizeof(const VkRenderPassBeginInfo));
                 reservedunmarshal_VkRenderPassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                         (VkRenderPassBeginInfo*)(pRenderPassBegin),
@@ -10362,8 +10818,10 @@
                             (unsigned long long)pRenderPassBegin,
                             (unsigned long long)pSubpassBeginInfo);
                 }
-                m_state->on_vkCmdBeginRenderPass2(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                                  pRenderPassBegin, pSubpassBeginInfo);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdBeginRenderPass2(&m_pool, snapshotApiCallInfo, commandBuffer,
+                                                      pRenderPassBegin, pSubpassBeginInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBeginRenderPass2(&m_pool, snapshotApiCallInfo, packet,
@@ -10412,7 +10870,10 @@
                             (unsigned long long)pSubpassBeginInfo,
                             (unsigned long long)pSubpassEndInfo);
                 }
-                vk->vkCmdNextSubpass2(unboxed_commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdNextSubpass2(unboxed_commandBuffer, pSubpassBeginInfo,
+                                          pSubpassEndInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdNextSubpass2(&m_pool, snapshotApiCallInfo, packet,
@@ -10451,7 +10912,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pSubpassEndInfo);
                 }
-                vk->vkCmdEndRenderPass2(unboxed_commandBuffer, pSubpassEndInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndRenderPass2(unboxed_commandBuffer, pSubpassEndInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdEndRenderPass2(&m_pool, snapshotApiCallInfo, packet,
@@ -10493,7 +10956,9 @@
                             ioStream, (unsigned long long)device, (unsigned long long)queryPool,
                             (unsigned long long)firstQuery, (unsigned long long)queryCount);
                 }
-                vk->vkResetQueryPool(unboxed_device, queryPool, firstQuery, queryCount);
+                if (CC_LIKELY(vk)) {
+                    vk->vkResetQueryPool(unboxed_device, queryPool, firstQuery, queryCount);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkResetQueryPool(&m_pool, snapshotApiCallInfo, packet,
@@ -10535,9 +11000,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)semaphore,
                             (unsigned long long)pValue);
                 }
-                VkResult vkGetSemaphoreCounterValue_VkResult_return = (VkResult)0;
-                vkGetSemaphoreCounterValue_VkResult_return =
-                    vk->vkGetSemaphoreCounterValue(unboxed_device, semaphore, pValue);
+                VkResult vkGetSemaphoreCounterValue_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetSemaphoreCounterValue_VkResult_return =
+                        vk->vkGetSemaphoreCounterValue(unboxed_device, semaphore, pValue);
+                }
                 if ((vkGetSemaphoreCounterValue_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetSemaphoreCounterValue_VkResult_return, opcode,
@@ -10567,6 +11034,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pWaitInfo, sizeof(const VkSemaphoreWaitInfo));
                 reservedunmarshal_VkSemaphoreWaitInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                       (VkSemaphoreWaitInfo*)(pWaitInfo),
@@ -10584,9 +11052,11 @@
                 }
                 if (m_queueSubmitWithCommandsEnabled)
                     seqnoPtr->fetch_add(1, std::memory_order_seq_cst);
-                VkResult vkWaitSemaphores_VkResult_return = (VkResult)0;
-                vkWaitSemaphores_VkResult_return = m_state->on_vkWaitSemaphores(
-                    &m_pool, snapshotApiCallInfo, device, pWaitInfo, timeout);
+                VkResult vkWaitSemaphores_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkWaitSemaphores_VkResult_return = m_state->on_vkWaitSemaphores(
+                        &m_pool, snapshotApiCallInfo, device, pWaitInfo, timeout);
+                }
                 if ((vkWaitSemaphores_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkWaitSemaphores_VkResult_return, opcode, context);
@@ -10611,6 +11081,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pSignalInfo, sizeof(const VkSemaphoreSignalInfo));
                 reservedunmarshal_VkSemaphoreSignalInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                         (VkSemaphoreSignalInfo*)(pSignalInfo),
@@ -10623,9 +11094,11 @@
                     fprintf(stderr, "stream %p: call vkSignalSemaphore 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)device, (unsigned long long)pSignalInfo);
                 }
-                VkResult vkSignalSemaphore_VkResult_return = (VkResult)0;
-                vkSignalSemaphore_VkResult_return = m_state->on_vkSignalSemaphore(
-                    &m_pool, snapshotApiCallInfo, device, pSignalInfo);
+                VkResult vkSignalSemaphore_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkSignalSemaphore_VkResult_return = m_state->on_vkSignalSemaphore(
+                        &m_pool, snapshotApiCallInfo, device, pSignalInfo);
+                }
                 if ((vkSignalSemaphore_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkSignalSemaphore_VkResult_return, opcode, context);
@@ -10669,8 +11142,10 @@
                 }
                 VkDeviceAddress vkGetBufferDeviceAddress_VkDeviceAddress_return =
                     (VkDeviceAddress)0;
-                vkGetBufferDeviceAddress_VkDeviceAddress_return =
-                    vk->vkGetBufferDeviceAddress(unboxed_device, pInfo);
+                if (CC_LIKELY(vk)) {
+                    vkGetBufferDeviceAddress_VkDeviceAddress_return =
+                        vk->vkGetBufferDeviceAddress(unboxed_device, pInfo);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetBufferDeviceAddress_VkDeviceAddress_return,
                                 sizeof(VkDeviceAddress));
@@ -10712,8 +11187,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pInfo);
                 }
                 uint64_t vkGetBufferOpaqueCaptureAddress_uint64_t_return = (uint64_t)0;
-                vkGetBufferOpaqueCaptureAddress_uint64_t_return =
-                    vk->vkGetBufferOpaqueCaptureAddress(unboxed_device, pInfo);
+                if (CC_LIKELY(vk)) {
+                    vkGetBufferOpaqueCaptureAddress_uint64_t_return =
+                        vk->vkGetBufferOpaqueCaptureAddress(unboxed_device, pInfo);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetBufferOpaqueCaptureAddress_uint64_t_return, sizeof(uint64_t));
                 vkStream->commitWrite();
@@ -10756,8 +11233,10 @@
                         ioStream, (unsigned long long)device, (unsigned long long)pInfo);
                 }
                 uint64_t vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return = (uint64_t)0;
-                vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return =
-                    vk->vkGetDeviceMemoryOpaqueCaptureAddress(unboxed_device, pInfo);
+                if (CC_LIKELY(vk)) {
+                    vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return =
+                        vk->vkGetDeviceMemoryOpaqueCaptureAddress(unboxed_device, pInfo);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return,
                                 sizeof(uint64_t));
@@ -10831,10 +11310,13 @@
                         ioStream, (unsigned long long)physicalDevice,
                         (unsigned long long)pToolCount, (unsigned long long)pToolProperties);
                 }
-                VkResult vkGetPhysicalDeviceToolProperties_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceToolProperties_VkResult_return =
-                    vk->vkGetPhysicalDeviceToolProperties(unboxed_physicalDevice, pToolCount,
-                                                          pToolProperties);
+                VkResult vkGetPhysicalDeviceToolProperties_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetPhysicalDeviceToolProperties_VkResult_return =
+                        vk->vkGetPhysicalDeviceToolProperties(unboxed_physicalDevice, pToolCount,
+                                                              pToolProperties);
+                }
                 if ((vkGetPhysicalDeviceToolProperties_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetPhysicalDeviceToolProperties_VkResult_return,
@@ -10933,9 +11415,11 @@
                         ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                         (unsigned long long)pAllocator, (unsigned long long)pPrivateDataSlot);
                 }
-                VkResult vkCreatePrivateDataSlot_VkResult_return = (VkResult)0;
-                vkCreatePrivateDataSlot_VkResult_return = vk->vkCreatePrivateDataSlot(
-                    unboxed_device, pCreateInfo, pAllocator, pPrivateDataSlot);
+                VkResult vkCreatePrivateDataSlot_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreatePrivateDataSlot_VkResult_return = vk->vkCreatePrivateDataSlot(
+                        unboxed_device, pCreateInfo, pAllocator, pPrivateDataSlot);
+                }
                 if ((vkCreatePrivateDataSlot_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreatePrivateDataSlot_VkResult_return, opcode,
@@ -11008,7 +11492,9 @@
                             ioStream, (unsigned long long)device,
                             (unsigned long long)privateDataSlot, (unsigned long long)pAllocator);
                 }
-                vk->vkDestroyPrivateDataSlot(unboxed_device, privateDataSlot, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    vk->vkDestroyPrivateDataSlot(unboxed_device, privateDataSlot, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyPrivateDataSlot(
@@ -11056,9 +11542,11 @@
                         (unsigned long long)objectHandle, (unsigned long long)privateDataSlot,
                         (unsigned long long)data);
                 }
-                VkResult vkSetPrivateData_VkResult_return = (VkResult)0;
-                vkSetPrivateData_VkResult_return = vk->vkSetPrivateData(
-                    unboxed_device, objectType, objectHandle, privateDataSlot, data);
+                VkResult vkSetPrivateData_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkSetPrivateData_VkResult_return = vk->vkSetPrivateData(
+                        unboxed_device, objectType, objectHandle, privateDataSlot, data);
+                }
                 if ((vkSetPrivateData_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkSetPrivateData_VkResult_return, opcode, context);
@@ -11114,8 +11602,10 @@
                         (unsigned long long)objectHandle, (unsigned long long)privateDataSlot,
                         (unsigned long long)pData);
                 }
-                vk->vkGetPrivateData(unboxed_device, objectType, objectHandle, privateDataSlot,
-                                     pData);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetPrivateData(unboxed_device, objectType, objectHandle, privateDataSlot,
+                                         pData);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write((uint64_t*)pData, sizeof(uint64_t));
                 vkStream->commitWrite();
@@ -11160,7 +11650,9 @@
                             ioStream, (unsigned long long)commandBuffer, (unsigned long long)event,
                             (unsigned long long)pDependencyInfo);
                 }
-                vk->vkCmdSetEvent2(unboxed_commandBuffer, event, pDependencyInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetEvent2(unboxed_commandBuffer, event, pDependencyInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetEvent2(&m_pool, snapshotApiCallInfo, packet,
@@ -11199,7 +11691,9 @@
                             ioStream, (unsigned long long)commandBuffer, (unsigned long long)event,
                             (unsigned long long)stageMask);
                 }
-                vk->vkCmdResetEvent2(unboxed_commandBuffer, event, stageMask);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdResetEvent2(unboxed_commandBuffer, event, stageMask);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdResetEvent2(&m_pool, snapshotApiCallInfo, packet,
@@ -11259,7 +11753,10 @@
                         ioStream, (unsigned long long)commandBuffer, (unsigned long long)eventCount,
                         (unsigned long long)pEvents, (unsigned long long)pDependencyInfos);
                 }
-                vk->vkCmdWaitEvents2(unboxed_commandBuffer, eventCount, pEvents, pDependencyInfos);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdWaitEvents2(unboxed_commandBuffer, eventCount, pEvents,
+                                         pDependencyInfos);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdWaitEvents2(&m_pool, snapshotApiCallInfo, packet,
@@ -11282,6 +11779,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 vkReadStream->alloc((void**)&pDependencyInfo, sizeof(const VkDependencyInfo));
                 reservedunmarshal_VkDependencyInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                    (VkDependencyInfo*)(pDependencyInfo),
@@ -11295,8 +11793,10 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pDependencyInfo);
                 }
-                m_state->on_vkCmdPipelineBarrier2(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                                  pDependencyInfo);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdPipelineBarrier2(&m_pool, snapshotApiCallInfo, commandBuffer,
+                                                      pDependencyInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdPipelineBarrier2(&m_pool, snapshotApiCallInfo, packet,
@@ -11340,7 +11840,9 @@
                             ioStream, (unsigned long long)commandBuffer, (unsigned long long)stage,
                             (unsigned long long)queryPool, (unsigned long long)query);
                 }
-                vk->vkCmdWriteTimestamp2(unboxed_commandBuffer, stage, queryPool, query);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdWriteTimestamp2(unboxed_commandBuffer, stage, queryPool, query);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdWriteTimestamp2(&m_pool, snapshotApiCallInfo, packet,
@@ -11363,6 +11865,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 memcpy((uint32_t*)&submitCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pSubmits,
@@ -11386,9 +11889,11 @@
                             ioStream, (unsigned long long)queue, (unsigned long long)submitCount,
                             (unsigned long long)pSubmits, (unsigned long long)fence);
                 }
-                VkResult vkQueueSubmit2_VkResult_return = (VkResult)0;
-                vkQueueSubmit2_VkResult_return = m_state->on_vkQueueSubmit2(
-                    &m_pool, snapshotApiCallInfo, queue, submitCount, pSubmits, fence);
+                VkResult vkQueueSubmit2_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkQueueSubmit2_VkResult_return = m_state->on_vkQueueSubmit2(
+                        &m_pool, snapshotApiCallInfo, queue, submitCount, pSubmits, fence);
+                }
                 if ((vkQueueSubmit2_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkQueueSubmit2_VkResult_return, opcode, context);
@@ -11431,7 +11936,9 @@
                     fprintf(stderr, "stream %p: call vkCmdCopyBuffer2 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer, (unsigned long long)pCopyBufferInfo);
                 }
-                vk->vkCmdCopyBuffer2(unboxed_commandBuffer, pCopyBufferInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdCopyBuffer2(unboxed_commandBuffer, pCopyBufferInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdCopyBuffer2(&m_pool, snapshotApiCallInfo, packet,
@@ -11454,6 +11961,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 vkReadStream->alloc((void**)&pCopyImageInfo, sizeof(const VkCopyImageInfo2));
                 reservedunmarshal_VkCopyImageInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                    (VkCopyImageInfo2*)(pCopyImageInfo),
@@ -11465,8 +11973,10 @@
                     fprintf(stderr, "stream %p: call vkCmdCopyImage2 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer, (unsigned long long)pCopyImageInfo);
                 }
-                m_state->on_vkCmdCopyImage2(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                            pCopyImageInfo);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdCopyImage2(&m_pool, snapshotApiCallInfo, commandBuffer,
+                                                pCopyImageInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdCopyImage2(&m_pool, snapshotApiCallInfo, packet,
@@ -11488,6 +11998,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 vkReadStream->alloc((void**)&pCopyBufferToImageInfo,
                                     sizeof(const VkCopyBufferToImageInfo2));
                 reservedunmarshal_VkCopyBufferToImageInfo2(
@@ -11502,8 +12013,10 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pCopyBufferToImageInfo);
                 }
-                m_state->on_vkCmdCopyBufferToImage2(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                                    pCopyBufferToImageInfo, context);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdCopyBufferToImage2(&m_pool, snapshotApiCallInfo, commandBuffer,
+                                                        pCopyBufferToImageInfo, context);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdCopyBufferToImage2(&m_pool, snapshotApiCallInfo,
@@ -11526,6 +12039,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 vkReadStream->alloc((void**)&pCopyImageToBufferInfo,
                                     sizeof(const VkCopyImageToBufferInfo2));
                 reservedunmarshal_VkCopyImageToBufferInfo2(
@@ -11540,8 +12054,10 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pCopyImageToBufferInfo);
                 }
-                m_state->on_vkCmdCopyImageToBuffer2(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                                    pCopyImageToBufferInfo);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdCopyImageToBuffer2(&m_pool, snapshotApiCallInfo, commandBuffer,
+                                                        pCopyImageToBufferInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdCopyImageToBuffer2(&m_pool, snapshotApiCallInfo,
@@ -11578,7 +12094,9 @@
                     fprintf(stderr, "stream %p: call vkCmdBlitImage2 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer, (unsigned long long)pBlitImageInfo);
                 }
-                vk->vkCmdBlitImage2(unboxed_commandBuffer, pBlitImageInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBlitImage2(unboxed_commandBuffer, pBlitImageInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBlitImage2(&m_pool, snapshotApiCallInfo, packet,
@@ -11616,7 +12134,9 @@
                             (unsigned long long)commandBuffer,
                             (unsigned long long)pResolveImageInfo);
                 }
-                vk->vkCmdResolveImage2(unboxed_commandBuffer, pResolveImageInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdResolveImage2(unboxed_commandBuffer, pResolveImageInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdResolveImage2(&m_pool, snapshotApiCallInfo, packet,
@@ -11654,7 +12174,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pRenderingInfo);
                 }
-                vk->vkCmdBeginRendering(unboxed_commandBuffer, pRenderingInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBeginRendering(unboxed_commandBuffer, pRenderingInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBeginRendering(&m_pool, snapshotApiCallInfo, packet,
@@ -11683,7 +12205,9 @@
                     fprintf(stderr, "stream %p: call vkCmdEndRendering 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer);
                 }
-                vk->vkCmdEndRendering(unboxed_commandBuffer);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndRendering(unboxed_commandBuffer);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdEndRendering(&m_pool, snapshotApiCallInfo, packet,
@@ -11714,7 +12238,9 @@
                     fprintf(stderr, "stream %p: call vkCmdSetCullMode 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer, (unsigned long long)cullMode);
                 }
-                vk->vkCmdSetCullMode(unboxed_commandBuffer, cullMode);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetCullMode(unboxed_commandBuffer, cullMode);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetCullMode(&m_pool, snapshotApiCallInfo, packet,
@@ -11745,7 +12271,9 @@
                     fprintf(stderr, "stream %p: call vkCmdSetFrontFace 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer, (unsigned long long)frontFace);
                 }
-                vk->vkCmdSetFrontFace(unboxed_commandBuffer, frontFace);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetFrontFace(unboxed_commandBuffer, frontFace);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetFrontFace(&m_pool, snapshotApiCallInfo, packet,
@@ -11778,7 +12306,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)primitiveTopology);
                 }
-                vk->vkCmdSetPrimitiveTopology(unboxed_commandBuffer, primitiveTopology);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetPrimitiveTopology(unboxed_commandBuffer, primitiveTopology);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetPrimitiveTopology(&m_pool, snapshotApiCallInfo,
@@ -11824,7 +12354,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)viewportCount, (unsigned long long)pViewports);
                 }
-                vk->vkCmdSetViewportWithCount(unboxed_commandBuffer, viewportCount, pViewports);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetViewportWithCount(unboxed_commandBuffer, viewportCount, pViewports);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetViewportWithCount(&m_pool, snapshotApiCallInfo,
@@ -11869,7 +12401,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)scissorCount, (unsigned long long)pScissors);
                 }
-                vk->vkCmdSetScissorWithCount(unboxed_commandBuffer, scissorCount, pScissors);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetScissorWithCount(unboxed_commandBuffer, scissorCount, pScissors);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetScissorWithCount(&m_pool, snapshotApiCallInfo,
@@ -11959,8 +12493,10 @@
                             (unsigned long long)pBuffers, (unsigned long long)pOffsets,
                             (unsigned long long)pSizes, (unsigned long long)pStrides);
                 }
-                vk->vkCmdBindVertexBuffers2(unboxed_commandBuffer, firstBinding, bindingCount,
-                                            pBuffers, pOffsets, pSizes, pStrides);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBindVertexBuffers2(unboxed_commandBuffer, firstBinding, bindingCount,
+                                                pBuffers, pOffsets, pSizes, pStrides);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBindVertexBuffers2(
@@ -11993,7 +12529,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)depthTestEnable);
                 }
-                vk->vkCmdSetDepthTestEnable(unboxed_commandBuffer, depthTestEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthTestEnable(unboxed_commandBuffer, depthTestEnable);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetDepthTestEnable(&m_pool, snapshotApiCallInfo,
@@ -12026,7 +12564,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)depthWriteEnable);
                 }
-                vk->vkCmdSetDepthWriteEnable(unboxed_commandBuffer, depthWriteEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthWriteEnable(unboxed_commandBuffer, depthWriteEnable);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetDepthWriteEnable(&m_pool, snapshotApiCallInfo,
@@ -12059,7 +12599,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)depthCompareOp);
                 }
-                vk->vkCmdSetDepthCompareOp(unboxed_commandBuffer, depthCompareOp);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthCompareOp(unboxed_commandBuffer, depthCompareOp);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetDepthCompareOp(&m_pool, snapshotApiCallInfo,
@@ -12093,7 +12635,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)depthBoundsTestEnable);
                 }
-                vk->vkCmdSetDepthBoundsTestEnable(unboxed_commandBuffer, depthBoundsTestEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthBoundsTestEnable(unboxed_commandBuffer, depthBoundsTestEnable);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetDepthBoundsTestEnable(
@@ -12126,7 +12670,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)stencilTestEnable);
                 }
-                vk->vkCmdSetStencilTestEnable(unboxed_commandBuffer, stencilTestEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetStencilTestEnable(unboxed_commandBuffer, stencilTestEnable);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetStencilTestEnable(&m_pool, snapshotApiCallInfo,
@@ -12176,8 +12722,10 @@
                             (unsigned long long)passOp, (unsigned long long)depthFailOp,
                             (unsigned long long)compareOp);
                 }
-                vk->vkCmdSetStencilOp(unboxed_commandBuffer, faceMask, failOp, passOp, depthFailOp,
-                                      compareOp);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetStencilOp(unboxed_commandBuffer, faceMask, failOp, passOp,
+                                          depthFailOp, compareOp);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetStencilOp(&m_pool, snapshotApiCallInfo, packet,
@@ -12211,7 +12759,10 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)rasterizerDiscardEnable);
                 }
-                vk->vkCmdSetRasterizerDiscardEnable(unboxed_commandBuffer, rasterizerDiscardEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetRasterizerDiscardEnable(unboxed_commandBuffer,
+                                                        rasterizerDiscardEnable);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetRasterizerDiscardEnable(
@@ -12244,7 +12795,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)depthBiasEnable);
                 }
-                vk->vkCmdSetDepthBiasEnable(unboxed_commandBuffer, depthBiasEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthBiasEnable(unboxed_commandBuffer, depthBiasEnable);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetDepthBiasEnable(&m_pool, snapshotApiCallInfo,
@@ -12278,7 +12831,10 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)primitiveRestartEnable);
                 }
-                vk->vkCmdSetPrimitiveRestartEnable(unboxed_commandBuffer, primitiveRestartEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetPrimitiveRestartEnable(unboxed_commandBuffer,
+                                                       primitiveRestartEnable);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetPrimitiveRestartEnable(
@@ -12329,7 +12885,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pInfo,
                             (unsigned long long)pMemoryRequirements);
                 }
-                vk->vkGetDeviceBufferMemoryRequirements(unboxed_device, pInfo, pMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetDeviceBufferMemoryRequirements(unboxed_device, pInfo,
+                                                            pMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 if (pMemoryRequirements) {
                     transform_fromhost_VkMemoryRequirements2(
@@ -12387,7 +12946,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pInfo,
                             (unsigned long long)pMemoryRequirements);
                 }
-                vk->vkGetDeviceImageMemoryRequirements(unboxed_device, pInfo, pMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetDeviceImageMemoryRequirements(unboxed_device, pInfo,
+                                                           pMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 if (pMemoryRequirements) {
                     transform_fromhost_VkMemoryRequirements2(
@@ -12477,9 +13039,11 @@
                             (unsigned long long)pSparseMemoryRequirementCount,
                             (unsigned long long)pSparseMemoryRequirements);
                 }
-                vk->vkGetDeviceImageSparseMemoryRequirements(unboxed_device, pInfo,
-                                                             pSparseMemoryRequirementCount,
-                                                             pSparseMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetDeviceImageSparseMemoryRequirements(unboxed_device, pInfo,
+                                                                 pSparseMemoryRequirementCount,
+                                                                 pSparseMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
@@ -12574,9 +13138,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pSwapchain);
                 }
-                VkResult vkCreateSwapchainKHR_VkResult_return = (VkResult)0;
-                vkCreateSwapchainKHR_VkResult_return =
-                    vk->vkCreateSwapchainKHR(unboxed_device, pCreateInfo, pAllocator, pSwapchain);
+                VkResult vkCreateSwapchainKHR_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateSwapchainKHR_VkResult_return = vk->vkCreateSwapchainKHR(
+                        unboxed_device, pCreateInfo, pAllocator, pSwapchain);
+                }
                 if ((vkCreateSwapchainKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateSwapchainKHR_VkResult_return, opcode, context);
@@ -12647,7 +13213,9 @@
                             ioStream, (unsigned long long)device, (unsigned long long)swapchain,
                             (unsigned long long)pAllocator);
                 }
-                vk->vkDestroySwapchainKHR(unboxed_device, swapchain, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    vk->vkDestroySwapchainKHR(unboxed_device, swapchain, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroySwapchainKHR(
@@ -12721,9 +13289,11 @@
                         (unsigned long long)pSwapchainImageCount,
                         (unsigned long long)pSwapchainImages);
                 }
-                VkResult vkGetSwapchainImagesKHR_VkResult_return = (VkResult)0;
-                vkGetSwapchainImagesKHR_VkResult_return = vk->vkGetSwapchainImagesKHR(
-                    unboxed_device, swapchain, pSwapchainImageCount, pSwapchainImages);
+                VkResult vkGetSwapchainImagesKHR_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetSwapchainImagesKHR_VkResult_return = vk->vkGetSwapchainImagesKHR(
+                        unboxed_device, swapchain, pSwapchainImageCount, pSwapchainImages);
+                }
                 if ((vkGetSwapchainImagesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetSwapchainImagesKHR_VkResult_return, opcode,
@@ -12806,9 +13376,11 @@
                             (unsigned long long)timeout, (unsigned long long)semaphore,
                             (unsigned long long)fence, (unsigned long long)pImageIndex);
                 }
-                VkResult vkAcquireNextImageKHR_VkResult_return = (VkResult)0;
-                vkAcquireNextImageKHR_VkResult_return = vk->vkAcquireNextImageKHR(
-                    unboxed_device, swapchain, timeout, semaphore, fence, pImageIndex);
+                VkResult vkAcquireNextImageKHR_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkAcquireNextImageKHR_VkResult_return = vk->vkAcquireNextImageKHR(
+                        unboxed_device, swapchain, timeout, semaphore, fence, pImageIndex);
+                }
                 if ((vkAcquireNextImageKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkAcquireNextImageKHR_VkResult_return, opcode,
@@ -12838,6 +13410,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 vkReadStream->alloc((void**)&pPresentInfo, sizeof(const VkPresentInfoKHR));
                 reservedunmarshal_VkPresentInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                    (VkPresentInfoKHR*)(pPresentInfo),
@@ -12849,9 +13422,11 @@
                     fprintf(stderr, "stream %p: call vkQueuePresentKHR 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)queue, (unsigned long long)pPresentInfo);
                 }
-                VkResult vkQueuePresentKHR_VkResult_return = (VkResult)0;
-                vkQueuePresentKHR_VkResult_return = m_state->on_vkQueuePresentKHR(
-                    &m_pool, snapshotApiCallInfo, queue, pPresentInfo);
+                VkResult vkQueuePresentKHR_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkQueuePresentKHR_VkResult_return = m_state->on_vkQueuePresentKHR(
+                        &m_pool, snapshotApiCallInfo, queue, pPresentInfo);
+                }
                 if ((vkQueuePresentKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkQueuePresentKHR_VkResult_return, opcode, context);
@@ -12901,10 +13476,13 @@
                         ioStream, (unsigned long long)device,
                         (unsigned long long)pDeviceGroupPresentCapabilities);
                 }
-                VkResult vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return = (VkResult)0;
-                vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return =
-                    vk->vkGetDeviceGroupPresentCapabilitiesKHR(unboxed_device,
-                                                               pDeviceGroupPresentCapabilities);
+                VkResult vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return =
+                        vk->vkGetDeviceGroupPresentCapabilitiesKHR(unboxed_device,
+                                                                   pDeviceGroupPresentCapabilities);
+                }
                 if ((vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return) ==
                     VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
@@ -12971,9 +13549,12 @@
                             ioStream, (unsigned long long)device, (unsigned long long)surface,
                             (unsigned long long)pModes);
                 }
-                VkResult vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return = (VkResult)0;
-                vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return =
-                    vk->vkGetDeviceGroupSurfacePresentModesKHR(unboxed_device, surface, pModes);
+                VkResult vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return =
+                        vk->vkGetDeviceGroupSurfacePresentModesKHR(unboxed_device, surface, pModes);
+                }
                 if ((vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return) ==
                     VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
@@ -13061,10 +13642,13 @@
                             (unsigned long long)surface, (unsigned long long)pRectCount,
                             (unsigned long long)pRects);
                 }
-                VkResult vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return =
-                    vk->vkGetPhysicalDevicePresentRectanglesKHR(unboxed_physicalDevice, surface,
-                                                                pRectCount, pRects);
+                VkResult vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return =
+                        vk->vkGetPhysicalDevicePresentRectanglesKHR(unboxed_physicalDevice, surface,
+                                                                    pRectCount, pRects);
+                }
                 if ((vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return) ==
                     VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
@@ -13142,9 +13726,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pAcquireInfo,
                             (unsigned long long)pImageIndex);
                 }
-                VkResult vkAcquireNextImage2KHR_VkResult_return = (VkResult)0;
-                vkAcquireNextImage2KHR_VkResult_return =
-                    vk->vkAcquireNextImage2KHR(unboxed_device, pAcquireInfo, pImageIndex);
+                VkResult vkAcquireNextImage2KHR_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkAcquireNextImage2KHR_VkResult_return =
+                        vk->vkAcquireNextImage2KHR(unboxed_device, pAcquireInfo, pImageIndex);
+                }
                 if ((vkAcquireNextImage2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkAcquireNextImage2KHR_VkResult_return, opcode,
@@ -13191,7 +13777,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pRenderingInfo);
                 }
-                vk->vkCmdBeginRenderingKHR(unboxed_commandBuffer, pRenderingInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBeginRenderingKHR(unboxed_commandBuffer, pRenderingInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBeginRenderingKHR(&m_pool, snapshotApiCallInfo,
@@ -13220,7 +13808,9 @@
                     fprintf(stderr, "stream %p: call vkCmdEndRenderingKHR 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer);
                 }
-                vk->vkCmdEndRenderingKHR(unboxed_commandBuffer);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndRenderingKHR(unboxed_commandBuffer);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdEndRenderingKHR(&m_pool, snapshotApiCallInfo, packet,
@@ -13244,6 +13834,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // Begin manual dispatchable handle unboxing for pFeatures;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pFeatures, sizeof(VkPhysicalDeviceFeatures2));
@@ -13260,8 +13851,10 @@
                             ioStream, (unsigned long long)physicalDevice,
                             (unsigned long long)pFeatures);
                 }
-                m_state->on_vkGetPhysicalDeviceFeatures2KHR(&m_pool, snapshotApiCallInfo,
-                                                            physicalDevice, pFeatures);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceFeatures2KHR(&m_pool, snapshotApiCallInfo,
+                                                                physicalDevice, pFeatures);
+                }
                 vkStream->unsetHandleMapping();
                 if (pFeatures) {
                     transform_fromhost_VkPhysicalDeviceFeatures2(
@@ -13290,6 +13883,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // Begin manual dispatchable handle unboxing for pProperties;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pProperties, sizeof(VkPhysicalDeviceProperties2));
@@ -13306,8 +13900,10 @@
                             ioStream, (unsigned long long)physicalDevice,
                             (unsigned long long)pProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceProperties2KHR(&m_pool, snapshotApiCallInfo,
-                                                              physicalDevice, pProperties);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceProperties2KHR(&m_pool, snapshotApiCallInfo,
+                                                                  physicalDevice, pProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pProperties) {
                     transform_fromhost_VkPhysicalDeviceProperties2(
@@ -13338,6 +13934,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 memcpy((VkFormat*)&format, *readStreamPtrPtr, sizeof(VkFormat));
                 *readStreamPtrPtr += sizeof(VkFormat);
                 // Begin manual dispatchable handle unboxing for pFormatProperties;
@@ -13357,8 +13954,10 @@
                             ioStream, (unsigned long long)physicalDevice,
                             (unsigned long long)format, (unsigned long long)pFormatProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceFormatProperties2KHR(
-                    &m_pool, snapshotApiCallInfo, physicalDevice, format, pFormatProperties);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceFormatProperties2KHR(
+                        &m_pool, snapshotApiCallInfo, physicalDevice, format, pFormatProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pFormatProperties) {
                     transform_fromhost_VkFormatProperties2(
@@ -13389,6 +13988,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 vkReadStream->alloc((void**)&pImageFormatInfo,
                                     sizeof(const VkPhysicalDeviceImageFormatInfo2));
                 reservedunmarshal_VkPhysicalDeviceImageFormatInfo2(
@@ -13417,11 +14017,14 @@
                             (unsigned long long)pImageFormatInfo,
                             (unsigned long long)pImageFormatProperties);
                 }
-                VkResult vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return =
-                    m_state->on_vkGetPhysicalDeviceImageFormatProperties2KHR(
-                        &m_pool, snapshotApiCallInfo, physicalDevice, pImageFormatInfo,
-                        pImageFormatProperties);
+                VkResult vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return =
+                        m_state->on_vkGetPhysicalDeviceImageFormatProperties2KHR(
+                            &m_pool, snapshotApiCallInfo, physicalDevice, pImageFormatInfo,
+                            pImageFormatProperties);
+                }
                 if ((vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return) ==
                     VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
@@ -13509,8 +14112,10 @@
                             (unsigned long long)pQueueFamilyPropertyCount,
                             (unsigned long long)pQueueFamilyProperties);
                 }
-                vk->vkGetPhysicalDeviceQueueFamilyProperties2KHR(
-                    unboxed_physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetPhysicalDeviceQueueFamilyProperties2KHR(
+                        unboxed_physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
+                }
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
@@ -13560,6 +14165,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 // Begin manual dispatchable handle unboxing for pMemoryProperties;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pMemoryProperties,
@@ -13578,8 +14184,10 @@
                         ioStream, (unsigned long long)physicalDevice,
                         (unsigned long long)pMemoryProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceMemoryProperties2KHR(
-                    &m_pool, snapshotApiCallInfo, physicalDevice, pMemoryProperties);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceMemoryProperties2KHR(
+                        &m_pool, snapshotApiCallInfo, physicalDevice, pMemoryProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pMemoryProperties) {
                     transform_fromhost_VkPhysicalDeviceMemoryProperties2(
@@ -13668,8 +14276,10 @@
                             (unsigned long long)pFormatInfo, (unsigned long long)pPropertyCount,
                             (unsigned long long)pProperties);
                 }
-                vk->vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
-                    unboxed_physicalDevice, pFormatInfo, pPropertyCount, pProperties);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
+                        unboxed_physicalDevice, pFormatInfo, pPropertyCount, pProperties);
+                }
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pPropertyCount;
@@ -13737,7 +14347,9 @@
                             ioStream, (unsigned long long)device, (unsigned long long)commandPool,
                             (unsigned long long)flags);
                 }
-                vk->vkTrimCommandPoolKHR(unboxed_device, commandPool, flags);
+                if (CC_LIKELY(vk)) {
+                    vk->vkTrimCommandPoolKHR(unboxed_device, commandPool, flags);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkTrimCommandPoolKHR(&m_pool, snapshotApiCallInfo, packet,
@@ -13798,8 +14410,10 @@
                             (unsigned long long)pExternalBufferInfo,
                             (unsigned long long)pExternalBufferProperties);
                 }
-                vk->vkGetPhysicalDeviceExternalBufferPropertiesKHR(
-                    unboxed_physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetPhysicalDeviceExternalBufferPropertiesKHR(
+                        unboxed_physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pExternalBufferProperties) {
                     m_state->transformImpl_VkExternalBufferProperties_fromhost(
@@ -13836,6 +14450,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPhysicalDevice*)&physicalDevice =
                     (VkPhysicalDevice)(VkPhysicalDevice)((VkPhysicalDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkPhysicalDevice(physicalDevice);
                 vkReadStream->alloc((void**)&pExternalSemaphoreInfo,
                                     sizeof(const VkPhysicalDeviceExternalSemaphoreInfo));
                 reservedunmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
@@ -13866,9 +14481,11 @@
                             (unsigned long long)pExternalSemaphoreInfo,
                             (unsigned long long)pExternalSemaphoreProperties);
                 }
-                m_state->on_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
-                    &m_pool, snapshotApiCallInfo, physicalDevice, pExternalSemaphoreInfo,
-                    pExternalSemaphoreProperties);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
+                        &m_pool, snapshotApiCallInfo, physicalDevice, pExternalSemaphoreInfo,
+                        pExternalSemaphoreProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pExternalSemaphoreProperties) {
                     transform_fromhost_VkExternalSemaphoreProperties(
@@ -13900,6 +14517,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pImportSemaphoreFdInfo,
                                     sizeof(const VkImportSemaphoreFdInfoKHR));
                 reservedunmarshal_VkImportSemaphoreFdInfoKHR(
@@ -13914,9 +14532,11 @@
                             ioStream, (unsigned long long)device,
                             (unsigned long long)pImportSemaphoreFdInfo);
                 }
-                VkResult vkImportSemaphoreFdKHR_VkResult_return = (VkResult)0;
-                vkImportSemaphoreFdKHR_VkResult_return = m_state->on_vkImportSemaphoreFdKHR(
-                    &m_pool, snapshotApiCallInfo, device, pImportSemaphoreFdInfo);
+                VkResult vkImportSemaphoreFdKHR_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkImportSemaphoreFdKHR_VkResult_return = m_state->on_vkImportSemaphoreFdKHR(
+                        &m_pool, snapshotApiCallInfo, device, pImportSemaphoreFdInfo);
+                }
                 if ((vkImportSemaphoreFdKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkImportSemaphoreFdKHR_VkResult_return, opcode,
@@ -13945,6 +14565,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pGetFdInfo, sizeof(const VkSemaphoreGetFdInfoKHR));
                 reservedunmarshal_VkSemaphoreGetFdInfoKHR(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                           (VkSemaphoreGetFdInfoKHR*)(pGetFdInfo),
@@ -13963,9 +14584,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pGetFdInfo,
                             (unsigned long long)pFd);
                 }
-                VkResult vkGetSemaphoreFdKHR_VkResult_return = (VkResult)0;
-                vkGetSemaphoreFdKHR_VkResult_return = m_state->on_vkGetSemaphoreFdKHR(
-                    &m_pool, snapshotApiCallInfo, device, pGetFdInfo, pFd);
+                VkResult vkGetSemaphoreFdKHR_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetSemaphoreFdKHR_VkResult_return = m_state->on_vkGetSemaphoreFdKHR(
+                        &m_pool, snapshotApiCallInfo, device, pGetFdInfo, pFd);
+                }
                 if ((vkGetSemaphoreFdKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetSemaphoreFdKHR_VkResult_return, opcode, context);
@@ -13997,6 +14620,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo,
                                     sizeof(const VkDescriptorUpdateTemplateCreateInfo));
                 reservedunmarshal_VkDescriptorUpdateTemplateCreateInfo(
@@ -14038,11 +14662,14 @@
                             (unsigned long long)pAllocator,
                             (unsigned long long)pDescriptorUpdateTemplate);
                 }
-                VkResult vkCreateDescriptorUpdateTemplateKHR_VkResult_return = (VkResult)0;
-                vkCreateDescriptorUpdateTemplateKHR_VkResult_return =
-                    m_state->on_vkCreateDescriptorUpdateTemplateKHR(&m_pool, snapshotApiCallInfo,
-                                                                    device, pCreateInfo, pAllocator,
-                                                                    pDescriptorUpdateTemplate);
+                VkResult vkCreateDescriptorUpdateTemplateKHR_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateDescriptorUpdateTemplateKHR_VkResult_return =
+                        m_state->on_vkCreateDescriptorUpdateTemplateKHR(
+                            &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator,
+                            pDescriptorUpdateTemplate);
+                }
                 if ((vkCreateDescriptorUpdateTemplateKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateDescriptorUpdateTemplateKHR_VkResult_return,
@@ -14084,6 +14711,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for
                 // descriptorUpdateTemplate;
                 VkDescriptorUpdateTemplate boxed_descriptorUpdateTemplate_preserve;
@@ -14118,8 +14746,10 @@
                             (unsigned long long)descriptorUpdateTemplate,
                             (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroyDescriptorUpdateTemplateKHR(
-                    &m_pool, snapshotApiCallInfo, device, descriptorUpdateTemplate, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroyDescriptorUpdateTemplateKHR(
+                        &m_pool, snapshotApiCallInfo, device, descriptorUpdateTemplate, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyDescriptorUpdateTemplateKHR(
@@ -14175,8 +14805,10 @@
                             (unsigned long long)descriptorUpdateTemplate,
                             (unsigned long long)pData);
                 }
-                vk->vkUpdateDescriptorSetWithTemplateKHR(unboxed_device, descriptorSet,
-                                                         descriptorUpdateTemplate, pData);
+                if (CC_LIKELY(vk)) {
+                    vk->vkUpdateDescriptorSetWithTemplateKHR(unboxed_device, descriptorSet,
+                                                             descriptorUpdateTemplate, pData);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkUpdateDescriptorSetWithTemplateKHR(
@@ -14202,6 +14834,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkRenderPassCreateInfo2));
                 reservedunmarshal_VkRenderPassCreateInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                           (VkRenderPassCreateInfo2*)(pCreateInfo),
@@ -14238,9 +14871,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pRenderPass);
                 }
-                VkResult vkCreateRenderPass2KHR_VkResult_return = (VkResult)0;
-                vkCreateRenderPass2KHR_VkResult_return = m_state->on_vkCreateRenderPass2KHR(
-                    &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pRenderPass);
+                VkResult vkCreateRenderPass2KHR_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateRenderPass2KHR_VkResult_return = m_state->on_vkCreateRenderPass2KHR(
+                        &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pRenderPass);
+                }
                 if ((vkCreateRenderPass2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateRenderPass2KHR_VkResult_return, opcode,
@@ -14280,6 +14915,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 vkReadStream->alloc((void**)&pRenderPassBegin, sizeof(const VkRenderPassBeginInfo));
                 reservedunmarshal_VkRenderPassBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                         (VkRenderPassBeginInfo*)(pRenderPassBegin),
@@ -14303,8 +14939,11 @@
                             (unsigned long long)pRenderPassBegin,
                             (unsigned long long)pSubpassBeginInfo);
                 }
-                m_state->on_vkCmdBeginRenderPass2KHR(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                                     pRenderPassBegin, pSubpassBeginInfo);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdBeginRenderPass2KHR(&m_pool, snapshotApiCallInfo,
+                                                         commandBuffer, pRenderPassBegin,
+                                                         pSubpassBeginInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBeginRenderPass2KHR(
@@ -14353,7 +14992,10 @@
                             (unsigned long long)pSubpassBeginInfo,
                             (unsigned long long)pSubpassEndInfo);
                 }
-                vk->vkCmdNextSubpass2KHR(unboxed_commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdNextSubpass2KHR(unboxed_commandBuffer, pSubpassBeginInfo,
+                                             pSubpassEndInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdNextSubpass2KHR(&m_pool, snapshotApiCallInfo, packet,
@@ -14392,7 +15034,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pSubpassEndInfo);
                 }
-                vk->vkCmdEndRenderPass2KHR(unboxed_commandBuffer, pSubpassEndInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndRenderPass2KHR(unboxed_commandBuffer, pSubpassEndInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdEndRenderPass2KHR(&m_pool, snapshotApiCallInfo,
@@ -14449,8 +15093,10 @@
                             (unsigned long long)pExternalFenceInfo,
                             (unsigned long long)pExternalFenceProperties);
                 }
-                vk->vkGetPhysicalDeviceExternalFencePropertiesKHR(
-                    unboxed_physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetPhysicalDeviceExternalFencePropertiesKHR(
+                        unboxed_physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
+                }
                 vkStream->unsetHandleMapping();
                 if (pExternalFenceProperties) {
                     transform_fromhost_VkExternalFenceProperties(
@@ -14498,9 +15144,11 @@
                     fprintf(stderr, "stream %p: call vkImportFenceFdKHR 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)device, (unsigned long long)pImportFenceFdInfo);
                 }
-                VkResult vkImportFenceFdKHR_VkResult_return = (VkResult)0;
-                vkImportFenceFdKHR_VkResult_return =
-                    vk->vkImportFenceFdKHR(unboxed_device, pImportFenceFdInfo);
+                VkResult vkImportFenceFdKHR_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkImportFenceFdKHR_VkResult_return =
+                        vk->vkImportFenceFdKHR(unboxed_device, pImportFenceFdInfo);
+                }
                 if ((vkImportFenceFdKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkImportFenceFdKHR_VkResult_return, opcode, context);
@@ -14549,9 +15197,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pGetFdInfo,
                             (unsigned long long)pFd);
                 }
-                VkResult vkGetFenceFdKHR_VkResult_return = (VkResult)0;
-                vkGetFenceFdKHR_VkResult_return =
-                    vk->vkGetFenceFdKHR(unboxed_device, pGetFdInfo, pFd);
+                VkResult vkGetFenceFdKHR_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetFenceFdKHR_VkResult_return =
+                        vk->vkGetFenceFdKHR(unboxed_device, pGetFdInfo, pFd);
+                }
                 if ((vkGetFenceFdKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetFenceFdKHR_VkResult_return, opcode, context);
@@ -14582,6 +15232,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkImageMemoryRequirementsInfo2));
                 reservedunmarshal_VkImageMemoryRequirementsInfo2(
                     vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
@@ -14607,8 +15258,10 @@
                         ioStream, (unsigned long long)device, (unsigned long long)pInfo,
                         (unsigned long long)pMemoryRequirements);
                 }
-                m_state->on_vkGetImageMemoryRequirements2KHR(&m_pool, snapshotApiCallInfo, device,
-                                                             pInfo, pMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetImageMemoryRequirements2KHR(
+                        &m_pool, snapshotApiCallInfo, device, pInfo, pMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 if (pMemoryRequirements) {
                     transform_fromhost_VkMemoryRequirements2(
@@ -14638,6 +15291,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pInfo, sizeof(const VkBufferMemoryRequirementsInfo2));
                 reservedunmarshal_VkBufferMemoryRequirementsInfo2(
                     vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
@@ -14663,8 +15317,10 @@
                         ioStream, (unsigned long long)device, (unsigned long long)pInfo,
                         (unsigned long long)pMemoryRequirements);
                 }
-                m_state->on_vkGetBufferMemoryRequirements2KHR(&m_pool, snapshotApiCallInfo, device,
-                                                              pInfo, pMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetBufferMemoryRequirements2KHR(
+                        &m_pool, snapshotApiCallInfo, device, pInfo, pMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 if (pMemoryRequirements) {
                     transform_fromhost_VkMemoryRequirements2(
@@ -14755,9 +15411,11 @@
                             (unsigned long long)pSparseMemoryRequirementCount,
                             (unsigned long long)pSparseMemoryRequirements);
                 }
-                vk->vkGetImageSparseMemoryRequirements2KHR(unboxed_device, pInfo,
-                                                           pSparseMemoryRequirementCount,
-                                                           pSparseMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetImageSparseMemoryRequirements2KHR(unboxed_device, pInfo,
+                                                               pSparseMemoryRequirementCount,
+                                                               pSparseMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
@@ -14813,6 +15471,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo,
                                     sizeof(const VkSamplerYcbcrConversionCreateInfo));
                 reservedunmarshal_VkSamplerYcbcrConversionCreateInfo(
@@ -14852,11 +15511,14 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pYcbcrConversion);
                 }
-                VkResult vkCreateSamplerYcbcrConversionKHR_VkResult_return = (VkResult)0;
-                vkCreateSamplerYcbcrConversionKHR_VkResult_return =
-                    m_state->on_vkCreateSamplerYcbcrConversionKHR(&m_pool, snapshotApiCallInfo,
-                                                                  device, pCreateInfo, pAllocator,
-                                                                  pYcbcrConversion);
+                VkResult vkCreateSamplerYcbcrConversionKHR_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateSamplerYcbcrConversionKHR_VkResult_return =
+                        m_state->on_vkCreateSamplerYcbcrConversionKHR(&m_pool, snapshotApiCallInfo,
+                                                                      device, pCreateInfo,
+                                                                      pAllocator, pYcbcrConversion);
+                }
                 if ((vkCreateSamplerYcbcrConversionKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateSamplerYcbcrConversionKHR_VkResult_return,
@@ -14898,6 +15560,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for ycbcrConversion;
                 VkSamplerYcbcrConversion boxed_ycbcrConversion_preserve;
                 uint64_t cgen_var_1;
@@ -14929,8 +15592,10 @@
                             ioStream, (unsigned long long)device,
                             (unsigned long long)ycbcrConversion, (unsigned long long)pAllocator);
                 }
-                m_state->on_vkDestroySamplerYcbcrConversionKHR(&m_pool, snapshotApiCallInfo, device,
-                                                               ycbcrConversion, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkDestroySamplerYcbcrConversionKHR(
+                        &m_pool, snapshotApiCallInfo, device, ycbcrConversion, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroySamplerYcbcrConversionKHR(
@@ -14956,6 +15621,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 memcpy((uint32_t*)&bindInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pBindInfos,
@@ -14977,9 +15643,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)bindInfoCount,
                             (unsigned long long)pBindInfos);
                 }
-                VkResult vkBindBufferMemory2KHR_VkResult_return = (VkResult)0;
-                vkBindBufferMemory2KHR_VkResult_return = m_state->on_vkBindBufferMemory2KHR(
-                    &m_pool, snapshotApiCallInfo, device, bindInfoCount, pBindInfos);
+                VkResult vkBindBufferMemory2KHR_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkBindBufferMemory2KHR_VkResult_return = m_state->on_vkBindBufferMemory2KHR(
+                        &m_pool, snapshotApiCallInfo, device, bindInfoCount, pBindInfos);
+                }
                 if ((vkBindBufferMemory2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkBindBufferMemory2KHR_VkResult_return, opcode,
@@ -15008,6 +15676,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 memcpy((uint32_t*)&bindInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pBindInfos,
@@ -15028,9 +15697,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)bindInfoCount,
                             (unsigned long long)pBindInfos);
                 }
-                VkResult vkBindImageMemory2KHR_VkResult_return = (VkResult)0;
-                vkBindImageMemory2KHR_VkResult_return = m_state->on_vkBindImageMemory2KHR(
-                    &m_pool, snapshotApiCallInfo, device, bindInfoCount, pBindInfos);
+                VkResult vkBindImageMemory2KHR_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkBindImageMemory2KHR_VkResult_return = m_state->on_vkBindImageMemory2KHR(
+                        &m_pool, snapshotApiCallInfo, device, bindInfoCount, pBindInfos);
+                }
                 if ((vkBindImageMemory2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkBindImageMemory2KHR_VkResult_return, opcode,
@@ -15090,7 +15761,9 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pSupport);
                 }
-                vk->vkGetDescriptorSetLayoutSupportKHR(unboxed_device, pCreateInfo, pSupport);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetDescriptorSetLayoutSupportKHR(unboxed_device, pCreateInfo, pSupport);
+                }
                 vkStream->unsetHandleMapping();
                 if (pSupport) {
                     transform_fromhost_VkDescriptorSetLayoutSupport(
@@ -15138,8 +15811,10 @@
                 }
                 VkDeviceAddress vkGetBufferDeviceAddressKHR_VkDeviceAddress_return =
                     (VkDeviceAddress)0;
-                vkGetBufferDeviceAddressKHR_VkDeviceAddress_return =
-                    vk->vkGetBufferDeviceAddressKHR(unboxed_device, pInfo);
+                if (CC_LIKELY(vk)) {
+                    vkGetBufferDeviceAddressKHR_VkDeviceAddress_return =
+                        vk->vkGetBufferDeviceAddressKHR(unboxed_device, pInfo);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetBufferDeviceAddressKHR_VkDeviceAddress_return,
                                 sizeof(VkDeviceAddress));
@@ -15181,8 +15856,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pInfo);
                 }
                 uint64_t vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return = (uint64_t)0;
-                vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return =
-                    vk->vkGetBufferOpaqueCaptureAddressKHR(unboxed_device, pInfo);
+                if (CC_LIKELY(vk)) {
+                    vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return =
+                        vk->vkGetBufferOpaqueCaptureAddressKHR(unboxed_device, pInfo);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return,
                                 sizeof(uint64_t));
@@ -15226,8 +15903,10 @@
                         ioStream, (unsigned long long)device, (unsigned long long)pInfo);
                 }
                 uint64_t vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return = (uint64_t)0;
-                vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return =
-                    vk->vkGetDeviceMemoryOpaqueCaptureAddressKHR(unboxed_device, pInfo);
+                if (CC_LIKELY(vk)) {
+                    vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return =
+                        vk->vkGetDeviceMemoryOpaqueCaptureAddressKHR(unboxed_device, pInfo);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return,
                                 sizeof(uint64_t));
@@ -15310,10 +15989,13 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pPipelineInfo,
                             (unsigned long long)pExecutableCount, (unsigned long long)pProperties);
                 }
-                VkResult vkGetPipelineExecutablePropertiesKHR_VkResult_return = (VkResult)0;
-                vkGetPipelineExecutablePropertiesKHR_VkResult_return =
-                    vk->vkGetPipelineExecutablePropertiesKHR(unboxed_device, pPipelineInfo,
-                                                             pExecutableCount, pProperties);
+                VkResult vkGetPipelineExecutablePropertiesKHR_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetPipelineExecutablePropertiesKHR_VkResult_return =
+                        vk->vkGetPipelineExecutablePropertiesKHR(unboxed_device, pPipelineInfo,
+                                                                 pExecutableCount, pProperties);
+                }
                 if ((vkGetPipelineExecutablePropertiesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetPipelineExecutablePropertiesKHR_VkResult_return,
@@ -15426,10 +16108,13 @@
                             (unsigned long long)pExecutableInfo,
                             (unsigned long long)pStatisticCount, (unsigned long long)pStatistics);
                 }
-                VkResult vkGetPipelineExecutableStatisticsKHR_VkResult_return = (VkResult)0;
-                vkGetPipelineExecutableStatisticsKHR_VkResult_return =
-                    vk->vkGetPipelineExecutableStatisticsKHR(unboxed_device, pExecutableInfo,
-                                                             pStatisticCount, pStatistics);
+                VkResult vkGetPipelineExecutableStatisticsKHR_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetPipelineExecutableStatisticsKHR_VkResult_return =
+                        vk->vkGetPipelineExecutableStatisticsKHR(unboxed_device, pExecutableInfo,
+                                                                 pStatisticCount, pStatistics);
+                }
                 if ((vkGetPipelineExecutableStatisticsKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetPipelineExecutableStatisticsKHR_VkResult_return,
@@ -15551,11 +16236,13 @@
                             (unsigned long long)pInternalRepresentations);
                 }
                 VkResult vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return =
-                    (VkResult)0;
-                vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return =
-                    vk->vkGetPipelineExecutableInternalRepresentationsKHR(
-                        unboxed_device, pExecutableInfo, pInternalRepresentationCount,
-                        pInternalRepresentations);
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return =
+                        vk->vkGetPipelineExecutableInternalRepresentationsKHR(
+                            unboxed_device, pExecutableInfo, pInternalRepresentationCount,
+                            pInternalRepresentations);
+                }
                 if ((vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return) ==
                     VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
@@ -15640,7 +16327,9 @@
                             ioStream, (unsigned long long)commandBuffer, (unsigned long long)event,
                             (unsigned long long)pDependencyInfo);
                 }
-                vk->vkCmdSetEvent2KHR(unboxed_commandBuffer, event, pDependencyInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetEvent2KHR(unboxed_commandBuffer, event, pDependencyInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetEvent2KHR(&m_pool, snapshotApiCallInfo, packet,
@@ -15679,7 +16368,9 @@
                             ioStream, (unsigned long long)commandBuffer, (unsigned long long)event,
                             (unsigned long long)stageMask);
                 }
-                vk->vkCmdResetEvent2KHR(unboxed_commandBuffer, event, stageMask);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdResetEvent2KHR(unboxed_commandBuffer, event, stageMask);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdResetEvent2KHR(&m_pool, snapshotApiCallInfo, packet,
@@ -15740,8 +16431,10 @@
                             (unsigned long long)eventCount, (unsigned long long)pEvents,
                             (unsigned long long)pDependencyInfos);
                 }
-                vk->vkCmdWaitEvents2KHR(unboxed_commandBuffer, eventCount, pEvents,
-                                        pDependencyInfos);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdWaitEvents2KHR(unboxed_commandBuffer, eventCount, pEvents,
+                                            pDependencyInfos);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdWaitEvents2KHR(&m_pool, snapshotApiCallInfo, packet,
@@ -15780,7 +16473,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pDependencyInfo);
                 }
-                vk->vkCmdPipelineBarrier2KHR(unboxed_commandBuffer, pDependencyInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdPipelineBarrier2KHR(unboxed_commandBuffer, pDependencyInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdPipelineBarrier2KHR(&m_pool, snapshotApiCallInfo,
@@ -15825,7 +16520,9 @@
                         ioStream, (unsigned long long)commandBuffer, (unsigned long long)stage,
                         (unsigned long long)queryPool, (unsigned long long)query);
                 }
-                vk->vkCmdWriteTimestamp2KHR(unboxed_commandBuffer, stage, queryPool, query);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdWriteTimestamp2KHR(unboxed_commandBuffer, stage, queryPool, query);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdWriteTimestamp2KHR(&m_pool, snapshotApiCallInfo,
@@ -15876,9 +16573,11 @@
                             ioStream, (unsigned long long)queue, (unsigned long long)submitCount,
                             (unsigned long long)pSubmits, (unsigned long long)fence);
                 }
-                VkResult vkQueueSubmit2KHR_VkResult_return = (VkResult)0;
-                vkQueueSubmit2KHR_VkResult_return =
-                    vk->vkQueueSubmit2KHR(unboxed_queue, submitCount, pSubmits, fence);
+                VkResult vkQueueSubmit2KHR_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkQueueSubmit2KHR_VkResult_return =
+                        vk->vkQueueSubmit2KHR(unboxed_queue, submitCount, pSubmits, fence);
+                }
                 if ((vkQueueSubmit2KHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkQueueSubmit2KHR_VkResult_return, opcode, context);
@@ -15931,8 +16630,10 @@
                             (unsigned long long)dstBuffer, (unsigned long long)dstOffset,
                             (unsigned long long)marker);
                 }
-                vk->vkCmdWriteBufferMarker2AMD(unboxed_commandBuffer, stage, dstBuffer, dstOffset,
-                                               marker);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdWriteBufferMarker2AMD(unboxed_commandBuffer, stage, dstBuffer,
+                                                   dstOffset, marker);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdWriteBufferMarker2AMD(
@@ -15999,8 +16700,10 @@
                             (unsigned long long)pCheckpointDataCount,
                             (unsigned long long)pCheckpointData);
                 }
-                vk->vkGetQueueCheckpointData2NV(unboxed_queue, pCheckpointDataCount,
-                                                pCheckpointData);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetQueueCheckpointData2NV(unboxed_queue, pCheckpointDataCount,
+                                                    pCheckpointData);
+                }
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pCheckpointDataCount;
@@ -16068,7 +16771,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pCopyBufferInfo);
                 }
-                vk->vkCmdCopyBuffer2KHR(unboxed_commandBuffer, pCopyBufferInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdCopyBuffer2KHR(unboxed_commandBuffer, pCopyBufferInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdCopyBuffer2KHR(&m_pool, snapshotApiCallInfo, packet,
@@ -16091,6 +16796,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 vkReadStream->alloc((void**)&pCopyImageInfo, sizeof(const VkCopyImageInfo2));
                 reservedunmarshal_VkCopyImageInfo2(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                    (VkCopyImageInfo2*)(pCopyImageInfo),
@@ -16102,8 +16808,10 @@
                     fprintf(stderr, "stream %p: call vkCmdCopyImage2KHR 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer, (unsigned long long)pCopyImageInfo);
                 }
-                m_state->on_vkCmdCopyImage2KHR(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                               pCopyImageInfo);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdCopyImage2KHR(&m_pool, snapshotApiCallInfo, commandBuffer,
+                                                   pCopyImageInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdCopyImage2KHR(&m_pool, snapshotApiCallInfo, packet,
@@ -16126,6 +16834,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 vkReadStream->alloc((void**)&pCopyBufferToImageInfo,
                                     sizeof(const VkCopyBufferToImageInfo2));
                 reservedunmarshal_VkCopyBufferToImageInfo2(
@@ -16140,8 +16849,11 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pCopyBufferToImageInfo);
                 }
-                m_state->on_vkCmdCopyBufferToImage2KHR(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                                       pCopyBufferToImageInfo, context);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdCopyBufferToImage2KHR(&m_pool, snapshotApiCallInfo,
+                                                           commandBuffer, pCopyBufferToImageInfo,
+                                                           context);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdCopyBufferToImage2KHR(
@@ -16164,6 +16876,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 vkReadStream->alloc((void**)&pCopyImageToBufferInfo,
                                     sizeof(const VkCopyImageToBufferInfo2));
                 reservedunmarshal_VkCopyImageToBufferInfo2(
@@ -16178,8 +16891,10 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pCopyImageToBufferInfo);
                 }
-                m_state->on_vkCmdCopyImageToBuffer2KHR(&m_pool, snapshotApiCallInfo, commandBuffer,
-                                                       pCopyImageToBufferInfo);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCmdCopyImageToBuffer2KHR(&m_pool, snapshotApiCallInfo,
+                                                           commandBuffer, pCopyImageToBufferInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdCopyImageToBuffer2KHR(
@@ -16216,7 +16931,9 @@
                     fprintf(stderr, "stream %p: call vkCmdBlitImage2KHR 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer, (unsigned long long)pBlitImageInfo);
                 }
-                vk->vkCmdBlitImage2KHR(unboxed_commandBuffer, pBlitImageInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBlitImage2KHR(unboxed_commandBuffer, pBlitImageInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBlitImage2KHR(&m_pool, snapshotApiCallInfo, packet,
@@ -16255,7 +16972,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pResolveImageInfo);
                 }
-                vk->vkCmdResolveImage2KHR(unboxed_commandBuffer, pResolveImageInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdResolveImage2KHR(unboxed_commandBuffer, pResolveImageInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdResolveImage2KHR(&m_pool, snapshotApiCallInfo, packet,
@@ -16308,8 +17027,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pInfo,
                             (unsigned long long)pMemoryRequirements);
                 }
-                vk->vkGetDeviceBufferMemoryRequirementsKHR(unboxed_device, pInfo,
-                                                           pMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetDeviceBufferMemoryRequirementsKHR(unboxed_device, pInfo,
+                                                               pMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 if (pMemoryRequirements) {
                     transform_fromhost_VkMemoryRequirements2(
@@ -16367,8 +17088,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pInfo,
                             (unsigned long long)pMemoryRequirements);
                 }
-                vk->vkGetDeviceImageMemoryRequirementsKHR(unboxed_device, pInfo,
-                                                          pMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetDeviceImageMemoryRequirementsKHR(unboxed_device, pInfo,
+                                                              pMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 if (pMemoryRequirements) {
                     transform_fromhost_VkMemoryRequirements2(
@@ -16458,9 +17181,11 @@
                             (unsigned long long)pSparseMemoryRequirementCount,
                             (unsigned long long)pSparseMemoryRequirements);
                 }
-                vk->vkGetDeviceImageSparseMemoryRequirementsKHR(unboxed_device, pInfo,
-                                                                pSparseMemoryRequirementCount,
-                                                                pSparseMemoryRequirements);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetDeviceImageSparseMemoryRequirementsKHR(unboxed_device, pInfo,
+                                                                    pSparseMemoryRequirementCount,
+                                                                    pSparseMemoryRequirements);
+                }
                 vkStream->unsetHandleMapping();
                 // WARNING PTR CHECK
                 uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
@@ -16539,8 +17264,10 @@
                             (unsigned long long)offset, (unsigned long long)size,
                             (unsigned long long)indexType);
                 }
-                vk->vkCmdBindIndexBuffer2KHR(unboxed_commandBuffer, buffer, offset, size,
-                                             indexType);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBindIndexBuffer2KHR(unboxed_commandBuffer, buffer, offset, size,
+                                                 indexType);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBindIndexBuffer2KHR(&m_pool, snapshotApiCallInfo,
@@ -16590,8 +17317,10 @@
                         ioStream, (unsigned long long)device,
                         (unsigned long long)pRenderingAreaInfo, (unsigned long long)pGranularity);
                 }
-                vk->vkGetRenderingAreaGranularityKHR(unboxed_device, pRenderingAreaInfo,
-                                                     pGranularity);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetRenderingAreaGranularityKHR(unboxed_device, pRenderingAreaInfo,
+                                                         pGranularity);
+                }
                 vkStream->unsetHandleMapping();
                 if (pGranularity) {
                     transform_fromhost_VkExtent2D(m_state, (VkExtent2D*)(pGranularity));
@@ -16648,7 +17377,9 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pInfo,
                             (unsigned long long)pLayout);
                 }
-                vk->vkGetDeviceImageSubresourceLayoutKHR(unboxed_device, pInfo, pLayout);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetDeviceImageSubresourceLayoutKHR(unboxed_device, pInfo, pLayout);
+                }
                 vkStream->unsetHandleMapping();
                 if (pLayout) {
                     transform_fromhost_VkSubresourceLayout2KHR(m_state,
@@ -16710,7 +17441,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)image,
                             (unsigned long long)pSubresource, (unsigned long long)pLayout);
                 }
-                vk->vkGetImageSubresourceLayout2KHR(unboxed_device, image, pSubresource, pLayout);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetImageSubresourceLayout2KHR(unboxed_device, image, pSubresource,
+                                                        pLayout);
+                }
                 vkStream->unsetHandleMapping();
                 if (pLayout) {
                     transform_fromhost_VkSubresourceLayout2KHR(m_state,
@@ -16757,8 +17491,10 @@
                             (unsigned long long)lineStippleFactor,
                             (unsigned long long)lineStipplePattern);
                 }
-                vk->vkCmdSetLineStippleKHR(unboxed_commandBuffer, lineStippleFactor,
-                                           lineStipplePattern);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetLineStippleKHR(unboxed_commandBuffer, lineStippleFactor,
+                                               lineStipplePattern);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetLineStippleKHR(
@@ -16784,6 +17520,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 memcpy((VkFormat*)&format, *readStreamPtrPtr, sizeof(VkFormat));
                 *readStreamPtrPtr += sizeof(VkFormat);
                 memcpy((VkImageUsageFlags*)&imageUsage, *readStreamPtrPtr,
@@ -16801,10 +17538,13 @@
                             ioStream, (unsigned long long)device, (unsigned long long)format,
                             (unsigned long long)imageUsage, (unsigned long long)grallocUsage);
                 }
-                VkResult vkGetSwapchainGrallocUsageANDROID_VkResult_return = (VkResult)0;
-                vkGetSwapchainGrallocUsageANDROID_VkResult_return =
-                    m_state->on_vkGetSwapchainGrallocUsageANDROID(
-                        &m_pool, snapshotApiCallInfo, device, format, imageUsage, grallocUsage);
+                VkResult vkGetSwapchainGrallocUsageANDROID_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetSwapchainGrallocUsageANDROID_VkResult_return =
+                        m_state->on_vkGetSwapchainGrallocUsageANDROID(
+                            &m_pool, snapshotApiCallInfo, device, format, imageUsage, grallocUsage);
+                }
                 if ((vkGetSwapchainGrallocUsageANDROID_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetSwapchainGrallocUsageANDROID_VkResult_return,
@@ -16838,6 +17578,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -16861,9 +17602,12 @@
                             (unsigned long long)nativeFenceFd, (unsigned long long)semaphore,
                             (unsigned long long)fence);
                 }
-                VkResult vkAcquireImageANDROID_VkResult_return = (VkResult)0;
-                vkAcquireImageANDROID_VkResult_return = m_state->on_vkAcquireImageANDROID(
-                    &m_pool, snapshotApiCallInfo, device, image, nativeFenceFd, semaphore, fence);
+                VkResult vkAcquireImageANDROID_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkAcquireImageANDROID_VkResult_return =
+                        m_state->on_vkAcquireImageANDROID(&m_pool, snapshotApiCallInfo, device,
+                                                          image, nativeFenceFd, semaphore, fence);
+                }
                 if ((vkAcquireImageANDROID_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkAcquireImageANDROID_VkResult_return, opcode,
@@ -16895,6 +17639,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 memcpy((uint32_t*)&waitSemaphoreCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 // WARNING PTR CHECK
@@ -16934,11 +17679,14 @@
                             (unsigned long long)pWaitSemaphores, (unsigned long long)image,
                             (unsigned long long)pNativeFenceFd);
                 }
-                VkResult vkQueueSignalReleaseImageANDROID_VkResult_return = (VkResult)0;
-                vkQueueSignalReleaseImageANDROID_VkResult_return =
-                    m_state->on_vkQueueSignalReleaseImageANDROID(
-                        &m_pool, snapshotApiCallInfo, queue, waitSemaphoreCount, pWaitSemaphores,
-                        image, pNativeFenceFd);
+                VkResult vkQueueSignalReleaseImageANDROID_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkQueueSignalReleaseImageANDROID_VkResult_return =
+                        m_state->on_vkQueueSignalReleaseImageANDROID(
+                            &m_pool, snapshotApiCallInfo, queue, waitSemaphoreCount,
+                            pWaitSemaphores, image, pNativeFenceFd);
+                }
                 if ((vkQueueSignalReleaseImageANDROID_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkQueueSignalReleaseImageANDROID_VkResult_return,
@@ -16973,6 +17721,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 memcpy((VkFormat*)&format, *readStreamPtrPtr, sizeof(VkFormat));
                 *readStreamPtrPtr += sizeof(VkFormat);
                 memcpy((VkImageUsageFlags*)&imageUsage, *readStreamPtrPtr,
@@ -17000,11 +17749,14 @@
                             (unsigned long long)grallocConsumerUsage,
                             (unsigned long long)grallocProducerUsage);
                 }
-                VkResult vkGetSwapchainGrallocUsage2ANDROID_VkResult_return = (VkResult)0;
-                vkGetSwapchainGrallocUsage2ANDROID_VkResult_return =
-                    m_state->on_vkGetSwapchainGrallocUsage2ANDROID(
-                        &m_pool, snapshotApiCallInfo, device, format, imageUsage,
-                        swapchainImageUsage, grallocConsumerUsage, grallocProducerUsage);
+                VkResult vkGetSwapchainGrallocUsage2ANDROID_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetSwapchainGrallocUsage2ANDROID_VkResult_return =
+                        m_state->on_vkGetSwapchainGrallocUsage2ANDROID(
+                            &m_pool, snapshotApiCallInfo, device, format, imageUsage,
+                            swapchainImageUsage, grallocConsumerUsage, grallocProducerUsage);
+                }
                 if ((vkGetSwapchainGrallocUsage2ANDROID_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetSwapchainGrallocUsage2ANDROID_VkResult_return,
@@ -17083,9 +17835,13 @@
                             ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pCallback);
                 }
-                VkResult vkCreateDebugReportCallbackEXT_VkResult_return = (VkResult)0;
-                vkCreateDebugReportCallbackEXT_VkResult_return = vk->vkCreateDebugReportCallbackEXT(
-                    unboxed_instance, pCreateInfo, pAllocator, pCallback);
+                VkResult vkCreateDebugReportCallbackEXT_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateDebugReportCallbackEXT_VkResult_return =
+                        vk->vkCreateDebugReportCallbackEXT(unboxed_instance, pCreateInfo,
+                                                           pAllocator, pCallback);
+                }
                 if ((vkCreateDebugReportCallbackEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateDebugReportCallbackEXT_VkResult_return, opcode,
@@ -17161,7 +17917,9 @@
                         ioStream, (unsigned long long)instance, (unsigned long long)callback,
                         (unsigned long long)pAllocator);
                 }
-                vk->vkDestroyDebugReportCallbackEXT(unboxed_instance, callback, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    vk->vkDestroyDebugReportCallbackEXT(unboxed_instance, callback, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyDebugReportCallbackEXT(
@@ -17218,8 +17976,10 @@
                             (unsigned long long)location, (unsigned long long)messageCode,
                             (unsigned long long)pLayerPrefix, (unsigned long long)pMessage);
                 }
-                vk->vkDebugReportMessageEXT(unboxed_instance, flags, objectType, object, location,
-                                            messageCode, pLayerPrefix, pMessage);
+                if (CC_LIKELY(vk)) {
+                    vk->vkDebugReportMessageEXT(unboxed_instance, flags, objectType, object,
+                                                location, messageCode, pLayerPrefix, pMessage);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDebugReportMessageEXT(
@@ -17291,8 +18051,11 @@
                             (unsigned long long)pBuffers, (unsigned long long)pOffsets,
                             (unsigned long long)pSizes);
                 }
-                vk->vkCmdBindTransformFeedbackBuffersEXT(unboxed_commandBuffer, firstBinding,
-                                                         bindingCount, pBuffers, pOffsets, pSizes);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBindTransformFeedbackBuffersEXT(unboxed_commandBuffer, firstBinding,
+                                                             bindingCount, pBuffers, pOffsets,
+                                                             pSizes);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBindTransformFeedbackBuffersEXT(
@@ -17365,9 +18128,11 @@
                             (unsigned long long)pCounterBuffers,
                             (unsigned long long)pCounterBufferOffsets);
                 }
-                vk->vkCmdBeginTransformFeedbackEXT(unboxed_commandBuffer, firstCounterBuffer,
-                                                   counterBufferCount, pCounterBuffers,
-                                                   pCounterBufferOffsets);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBeginTransformFeedbackEXT(unboxed_commandBuffer, firstCounterBuffer,
+                                                       counterBufferCount, pCounterBuffers,
+                                                       pCounterBufferOffsets);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBeginTransformFeedbackEXT(
@@ -17441,9 +18206,11 @@
                             (unsigned long long)pCounterBuffers,
                             (unsigned long long)pCounterBufferOffsets);
                 }
-                vk->vkCmdEndTransformFeedbackEXT(unboxed_commandBuffer, firstCounterBuffer,
-                                                 counterBufferCount, pCounterBuffers,
-                                                 pCounterBufferOffsets);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndTransformFeedbackEXT(unboxed_commandBuffer, firstCounterBuffer,
+                                                     counterBufferCount, pCounterBuffers,
+                                                     pCounterBufferOffsets);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdEndTransformFeedbackEXT(
@@ -17493,8 +18260,10 @@
                             (unsigned long long)queryPool, (unsigned long long)query,
                             (unsigned long long)flags, (unsigned long long)index);
                 }
-                vk->vkCmdBeginQueryIndexedEXT(unboxed_commandBuffer, queryPool, query, flags,
-                                              index);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBeginQueryIndexedEXT(unboxed_commandBuffer, queryPool, query, flags,
+                                                  index);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBeginQueryIndexedEXT(&m_pool, snapshotApiCallInfo,
@@ -17538,7 +18307,9 @@
                         ioStream, (unsigned long long)commandBuffer, (unsigned long long)queryPool,
                         (unsigned long long)query, (unsigned long long)index);
                 }
-                vk->vkCmdEndQueryIndexedEXT(unboxed_commandBuffer, queryPool, query, index);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndQueryIndexedEXT(unboxed_commandBuffer, queryPool, query, index);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdEndQueryIndexedEXT(&m_pool, snapshotApiCallInfo,
@@ -17594,9 +18365,11 @@
                             (unsigned long long)counterBufferOffset,
                             (unsigned long long)counterOffset, (unsigned long long)vertexStride);
                 }
-                vk->vkCmdDrawIndirectByteCountEXT(unboxed_commandBuffer, instanceCount,
-                                                  firstInstance, counterBuffer, counterBufferOffset,
-                                                  counterOffset, vertexStride);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDrawIndirectByteCountEXT(
+                        unboxed_commandBuffer, instanceCount, firstInstance, counterBuffer,
+                        counterBufferOffset, counterOffset, vertexStride);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdDrawIndirectByteCountEXT(
@@ -17637,9 +18410,11 @@
                     fprintf(stderr, "stream %p: call vkSetDebugUtilsObjectNameEXT 0x%llx 0x%llx \n",
                             ioStream, (unsigned long long)device, (unsigned long long)pNameInfo);
                 }
-                VkResult vkSetDebugUtilsObjectNameEXT_VkResult_return = (VkResult)0;
-                vkSetDebugUtilsObjectNameEXT_VkResult_return =
-                    vk->vkSetDebugUtilsObjectNameEXT(unboxed_device, pNameInfo);
+                VkResult vkSetDebugUtilsObjectNameEXT_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkSetDebugUtilsObjectNameEXT_VkResult_return =
+                        vk->vkSetDebugUtilsObjectNameEXT(unboxed_device, pNameInfo);
+                }
                 if ((vkSetDebugUtilsObjectNameEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkSetDebugUtilsObjectNameEXT_VkResult_return, opcode,
@@ -17682,9 +18457,11 @@
                     fprintf(stderr, "stream %p: call vkSetDebugUtilsObjectTagEXT 0x%llx 0x%llx \n",
                             ioStream, (unsigned long long)device, (unsigned long long)pTagInfo);
                 }
-                VkResult vkSetDebugUtilsObjectTagEXT_VkResult_return = (VkResult)0;
-                vkSetDebugUtilsObjectTagEXT_VkResult_return =
-                    vk->vkSetDebugUtilsObjectTagEXT(unboxed_device, pTagInfo);
+                VkResult vkSetDebugUtilsObjectTagEXT_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkSetDebugUtilsObjectTagEXT_VkResult_return =
+                        vk->vkSetDebugUtilsObjectTagEXT(unboxed_device, pTagInfo);
+                }
                 if ((vkSetDebugUtilsObjectTagEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkSetDebugUtilsObjectTagEXT_VkResult_return, opcode,
@@ -17728,7 +18505,9 @@
                             "stream %p: call vkQueueBeginDebugUtilsLabelEXT 0x%llx 0x%llx \n",
                             ioStream, (unsigned long long)queue, (unsigned long long)pLabelInfo);
                 }
-                vk->vkQueueBeginDebugUtilsLabelEXT(unboxed_queue, pLabelInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkQueueBeginDebugUtilsLabelEXT(unboxed_queue, pLabelInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkQueueBeginDebugUtilsLabelEXT(
@@ -17755,7 +18534,9 @@
                     fprintf(stderr, "stream %p: call vkQueueEndDebugUtilsLabelEXT 0x%llx \n",
                             ioStream, (unsigned long long)queue);
                 }
-                vk->vkQueueEndDebugUtilsLabelEXT(unboxed_queue);
+                if (CC_LIKELY(vk)) {
+                    vk->vkQueueEndDebugUtilsLabelEXT(unboxed_queue);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkQueueEndDebugUtilsLabelEXT(&m_pool, snapshotApiCallInfo,
@@ -17792,7 +18573,9 @@
                             "stream %p: call vkQueueInsertDebugUtilsLabelEXT 0x%llx 0x%llx \n",
                             ioStream, (unsigned long long)queue, (unsigned long long)pLabelInfo);
                 }
-                vk->vkQueueInsertDebugUtilsLabelEXT(unboxed_queue, pLabelInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkQueueInsertDebugUtilsLabelEXT(unboxed_queue, pLabelInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkQueueInsertDebugUtilsLabelEXT(
@@ -17830,7 +18613,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pLabelInfo);
                 }
-                vk->vkCmdBeginDebugUtilsLabelEXT(unboxed_commandBuffer, pLabelInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBeginDebugUtilsLabelEXT(unboxed_commandBuffer, pLabelInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBeginDebugUtilsLabelEXT(
@@ -17858,7 +18643,9 @@
                     fprintf(stderr, "stream %p: call vkCmdEndDebugUtilsLabelEXT 0x%llx \n",
                             ioStream, (unsigned long long)commandBuffer);
                 }
-                vk->vkCmdEndDebugUtilsLabelEXT(unboxed_commandBuffer);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndDebugUtilsLabelEXT(unboxed_commandBuffer);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdEndDebugUtilsLabelEXT(
@@ -17897,7 +18684,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pLabelInfo);
                 }
-                vk->vkCmdInsertDebugUtilsLabelEXT(unboxed_commandBuffer, pLabelInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdInsertDebugUtilsLabelEXT(unboxed_commandBuffer, pLabelInfo);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdInsertDebugUtilsLabelEXT(
@@ -17962,9 +18751,13 @@
                             ioStream, (unsigned long long)instance, (unsigned long long)pCreateInfo,
                             (unsigned long long)pAllocator, (unsigned long long)pMessenger);
                 }
-                VkResult vkCreateDebugUtilsMessengerEXT_VkResult_return = (VkResult)0;
-                vkCreateDebugUtilsMessengerEXT_VkResult_return = vk->vkCreateDebugUtilsMessengerEXT(
-                    unboxed_instance, pCreateInfo, pAllocator, pMessenger);
+                VkResult vkCreateDebugUtilsMessengerEXT_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateDebugUtilsMessengerEXT_VkResult_return =
+                        vk->vkCreateDebugUtilsMessengerEXT(unboxed_instance, pCreateInfo,
+                                                           pAllocator, pMessenger);
+                }
                 if ((vkCreateDebugUtilsMessengerEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateDebugUtilsMessengerEXT_VkResult_return, opcode,
@@ -18040,7 +18833,9 @@
                         ioStream, (unsigned long long)instance, (unsigned long long)messenger,
                         (unsigned long long)pAllocator);
                 }
-                vk->vkDestroyDebugUtilsMessengerEXT(unboxed_instance, messenger, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    vk->vkDestroyDebugUtilsMessengerEXT(unboxed_instance, messenger, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyDebugUtilsMessengerEXT(
@@ -18091,8 +18886,10 @@
                             (unsigned long long)messageSeverity, (unsigned long long)messageTypes,
                             (unsigned long long)pCallbackData);
                 }
-                vk->vkSubmitDebugUtilsMessageEXT(unboxed_instance, messageSeverity, messageTypes,
-                                                 pCallbackData);
+                if (CC_LIKELY(vk)) {
+                    vk->vkSubmitDebugUtilsMessageEXT(unboxed_instance, messageSeverity,
+                                                     messageTypes, pCallbackData);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkSubmitDebugUtilsMessageEXT(
@@ -18142,10 +18939,13 @@
                             ioStream, (unsigned long long)device, (unsigned long long)image,
                             (unsigned long long)pProperties);
                 }
-                VkResult vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return = (VkResult)0;
-                vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return =
-                    vk->vkGetImageDrmFormatModifierPropertiesEXT(unboxed_device, image,
-                                                                 pProperties);
+                VkResult vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return =
+                        vk->vkGetImageDrmFormatModifierPropertiesEXT(unboxed_device, image,
+                                                                     pProperties);
+                }
                 if ((vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return) ==
                     VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
@@ -18216,10 +19016,13 @@
                             (unsigned long long)pHostPointer,
                             (unsigned long long)pMemoryHostPointerProperties);
                 }
-                VkResult vkGetMemoryHostPointerPropertiesEXT_VkResult_return = (VkResult)0;
-                vkGetMemoryHostPointerPropertiesEXT_VkResult_return =
-                    vk->vkGetMemoryHostPointerPropertiesEXT(
-                        unboxed_device, handleType, pHostPointer, pMemoryHostPointerProperties);
+                VkResult vkGetMemoryHostPointerPropertiesEXT_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetMemoryHostPointerPropertiesEXT_VkResult_return =
+                        vk->vkGetMemoryHostPointerPropertiesEXT(
+                            unboxed_device, handleType, pHostPointer, pMemoryHostPointerProperties);
+                }
                 if ((vkGetMemoryHostPointerPropertiesEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetMemoryHostPointerPropertiesEXT_VkResult_return,
@@ -18305,10 +19108,13 @@
                             ioStream, (unsigned long long)physicalDevice,
                             (unsigned long long)pToolCount, (unsigned long long)pToolProperties);
                 }
-                VkResult vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return = (VkResult)0;
-                vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return =
-                    vk->vkGetPhysicalDeviceToolPropertiesEXT(unboxed_physicalDevice, pToolCount,
-                                                             pToolProperties);
+                VkResult vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return =
+                        vk->vkGetPhysicalDeviceToolPropertiesEXT(unboxed_physicalDevice, pToolCount,
+                                                                 pToolProperties);
+                }
                 if ((vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return,
@@ -18382,8 +19188,10 @@
                             (unsigned long long)lineStippleFactor,
                             (unsigned long long)lineStipplePattern);
                 }
-                vk->vkCmdSetLineStippleEXT(unboxed_commandBuffer, lineStippleFactor,
-                                           lineStipplePattern);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetLineStippleEXT(unboxed_commandBuffer, lineStippleFactor,
+                                               lineStipplePattern);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetLineStippleEXT(
@@ -18418,7 +19226,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)cullMode);
                 }
-                vk->vkCmdSetCullModeEXT(unboxed_commandBuffer, cullMode);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetCullModeEXT(unboxed_commandBuffer, cullMode);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetCullModeEXT(&m_pool, snapshotApiCallInfo, packet,
@@ -18450,7 +19260,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)frontFace);
                 }
-                vk->vkCmdSetFrontFaceEXT(unboxed_commandBuffer, frontFace);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetFrontFaceEXT(unboxed_commandBuffer, frontFace);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetFrontFaceEXT(&m_pool, snapshotApiCallInfo, packet,
@@ -18483,7 +19295,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)primitiveTopology);
                 }
-                vk->vkCmdSetPrimitiveTopologyEXT(unboxed_commandBuffer, primitiveTopology);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetPrimitiveTopologyEXT(unboxed_commandBuffer, primitiveTopology);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetPrimitiveTopologyEXT(
@@ -18529,7 +19343,10 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)viewportCount, (unsigned long long)pViewports);
                 }
-                vk->vkCmdSetViewportWithCountEXT(unboxed_commandBuffer, viewportCount, pViewports);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetViewportWithCountEXT(unboxed_commandBuffer, viewportCount,
+                                                     pViewports);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetViewportWithCountEXT(
@@ -18574,7 +19391,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)scissorCount, (unsigned long long)pScissors);
                 }
-                vk->vkCmdSetScissorWithCountEXT(unboxed_commandBuffer, scissorCount, pScissors);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetScissorWithCountEXT(unboxed_commandBuffer, scissorCount, pScissors);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetScissorWithCountEXT(
@@ -18664,8 +19483,11 @@
                             (unsigned long long)pBuffers, (unsigned long long)pOffsets,
                             (unsigned long long)pSizes, (unsigned long long)pStrides);
                 }
-                vk->vkCmdBindVertexBuffers2EXT(unboxed_commandBuffer, firstBinding, bindingCount,
-                                               pBuffers, pOffsets, pSizes, pStrides);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBindVertexBuffers2EXT(unboxed_commandBuffer, firstBinding,
+                                                   bindingCount, pBuffers, pOffsets, pSizes,
+                                                   pStrides);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdBindVertexBuffers2EXT(
@@ -18698,7 +19520,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)depthTestEnable);
                 }
-                vk->vkCmdSetDepthTestEnableEXT(unboxed_commandBuffer, depthTestEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthTestEnableEXT(unboxed_commandBuffer, depthTestEnable);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetDepthTestEnableEXT(&m_pool, snapshotApiCallInfo,
@@ -18731,7 +19555,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)depthWriteEnable);
                 }
-                vk->vkCmdSetDepthWriteEnableEXT(unboxed_commandBuffer, depthWriteEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthWriteEnableEXT(unboxed_commandBuffer, depthWriteEnable);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetDepthWriteEnableEXT(
@@ -18764,7 +19590,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)depthCompareOp);
                 }
-                vk->vkCmdSetDepthCompareOpEXT(unboxed_commandBuffer, depthCompareOp);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthCompareOpEXT(unboxed_commandBuffer, depthCompareOp);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetDepthCompareOpEXT(&m_pool, snapshotApiCallInfo,
@@ -18798,7 +19626,10 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)depthBoundsTestEnable);
                 }
-                vk->vkCmdSetDepthBoundsTestEnableEXT(unboxed_commandBuffer, depthBoundsTestEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthBoundsTestEnableEXT(unboxed_commandBuffer,
+                                                         depthBoundsTestEnable);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetDepthBoundsTestEnableEXT(
@@ -18831,7 +19662,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)stencilTestEnable);
                 }
-                vk->vkCmdSetStencilTestEnableEXT(unboxed_commandBuffer, stencilTestEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetStencilTestEnableEXT(unboxed_commandBuffer, stencilTestEnable);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetStencilTestEnableEXT(
@@ -18881,8 +19714,10 @@
                             (unsigned long long)passOp, (unsigned long long)depthFailOp,
                             (unsigned long long)compareOp);
                 }
-                vk->vkCmdSetStencilOpEXT(unboxed_commandBuffer, faceMask, failOp, passOp,
-                                         depthFailOp, compareOp);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetStencilOpEXT(unboxed_commandBuffer, faceMask, failOp, passOp,
+                                             depthFailOp, compareOp);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetStencilOpEXT(
@@ -18923,9 +19758,11 @@
                             ioStream, (unsigned long long)device,
                             (unsigned long long)pCopyMemoryToImageInfo);
                 }
-                VkResult vkCopyMemoryToImageEXT_VkResult_return = (VkResult)0;
-                vkCopyMemoryToImageEXT_VkResult_return =
-                    vk->vkCopyMemoryToImageEXT(unboxed_device, pCopyMemoryToImageInfo);
+                VkResult vkCopyMemoryToImageEXT_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCopyMemoryToImageEXT_VkResult_return =
+                        vk->vkCopyMemoryToImageEXT(unboxed_device, pCopyMemoryToImageInfo);
+                }
                 if ((vkCopyMemoryToImageEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCopyMemoryToImageEXT_VkResult_return, opcode,
@@ -18970,9 +19807,11 @@
                             ioStream, (unsigned long long)device,
                             (unsigned long long)pCopyImageToMemoryInfo);
                 }
-                VkResult vkCopyImageToMemoryEXT_VkResult_return = (VkResult)0;
-                vkCopyImageToMemoryEXT_VkResult_return =
-                    vk->vkCopyImageToMemoryEXT(unboxed_device, pCopyImageToMemoryInfo);
+                VkResult vkCopyImageToMemoryEXT_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCopyImageToMemoryEXT_VkResult_return =
+                        vk->vkCopyImageToMemoryEXT(unboxed_device, pCopyImageToMemoryInfo);
+                }
                 if ((vkCopyImageToMemoryEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCopyImageToMemoryEXT_VkResult_return, opcode,
@@ -19017,9 +19856,11 @@
                             ioStream, (unsigned long long)device,
                             (unsigned long long)pCopyImageToImageInfo);
                 }
-                VkResult vkCopyImageToImageEXT_VkResult_return = (VkResult)0;
-                vkCopyImageToImageEXT_VkResult_return =
-                    vk->vkCopyImageToImageEXT(unboxed_device, pCopyImageToImageInfo);
+                VkResult vkCopyImageToImageEXT_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCopyImageToImageEXT_VkResult_return =
+                        vk->vkCopyImageToImageEXT(unboxed_device, pCopyImageToImageInfo);
+                }
                 if ((vkCopyImageToImageEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCopyImageToImageEXT_VkResult_return, opcode,
@@ -19073,9 +19914,11 @@
                             ioStream, (unsigned long long)device,
                             (unsigned long long)transitionCount, (unsigned long long)pTransitions);
                 }
-                VkResult vkTransitionImageLayoutEXT_VkResult_return = (VkResult)0;
-                vkTransitionImageLayoutEXT_VkResult_return =
-                    vk->vkTransitionImageLayoutEXT(unboxed_device, transitionCount, pTransitions);
+                VkResult vkTransitionImageLayoutEXT_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkTransitionImageLayoutEXT_VkResult_return = vk->vkTransitionImageLayoutEXT(
+                        unboxed_device, transitionCount, pTransitions);
+                }
                 if ((vkTransitionImageLayoutEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkTransitionImageLayoutEXT_VkResult_return, opcode,
@@ -19138,7 +19981,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)image,
                             (unsigned long long)pSubresource, (unsigned long long)pLayout);
                 }
-                vk->vkGetImageSubresourceLayout2EXT(unboxed_device, image, pSubresource, pLayout);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetImageSubresourceLayout2EXT(unboxed_device, image, pSubresource,
+                                                        pLayout);
+                }
                 vkStream->unsetHandleMapping();
                 if (pLayout) {
                     transform_fromhost_VkSubresourceLayout2KHR(m_state,
@@ -19185,9 +20031,11 @@
                     fprintf(stderr, "stream %p: call vkReleaseSwapchainImagesEXT 0x%llx 0x%llx \n",
                             ioStream, (unsigned long long)device, (unsigned long long)pReleaseInfo);
                 }
-                VkResult vkReleaseSwapchainImagesEXT_VkResult_return = (VkResult)0;
-                vkReleaseSwapchainImagesEXT_VkResult_return =
-                    vk->vkReleaseSwapchainImagesEXT(unboxed_device, pReleaseInfo);
+                VkResult vkReleaseSwapchainImagesEXT_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkReleaseSwapchainImagesEXT_VkResult_return =
+                        vk->vkReleaseSwapchainImagesEXT(unboxed_device, pReleaseInfo);
+                }
                 if ((vkReleaseSwapchainImagesEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkReleaseSwapchainImagesEXT_VkResult_return, opcode,
@@ -19260,9 +20108,11 @@
                         ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                         (unsigned long long)pAllocator, (unsigned long long)pPrivateDataSlot);
                 }
-                VkResult vkCreatePrivateDataSlotEXT_VkResult_return = (VkResult)0;
-                vkCreatePrivateDataSlotEXT_VkResult_return = vk->vkCreatePrivateDataSlotEXT(
-                    unboxed_device, pCreateInfo, pAllocator, pPrivateDataSlot);
+                VkResult vkCreatePrivateDataSlotEXT_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreatePrivateDataSlotEXT_VkResult_return = vk->vkCreatePrivateDataSlotEXT(
+                        unboxed_device, pCreateInfo, pAllocator, pPrivateDataSlot);
+                }
                 if ((vkCreatePrivateDataSlotEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreatePrivateDataSlotEXT_VkResult_return, opcode,
@@ -19324,7 +20174,9 @@
                             ioStream, (unsigned long long)device,
                             (unsigned long long)privateDataSlot, (unsigned long long)pAllocator);
                 }
-                vk->vkDestroyPrivateDataSlotEXT(unboxed_device, privateDataSlot, pAllocator);
+                if (CC_LIKELY(vk)) {
+                    vk->vkDestroyPrivateDataSlotEXT(unboxed_device, privateDataSlot, pAllocator);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkDestroyPrivateDataSlotEXT(&m_pool, snapshotApiCallInfo,
@@ -19371,9 +20223,11 @@
                         (unsigned long long)objectHandle, (unsigned long long)privateDataSlot,
                         (unsigned long long)data);
                 }
-                VkResult vkSetPrivateDataEXT_VkResult_return = (VkResult)0;
-                vkSetPrivateDataEXT_VkResult_return = vk->vkSetPrivateDataEXT(
-                    unboxed_device, objectType, objectHandle, privateDataSlot, data);
+                VkResult vkSetPrivateDataEXT_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkSetPrivateDataEXT_VkResult_return = vk->vkSetPrivateDataEXT(
+                        unboxed_device, objectType, objectHandle, privateDataSlot, data);
+                }
                 if ((vkSetPrivateDataEXT_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkSetPrivateDataEXT_VkResult_return, opcode, context);
@@ -19429,8 +20283,10 @@
                         (unsigned long long)objectHandle, (unsigned long long)privateDataSlot,
                         (unsigned long long)pData);
                 }
-                vk->vkGetPrivateDataEXT(unboxed_device, objectType, objectHandle, privateDataSlot,
-                                        pData);
+                if (CC_LIKELY(vk)) {
+                    vk->vkGetPrivateDataEXT(unboxed_device, objectType, objectHandle,
+                                            privateDataSlot, pData);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write((uint64_t*)pData, sizeof(uint64_t));
                 vkStream->commitWrite();
@@ -19468,7 +20324,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)patchControlPoints);
                 }
-                vk->vkCmdSetPatchControlPointsEXT(unboxed_commandBuffer, patchControlPoints);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetPatchControlPointsEXT(unboxed_commandBuffer, patchControlPoints);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetPatchControlPointsEXT(
@@ -19502,8 +20360,10 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)rasterizerDiscardEnable);
                 }
-                vk->vkCmdSetRasterizerDiscardEnableEXT(unboxed_commandBuffer,
-                                                       rasterizerDiscardEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetRasterizerDiscardEnableEXT(unboxed_commandBuffer,
+                                                           rasterizerDiscardEnable);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetRasterizerDiscardEnableEXT(
@@ -19536,7 +20396,9 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)depthBiasEnable);
                 }
-                vk->vkCmdSetDepthBiasEnableEXT(unboxed_commandBuffer, depthBiasEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthBiasEnableEXT(unboxed_commandBuffer, depthBiasEnable);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetDepthBiasEnableEXT(&m_pool, snapshotApiCallInfo,
@@ -19568,7 +20430,9 @@
                     fprintf(stderr, "stream %p: call vkCmdSetLogicOpEXT 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)commandBuffer, (unsigned long long)logicOp);
                 }
-                vk->vkCmdSetLogicOpEXT(unboxed_commandBuffer, logicOp);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetLogicOpEXT(unboxed_commandBuffer, logicOp);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetLogicOpEXT(&m_pool, snapshotApiCallInfo, packet,
@@ -19601,8 +20465,10 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)primitiveRestartEnable);
                 }
-                vk->vkCmdSetPrimitiveRestartEnableEXT(unboxed_commandBuffer,
-                                                      primitiveRestartEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetPrimitiveRestartEnableEXT(unboxed_commandBuffer,
+                                                          primitiveRestartEnable);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetPrimitiveRestartEnableEXT(
@@ -19645,8 +20511,10 @@
                             (unsigned long long)attachmentCount,
                             (unsigned long long)pColorWriteEnables);
                 }
-                vk->vkCmdSetColorWriteEnableEXT(unboxed_commandBuffer, attachmentCount,
-                                                pColorWriteEnables);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetColorWriteEnableEXT(unboxed_commandBuffer, attachmentCount,
+                                                    pColorWriteEnables);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetColorWriteEnableEXT(
@@ -19671,6 +20539,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -19694,10 +20563,13 @@
                         ioStream, (unsigned long long)device, (unsigned long long)memory,
                         (unsigned long long)pAddress);
                 }
-                VkResult vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return = (VkResult)0;
-                vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return =
-                    m_state->on_vkMapMemoryIntoAddressSpaceGOOGLE(&m_pool, snapshotApiCallInfo,
-                                                                  device, memory, pAddress);
+                VkResult vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return =
+                        m_state->on_vkMapMemoryIntoAddressSpaceGOOGLE(&m_pool, snapshotApiCallInfo,
+                                                                      device, memory, pAddress);
+                }
                 if ((vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return,
@@ -19743,6 +20615,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -19865,11 +20738,13 @@
                             (unsigned long long)pImageInfos, (unsigned long long)pBufferInfos,
                             (unsigned long long)pBufferViews);
                 }
-                m_state->on_vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
-                    &m_pool, snapshotApiCallInfo, device, descriptorSet, descriptorUpdateTemplate,
-                    imageInfoCount, bufferInfoCount, bufferViewCount, pImageInfoEntryIndices,
-                    pBufferInfoEntryIndices, pBufferViewEntryIndices, pImageInfos, pBufferInfos,
-                    pBufferViews);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
+                        &m_pool, snapshotApiCallInfo, device, descriptorSet,
+                        descriptorUpdateTemplate, imageInfoCount, bufferInfoCount, bufferViewCount,
+                        pImageInfoEntryIndices, pBufferInfoEntryIndices, pBufferViewEntryIndices,
+                        pImageInfos, pBufferInfos, pBufferViews);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
@@ -19894,6 +20769,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 vkReadStream->alloc((void**)&pBeginInfo, sizeof(const VkCommandBufferBeginInfo));
                 reservedunmarshal_VkCommandBufferBeginInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                            (VkCommandBufferBeginInfo*)(pBeginInfo),
@@ -19908,8 +20784,10 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)pBeginInfo);
                 }
-                m_state->on_vkBeginCommandBufferAsyncGOOGLE(&m_pool, snapshotApiCallInfo,
-                                                            commandBuffer, pBeginInfo, context);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkBeginCommandBufferAsyncGOOGLE(&m_pool, snapshotApiCallInfo,
+                                                                commandBuffer, pBeginInfo, context);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkBeginCommandBufferAsyncGOOGLE(
@@ -19930,12 +20808,15 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 if (m_logCalls) {
                     fprintf(stderr, "stream %p: call vkEndCommandBufferAsyncGOOGLE 0x%llx \n",
                             ioStream, (unsigned long long)commandBuffer);
                 }
-                m_state->on_vkEndCommandBufferAsyncGOOGLE(&m_pool, snapshotApiCallInfo,
-                                                          commandBuffer, context);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkEndCommandBufferAsyncGOOGLE(&m_pool, snapshotApiCallInfo,
+                                                              commandBuffer, context);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkEndCommandBufferAsyncGOOGLE(
@@ -19957,6 +20838,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 memcpy((VkCommandBufferResetFlags*)&flags, *readStreamPtrPtr,
                        sizeof(VkCommandBufferResetFlags));
                 *readStreamPtrPtr += sizeof(VkCommandBufferResetFlags);
@@ -19965,8 +20847,10 @@
                             "stream %p: call vkResetCommandBufferAsyncGOOGLE 0x%llx 0x%llx \n",
                             ioStream, (unsigned long long)commandBuffer, (unsigned long long)flags);
                 }
-                m_state->on_vkResetCommandBufferAsyncGOOGLE(&m_pool, snapshotApiCallInfo,
-                                                            commandBuffer, flags);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkResetCommandBufferAsyncGOOGLE(&m_pool, snapshotApiCallInfo,
+                                                                commandBuffer, flags);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkResetCommandBufferAsyncGOOGLE(
@@ -19989,6 +20873,7 @@
                 *readStreamPtrPtr += 1 * 8;
                 *(VkCommandBuffer*)&commandBuffer =
                     (VkCommandBuffer)(VkCommandBuffer)((VkCommandBuffer)(*&cgen_var_0));
+                auto vk = dispatch_VkCommandBuffer(commandBuffer);
                 memcpy((uint32_t*)&needHostSync, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&sequenceNumber, *readStreamPtrPtr, sizeof(uint32_t));
@@ -19999,8 +20884,10 @@
                             ioStream, (unsigned long long)commandBuffer,
                             (unsigned long long)needHostSync, (unsigned long long)sequenceNumber);
                 }
-                m_state->on_vkCommandBufferHostSyncGOOGLE(
-                    &m_pool, snapshotApiCallInfo, commandBuffer, needHostSync, sequenceNumber);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCommandBufferHostSyncGOOGLE(
+                        &m_pool, snapshotApiCallInfo, commandBuffer, needHostSync, sequenceNumber);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCommandBufferHostSyncGOOGLE(
@@ -20025,6 +20912,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkImageCreateInfo));
                 reservedunmarshal_VkImageCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                     (VkImageCreateInfo*)(pCreateInfo),
@@ -20072,11 +20960,14 @@
                             (unsigned long long)pAllocator, (unsigned long long)pImage,
                             (unsigned long long)pMemoryRequirements);
                 }
-                VkResult vkCreateImageWithRequirementsGOOGLE_VkResult_return = (VkResult)0;
-                vkCreateImageWithRequirementsGOOGLE_VkResult_return =
-                    m_state->on_vkCreateImageWithRequirementsGOOGLE(&m_pool, snapshotApiCallInfo,
-                                                                    device, pCreateInfo, pAllocator,
-                                                                    pImage, pMemoryRequirements);
+                VkResult vkCreateImageWithRequirementsGOOGLE_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateImageWithRequirementsGOOGLE_VkResult_return =
+                        m_state->on_vkCreateImageWithRequirementsGOOGLE(
+                            &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pImage,
+                            pMemoryRequirements);
+                }
                 if ((vkCreateImageWithRequirementsGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateImageWithRequirementsGOOGLE_VkResult_return,
@@ -20124,6 +21015,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkBufferCreateInfo));
                 reservedunmarshal_VkBufferCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                      (VkBufferCreateInfo*)(pCreateInfo),
@@ -20171,11 +21063,14 @@
                             (unsigned long long)pAllocator, (unsigned long long)pBuffer,
                             (unsigned long long)pMemoryRequirements);
                 }
-                VkResult vkCreateBufferWithRequirementsGOOGLE_VkResult_return = (VkResult)0;
-                vkCreateBufferWithRequirementsGOOGLE_VkResult_return =
-                    m_state->on_vkCreateBufferWithRequirementsGOOGLE(
-                        &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pBuffer,
-                        pMemoryRequirements);
+                VkResult vkCreateBufferWithRequirementsGOOGLE_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateBufferWithRequirementsGOOGLE_VkResult_return =
+                        m_state->on_vkCreateBufferWithRequirementsGOOGLE(
+                            &m_pool, snapshotApiCallInfo, device, pCreateInfo, pAllocator, pBuffer,
+                            pMemoryRequirements);
+                }
                 if ((vkCreateBufferWithRequirementsGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateBufferWithRequirementsGOOGLE_VkResult_return,
@@ -20223,6 +21118,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -20269,10 +21165,14 @@
                             (unsigned long long)pAddress, (unsigned long long)pSize,
                             (unsigned long long)pHostmemId);
                 }
-                VkResult vkGetMemoryHostAddressInfoGOOGLE_VkResult_return = (VkResult)0;
-                vkGetMemoryHostAddressInfoGOOGLE_VkResult_return =
-                    m_state->on_vkGetMemoryHostAddressInfoGOOGLE(
-                        &m_pool, snapshotApiCallInfo, device, memory, pAddress, pSize, pHostmemId);
+                VkResult vkGetMemoryHostAddressInfoGOOGLE_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetMemoryHostAddressInfoGOOGLE_VkResult_return =
+                        m_state->on_vkGetMemoryHostAddressInfoGOOGLE(&m_pool, snapshotApiCallInfo,
+                                                                     device, memory, pAddress,
+                                                                     pSize, pHostmemId);
+                }
                 if ((vkGetMemoryHostAddressInfoGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetMemoryHostAddressInfoGOOGLE_VkResult_return,
@@ -20321,6 +21221,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 // Begin manual non dispatchable handle destroy unboxing for memory;
                 VkDeviceMemory boxed_memory_preserve;
                 uint64_t cgen_var_1;
@@ -20350,9 +21251,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)memory,
                             (unsigned long long)pAllocator);
                 }
-                VkResult vkFreeMemorySyncGOOGLE_VkResult_return = (VkResult)0;
-                vkFreeMemorySyncGOOGLE_VkResult_return = m_state->on_vkFreeMemorySyncGOOGLE(
-                    &m_pool, snapshotApiCallInfo, device, memory, pAllocator);
+                VkResult vkFreeMemorySyncGOOGLE_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkFreeMemorySyncGOOGLE_VkResult_return = m_state->on_vkFreeMemorySyncGOOGLE(
+                        &m_pool, snapshotApiCallInfo, device, memory, pAllocator);
+                }
                 if ((vkFreeMemorySyncGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkFreeMemorySyncGOOGLE_VkResult_return, opcode,
@@ -20383,6 +21286,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 memcpy((uint32_t*)&needHostSync, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&sequenceNumber, *readStreamPtrPtr, sizeof(uint32_t));
@@ -20392,8 +21296,10 @@
                             ioStream, (unsigned long long)queue, (unsigned long long)needHostSync,
                             (unsigned long long)sequenceNumber);
                 }
-                m_state->on_vkQueueHostSyncGOOGLE(&m_pool, snapshotApiCallInfo, queue, needHostSync,
-                                                  sequenceNumber);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkQueueHostSyncGOOGLE(&m_pool, snapshotApiCallInfo, queue,
+                                                      needHostSync, sequenceNumber);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkQueueHostSyncGOOGLE(&m_pool, snapshotApiCallInfo, packet,
@@ -20417,6 +21323,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 memcpy((uint32_t*)&submitCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pSubmits,
@@ -20441,8 +21348,10 @@
                         ioStream, (unsigned long long)queue, (unsigned long long)submitCount,
                         (unsigned long long)pSubmits, (unsigned long long)fence);
                 }
-                m_state->on_vkQueueSubmitAsyncGOOGLE(&m_pool, snapshotApiCallInfo, queue,
-                                                     submitCount, pSubmits, fence);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkQueueSubmitAsyncGOOGLE(&m_pool, snapshotApiCallInfo, queue,
+                                                         submitCount, pSubmits, fence);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkQueueSubmitAsyncGOOGLE(&m_pool, snapshotApiCallInfo,
@@ -20463,11 +21372,14 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 if (m_logCalls) {
                     fprintf(stderr, "stream %p: call vkQueueWaitIdleAsyncGOOGLE 0x%llx \n",
                             ioStream, (unsigned long long)queue);
                 }
-                m_state->on_vkQueueWaitIdleAsyncGOOGLE(&m_pool, snapshotApiCallInfo, queue);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkQueueWaitIdleAsyncGOOGLE(&m_pool, snapshotApiCallInfo, queue);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkQueueWaitIdleAsyncGOOGLE(&m_pool, snapshotApiCallInfo,
@@ -20490,6 +21402,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 memcpy((uint32_t*)&bindInfoCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pBindInfo,
@@ -20516,8 +21429,10 @@
                             ioStream, (unsigned long long)queue, (unsigned long long)bindInfoCount,
                             (unsigned long long)pBindInfo, (unsigned long long)fence);
                 }
-                m_state->on_vkQueueBindSparseAsyncGOOGLE(&m_pool, snapshotApiCallInfo, queue,
-                                                         bindInfoCount, pBindInfo, fence);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkQueueBindSparseAsyncGOOGLE(&m_pool, snapshotApiCallInfo, queue,
+                                                             bindInfoCount, pBindInfo, fence);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkQueueBindSparseAsyncGOOGLE(
@@ -20541,6 +21456,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 memcpy((VkFormat*)&format, *readStreamPtrPtr, sizeof(VkFormat));
                 *readStreamPtrPtr += sizeof(VkFormat);
                 // Begin manual dispatchable handle unboxing for pOffset;
@@ -20560,8 +21476,10 @@
                             ioStream, (unsigned long long)device, (unsigned long long)format,
                             (unsigned long long)pOffset, (unsigned long long)pRowPitchAlignment);
                 }
-                m_state->on_vkGetLinearImageLayoutGOOGLE(&m_pool, snapshotApiCallInfo, device,
-                                                         format, pOffset, pRowPitchAlignment);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetLinearImageLayoutGOOGLE(&m_pool, snapshotApiCallInfo, device,
+                                                             format, pOffset, pRowPitchAlignment);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write((VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
                 vkStream->write((VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
@@ -20588,6 +21506,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 vkReadStream->alloc((void**)&pCreateInfo, sizeof(const VkImageCreateInfo));
                 reservedunmarshal_VkImageCreateInfo(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM,
                                                     (VkImageCreateInfo*)(pCreateInfo),
@@ -20613,8 +21532,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)pCreateInfo,
                             (unsigned long long)pOffset, (unsigned long long)pRowPitchAlignment);
                 }
-                m_state->on_vkGetLinearImageLayout2GOOGLE(&m_pool, snapshotApiCallInfo, device,
-                                                          pCreateInfo, pOffset, pRowPitchAlignment);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkGetLinearImageLayout2GOOGLE(&m_pool, snapshotApiCallInfo, device,
+                                                              pCreateInfo, pOffset,
+                                                              pRowPitchAlignment);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write((VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
                 vkStream->write((VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
@@ -20641,6 +21563,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 // No unbox for commandBuffer
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
@@ -20661,8 +21584,10 @@
                 }
                 if (m_queueSubmitWithCommandsEnabled)
                     seqnoPtr->fetch_add(1, std::memory_order_seq_cst);
-                m_state->on_vkQueueFlushCommandsGOOGLE(&m_pool, snapshotApiCallInfo, queue,
-                                                       commandBuffer, dataSize, pData, context);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkQueueFlushCommandsGOOGLE(&m_pool, snapshotApiCallInfo, queue,
+                                                           commandBuffer, dataSize, pData, context);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkQueueFlushCommandsGOOGLE(&m_pool, snapshotApiCallInfo,
@@ -20691,6 +21616,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 memcpy((uint32_t*)&descriptorPoolCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pDescriptorPools,
@@ -20775,11 +21701,14 @@
                             (unsigned long long)pendingDescriptorWriteCount,
                             (unsigned long long)pPendingDescriptorWrites);
                 }
-                m_state->on_vkQueueCommitDescriptorSetUpdatesGOOGLE(
-                    &m_pool, snapshotApiCallInfo, queue, descriptorPoolCount, pDescriptorPools,
-                    descriptorSetCount, pSetLayouts, pDescriptorSetPoolIds, pDescriptorSetWhichPool,
-                    pDescriptorSetPendingAllocation, pDescriptorWriteStartingIndices,
-                    pendingDescriptorWriteCount, pPendingDescriptorWrites);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkQueueCommitDescriptorSetUpdatesGOOGLE(
+                        &m_pool, snapshotApiCallInfo, queue, descriptorPoolCount, pDescriptorPools,
+                        descriptorSetCount, pSetLayouts, pDescriptorSetPoolIds,
+                        pDescriptorSetWhichPool, pDescriptorSetPendingAllocation,
+                        pDescriptorWriteStartingIndices, pendingDescriptorWriteCount,
+                        pPendingDescriptorWrites);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkQueueCommitDescriptorSetUpdatesGOOGLE(
@@ -20806,6 +21735,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -20836,8 +21766,11 @@
                             (unsigned long long)descriptorPool, (unsigned long long)pPoolIdCount,
                             (unsigned long long)pPoolIds);
                 }
-                m_state->on_vkCollectDescriptorPoolIdsGOOGLE(
-                    &m_pool, snapshotApiCallInfo, device, descriptorPool, pPoolIdCount, pPoolIds);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkCollectDescriptorPoolIdsGOOGLE(&m_pool, snapshotApiCallInfo,
+                                                                 device, descriptorPool,
+                                                                 pPoolIdCount, pPoolIds);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write((uint32_t*)pPoolIdCount, sizeof(uint32_t));
                 // WARNING PTR CHECK
@@ -20869,6 +21802,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 memcpy((uint32_t*)&waitSemaphoreCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 // WARNING PTR CHECK
@@ -20902,9 +21836,11 @@
                             (unsigned long long)waitSemaphoreCount,
                             (unsigned long long)pWaitSemaphores, (unsigned long long)image);
                 }
-                m_state->on_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
-                    &m_pool, snapshotApiCallInfo, queue, waitSemaphoreCount, pWaitSemaphores,
-                    image);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
+                        &m_pool, snapshotApiCallInfo, queue, waitSemaphoreCount, pWaitSemaphores,
+                        image);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
@@ -20929,6 +21865,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 // No unbox for commandBuffer
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
@@ -20952,9 +21889,11 @@
                             (unsigned long long)deviceMemory, (unsigned long long)dataOffset,
                             (unsigned long long)dataSize);
                 }
-                m_state->on_vkQueueFlushCommandsFromAuxMemoryGOOGLE(
-                    &m_pool, snapshotApiCallInfo, queue, commandBuffer, deviceMemory, dataOffset,
-                    dataSize, context);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkQueueFlushCommandsFromAuxMemoryGOOGLE(
+                        &m_pool, snapshotApiCallInfo, queue, commandBuffer, deviceMemory,
+                        dataOffset, dataSize, context);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkQueueFlushCommandsFromAuxMemoryGOOGLE(
@@ -20976,6 +21915,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -20985,9 +21925,11 @@
                     fprintf(stderr, "stream %p: call vkGetBlobGOOGLE 0x%llx 0x%llx \n", ioStream,
                             (unsigned long long)device, (unsigned long long)memory);
                 }
-                VkResult vkGetBlobGOOGLE_VkResult_return = (VkResult)0;
-                vkGetBlobGOOGLE_VkResult_return =
-                    m_state->on_vkGetBlobGOOGLE(&m_pool, snapshotApiCallInfo, device, memory);
+                VkResult vkGetBlobGOOGLE_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetBlobGOOGLE_VkResult_return =
+                        m_state->on_vkGetBlobGOOGLE(&m_pool, snapshotApiCallInfo, device, memory);
+                }
                 if ((vkGetBlobGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetBlobGOOGLE_VkResult_return, opcode, context);
@@ -21026,6 +21968,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -21163,11 +22106,14 @@
                             (unsigned long long)pBufferViews,
                             (unsigned long long)pInlineUniformBlockData);
                 }
-                m_state->on_vkUpdateDescriptorSetWithTemplateSized2GOOGLE(
-                    &m_pool, snapshotApiCallInfo, device, descriptorSet, descriptorUpdateTemplate,
-                    imageInfoCount, bufferInfoCount, bufferViewCount, inlineUniformBlockCount,
-                    pImageInfoEntryIndices, pBufferInfoEntryIndices, pBufferViewEntryIndices,
-                    pImageInfos, pBufferInfos, pBufferViews, pInlineUniformBlockData);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkUpdateDescriptorSetWithTemplateSized2GOOGLE(
+                        &m_pool, snapshotApiCallInfo, device, descriptorSet,
+                        descriptorUpdateTemplate, imageInfoCount, bufferInfoCount, bufferViewCount,
+                        inlineUniformBlockCount, pImageInfoEntryIndices, pBufferInfoEntryIndices,
+                        pBufferViewEntryIndices, pImageInfos, pBufferInfos, pBufferViews,
+                        pInlineUniformBlockData);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkUpdateDescriptorSetWithTemplateSized2GOOGLE(
@@ -21194,6 +22140,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkQueue*)&queue = (VkQueue)(VkQueue)((VkQueue)(*&cgen_var_0));
+                auto vk = dispatch_VkQueue(queue);
                 memcpy((uint32_t*)&submitCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
                 vkReadStream->alloc((void**)&pSubmits,
@@ -21219,8 +22166,10 @@
                         ioStream, (unsigned long long)queue, (unsigned long long)submitCount,
                         (unsigned long long)pSubmits, (unsigned long long)fence);
                 }
-                m_state->on_vkQueueSubmitAsync2GOOGLE(&m_pool, snapshotApiCallInfo, queue,
-                                                      submitCount, pSubmits, fence);
+                if (CC_LIKELY(vk)) {
+                    m_state->on_vkQueueSubmitAsync2GOOGLE(&m_pool, snapshotApiCallInfo, queue,
+                                                          submitCount, pSubmits, fence);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkQueueSubmitAsync2GOOGLE(&m_pool, snapshotApiCallInfo,
@@ -21243,6 +22192,7 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkDevice*)&device = (VkDevice)(VkDevice)((VkDevice)(*&cgen_var_0));
+                auto vk = dispatch_VkDevice(device);
                 uint64_t cgen_var_1;
                 memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
@@ -21255,9 +22205,11 @@
                             ioStream, (unsigned long long)device, (unsigned long long)semaphore,
                             (unsigned long long)syncId);
                 }
-                VkResult vkGetSemaphoreGOOGLE_VkResult_return = (VkResult)0;
-                vkGetSemaphoreGOOGLE_VkResult_return = m_state->on_vkGetSemaphoreGOOGLE(
-                    &m_pool, snapshotApiCallInfo, device, semaphore, syncId);
+                VkResult vkGetSemaphoreGOOGLE_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetSemaphoreGOOGLE_VkResult_return = m_state->on_vkGetSemaphoreGOOGLE(
+                        &m_pool, snapshotApiCallInfo, device, semaphore, syncId);
+                }
                 if ((vkGetSemaphoreGOOGLE_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkGetSemaphoreGOOGLE_VkResult_return, opcode, context);
@@ -21352,9 +22304,11 @@
                             (unsigned long long)width, (unsigned long long)height,
                             (unsigned long long)depth);
                 }
-                vk->vkCmdTraceRaysKHR(unboxed_commandBuffer, pRaygenShaderBindingTable,
-                                      pMissShaderBindingTable, pHitShaderBindingTable,
-                                      pCallableShaderBindingTable, width, height, depth);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdTraceRaysKHR(unboxed_commandBuffer, pRaygenShaderBindingTable,
+                                          pMissShaderBindingTable, pHitShaderBindingTable,
+                                          pCallableShaderBindingTable, width, height, depth);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdTraceRaysKHR(
@@ -21446,10 +22400,14 @@
                             (unsigned long long)pCreateInfos, (unsigned long long)pAllocator,
                             (unsigned long long)pPipelines);
                 }
-                VkResult vkCreateRayTracingPipelinesKHR_VkResult_return = (VkResult)0;
-                vkCreateRayTracingPipelinesKHR_VkResult_return = vk->vkCreateRayTracingPipelinesKHR(
-                    unboxed_device, deferredOperation, pipelineCache, createInfoCount, pCreateInfos,
-                    pAllocator, pPipelines);
+                VkResult vkCreateRayTracingPipelinesKHR_VkResult_return =
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkCreateRayTracingPipelinesKHR_VkResult_return =
+                        vk->vkCreateRayTracingPipelinesKHR(unboxed_device, deferredOperation,
+                                                           pipelineCache, createInfoCount,
+                                                           pCreateInfos, pAllocator, pPipelines);
+                }
                 if ((vkCreateRayTracingPipelinesKHR_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
                 m_state->on_CheckOutOfMemory(vkCreateRayTracingPipelinesKHR_VkResult_return, opcode,
@@ -21518,10 +22476,12 @@
                             (unsigned long long)dataSize, (unsigned long long)pData);
                 }
                 VkResult vkGetRayTracingCaptureReplayShaderGroupHandlesKHR_VkResult_return =
-                    (VkResult)0;
-                vkGetRayTracingCaptureReplayShaderGroupHandlesKHR_VkResult_return =
-                    vk->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
-                        unboxed_device, pipeline, firstGroup, groupCount, dataSize, pData);
+                    VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkGetRayTracingCaptureReplayShaderGroupHandlesKHR_VkResult_return =
+                        vk->vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
+                            unboxed_device, pipeline, firstGroup, groupCount, dataSize, pData);
+                }
                 if ((vkGetRayTracingCaptureReplayShaderGroupHandlesKHR_VkResult_return) ==
                     VK_ERROR_DEVICE_LOST)
                     m_state->on_DeviceLost();
@@ -21614,9 +22574,11 @@
                             (unsigned long long)pCallableShaderBindingTable,
                             (unsigned long long)indirectDeviceAddress);
                 }
-                vk->vkCmdTraceRaysIndirectKHR(unboxed_commandBuffer, pRaygenShaderBindingTable,
-                                              pMissShaderBindingTable, pHitShaderBindingTable,
-                                              pCallableShaderBindingTable, indirectDeviceAddress);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdTraceRaysIndirectKHR(
+                        unboxed_commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable,
+                        pHitShaderBindingTable, pCallableShaderBindingTable, indirectDeviceAddress);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdTraceRaysIndirectKHR(
@@ -21662,9 +22624,11 @@
                 }
                 VkDeviceSize vkGetRayTracingShaderGroupStackSizeKHR_VkDeviceSize_return =
                     (VkDeviceSize)0;
-                vkGetRayTracingShaderGroupStackSizeKHR_VkDeviceSize_return =
-                    vk->vkGetRayTracingShaderGroupStackSizeKHR(unboxed_device, pipeline, group,
-                                                               groupShader);
+                if (CC_LIKELY(vk)) {
+                    vkGetRayTracingShaderGroupStackSizeKHR_VkDeviceSize_return =
+                        vk->vkGetRayTracingShaderGroupStackSizeKHR(unboxed_device, pipeline, group,
+                                                                   groupShader);
+                }
                 vkStream->unsetHandleMapping();
                 vkStream->write(&vkGetRayTracingShaderGroupStackSizeKHR_VkDeviceSize_return,
                                 sizeof(VkDeviceSize));
@@ -21703,8 +22667,10 @@
                         ioStream, (unsigned long long)commandBuffer,
                         (unsigned long long)pipelineStackSize);
                 }
-                vk->vkCmdSetRayTracingPipelineStackSizeKHR(unboxed_commandBuffer,
-                                                           pipelineStackSize);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetRayTracingPipelineStackSizeKHR(unboxed_commandBuffer,
+                                                               pipelineStackSize);
+                }
                 vkStream->unsetHandleMapping();
                 if (m_snapshotsEnabled) {
                     m_state->snapshot()->vkCmdSetRayTracingPipelineStackSizeKHR(
diff --git a/host/vulkan/VkDecoderGlobalState.cpp b/host/vulkan/VkDecoderGlobalState.cpp
index 2ea424a..69ce78a 100644
--- a/host/vulkan/VkDecoderGlobalState.cpp
+++ b/host/vulkan/VkDecoderGlobalState.cpp
@@ -201,12 +201,6 @@
 
 static std::atomic<uint64_t> sNextHostBlobId{1};
 
-// b/319729462
-// On snapshot load, thread local data is not available, thus we use a
-// fake context ID. We will eventually need to fix it once we start using
-// snapshot with virtio.
-static uint32_t kTemporaryContextIdForSnapshotLoading = 1;
-
 class VkDecoderGlobalState::Impl {
    public:
     Impl(VkEmulation* emulation)
@@ -876,6 +870,17 @@
         return VK_SUCCESS;
     }
 
+    VkResult on_vkEnumerateInstanceExtensionProperties(android::base::BumpPool* pool,
+                                                   VkSnapshotApiCallInfo*, const char* pLayerName,
+                                                   uint32_t* pPropertyCount,
+                                                   VkExtensionProperties* pProperties) {
+#if defined(__linux__)
+        // TODO(b/401005629) always lock before the call on linux
+        std::lock_guard<std::mutex> lock(mMutex);
+#endif
+        return m_vk->vkEnumerateInstanceExtensionProperties(pLayerName, pPropertyCount, pProperties);
+    }
+
     VkResult on_vkCreateInstance(android::base::BumpPool* pool, VkSnapshotApiCallInfo*,
                                  const VkInstanceCreateInfo* pCreateInfo,
                                  const VkAllocationCallbacks* pAllocator, VkInstance* pInstance) {
@@ -1263,6 +1268,11 @@
                 // information to mark as unsupported (see b/329845987).
                 protectedMemoryFeatures->protectedMemory = VK_FALSE;
             }
+            VkPhysicalDeviceVulkan11Features* vk11Features =
+                vk_find_struct<VkPhysicalDeviceVulkan11Features>(pFeatures);
+            if (vk11Features != nullptr) {
+                vk11Features->protectedMemory = VK_FALSE;
+            }
 
             VkPhysicalDevicePrivateDataFeatures* privateDataFeatures =
                 vk_find_struct<VkPhysicalDevicePrivateDataFeatures>(pFeatures);
@@ -1574,7 +1584,6 @@
         VkPhysicalDevice boxed_physicalDevice, uint32_t* pQueueFamilyPropertyCount,
         VkQueueFamilyProperties* pQueueFamilyProperties) {
         auto physicalDevice = unbox_VkPhysicalDevice(boxed_physicalDevice);
-        auto vk = dispatch_VkPhysicalDevice(boxed_physicalDevice);
 
         std::lock_guard<std::mutex> lock(mMutex);
 
@@ -1642,7 +1651,6 @@
         VkPhysicalDevice boxed_physicalDevice,
         VkPhysicalDeviceMemoryProperties* pMemoryProperties) {
         auto physicalDevice = unbox_VkPhysicalDevice(boxed_physicalDevice);
-        auto vk = dispatch_VkPhysicalDevice(boxed_physicalDevice);
 
         std::lock_guard<std::mutex> lock(mMutex);
 
@@ -1771,7 +1779,11 @@
         uint32_t supportedFenceHandleTypes = 0;
         uint32_t supportedBinarySemaphoreHandleTypes = 0;
         // Run the underlying API call, filtering extensions.
-        VkDeviceCreateInfo createInfoFiltered = *pCreateInfo;
+
+        VkDeviceCreateInfo createInfoFiltered;
+        deepcopy_VkDeviceCreateInfo(pool, VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, pCreateInfo,
+                                      &createInfoFiltered);
+
         // According to the spec, it seems that the application can use compressed texture formats
         // without enabling the feature when creating the VkDevice, as long as
         // vkGetPhysicalDeviceFormatProperties and vkGetPhysicalDeviceImageFormatProperties reports
@@ -1810,11 +1822,43 @@
             }
         }
 
+        VkPhysicalDeviceRobustness2FeaturesEXT modifiedRobustness2features;
+        const auto r2features = m_vkEmulation->getRobustness2Features();
+        if (r2features && vk_find_struct<VkPhysicalDeviceRobustness2FeaturesEXT>(
+                                       &createInfoFiltered) == nullptr) {
+            VERBOSE("Force-enabling VK_EXT_robustness2 on device creation.");
+            updatedDeviceExtensions.push_back(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
+            modifiedRobustness2features = *r2features;
+            modifiedRobustness2features.pNext = const_cast<void*>(createInfoFiltered.pNext);
+            createInfoFiltered.pNext = &modifiedRobustness2features;
+        }
+
         if (VkPhysicalDeviceFeatures2* features2 =
                 vk_find_struct<VkPhysicalDeviceFeatures2>(&createInfoFiltered)) {
             featuresToFilter.emplace_back(&features2->features);
         }
 
+        {
+            // Protected memory is not supported on emulators. Override feature
+            // information to mark as unsupported (see b/329845987).
+            VkPhysicalDeviceProtectedMemoryFeatures* protectedMemoryFeatures =
+                vk_find_struct<VkPhysicalDeviceProtectedMemoryFeatures>(&createInfoFiltered);
+            if (protectedMemoryFeatures != nullptr) {
+                protectedMemoryFeatures->protectedMemory = VK_FALSE;
+            }
+
+            VkPhysicalDeviceVulkan11Features* vk11Features =
+                vk_find_struct<VkPhysicalDeviceVulkan11Features>(&createInfoFiltered);
+            if (vk11Features != nullptr) {
+                vk11Features->protectedMemory = VK_FALSE;
+            }
+
+            for (uint32_t i = 0; i < createInfoFiltered.queueCreateInfoCount; i++) {
+                (const_cast<VkDeviceQueueCreateInfo*>(createInfoFiltered.pQueueCreateInfos))[i]
+                    .flags &= ~VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT;
+            }
+        }
+
         VkPhysicalDeviceDiagnosticsConfigFeaturesNV deviceDiagnosticsConfigFeatures = {
             .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV,
             .diagnosticsConfig = VK_TRUE,
@@ -2173,7 +2217,7 @@
         // queue. See b/328436383.
         if (pQueueInfo->flags & VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT) {
             *pQueue = VK_NULL_HANDLE;
-            INFO("%s: Cannot get protected Vulkan device queue", __func__);
+            WARN("%s: Cannot get protected Vulkan device queue", __func__);
             return;
         }
         uint32_t queueFamilyIndex = pQueueInfo->queueFamilyIndex;
@@ -2567,9 +2611,6 @@
                                                VkSnapshotApiCallInfo* snapshotInfo,
                                                VkDevice boxed_device,
                                                const VkBindImageMemoryInfo* bimi) {
-        auto device = unbox_VkDevice(boxed_device);
-        auto vk = dispatch_VkDevice(boxed_device);
-
         auto original_underlying_image = bimi->image;
         auto original_boxed_image = unboxed_to_boxed_non_dispatchable_VkImage(original_underlying_image);
 
@@ -3904,8 +3945,6 @@
         std::unique_ptr<bool[]> descriptorWritesNeedDeepCopy(new bool[descriptorWriteCount]);
         for (uint32_t i = 0; i < descriptorWriteCount; i++) {
             const VkWriteDescriptorSet& descriptorWrite = pDescriptorWrites[i];
-            auto descriptorSetInfo =
-                android::base::find(mDescriptorSetInfo, descriptorWrite.dstSet);
             descriptorWritesNeedDeepCopy[i] = false;
             if (!vk_util::vk_descriptor_type_has_image_view(descriptorWrite.descriptorType)) {
                 continue;
@@ -5037,11 +5076,9 @@
     VkResult on_vkAllocateMemory(android::base::BumpPool* pool, VkSnapshotApiCallInfo*,
                                  VkDevice boxed_device, const VkMemoryAllocateInfo* pAllocateInfo,
                                  const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory) {
+        if (!pAllocateInfo) return VK_ERROR_INITIALIZATION_FAILED;
         auto device = unbox_VkDevice(boxed_device);
         auto vk = dispatch_VkDevice(boxed_device);
-        auto* tInfo = RenderThreadInfoVk::get();
-
-        if (!pAllocateInfo) return VK_ERROR_INITIALIZATION_FAILED;
 
         VkMemoryAllocateInfo localAllocInfo = vk_make_orphan_copy(*pAllocateInfo);
         vk_struct_chain_iterator structChainIter = vk_make_chain_iterator(&localAllocInfo);
@@ -5276,7 +5313,7 @@
                     return VK_ERROR_OUT_OF_DEVICE_MEMORY;
                 }
 
-                importInfoMetalHandle.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLBUFFER_BIT_EXT;
+                importInfoMetalHandle.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLHEAP_BIT_EXT;
                 importInfoMetalHandle.handle = bufferMetalMemoryHandle;
 
                 vk_append_struct(&structChainIter, &importInfoMetalHandle);
@@ -5456,7 +5493,7 @@
 #if defined(__APPLE__)
                 if (m_vkEmulation->supportsMoltenVk()) {
                     // Using a different handle type when in MoltenVK mode
-                    handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLBUFFER_BIT_EXT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLTEXTURE_BIT_EXT;
+                    handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLHEAP_BIT_EXT;
                 } else {
                     handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
                 }
@@ -6083,8 +6120,20 @@
                                     VkCommandPool* pCommandPool) {
         auto device = unbox_VkDevice(boxed_device);
         auto vk = dispatch_VkDevice(boxed_device);
+        if (!pCreateInfo) {
+            WARN("%s: Invalid parameter.", __func__);
+            return VK_ERROR_OUT_OF_HOST_MEMORY;
+        }
 
-        VkResult result = vk->vkCreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
+        VkCommandPoolCreateInfo localCI = *pCreateInfo;
+        if (localCI.flags & VK_COMMAND_POOL_CREATE_PROTECTED_BIT) {
+            // Protected memory is not supported on emulators. Override feature
+            // information to mark as unsupported (see b/329845987).
+            localCI.flags &= ~VK_COMMAND_POOL_CREATE_PROTECTED_BIT;
+            VERBOSE("Changed VK_COMMAND_POOL_CREATE_PROTECTED_BIT, new flags = %d", localCI.flags);
+        }
+
+        VkResult result = vk->vkCreateCommandPool(device, &localCI, pAllocator, pCommandPool);
         if (result != VK_SUCCESS) {
             return result;
         }
@@ -8042,100 +8091,63 @@
             return res;
         }
 
-        if (hasDeviceExtension(properties, VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME)) {
-            res.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
-        }
-
-        if (hasDeviceExtension(properties, VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME)) {
-            res.push_back(VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME);
-        }
-
-        if (hasDeviceExtension(properties, VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME)) {
-            res.push_back(VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME);
-        }
-
-        if (hasDeviceExtension(properties, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME)) {
-            res.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
-        }
-
-        if (hasDeviceExtension(properties, VK_KHR_SWAPCHAIN_EXTENSION_NAME)) {
-            res.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
-        }
-
-#ifdef _WIN32
-        if (hasDeviceExtension(properties, VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME)) {
-            res.push_back(VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME);
-        }
-
-        if (hasDeviceExtension(properties, VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME)) {
-            res.push_back(VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME);
-        }
-#elif defined(__QNX__)
-        // Note: VK_QNX_external_memory_screen_buffer is not supported in API translation,
-        // decoding, etc. However, push name to indicate external memory support to guest
-        if (hasDeviceExtension(properties, VK_QNX_EXTERNAL_MEMORY_SCREEN_BUFFER_EXTENSION_NAME)) {
-            res.push_back(VK_QNX_EXTERNAL_MEMORY_SCREEN_BUFFER_EXTENSION_NAME);
-            // EXT_queue_family_foreign is a pre-requisite for QNX_external_memory_screen_buffer
-            if (hasDeviceExtension(properties, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME)) {
-                res.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
-            }
-        }
-
-        if (hasDeviceExtension(properties, VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME)) {
-            res.push_back(VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME);
-        }
-#elif __unix__
-        if (hasDeviceExtension(properties, VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME)) {
-            res.push_back(VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME);
-        }
-
-        if (hasDeviceExtension(properties, VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME)) {
-            res.push_back(VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME);
-        }
-#elif defined(__APPLE__)
-        if (m_vkEmulation->supportsMoltenVk()) {
-            if (hasDeviceExtension(properties, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME)) {
-                res.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME);
-            }
-            if (hasDeviceExtension(properties, VK_EXT_METAL_OBJECTS_EXTENSION_NAME)) {
-                res.push_back(VK_EXT_METAL_OBJECTS_EXTENSION_NAME);
-            }
-            if (hasDeviceExtension(properties, VK_EXT_EXTERNAL_MEMORY_METAL_EXTENSION_NAME)) {
-                res.push_back(VK_EXT_EXTERNAL_MEMORY_METAL_EXTENSION_NAME);
-            }
-        } else {
-            // Non-MoltenVK path, use memory_fd
-            if (hasDeviceExtension(properties, VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME)) {
-                res.push_back(VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME);
-            }
-        }
-#endif
-
-#ifdef __linux__
-        // A dma-buf is a Linux kernel construct, commonly used with open-source DRM drivers.
-        // See https://docs.kernel.org/driver-api/dma-buf.html for details.
-        if (m_vkEmulation->supportsDmaBuf() &&
-            hasDeviceExtension(properties, VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME)) {
-            res.push_back(VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME);
-        }
-
-        if (hasDeviceExtension(properties, VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME)) {
-            // Mesa Vulkan Wayland WSI needs vkGetImageDrmFormatModifierPropertiesEXT. On some Intel
-            // GPUs, this extension is exposed by the driver only if
-            // VK_EXT_image_drm_format_modifier extension is requested via
-            // VkDeviceCreateInfo::ppEnabledExtensionNames. vkcube-wayland does not request it,
-            // which makes the host attempt to call a null function pointer unless we force-enable
-            // it regardless of the client's wishes.
-            res.push_back(VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME);
-        }
-
-#endif
-
-        if (hasDeviceExtension(properties, VK_EXT_PRIVATE_DATA_EXTENSION_NAME)) {
-            //TODO(b/378686769): Enable private data extension where available to
+        std::vector<const char*> hostAlwaysDeviceExtensions = {
+            VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME,
+            VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME,
+            VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
+            VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME,
+            VK_KHR_SWAPCHAIN_EXTENSION_NAME,
+            // TODO(b/378686769): Enable private data extension where available to
             // mitigate the issues with duplicated vulkan handles. This should be
             // removed once the issue is properly resolved.
-            res.push_back(VK_EXT_PRIVATE_DATA_EXTENSION_NAME);
+            VK_EXT_PRIVATE_DATA_EXTENSION_NAME,
+            // It is not uncommon for a guest app flow to expect to use
+            // VK_EXT_IMAGE_DRM_FORMAT_MODIFIER without actually enabling it in the
+            // ppEnabledExtensionNames. Mesa WSI (in Linux) does this, because it has certain
+            // assumptions about the Vulkan loader architecture it is using. However, depending on
+            // the host's Vulkan loader architecture, this could in NULL function pointer access
+            // (i.e. on vkGetImageDrmFormatModifierPropertiesEXT()). So just enable it if it's
+            // available.
+            VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME,
+#ifdef _WIN32
+            VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME,
+            VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME,
+#elif defined(__QNX__)
+            VK_QNX_EXTERNAL_MEMORY_SCREEN_BUFFER_EXTENSION_NAME,
+            // EXT_queue_family_foreign is an extension dependency of
+            // VK_QNX_external_memory_screen_buffer
+            VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME,
+            VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,
+#elif __unix__
+            VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,
+            VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,
+#endif
+        };
+
+#if defined(__APPLE__)
+        if (m_vkEmulation->supportsMoltenVk()) {
+            hostAlwaysDeviceExtensions.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME);
+            hostAlwaysDeviceExtensions.push_back(VK_EXT_METAL_OBJECTS_EXTENSION_NAME);
+            hostAlwaysDeviceExtensions.push_back(VK_EXT_EXTERNAL_MEMORY_METAL_EXTENSION_NAME);
+        } else {
+            // Non-MoltenVK path, use memory_fd
+            hostAlwaysDeviceExtensions.push_back(VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME);
+        }
+#endif
+
+#if defined(__linux__)
+        // A dma-buf is a Linux kernel construct, commonly used with open-source DRM drivers.
+        // See https://docs.kernel.org/driver-api/dma-buf.html for details.
+        if (m_vkEmulation->supportsDmaBuf()) {
+            hostAlwaysDeviceExtensions.push_back(VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME);
+        }
+#endif
+
+        // Enable all the device extensions that should always be enabled on the host (if available)
+        for (auto extName : hostAlwaysDeviceExtensions) {
+            if (hasDeviceExtension(properties, extName)) {
+                res.push_back(extName);
+            }
         }
 
         return res;
@@ -8493,7 +8505,6 @@
     void extractInstanceAndDependenciesLocked(VkInstance instance, InstanceObjects& objects) REQUIRES(mMutex) {
         auto instanceInfoIt = mInstanceInfo.find(instance);
         if (instanceInfoIt == mInstanceInfo.end()) return;
-        auto& instanceInfo = instanceInfoIt->second;
 
         objects.instance = mInstanceInfo.extract(instanceInfoIt);
 
@@ -9128,6 +9139,13 @@
     return mImpl->on_vkEnumerateInstanceVersion(pool, snapshotInfo, pApiVersion);
 }
 
+VkResult VkDecoderGlobalState::on_vkEnumerateInstanceExtensionProperties(
+    android::base::BumpPool* pool, VkSnapshotApiCallInfo* snapshotInfo, const char* pLayerName,
+    uint32_t* pPropertyCount, VkExtensionProperties* pProperties) {
+    return mImpl->on_vkEnumerateInstanceExtensionProperties(pool, snapshotInfo, pLayerName,
+                                                            pPropertyCount, pProperties);
+}
+
 VkResult VkDecoderGlobalState::on_vkCreateInstance(android::base::BumpPool* pool,
                                                    VkSnapshotApiCallInfo* snapshotInfo,
                                                    const VkInstanceCreateInfo* pCreateInfo,
diff --git a/host/vulkan/VkDecoderGlobalState.h b/host/vulkan/VkDecoderGlobalState.h
index 20ced41..6f6646b 100644
--- a/host/vulkan/VkDecoderGlobalState.h
+++ b/host/vulkan/VkDecoderGlobalState.h
@@ -97,6 +97,11 @@
     VkResult on_vkEnumerateInstanceVersion(android::base::BumpPool* pool,
                                            VkSnapshotApiCallInfo* snapshotInfo,
                                            uint32_t* pApiVersion);
+    VkResult on_vkEnumerateInstanceExtensionProperties(android::base::BumpPool* pool,
+                                                       VkSnapshotApiCallInfo* snapshotInfo,
+                                                       const char* pLayerName,
+                                                       uint32_t* pPropertyCount,
+                                                       VkExtensionProperties* pProperties);
 
     // Fast way to get dispatch tables associated with a Vulkan object.
     // VkInstance
diff --git a/host/vulkan/VkDecoderSnapshotUtils.cpp b/host/vulkan/VkDecoderSnapshotUtils.cpp
index 7d75cfe..bb0de1e 100644
--- a/host/vulkan/VkDecoderSnapshotUtils.cpp
+++ b/host/vulkan/VkDecoderSnapshotUtils.cpp
@@ -655,7 +655,10 @@
     _RUN_AND_CHECK(dispatch->vkMapMemory(stateBlock->device, stagingMemory, 0, VK_WHOLE_SIZE,
                                          VkMemoryMapFlags{}, &mapped));
     size_t bufferSize = stream->getBe64();
-    assert(bufferSize == bufferInfo->size);
+    if (bufferSize != bufferInfo->size) {
+        GFXSTREAM_ABORT(emugl::FatalError(emugl::ABORT_REASON_OTHER))
+            << "Failed to read buffer on snapshot load";
+    }
     stream->read(mapped, bufferInfo->size);
 
     VkBufferCopy bufferCopy = {
@@ -669,7 +672,7 @@
     };
     if (dispatch->vkBeginCommandBuffer(commandBuffer, &beginInfo) != VK_SUCCESS) {
         GFXSTREAM_ABORT(emugl::FatalError(emugl::ABORT_REASON_OTHER))
-            << "Failed to start command buffer on snapshot save";
+            << "Failed to start command buffer on snapshot load";
     }
     dispatch->vkCmdCopyBuffer(commandBuffer, stagingBuffer, buffer, 1, &bufferCopy);
     VkBufferMemoryBarrier barrier{.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
diff --git a/host/vulkan/VkEmulatedPhysicalDeviceQueue.cpp b/host/vulkan/VkEmulatedPhysicalDeviceQueue.cpp
index 6c7ee69..fd89a3b 100644
--- a/host/vulkan/VkEmulatedPhysicalDeviceQueue.cpp
+++ b/host/vulkan/VkEmulatedPhysicalDeviceQueue.cpp
@@ -36,6 +36,9 @@
             if (qfp.queueFlags & VK_QUEUE_GRAPHICS_BIT) {
                 qfp.queueCount = 2;
             }
+
+            // TODO(b/329845987) Protected memory is not supported yet on emulators.
+            qfp.queueFlags &= ~VK_QUEUE_PROTECTED_BIT;
         }
     }
 }
diff --git a/host/vulkan/VkReconstruction.cpp b/host/vulkan/VkReconstruction.cpp
index 345e162..4a24ea9 100644
--- a/host/vulkan/VkReconstruction.cpp
+++ b/host/vulkan/VkReconstruction.cpp
@@ -125,7 +125,7 @@
                 savedApis.insert(apiRef);
 #if DEBUG_RECONSTRUCTION
                 DEBUG_RECON("adding handle 0x%lx API 0x%lx op code %d", handle.first, apiRef,
-                            apiItem->opCode);
+                            GetOpcode(*apiItem));
 #endif
                 nextApis.push_back(apiRef);
             }
@@ -167,7 +167,7 @@
         for (auto apiHandle : uniqApiRefsByTopoOrder[i]) {
             auto item = mApiCallManager.get(apiHandle);
             // 4 bytes for opcode, and 4 bytes for saveBufferRaw's size field
-            DEBUG_RECON("saving api handle 0x%lx op code %d", apiHandle, GetOpcode(item));
+            DEBUG_RECON("saving api handle 0x%lx op code %d", apiHandle, GetOpcode(*item));
             memcpy(apiTracePtr, item->packet.data(), item->packet.size());
             apiTracePtr += item->packet.size();
         }
@@ -230,14 +230,17 @@
 
 void VkReconstruction::destroyApiCallInfoIfUnused(VkSnapshotApiCallInfo* info) {
     if (!info) return;
+    auto handle = info->handle;
+    auto currentInfo = mApiCallManager.get(handle);
+    if (!currentInfo) return;
 
-    if (info->packet.empty()) {
-        mApiCallManager.remove(info->handle);
+    if (currentInfo->packet.empty()) {
+        mApiCallManager.remove(handle);
         return;
     }
 
     if (!info->extraCreatedHandles.empty()) {
-        info->createdHandles.insert(info->createdHandles.end(), info->extraCreatedHandles.begin(),
+        currentInfo->createdHandles.insert(currentInfo->createdHandles.end(), info->extraCreatedHandles.begin(),
                                     info->extraCreatedHandles.end());
         info->extraCreatedHandles.clear();
     }
@@ -249,7 +252,10 @@
 
 void VkReconstruction::setApiTrace(VkSnapshotApiCallInfo* apiInfo, const uint8_t* packet,
                                    size_t packetLenBytes) {
-    apiInfo->packet.assign(packet, packet + packetLenBytes);
+    auto* info = mApiCallManager.get(apiInfo->handle);
+    if(info) {
+        info->packet.assign(packet, packet + packetLenBytes);
+    }
 }
 
 void VkReconstruction::dump() {
diff --git a/host/vulkan/VkSubDecoder.cpp b/host/vulkan/VkSubDecoder.cpp
index bc3e050..d218bbe 100644
--- a/host/vulkan/VkSubDecoder.cpp
+++ b/host/vulkan/VkSubDecoder.cpp
@@ -32,6 +32,8 @@
 //
 #define MAX_STACK_ITEMS 16
 #define MAX_PACKET_LENGTH (400 * 1024 * 1024)  // 400MB
+#define CC_LIKELY(exp) (__builtin_expect(!!(exp), true))
+#define CC_UNLIKELY(exp) (__builtin_expect(!!(exp), false))
 size_t subDecode(VulkanMemReadingStream* readStream, VulkanDispatch* vk, void* boxed_dispatchHandle,
                  void* dispatchHandle, VkDeviceSize subDecodeDataSize, const void* pSubDecodeData,
                  const VkDecoderContext& context) {
@@ -72,9 +74,12 @@
                     transform_tohost_VkCommandBufferBeginInfo(
                         globalstate, (VkCommandBufferBeginInfo*)(pBeginInfo));
                 }
-                VkResult vkBeginCommandBuffer_VkResult_return = (VkResult)0;
-                vkBeginCommandBuffer_VkResult_return = this->on_vkBeginCommandBuffer(
-                    pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), pBeginInfo, context);
+                VkResult vkBeginCommandBuffer_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkBeginCommandBuffer_VkResult_return = this->on_vkBeginCommandBuffer(
+                        pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), pBeginInfo,
+                        context);
+                }
                 if ((vkBeginCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     this->on_DeviceLost();
                 this->on_CheckOutOfMemory(vkBeginCommandBuffer_VkResult_return, opcode, context);
@@ -83,9 +88,11 @@
             case OP_vkEndCommandBuffer: {
                 GFXSTREAM_TRACE_EVENT(GFXSTREAM_TRACE_DECODER_CATEGORY,
                                       "VkSubDecoder vkEndCommandBuffer");
-                VkResult vkEndCommandBuffer_VkResult_return = (VkResult)0;
-                vkEndCommandBuffer_VkResult_return = this->on_vkEndCommandBuffer(
-                    pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), context);
+                VkResult vkEndCommandBuffer_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkEndCommandBuffer_VkResult_return = this->on_vkEndCommandBuffer(
+                        pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), context);
+                }
                 if ((vkEndCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     this->on_DeviceLost();
                 this->on_CheckOutOfMemory(vkEndCommandBuffer_VkResult_return, opcode, context);
@@ -98,9 +105,11 @@
                 memcpy((VkCommandBufferResetFlags*)&flags, *readStreamPtrPtr,
                        sizeof(VkCommandBufferResetFlags));
                 *readStreamPtrPtr += sizeof(VkCommandBufferResetFlags);
-                VkResult vkResetCommandBuffer_VkResult_return = (VkResult)0;
-                vkResetCommandBuffer_VkResult_return = this->on_vkResetCommandBuffer(
-                    pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), flags);
+                VkResult vkResetCommandBuffer_VkResult_return = VK_ERROR_OUT_OF_HOST_MEMORY;
+                if (CC_LIKELY(vk)) {
+                    vkResetCommandBuffer_VkResult_return = this->on_vkResetCommandBuffer(
+                        pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), flags);
+                }
                 if ((vkResetCommandBuffer_VkResult_return) == VK_ERROR_DEVICE_LOST)
                     this->on_DeviceLost();
                 this->on_CheckOutOfMemory(vkResetCommandBuffer_VkResult_return, opcode, context);
@@ -118,8 +127,11 @@
                 memcpy((uint64_t*)&cgen_var_0, *readStreamPtrPtr, 1 * 8);
                 *readStreamPtrPtr += 1 * 8;
                 *(VkPipeline*)&pipeline = (VkPipeline)unbox_VkPipeline((VkPipeline)(*&cgen_var_0));
-                this->on_vkCmdBindPipeline(pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle),
-                                           pipelineBindPoint, pipeline);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdBindPipeline(pool, nullptr,
+                                               (VkCommandBuffer)(boxed_dispatchHandle),
+                                               pipelineBindPoint, pipeline);
+                }
                 break;
             }
             case OP_vkCmdSetViewport: {
@@ -148,8 +160,10 @@
                         transform_tohost_VkViewport(globalstate, (VkViewport*)(pViewports + i));
                     }
                 }
-                vk->vkCmdSetViewport((VkCommandBuffer)dispatchHandle, firstViewport, viewportCount,
-                                     pViewports);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetViewport((VkCommandBuffer)dispatchHandle, firstViewport,
+                                         viewportCount, pViewports);
+                }
                 break;
             }
             case OP_vkCmdSetScissor: {
@@ -178,8 +192,10 @@
                         transform_tohost_VkRect2D(globalstate, (VkRect2D*)(pScissors + i));
                     }
                 }
-                vk->vkCmdSetScissor((VkCommandBuffer)dispatchHandle, firstScissor, scissorCount,
-                                    pScissors);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetScissor((VkCommandBuffer)dispatchHandle, firstScissor, scissorCount,
+                                        pScissors);
+                }
                 break;
             }
             case OP_vkCmdSetLineWidth: {
@@ -188,7 +204,9 @@
                 float lineWidth;
                 memcpy((float*)&lineWidth, *readStreamPtrPtr, sizeof(float));
                 *readStreamPtrPtr += sizeof(float);
-                vk->vkCmdSetLineWidth((VkCommandBuffer)dispatchHandle, lineWidth);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetLineWidth((VkCommandBuffer)dispatchHandle, lineWidth);
+                }
                 break;
             }
             case OP_vkCmdSetDepthBias: {
@@ -203,8 +221,10 @@
                 *readStreamPtrPtr += sizeof(float);
                 memcpy((float*)&depthBiasSlopeFactor, *readStreamPtrPtr, sizeof(float));
                 *readStreamPtrPtr += sizeof(float);
-                vk->vkCmdSetDepthBias((VkCommandBuffer)dispatchHandle, depthBiasConstantFactor,
-                                      depthBiasClamp, depthBiasSlopeFactor);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthBias((VkCommandBuffer)dispatchHandle, depthBiasConstantFactor,
+                                          depthBiasClamp, depthBiasSlopeFactor);
+                }
                 break;
             }
             case OP_vkCmdSetBlendConstants: {
@@ -213,7 +233,9 @@
                 float blendConstants[4];
                 memcpy((float*)blendConstants, *readStreamPtrPtr, 4 * sizeof(const float));
                 *readStreamPtrPtr += 4 * sizeof(const float);
-                vk->vkCmdSetBlendConstants((VkCommandBuffer)dispatchHandle, blendConstants);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetBlendConstants((VkCommandBuffer)dispatchHandle, blendConstants);
+                }
                 break;
             }
             case OP_vkCmdSetDepthBounds: {
@@ -225,8 +247,10 @@
                 *readStreamPtrPtr += sizeof(float);
                 memcpy((float*)&maxDepthBounds, *readStreamPtrPtr, sizeof(float));
                 *readStreamPtrPtr += sizeof(float);
-                vk->vkCmdSetDepthBounds((VkCommandBuffer)dispatchHandle, minDepthBounds,
-                                        maxDepthBounds);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthBounds((VkCommandBuffer)dispatchHandle, minDepthBounds,
+                                            maxDepthBounds);
+                }
                 break;
             }
             case OP_vkCmdSetStencilCompareMask: {
@@ -239,8 +263,10 @@
                 *readStreamPtrPtr += sizeof(VkStencilFaceFlags);
                 memcpy((uint32_t*)&compareMask, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdSetStencilCompareMask((VkCommandBuffer)dispatchHandle, faceMask,
-                                               compareMask);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetStencilCompareMask((VkCommandBuffer)dispatchHandle, faceMask,
+                                                   compareMask);
+                }
                 break;
             }
             case OP_vkCmdSetStencilWriteMask: {
@@ -253,7 +279,10 @@
                 *readStreamPtrPtr += sizeof(VkStencilFaceFlags);
                 memcpy((uint32_t*)&writeMask, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdSetStencilWriteMask((VkCommandBuffer)dispatchHandle, faceMask, writeMask);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetStencilWriteMask((VkCommandBuffer)dispatchHandle, faceMask,
+                                                 writeMask);
+                }
                 break;
             }
             case OP_vkCmdSetStencilReference: {
@@ -266,7 +295,10 @@
                 *readStreamPtrPtr += sizeof(VkStencilFaceFlags);
                 memcpy((uint32_t*)&reference, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdSetStencilReference((VkCommandBuffer)dispatchHandle, faceMask, reference);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetStencilReference((VkCommandBuffer)dispatchHandle, faceMask,
+                                                 reference);
+                }
                 break;
             }
             case OP_vkCmdBindDescriptorSets: {
@@ -321,10 +353,12 @@
                 memcpy((uint32_t*)pDynamicOffsets, *readStreamPtrPtr,
                        ((dynamicOffsetCount)) * sizeof(const uint32_t));
                 *readStreamPtrPtr += ((dynamicOffsetCount)) * sizeof(const uint32_t);
-                this->on_vkCmdBindDescriptorSets(
-                    pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), pipelineBindPoint,
-                    layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount,
-                    pDynamicOffsets);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdBindDescriptorSets(
+                        pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), pipelineBindPoint,
+                        layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount,
+                        pDynamicOffsets);
+                }
                 break;
             }
             case OP_vkCmdBindIndexBuffer: {
@@ -341,8 +375,10 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((VkIndexType*)&indexType, *readStreamPtrPtr, sizeof(VkIndexType));
                 *readStreamPtrPtr += sizeof(VkIndexType);
-                vk->vkCmdBindIndexBuffer((VkCommandBuffer)dispatchHandle, buffer, offset,
-                                         indexType);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBindIndexBuffer((VkCommandBuffer)dispatchHandle, buffer, offset,
+                                             indexType);
+                }
                 break;
             }
             case OP_vkCmdBindVertexBuffers: {
@@ -382,8 +418,10 @@
                 memcpy((VkDeviceSize*)pOffsets, *readStreamPtrPtr,
                        ((bindingCount)) * sizeof(const VkDeviceSize));
                 *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
-                vk->vkCmdBindVertexBuffers((VkCommandBuffer)dispatchHandle, firstBinding,
-                                           bindingCount, pBuffers, pOffsets);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBindVertexBuffers((VkCommandBuffer)dispatchHandle, firstBinding,
+                                               bindingCount, pBuffers, pOffsets);
+                }
                 break;
             }
             case OP_vkCmdDraw: {
@@ -400,8 +438,10 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&firstInstance, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDraw((VkCommandBuffer)dispatchHandle, vertexCount, instanceCount,
-                              firstVertex, firstInstance);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDraw((VkCommandBuffer)dispatchHandle, vertexCount, instanceCount,
+                                  firstVertex, firstInstance);
+                }
                 break;
             }
             case OP_vkCmdDrawIndexed: {
@@ -422,8 +462,10 @@
                 *readStreamPtrPtr += sizeof(int32_t);
                 memcpy((uint32_t*)&firstInstance, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndexed((VkCommandBuffer)dispatchHandle, indexCount, instanceCount,
-                                     firstIndex, vertexOffset, firstInstance);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDrawIndexed((VkCommandBuffer)dispatchHandle, indexCount, instanceCount,
+                                         firstIndex, vertexOffset, firstInstance);
+                }
                 break;
             }
             case OP_vkCmdDrawIndirect: {
@@ -443,8 +485,10 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndirect((VkCommandBuffer)dispatchHandle, buffer, offset, drawCount,
-                                      stride);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDrawIndirect((VkCommandBuffer)dispatchHandle, buffer, offset,
+                                          drawCount, stride);
+                }
                 break;
             }
             case OP_vkCmdDrawIndexedIndirect: {
@@ -464,8 +508,10 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndexedIndirect((VkCommandBuffer)dispatchHandle, buffer, offset,
-                                             drawCount, stride);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDrawIndexedIndirect((VkCommandBuffer)dispatchHandle, buffer, offset,
+                                                 drawCount, stride);
+                }
                 break;
             }
             case OP_vkCmdDispatch: {
@@ -480,8 +526,10 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&groupCountZ, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDispatch((VkCommandBuffer)dispatchHandle, groupCountX, groupCountY,
-                                  groupCountZ);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDispatch((VkCommandBuffer)dispatchHandle, groupCountX, groupCountY,
+                                      groupCountZ);
+                }
                 break;
             }
             case OP_vkCmdDispatchIndirect: {
@@ -495,7 +543,9 @@
                 *(VkBuffer*)&buffer = (VkBuffer)unbox_VkBuffer((VkBuffer)(*&cgen_var_0));
                 memcpy((VkDeviceSize*)&offset, *readStreamPtrPtr, sizeof(VkDeviceSize));
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
-                vk->vkCmdDispatchIndirect((VkCommandBuffer)dispatchHandle, buffer, offset);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDispatchIndirect((VkCommandBuffer)dispatchHandle, buffer, offset);
+                }
                 break;
             }
             case OP_vkCmdCopyBuffer: {
@@ -531,8 +581,10 @@
                         transform_tohost_VkBufferCopy(globalstate, (VkBufferCopy*)(pRegions + i));
                     }
                 }
-                vk->vkCmdCopyBuffer((VkCommandBuffer)dispatchHandle, srcBuffer, dstBuffer,
-                                    regionCount, pRegions);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdCopyBuffer((VkCommandBuffer)dispatchHandle, srcBuffer, dstBuffer,
+                                        regionCount, pRegions);
+                }
                 break;
             }
             case OP_vkCmdCopyImage: {
@@ -574,9 +626,11 @@
                         transform_tohost_VkImageCopy(globalstate, (VkImageCopy*)(pRegions + i));
                     }
                 }
-                this->on_vkCmdCopyImage(pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle),
-                                        srcImage, srcImageLayout, dstImage, dstImageLayout,
-                                        regionCount, pRegions);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdCopyImage(pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle),
+                                            srcImage, srcImageLayout, dstImage, dstImageLayout,
+                                            regionCount, pRegions);
+                }
                 break;
             }
             case OP_vkCmdBlitImage: {
@@ -621,8 +675,10 @@
                         transform_tohost_VkImageBlit(globalstate, (VkImageBlit*)(pRegions + i));
                     }
                 }
-                vk->vkCmdBlitImage((VkCommandBuffer)dispatchHandle, srcImage, srcImageLayout,
-                                   dstImage, dstImageLayout, regionCount, pRegions, filter);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBlitImage((VkCommandBuffer)dispatchHandle, srcImage, srcImageLayout,
+                                       dstImage, dstImageLayout, regionCount, pRegions, filter);
+                }
                 break;
             }
             case OP_vkCmdCopyBufferToImage: {
@@ -663,9 +719,11 @@
                                                            (VkBufferImageCopy*)(pRegions + i));
                     }
                 }
-                this->on_vkCmdCopyBufferToImage(
-                    pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), srcBuffer, dstImage,
-                    dstImageLayout, regionCount, pRegions, context);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdCopyBufferToImage(
+                        pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), srcBuffer, dstImage,
+                        dstImageLayout, regionCount, pRegions, context);
+                }
                 break;
             }
             case OP_vkCmdCopyImageToBuffer: {
@@ -706,9 +764,11 @@
                                                            (VkBufferImageCopy*)(pRegions + i));
                     }
                 }
-                this->on_vkCmdCopyImageToBuffer(pool, nullptr,
-                                                (VkCommandBuffer)(boxed_dispatchHandle), srcImage,
-                                                srcImageLayout, dstBuffer, regionCount, pRegions);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdCopyImageToBuffer(
+                        pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), srcImage,
+                        srcImageLayout, dstBuffer, regionCount, pRegions);
+                }
                 break;
             }
             case OP_vkCmdUpdateBuffer: {
@@ -734,8 +794,10 @@
                 }
                 memcpy((void*)pData, *readStreamPtrPtr, ((dataSize)) * sizeof(const uint8_t));
                 *readStreamPtrPtr += ((dataSize)) * sizeof(const uint8_t);
-                vk->vkCmdUpdateBuffer((VkCommandBuffer)dispatchHandle, dstBuffer, dstOffset,
-                                      dataSize, pData);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdUpdateBuffer((VkCommandBuffer)dispatchHandle, dstBuffer, dstOffset,
+                                          dataSize, pData);
+                }
                 break;
             }
             case OP_vkCmdFillBuffer: {
@@ -755,8 +817,10 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((uint32_t*)&data, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdFillBuffer((VkCommandBuffer)dispatchHandle, dstBuffer, dstOffset, size,
-                                    data);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdFillBuffer((VkCommandBuffer)dispatchHandle, dstBuffer, dstOffset, size,
+                                        data);
+                }
                 break;
             }
             case OP_vkCmdClearColorImage: {
@@ -800,8 +864,10 @@
                             globalstate, (VkImageSubresourceRange*)(pRanges + i));
                     }
                 }
-                vk->vkCmdClearColorImage((VkCommandBuffer)dispatchHandle, image, imageLayout,
-                                         pColor, rangeCount, pRanges);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdClearColorImage((VkCommandBuffer)dispatchHandle, image, imageLayout,
+                                             pColor, rangeCount, pRanges);
+                }
                 break;
             }
             case OP_vkCmdClearDepthStencilImage: {
@@ -847,8 +913,11 @@
                             globalstate, (VkImageSubresourceRange*)(pRanges + i));
                     }
                 }
-                vk->vkCmdClearDepthStencilImage((VkCommandBuffer)dispatchHandle, image, imageLayout,
-                                                pDepthStencil, rangeCount, pRanges);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdClearDepthStencilImage((VkCommandBuffer)dispatchHandle, image,
+                                                    imageLayout, pDepthStencil, rangeCount,
+                                                    pRanges);
+                }
                 break;
             }
             case OP_vkCmdClearAttachments: {
@@ -895,8 +964,10 @@
                         transform_tohost_VkClearRect(globalstate, (VkClearRect*)(pRects + i));
                     }
                 }
-                vk->vkCmdClearAttachments((VkCommandBuffer)dispatchHandle, attachmentCount,
-                                          pAttachments, rectCount, pRects);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdClearAttachments((VkCommandBuffer)dispatchHandle, attachmentCount,
+                                              pAttachments, rectCount, pRects);
+                }
                 break;
             }
             case OP_vkCmdResolveImage: {
@@ -940,8 +1011,10 @@
                                                         (VkImageResolve*)(pRegions + i));
                     }
                 }
-                vk->vkCmdResolveImage((VkCommandBuffer)dispatchHandle, srcImage, srcImageLayout,
-                                      dstImage, dstImageLayout, regionCount, pRegions);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdResolveImage((VkCommandBuffer)dispatchHandle, srcImage, srcImageLayout,
+                                          dstImage, dstImageLayout, regionCount, pRegions);
+                }
                 break;
             }
             case OP_vkCmdSetEvent: {
@@ -956,7 +1029,9 @@
                 memcpy((VkPipelineStageFlags*)&stageMask, *readStreamPtrPtr,
                        sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
-                vk->vkCmdSetEvent((VkCommandBuffer)dispatchHandle, event, stageMask);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetEvent((VkCommandBuffer)dispatchHandle, event, stageMask);
+                }
                 break;
             }
             case OP_vkCmdResetEvent: {
@@ -971,7 +1046,9 @@
                 memcpy((VkPipelineStageFlags*)&stageMask, *readStreamPtrPtr,
                        sizeof(VkPipelineStageFlags));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags);
-                vk->vkCmdResetEvent((VkCommandBuffer)dispatchHandle, event, stageMask);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdResetEvent((VkCommandBuffer)dispatchHandle, event, stageMask);
+                }
                 break;
             }
             case OP_vkCmdWaitEvents: {
@@ -1073,10 +1150,12 @@
                             globalstate, (VkImageMemoryBarrier*)(pImageMemoryBarriers + i));
                     }
                 }
-                vk->vkCmdWaitEvents((VkCommandBuffer)dispatchHandle, eventCount, pEvents,
-                                    srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
-                                    bufferMemoryBarrierCount, pBufferMemoryBarriers,
-                                    imageMemoryBarrierCount, pImageMemoryBarriers);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdWaitEvents(
+                        (VkCommandBuffer)dispatchHandle, eventCount, pEvents, srcStageMask,
+                        dstStageMask, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
+                        pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
+                }
                 break;
             }
             case OP_vkCmdPipelineBarrier: {
@@ -1162,11 +1241,13 @@
                             globalstate, (VkImageMemoryBarrier*)(pImageMemoryBarriers + i));
                     }
                 }
-                this->on_vkCmdPipelineBarrier(
-                    pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), srcStageMask,
-                    dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
-                    bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount,
-                    pImageMemoryBarriers);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdPipelineBarrier(
+                        pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), srcStageMask,
+                        dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
+                        bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount,
+                        pImageMemoryBarriers);
+                }
                 break;
             }
             case OP_vkCmdBeginQuery: {
@@ -1185,7 +1266,9 @@
                 memcpy((VkQueryControlFlags*)&flags, *readStreamPtrPtr,
                        sizeof(VkQueryControlFlags));
                 *readStreamPtrPtr += sizeof(VkQueryControlFlags);
-                vk->vkCmdBeginQuery((VkCommandBuffer)dispatchHandle, queryPool, query, flags);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBeginQuery((VkCommandBuffer)dispatchHandle, queryPool, query, flags);
+                }
                 break;
             }
             case OP_vkCmdEndQuery: {
@@ -1200,7 +1283,9 @@
                     (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdEndQuery((VkCommandBuffer)dispatchHandle, queryPool, query);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndQuery((VkCommandBuffer)dispatchHandle, queryPool, query);
+                }
                 break;
             }
             case OP_vkCmdResetQueryPool: {
@@ -1218,8 +1303,10 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&queryCount, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdResetQueryPool((VkCommandBuffer)dispatchHandle, queryPool, firstQuery,
-                                        queryCount);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdResetQueryPool((VkCommandBuffer)dispatchHandle, queryPool, firstQuery,
+                                            queryCount);
+                }
                 break;
             }
             case OP_vkCmdWriteTimestamp: {
@@ -1238,8 +1325,10 @@
                     (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdWriteTimestamp((VkCommandBuffer)dispatchHandle, pipelineStage, queryPool,
-                                        query);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdWriteTimestamp((VkCommandBuffer)dispatchHandle, pipelineStage,
+                                            queryPool, query);
+                }
                 break;
             }
             case OP_vkCmdCopyQueryPoolResults: {
@@ -1271,9 +1360,11 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((VkQueryResultFlags*)&flags, *readStreamPtrPtr, sizeof(VkQueryResultFlags));
                 *readStreamPtrPtr += sizeof(VkQueryResultFlags);
-                this->on_vkCmdCopyQueryPoolResults(
-                    pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), queryPool, firstQuery,
-                    queryCount, dstBuffer, dstOffset, stride, flags);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdCopyQueryPoolResults(
+                        pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), queryPool,
+                        firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
+                }
                 break;
             }
             case OP_vkCmdPushConstants: {
@@ -1304,8 +1395,10 @@
                 }
                 memcpy((void*)pValues, *readStreamPtrPtr, ((size)) * sizeof(const uint8_t));
                 *readStreamPtrPtr += ((size)) * sizeof(const uint8_t);
-                vk->vkCmdPushConstants((VkCommandBuffer)dispatchHandle, layout, stageFlags, offset,
-                                       size, pValues);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdPushConstants((VkCommandBuffer)dispatchHandle, layout, stageFlags,
+                                           offset, size, pValues);
+                }
                 break;
             }
             case OP_vkCmdBeginRenderPass: {
@@ -1324,9 +1417,11 @@
                     transform_tohost_VkRenderPassBeginInfo(
                         globalstate, (VkRenderPassBeginInfo*)(pRenderPassBegin));
                 }
-                this->on_vkCmdBeginRenderPass(pool, nullptr,
-                                              (VkCommandBuffer)(boxed_dispatchHandle),
-                                              pRenderPassBegin, contents);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdBeginRenderPass(pool, nullptr,
+                                                  (VkCommandBuffer)(boxed_dispatchHandle),
+                                                  pRenderPassBegin, contents);
+                }
                 break;
             }
             case OP_vkCmdNextSubpass: {
@@ -1335,13 +1430,17 @@
                 VkSubpassContents contents;
                 memcpy((VkSubpassContents*)&contents, *readStreamPtrPtr, sizeof(VkSubpassContents));
                 *readStreamPtrPtr += sizeof(VkSubpassContents);
-                vk->vkCmdNextSubpass((VkCommandBuffer)dispatchHandle, contents);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdNextSubpass((VkCommandBuffer)dispatchHandle, contents);
+                }
                 break;
             }
             case OP_vkCmdEndRenderPass: {
                 GFXSTREAM_TRACE_EVENT(GFXSTREAM_TRACE_DECODER_CATEGORY,
                                       "VkSubDecoder vkCmdEndRenderPass");
-                vk->vkCmdEndRenderPass((VkCommandBuffer)dispatchHandle);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndRenderPass((VkCommandBuffer)dispatchHandle);
+                }
                 break;
             }
             case OP_vkCmdExecuteCommands: {
@@ -1369,9 +1468,11 @@
                                    : VK_NULL_HANDLE;
                     }
                 }
-                this->on_vkCmdExecuteCommands(pool, nullptr,
-                                              (VkCommandBuffer)(boxed_dispatchHandle),
-                                              commandBufferCount, pCommandBuffers);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdExecuteCommands(pool, nullptr,
+                                                  (VkCommandBuffer)(boxed_dispatchHandle),
+                                                  commandBufferCount, pCommandBuffers);
+                }
                 break;
             }
 #endif
@@ -1382,7 +1483,9 @@
                 uint32_t deviceMask;
                 memcpy((uint32_t*)&deviceMask, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdSetDeviceMask((VkCommandBuffer)dispatchHandle, deviceMask);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDeviceMask((VkCommandBuffer)dispatchHandle, deviceMask);
+                }
                 break;
             }
             case OP_vkCmdDispatchBase: {
@@ -1406,8 +1509,10 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&groupCountZ, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDispatchBase((VkCommandBuffer)dispatchHandle, baseGroupX, baseGroupY,
-                                      baseGroupZ, groupCountX, groupCountY, groupCountZ);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDispatchBase((VkCommandBuffer)dispatchHandle, baseGroupX, baseGroupY,
+                                          baseGroupZ, groupCountX, groupCountY, groupCountZ);
+                }
                 break;
             }
 #endif
@@ -1437,8 +1542,11 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndirectCount((VkCommandBuffer)dispatchHandle, buffer, offset,
-                                           countBuffer, countBufferOffset, maxDrawCount, stride);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDrawIndirectCount((VkCommandBuffer)dispatchHandle, buffer, offset,
+                                               countBuffer, countBufferOffset, maxDrawCount,
+                                               stride);
+                }
                 break;
             }
             case OP_vkCmdDrawIndexedIndirectCount: {
@@ -1466,9 +1574,11 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&stride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndexedIndirectCount((VkCommandBuffer)dispatchHandle, buffer, offset,
-                                                  countBuffer, countBufferOffset, maxDrawCount,
-                                                  stride);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDrawIndexedIndirectCount((VkCommandBuffer)dispatchHandle, buffer,
+                                                      offset, countBuffer, countBufferOffset,
+                                                      maxDrawCount, stride);
+                }
                 break;
             }
             case OP_vkCmdBeginRenderPass2: {
@@ -1494,9 +1604,11 @@
                     transform_tohost_VkSubpassBeginInfo(globalstate,
                                                         (VkSubpassBeginInfo*)(pSubpassBeginInfo));
                 }
-                this->on_vkCmdBeginRenderPass2(pool, nullptr,
-                                               (VkCommandBuffer)(boxed_dispatchHandle),
-                                               pRenderPassBegin, pSubpassBeginInfo);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdBeginRenderPass2(pool, nullptr,
+                                                   (VkCommandBuffer)(boxed_dispatchHandle),
+                                                   pRenderPassBegin, pSubpassBeginInfo);
+                }
                 break;
             }
             case OP_vkCmdNextSubpass2: {
@@ -1522,8 +1634,10 @@
                     transform_tohost_VkSubpassEndInfo(globalstate,
                                                       (VkSubpassEndInfo*)(pSubpassEndInfo));
                 }
-                vk->vkCmdNextSubpass2((VkCommandBuffer)dispatchHandle, pSubpassBeginInfo,
-                                      pSubpassEndInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdNextSubpass2((VkCommandBuffer)dispatchHandle, pSubpassBeginInfo,
+                                          pSubpassEndInfo);
+                }
                 break;
             }
             case OP_vkCmdEndRenderPass2: {
@@ -1539,7 +1653,9 @@
                     transform_tohost_VkSubpassEndInfo(globalstate,
                                                       (VkSubpassEndInfo*)(pSubpassEndInfo));
                 }
-                vk->vkCmdEndRenderPass2((VkCommandBuffer)dispatchHandle, pSubpassEndInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndRenderPass2((VkCommandBuffer)dispatchHandle, pSubpassEndInfo);
+                }
                 break;
             }
 #endif
@@ -1562,7 +1678,9 @@
                     transform_tohost_VkDependencyInfo(globalstate,
                                                       (VkDependencyInfo*)(pDependencyInfo));
                 }
-                vk->vkCmdSetEvent2((VkCommandBuffer)dispatchHandle, event, pDependencyInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetEvent2((VkCommandBuffer)dispatchHandle, event, pDependencyInfo);
+                }
                 break;
             }
             case OP_vkCmdResetEvent2: {
@@ -1577,7 +1695,9 @@
                 memcpy((VkPipelineStageFlags2*)&stageMask, *readStreamPtrPtr,
                        sizeof(VkPipelineStageFlags2));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags2);
-                vk->vkCmdResetEvent2((VkCommandBuffer)dispatchHandle, event, stageMask);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdResetEvent2((VkCommandBuffer)dispatchHandle, event, stageMask);
+                }
                 break;
             }
             case OP_vkCmdWaitEvents2: {
@@ -1622,8 +1742,10 @@
                             globalstate, (VkDependencyInfo*)(pDependencyInfos + i));
                     }
                 }
-                vk->vkCmdWaitEvents2((VkCommandBuffer)dispatchHandle, eventCount, pEvents,
-                                     pDependencyInfos);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdWaitEvents2((VkCommandBuffer)dispatchHandle, eventCount, pEvents,
+                                         pDependencyInfos);
+                }
                 break;
             }
             case OP_vkCmdPipelineBarrier2: {
@@ -1639,8 +1761,10 @@
                     transform_tohost_VkDependencyInfo(globalstate,
                                                       (VkDependencyInfo*)(pDependencyInfo));
                 }
-                this->on_vkCmdPipelineBarrier2(
-                    pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), pDependencyInfo);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdPipelineBarrier2(
+                        pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), pDependencyInfo);
+                }
                 break;
             }
             case OP_vkCmdWriteTimestamp2: {
@@ -1659,7 +1783,10 @@
                     (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdWriteTimestamp2((VkCommandBuffer)dispatchHandle, stage, queryPool, query);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdWriteTimestamp2((VkCommandBuffer)dispatchHandle, stage, queryPool,
+                                             query);
+                }
                 break;
             }
             case OP_vkCmdCopyBuffer2: {
@@ -1675,7 +1802,9 @@
                     transform_tohost_VkCopyBufferInfo2(globalstate,
                                                        (VkCopyBufferInfo2*)(pCopyBufferInfo));
                 }
-                vk->vkCmdCopyBuffer2((VkCommandBuffer)dispatchHandle, pCopyBufferInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdCopyBuffer2((VkCommandBuffer)dispatchHandle, pCopyBufferInfo);
+                }
                 break;
             }
             case OP_vkCmdCopyImage2: {
@@ -1691,8 +1820,10 @@
                     transform_tohost_VkCopyImageInfo2(globalstate,
                                                       (VkCopyImageInfo2*)(pCopyImageInfo));
                 }
-                this->on_vkCmdCopyImage2(pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle),
-                                         pCopyImageInfo);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdCopyImage2(pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle),
+                                             pCopyImageInfo);
+                }
                 break;
             }
             case OP_vkCmdCopyBufferToImage2: {
@@ -1708,9 +1839,11 @@
                     transform_tohost_VkCopyBufferToImageInfo2(
                         globalstate, (VkCopyBufferToImageInfo2*)(pCopyBufferToImageInfo));
                 }
-                this->on_vkCmdCopyBufferToImage2(pool, nullptr,
-                                                 (VkCommandBuffer)(boxed_dispatchHandle),
-                                                 pCopyBufferToImageInfo, context);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdCopyBufferToImage2(pool, nullptr,
+                                                     (VkCommandBuffer)(boxed_dispatchHandle),
+                                                     pCopyBufferToImageInfo, context);
+                }
                 break;
             }
             case OP_vkCmdCopyImageToBuffer2: {
@@ -1726,8 +1859,11 @@
                     transform_tohost_VkCopyImageToBufferInfo2(
                         globalstate, (VkCopyImageToBufferInfo2*)(pCopyImageToBufferInfo));
                 }
-                this->on_vkCmdCopyImageToBuffer2(
-                    pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), pCopyImageToBufferInfo);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdCopyImageToBuffer2(pool, nullptr,
+                                                     (VkCommandBuffer)(boxed_dispatchHandle),
+                                                     pCopyImageToBufferInfo);
+                }
                 break;
             }
             case OP_vkCmdBlitImage2: {
@@ -1743,7 +1879,9 @@
                     transform_tohost_VkBlitImageInfo2(globalstate,
                                                       (VkBlitImageInfo2*)(pBlitImageInfo));
                 }
-                vk->vkCmdBlitImage2((VkCommandBuffer)dispatchHandle, pBlitImageInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBlitImage2((VkCommandBuffer)dispatchHandle, pBlitImageInfo);
+                }
                 break;
             }
             case OP_vkCmdResolveImage2: {
@@ -1759,7 +1897,9 @@
                     transform_tohost_VkResolveImageInfo2(globalstate,
                                                          (VkResolveImageInfo2*)(pResolveImageInfo));
                 }
-                vk->vkCmdResolveImage2((VkCommandBuffer)dispatchHandle, pResolveImageInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdResolveImage2((VkCommandBuffer)dispatchHandle, pResolveImageInfo);
+                }
                 break;
             }
             case OP_vkCmdBeginRendering: {
@@ -1775,13 +1915,17 @@
                     transform_tohost_VkRenderingInfo(globalstate,
                                                      (VkRenderingInfo*)(pRenderingInfo));
                 }
-                vk->vkCmdBeginRendering((VkCommandBuffer)dispatchHandle, pRenderingInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBeginRendering((VkCommandBuffer)dispatchHandle, pRenderingInfo);
+                }
                 break;
             }
             case OP_vkCmdEndRendering: {
                 GFXSTREAM_TRACE_EVENT(GFXSTREAM_TRACE_DECODER_CATEGORY,
                                       "VkSubDecoder vkCmdEndRendering");
-                vk->vkCmdEndRendering((VkCommandBuffer)dispatchHandle);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndRendering((VkCommandBuffer)dispatchHandle);
+                }
                 break;
             }
             case OP_vkCmdSetCullMode: {
@@ -1790,7 +1934,9 @@
                 VkCullModeFlags cullMode;
                 memcpy((VkCullModeFlags*)&cullMode, *readStreamPtrPtr, sizeof(VkCullModeFlags));
                 *readStreamPtrPtr += sizeof(VkCullModeFlags);
-                vk->vkCmdSetCullMode((VkCommandBuffer)dispatchHandle, cullMode);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetCullMode((VkCommandBuffer)dispatchHandle, cullMode);
+                }
                 break;
             }
             case OP_vkCmdSetFrontFace: {
@@ -1799,7 +1945,9 @@
                 VkFrontFace frontFace;
                 memcpy((VkFrontFace*)&frontFace, *readStreamPtrPtr, sizeof(VkFrontFace));
                 *readStreamPtrPtr += sizeof(VkFrontFace);
-                vk->vkCmdSetFrontFace((VkCommandBuffer)dispatchHandle, frontFace);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetFrontFace((VkCommandBuffer)dispatchHandle, frontFace);
+                }
                 break;
             }
             case OP_vkCmdSetPrimitiveTopology: {
@@ -1809,7 +1957,10 @@
                 memcpy((VkPrimitiveTopology*)&primitiveTopology, *readStreamPtrPtr,
                        sizeof(VkPrimitiveTopology));
                 *readStreamPtrPtr += sizeof(VkPrimitiveTopology);
-                vk->vkCmdSetPrimitiveTopology((VkCommandBuffer)dispatchHandle, primitiveTopology);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetPrimitiveTopology((VkCommandBuffer)dispatchHandle,
+                                                  primitiveTopology);
+                }
                 break;
             }
             case OP_vkCmdSetViewportWithCount: {
@@ -1835,8 +1986,10 @@
                         transform_tohost_VkViewport(globalstate, (VkViewport*)(pViewports + i));
                     }
                 }
-                vk->vkCmdSetViewportWithCount((VkCommandBuffer)dispatchHandle, viewportCount,
-                                              pViewports);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetViewportWithCount((VkCommandBuffer)dispatchHandle, viewportCount,
+                                                  pViewports);
+                }
                 break;
             }
             case OP_vkCmdSetScissorWithCount: {
@@ -1862,8 +2015,10 @@
                         transform_tohost_VkRect2D(globalstate, (VkRect2D*)(pScissors + i));
                     }
                 }
-                vk->vkCmdSetScissorWithCount((VkCommandBuffer)dispatchHandle, scissorCount,
-                                             pScissors);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetScissorWithCount((VkCommandBuffer)dispatchHandle, scissorCount,
+                                                 pScissors);
+                }
                 break;
             }
             case OP_vkCmdBindVertexBuffers2: {
@@ -1945,8 +2100,10 @@
                            ((bindingCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
                 }
-                vk->vkCmdBindVertexBuffers2((VkCommandBuffer)dispatchHandle, firstBinding,
-                                            bindingCount, pBuffers, pOffsets, pSizes, pStrides);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBindVertexBuffers2((VkCommandBuffer)dispatchHandle, firstBinding,
+                                                bindingCount, pBuffers, pOffsets, pSizes, pStrides);
+                }
                 break;
             }
             case OP_vkCmdSetDepthTestEnable: {
@@ -1955,7 +2112,9 @@
                 VkBool32 depthTestEnable;
                 memcpy((VkBool32*)&depthTestEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetDepthTestEnable((VkCommandBuffer)dispatchHandle, depthTestEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthTestEnable((VkCommandBuffer)dispatchHandle, depthTestEnable);
+                }
                 break;
             }
             case OP_vkCmdSetDepthWriteEnable: {
@@ -1964,7 +2123,9 @@
                 VkBool32 depthWriteEnable;
                 memcpy((VkBool32*)&depthWriteEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetDepthWriteEnable((VkCommandBuffer)dispatchHandle, depthWriteEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthWriteEnable((VkCommandBuffer)dispatchHandle, depthWriteEnable);
+                }
                 break;
             }
             case OP_vkCmdSetDepthCompareOp: {
@@ -1973,7 +2134,9 @@
                 VkCompareOp depthCompareOp;
                 memcpy((VkCompareOp*)&depthCompareOp, *readStreamPtrPtr, sizeof(VkCompareOp));
                 *readStreamPtrPtr += sizeof(VkCompareOp);
-                vk->vkCmdSetDepthCompareOp((VkCommandBuffer)dispatchHandle, depthCompareOp);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthCompareOp((VkCommandBuffer)dispatchHandle, depthCompareOp);
+                }
                 break;
             }
             case OP_vkCmdSetDepthBoundsTestEnable: {
@@ -1982,8 +2145,10 @@
                 VkBool32 depthBoundsTestEnable;
                 memcpy((VkBool32*)&depthBoundsTestEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetDepthBoundsTestEnable((VkCommandBuffer)dispatchHandle,
-                                                  depthBoundsTestEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthBoundsTestEnable((VkCommandBuffer)dispatchHandle,
+                                                      depthBoundsTestEnable);
+                }
                 break;
             }
             case OP_vkCmdSetStencilTestEnable: {
@@ -1992,7 +2157,10 @@
                 VkBool32 stencilTestEnable;
                 memcpy((VkBool32*)&stencilTestEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetStencilTestEnable((VkCommandBuffer)dispatchHandle, stencilTestEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetStencilTestEnable((VkCommandBuffer)dispatchHandle,
+                                                  stencilTestEnable);
+                }
                 break;
             }
             case OP_vkCmdSetStencilOp: {
@@ -2014,8 +2182,10 @@
                 *readStreamPtrPtr += sizeof(VkStencilOp);
                 memcpy((VkCompareOp*)&compareOp, *readStreamPtrPtr, sizeof(VkCompareOp));
                 *readStreamPtrPtr += sizeof(VkCompareOp);
-                vk->vkCmdSetStencilOp((VkCommandBuffer)dispatchHandle, faceMask, failOp, passOp,
-                                      depthFailOp, compareOp);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetStencilOp((VkCommandBuffer)dispatchHandle, faceMask, failOp, passOp,
+                                          depthFailOp, compareOp);
+                }
                 break;
             }
             case OP_vkCmdSetRasterizerDiscardEnable: {
@@ -2024,8 +2194,10 @@
                 VkBool32 rasterizerDiscardEnable;
                 memcpy((VkBool32*)&rasterizerDiscardEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetRasterizerDiscardEnable((VkCommandBuffer)dispatchHandle,
-                                                    rasterizerDiscardEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetRasterizerDiscardEnable((VkCommandBuffer)dispatchHandle,
+                                                        rasterizerDiscardEnable);
+                }
                 break;
             }
             case OP_vkCmdSetDepthBiasEnable: {
@@ -2034,7 +2206,9 @@
                 VkBool32 depthBiasEnable;
                 memcpy((VkBool32*)&depthBiasEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetDepthBiasEnable((VkCommandBuffer)dispatchHandle, depthBiasEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthBiasEnable((VkCommandBuffer)dispatchHandle, depthBiasEnable);
+                }
                 break;
             }
             case OP_vkCmdSetPrimitiveRestartEnable: {
@@ -2043,8 +2217,10 @@
                 VkBool32 primitiveRestartEnable;
                 memcpy((VkBool32*)&primitiveRestartEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetPrimitiveRestartEnable((VkCommandBuffer)dispatchHandle,
-                                                   primitiveRestartEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetPrimitiveRestartEnable((VkCommandBuffer)dispatchHandle,
+                                                       primitiveRestartEnable);
+                }
                 break;
             }
 #endif
@@ -2062,13 +2238,17 @@
                     transform_tohost_VkRenderingInfo(globalstate,
                                                      (VkRenderingInfo*)(pRenderingInfo));
                 }
-                vk->vkCmdBeginRenderingKHR((VkCommandBuffer)dispatchHandle, pRenderingInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBeginRenderingKHR((VkCommandBuffer)dispatchHandle, pRenderingInfo);
+                }
                 break;
             }
             case OP_vkCmdEndRenderingKHR: {
                 GFXSTREAM_TRACE_EVENT(GFXSTREAM_TRACE_DECODER_CATEGORY,
                                       "VkSubDecoder vkCmdEndRenderingKHR");
-                vk->vkCmdEndRenderingKHR((VkCommandBuffer)dispatchHandle);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndRenderingKHR((VkCommandBuffer)dispatchHandle);
+                }
                 break;
             }
 #endif
@@ -2096,9 +2276,11 @@
                     transform_tohost_VkSubpassBeginInfo(globalstate,
                                                         (VkSubpassBeginInfo*)(pSubpassBeginInfo));
                 }
-                this->on_vkCmdBeginRenderPass2KHR(pool, nullptr,
-                                                  (VkCommandBuffer)(boxed_dispatchHandle),
-                                                  pRenderPassBegin, pSubpassBeginInfo);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdBeginRenderPass2KHR(pool, nullptr,
+                                                      (VkCommandBuffer)(boxed_dispatchHandle),
+                                                      pRenderPassBegin, pSubpassBeginInfo);
+                }
                 break;
             }
             case OP_vkCmdNextSubpass2KHR: {
@@ -2124,8 +2306,10 @@
                     transform_tohost_VkSubpassEndInfo(globalstate,
                                                       (VkSubpassEndInfo*)(pSubpassEndInfo));
                 }
-                vk->vkCmdNextSubpass2KHR((VkCommandBuffer)dispatchHandle, pSubpassBeginInfo,
-                                         pSubpassEndInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdNextSubpass2KHR((VkCommandBuffer)dispatchHandle, pSubpassBeginInfo,
+                                             pSubpassEndInfo);
+                }
                 break;
             }
             case OP_vkCmdEndRenderPass2KHR: {
@@ -2141,7 +2325,9 @@
                     transform_tohost_VkSubpassEndInfo(globalstate,
                                                       (VkSubpassEndInfo*)(pSubpassEndInfo));
                 }
-                vk->vkCmdEndRenderPass2KHR((VkCommandBuffer)dispatchHandle, pSubpassEndInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndRenderPass2KHR((VkCommandBuffer)dispatchHandle, pSubpassEndInfo);
+                }
                 break;
             }
 #endif
@@ -2164,7 +2350,9 @@
                     transform_tohost_VkDependencyInfo(globalstate,
                                                       (VkDependencyInfo*)(pDependencyInfo));
                 }
-                vk->vkCmdSetEvent2KHR((VkCommandBuffer)dispatchHandle, event, pDependencyInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetEvent2KHR((VkCommandBuffer)dispatchHandle, event, pDependencyInfo);
+                }
                 break;
             }
             case OP_vkCmdResetEvent2KHR: {
@@ -2179,7 +2367,9 @@
                 memcpy((VkPipelineStageFlags2*)&stageMask, *readStreamPtrPtr,
                        sizeof(VkPipelineStageFlags2));
                 *readStreamPtrPtr += sizeof(VkPipelineStageFlags2);
-                vk->vkCmdResetEvent2KHR((VkCommandBuffer)dispatchHandle, event, stageMask);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdResetEvent2KHR((VkCommandBuffer)dispatchHandle, event, stageMask);
+                }
                 break;
             }
             case OP_vkCmdWaitEvents2KHR: {
@@ -2224,8 +2414,10 @@
                             globalstate, (VkDependencyInfo*)(pDependencyInfos + i));
                     }
                 }
-                vk->vkCmdWaitEvents2KHR((VkCommandBuffer)dispatchHandle, eventCount, pEvents,
-                                        pDependencyInfos);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdWaitEvents2KHR((VkCommandBuffer)dispatchHandle, eventCount, pEvents,
+                                            pDependencyInfos);
+                }
                 break;
             }
             case OP_vkCmdPipelineBarrier2KHR: {
@@ -2241,7 +2433,9 @@
                     transform_tohost_VkDependencyInfo(globalstate,
                                                       (VkDependencyInfo*)(pDependencyInfo));
                 }
-                vk->vkCmdPipelineBarrier2KHR((VkCommandBuffer)dispatchHandle, pDependencyInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdPipelineBarrier2KHR((VkCommandBuffer)dispatchHandle, pDependencyInfo);
+                }
                 break;
             }
             case OP_vkCmdWriteTimestamp2KHR: {
@@ -2260,8 +2454,10 @@
                     (VkQueryPool)unbox_VkQueryPool((VkQueryPool)(*&cgen_var_0));
                 memcpy((uint32_t*)&query, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdWriteTimestamp2KHR((VkCommandBuffer)dispatchHandle, stage, queryPool,
-                                            query);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdWriteTimestamp2KHR((VkCommandBuffer)dispatchHandle, stage, queryPool,
+                                                query);
+                }
                 break;
             }
             case OP_vkCmdWriteBufferMarker2AMD: {
@@ -2282,8 +2478,10 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((uint32_t*)&marker, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdWriteBufferMarker2AMD((VkCommandBuffer)dispatchHandle, stage, dstBuffer,
-                                               dstOffset, marker);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdWriteBufferMarker2AMD((VkCommandBuffer)dispatchHandle, stage,
+                                                   dstBuffer, dstOffset, marker);
+                }
                 break;
             }
 #endif
@@ -2301,7 +2499,9 @@
                     transform_tohost_VkCopyBufferInfo2(globalstate,
                                                        (VkCopyBufferInfo2*)(pCopyBufferInfo));
                 }
-                vk->vkCmdCopyBuffer2KHR((VkCommandBuffer)dispatchHandle, pCopyBufferInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdCopyBuffer2KHR((VkCommandBuffer)dispatchHandle, pCopyBufferInfo);
+                }
                 break;
             }
             case OP_vkCmdCopyImage2KHR: {
@@ -2317,8 +2517,10 @@
                     transform_tohost_VkCopyImageInfo2(globalstate,
                                                       (VkCopyImageInfo2*)(pCopyImageInfo));
                 }
-                this->on_vkCmdCopyImage2KHR(pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle),
-                                            pCopyImageInfo);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdCopyImage2KHR(
+                        pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), pCopyImageInfo);
+                }
                 break;
             }
             case OP_vkCmdCopyBufferToImage2KHR: {
@@ -2334,9 +2536,11 @@
                     transform_tohost_VkCopyBufferToImageInfo2(
                         globalstate, (VkCopyBufferToImageInfo2*)(pCopyBufferToImageInfo));
                 }
-                this->on_vkCmdCopyBufferToImage2KHR(pool, nullptr,
-                                                    (VkCommandBuffer)(boxed_dispatchHandle),
-                                                    pCopyBufferToImageInfo, context);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdCopyBufferToImage2KHR(pool, nullptr,
+                                                        (VkCommandBuffer)(boxed_dispatchHandle),
+                                                        pCopyBufferToImageInfo, context);
+                }
                 break;
             }
             case OP_vkCmdCopyImageToBuffer2KHR: {
@@ -2352,8 +2556,11 @@
                     transform_tohost_VkCopyImageToBufferInfo2(
                         globalstate, (VkCopyImageToBufferInfo2*)(pCopyImageToBufferInfo));
                 }
-                this->on_vkCmdCopyImageToBuffer2KHR(
-                    pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), pCopyImageToBufferInfo);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCmdCopyImageToBuffer2KHR(pool, nullptr,
+                                                        (VkCommandBuffer)(boxed_dispatchHandle),
+                                                        pCopyImageToBufferInfo);
+                }
                 break;
             }
             case OP_vkCmdBlitImage2KHR: {
@@ -2369,7 +2576,9 @@
                     transform_tohost_VkBlitImageInfo2(globalstate,
                                                       (VkBlitImageInfo2*)(pBlitImageInfo));
                 }
-                vk->vkCmdBlitImage2KHR((VkCommandBuffer)dispatchHandle, pBlitImageInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBlitImage2KHR((VkCommandBuffer)dispatchHandle, pBlitImageInfo);
+                }
                 break;
             }
             case OP_vkCmdResolveImage2KHR: {
@@ -2385,7 +2594,9 @@
                     transform_tohost_VkResolveImageInfo2(globalstate,
                                                          (VkResolveImageInfo2*)(pResolveImageInfo));
                 }
-                vk->vkCmdResolveImage2KHR((VkCommandBuffer)dispatchHandle, pResolveImageInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdResolveImage2KHR((VkCommandBuffer)dispatchHandle, pResolveImageInfo);
+                }
                 break;
             }
 #endif
@@ -2407,8 +2618,10 @@
                 *readStreamPtrPtr += sizeof(VkDeviceSize);
                 memcpy((VkIndexType*)&indexType, *readStreamPtrPtr, sizeof(VkIndexType));
                 *readStreamPtrPtr += sizeof(VkIndexType);
-                vk->vkCmdBindIndexBuffer2KHR((VkCommandBuffer)dispatchHandle, buffer, offset, size,
-                                             indexType);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBindIndexBuffer2KHR((VkCommandBuffer)dispatchHandle, buffer, offset,
+                                                 size, indexType);
+                }
                 break;
             }
 #endif
@@ -2422,8 +2635,10 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint16_t*)&lineStipplePattern, *readStreamPtrPtr, sizeof(uint16_t));
                 *readStreamPtrPtr += sizeof(uint16_t);
-                vk->vkCmdSetLineStippleKHR((VkCommandBuffer)dispatchHandle, lineStippleFactor,
-                                           lineStipplePattern);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetLineStippleKHR((VkCommandBuffer)dispatchHandle, lineStippleFactor,
+                                               lineStipplePattern);
+                }
                 break;
             }
 #endif
@@ -2482,9 +2697,11 @@
                            ((bindingCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
                 }
-                vk->vkCmdBindTransformFeedbackBuffersEXT((VkCommandBuffer)dispatchHandle,
-                                                         firstBinding, bindingCount, pBuffers,
-                                                         pOffsets, pSizes);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBindTransformFeedbackBuffersEXT((VkCommandBuffer)dispatchHandle,
+                                                             firstBinding, bindingCount, pBuffers,
+                                                             pOffsets, pSizes);
+                }
                 break;
             }
             case OP_vkCmdBeginTransformFeedbackEXT: {
@@ -2538,9 +2755,11 @@
                            ((counterBufferCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((counterBufferCount)) * sizeof(const VkDeviceSize);
                 }
-                vk->vkCmdBeginTransformFeedbackEXT((VkCommandBuffer)dispatchHandle,
-                                                   firstCounterBuffer, counterBufferCount,
-                                                   pCounterBuffers, pCounterBufferOffsets);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBeginTransformFeedbackEXT((VkCommandBuffer)dispatchHandle,
+                                                       firstCounterBuffer, counterBufferCount,
+                                                       pCounterBuffers, pCounterBufferOffsets);
+                }
                 break;
             }
             case OP_vkCmdEndTransformFeedbackEXT: {
@@ -2594,9 +2813,11 @@
                            ((counterBufferCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((counterBufferCount)) * sizeof(const VkDeviceSize);
                 }
-                vk->vkCmdEndTransformFeedbackEXT((VkCommandBuffer)dispatchHandle,
-                                                 firstCounterBuffer, counterBufferCount,
-                                                 pCounterBuffers, pCounterBufferOffsets);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndTransformFeedbackEXT((VkCommandBuffer)dispatchHandle,
+                                                     firstCounterBuffer, counterBufferCount,
+                                                     pCounterBuffers, pCounterBufferOffsets);
+                }
                 break;
             }
             case OP_vkCmdBeginQueryIndexedEXT: {
@@ -2618,8 +2839,10 @@
                 *readStreamPtrPtr += sizeof(VkQueryControlFlags);
                 memcpy((uint32_t*)&index, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdBeginQueryIndexedEXT((VkCommandBuffer)dispatchHandle, queryPool, query,
-                                              flags, index);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBeginQueryIndexedEXT((VkCommandBuffer)dispatchHandle, queryPool, query,
+                                                  flags, index);
+                }
                 break;
             }
             case OP_vkCmdEndQueryIndexedEXT: {
@@ -2637,8 +2860,10 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&index, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdEndQueryIndexedEXT((VkCommandBuffer)dispatchHandle, queryPool, query,
-                                            index);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndQueryIndexedEXT((VkCommandBuffer)dispatchHandle, queryPool, query,
+                                                index);
+                }
                 break;
             }
             case OP_vkCmdDrawIndirectByteCountEXT: {
@@ -2665,9 +2890,11 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&vertexStride, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdDrawIndirectByteCountEXT((VkCommandBuffer)dispatchHandle, instanceCount,
-                                                  firstInstance, counterBuffer, counterBufferOffset,
-                                                  counterOffset, vertexStride);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdDrawIndirectByteCountEXT(
+                        (VkCommandBuffer)dispatchHandle, instanceCount, firstInstance,
+                        counterBuffer, counterBufferOffset, counterOffset, vertexStride);
+                }
                 break;
             }
 #endif
@@ -2685,13 +2912,17 @@
                     transform_tohost_VkDebugUtilsLabelEXT(globalstate,
                                                           (VkDebugUtilsLabelEXT*)(pLabelInfo));
                 }
-                vk->vkCmdBeginDebugUtilsLabelEXT((VkCommandBuffer)dispatchHandle, pLabelInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBeginDebugUtilsLabelEXT((VkCommandBuffer)dispatchHandle, pLabelInfo);
+                }
                 break;
             }
             case OP_vkCmdEndDebugUtilsLabelEXT: {
                 GFXSTREAM_TRACE_EVENT(GFXSTREAM_TRACE_DECODER_CATEGORY,
                                       "VkSubDecoder vkCmdEndDebugUtilsLabelEXT");
-                vk->vkCmdEndDebugUtilsLabelEXT((VkCommandBuffer)dispatchHandle);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdEndDebugUtilsLabelEXT((VkCommandBuffer)dispatchHandle);
+                }
                 break;
             }
             case OP_vkCmdInsertDebugUtilsLabelEXT: {
@@ -2707,7 +2938,9 @@
                     transform_tohost_VkDebugUtilsLabelEXT(globalstate,
                                                           (VkDebugUtilsLabelEXT*)(pLabelInfo));
                 }
-                vk->vkCmdInsertDebugUtilsLabelEXT((VkCommandBuffer)dispatchHandle, pLabelInfo);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdInsertDebugUtilsLabelEXT((VkCommandBuffer)dispatchHandle, pLabelInfo);
+                }
                 break;
             }
 #endif
@@ -2721,8 +2954,10 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint16_t*)&lineStipplePattern, *readStreamPtrPtr, sizeof(uint16_t));
                 *readStreamPtrPtr += sizeof(uint16_t);
-                vk->vkCmdSetLineStippleEXT((VkCommandBuffer)dispatchHandle, lineStippleFactor,
-                                           lineStipplePattern);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetLineStippleEXT((VkCommandBuffer)dispatchHandle, lineStippleFactor,
+                                               lineStipplePattern);
+                }
                 break;
             }
 #endif
@@ -2733,7 +2968,9 @@
                 VkCullModeFlags cullMode;
                 memcpy((VkCullModeFlags*)&cullMode, *readStreamPtrPtr, sizeof(VkCullModeFlags));
                 *readStreamPtrPtr += sizeof(VkCullModeFlags);
-                vk->vkCmdSetCullModeEXT((VkCommandBuffer)dispatchHandle, cullMode);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetCullModeEXT((VkCommandBuffer)dispatchHandle, cullMode);
+                }
                 break;
             }
             case OP_vkCmdSetFrontFaceEXT: {
@@ -2742,7 +2979,9 @@
                 VkFrontFace frontFace;
                 memcpy((VkFrontFace*)&frontFace, *readStreamPtrPtr, sizeof(VkFrontFace));
                 *readStreamPtrPtr += sizeof(VkFrontFace);
-                vk->vkCmdSetFrontFaceEXT((VkCommandBuffer)dispatchHandle, frontFace);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetFrontFaceEXT((VkCommandBuffer)dispatchHandle, frontFace);
+                }
                 break;
             }
             case OP_vkCmdSetPrimitiveTopologyEXT: {
@@ -2752,8 +2991,10 @@
                 memcpy((VkPrimitiveTopology*)&primitiveTopology, *readStreamPtrPtr,
                        sizeof(VkPrimitiveTopology));
                 *readStreamPtrPtr += sizeof(VkPrimitiveTopology);
-                vk->vkCmdSetPrimitiveTopologyEXT((VkCommandBuffer)dispatchHandle,
-                                                 primitiveTopology);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetPrimitiveTopologyEXT((VkCommandBuffer)dispatchHandle,
+                                                     primitiveTopology);
+                }
                 break;
             }
             case OP_vkCmdSetViewportWithCountEXT: {
@@ -2779,8 +3020,10 @@
                         transform_tohost_VkViewport(globalstate, (VkViewport*)(pViewports + i));
                     }
                 }
-                vk->vkCmdSetViewportWithCountEXT((VkCommandBuffer)dispatchHandle, viewportCount,
-                                                 pViewports);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetViewportWithCountEXT((VkCommandBuffer)dispatchHandle, viewportCount,
+                                                     pViewports);
+                }
                 break;
             }
             case OP_vkCmdSetScissorWithCountEXT: {
@@ -2806,8 +3049,10 @@
                         transform_tohost_VkRect2D(globalstate, (VkRect2D*)(pScissors + i));
                     }
                 }
-                vk->vkCmdSetScissorWithCountEXT((VkCommandBuffer)dispatchHandle, scissorCount,
-                                                pScissors);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetScissorWithCountEXT((VkCommandBuffer)dispatchHandle, scissorCount,
+                                                    pScissors);
+                }
                 break;
             }
             case OP_vkCmdBindVertexBuffers2EXT: {
@@ -2889,8 +3134,11 @@
                            ((bindingCount)) * sizeof(const VkDeviceSize));
                     *readStreamPtrPtr += ((bindingCount)) * sizeof(const VkDeviceSize);
                 }
-                vk->vkCmdBindVertexBuffers2EXT((VkCommandBuffer)dispatchHandle, firstBinding,
-                                               bindingCount, pBuffers, pOffsets, pSizes, pStrides);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdBindVertexBuffers2EXT((VkCommandBuffer)dispatchHandle, firstBinding,
+                                                   bindingCount, pBuffers, pOffsets, pSizes,
+                                                   pStrides);
+                }
                 break;
             }
             case OP_vkCmdSetDepthTestEnableEXT: {
@@ -2899,7 +3147,10 @@
                 VkBool32 depthTestEnable;
                 memcpy((VkBool32*)&depthTestEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetDepthTestEnableEXT((VkCommandBuffer)dispatchHandle, depthTestEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthTestEnableEXT((VkCommandBuffer)dispatchHandle,
+                                                   depthTestEnable);
+                }
                 break;
             }
             case OP_vkCmdSetDepthWriteEnableEXT: {
@@ -2908,7 +3159,10 @@
                 VkBool32 depthWriteEnable;
                 memcpy((VkBool32*)&depthWriteEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetDepthWriteEnableEXT((VkCommandBuffer)dispatchHandle, depthWriteEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthWriteEnableEXT((VkCommandBuffer)dispatchHandle,
+                                                    depthWriteEnable);
+                }
                 break;
             }
             case OP_vkCmdSetDepthCompareOpEXT: {
@@ -2917,7 +3171,9 @@
                 VkCompareOp depthCompareOp;
                 memcpy((VkCompareOp*)&depthCompareOp, *readStreamPtrPtr, sizeof(VkCompareOp));
                 *readStreamPtrPtr += sizeof(VkCompareOp);
-                vk->vkCmdSetDepthCompareOpEXT((VkCommandBuffer)dispatchHandle, depthCompareOp);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthCompareOpEXT((VkCommandBuffer)dispatchHandle, depthCompareOp);
+                }
                 break;
             }
             case OP_vkCmdSetDepthBoundsTestEnableEXT: {
@@ -2926,8 +3182,10 @@
                 VkBool32 depthBoundsTestEnable;
                 memcpy((VkBool32*)&depthBoundsTestEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetDepthBoundsTestEnableEXT((VkCommandBuffer)dispatchHandle,
-                                                     depthBoundsTestEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthBoundsTestEnableEXT((VkCommandBuffer)dispatchHandle,
+                                                         depthBoundsTestEnable);
+                }
                 break;
             }
             case OP_vkCmdSetStencilTestEnableEXT: {
@@ -2936,8 +3194,10 @@
                 VkBool32 stencilTestEnable;
                 memcpy((VkBool32*)&stencilTestEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetStencilTestEnableEXT((VkCommandBuffer)dispatchHandle,
-                                                 stencilTestEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetStencilTestEnableEXT((VkCommandBuffer)dispatchHandle,
+                                                     stencilTestEnable);
+                }
                 break;
             }
             case OP_vkCmdSetStencilOpEXT: {
@@ -2959,8 +3219,10 @@
                 *readStreamPtrPtr += sizeof(VkStencilOp);
                 memcpy((VkCompareOp*)&compareOp, *readStreamPtrPtr, sizeof(VkCompareOp));
                 *readStreamPtrPtr += sizeof(VkCompareOp);
-                vk->vkCmdSetStencilOpEXT((VkCommandBuffer)dispatchHandle, faceMask, failOp, passOp,
-                                         depthFailOp, compareOp);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetStencilOpEXT((VkCommandBuffer)dispatchHandle, faceMask, failOp,
+                                             passOp, depthFailOp, compareOp);
+                }
                 break;
             }
 #endif
@@ -2971,8 +3233,10 @@
                 uint32_t patchControlPoints;
                 memcpy((uint32_t*)&patchControlPoints, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdSetPatchControlPointsEXT((VkCommandBuffer)dispatchHandle,
-                                                  patchControlPoints);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetPatchControlPointsEXT((VkCommandBuffer)dispatchHandle,
+                                                      patchControlPoints);
+                }
                 break;
             }
             case OP_vkCmdSetRasterizerDiscardEnableEXT: {
@@ -2981,8 +3245,10 @@
                 VkBool32 rasterizerDiscardEnable;
                 memcpy((VkBool32*)&rasterizerDiscardEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetRasterizerDiscardEnableEXT((VkCommandBuffer)dispatchHandle,
-                                                       rasterizerDiscardEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetRasterizerDiscardEnableEXT((VkCommandBuffer)dispatchHandle,
+                                                           rasterizerDiscardEnable);
+                }
                 break;
             }
             case OP_vkCmdSetDepthBiasEnableEXT: {
@@ -2991,7 +3257,10 @@
                 VkBool32 depthBiasEnable;
                 memcpy((VkBool32*)&depthBiasEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetDepthBiasEnableEXT((VkCommandBuffer)dispatchHandle, depthBiasEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetDepthBiasEnableEXT((VkCommandBuffer)dispatchHandle,
+                                                   depthBiasEnable);
+                }
                 break;
             }
             case OP_vkCmdSetLogicOpEXT: {
@@ -3000,7 +3269,9 @@
                 VkLogicOp logicOp;
                 memcpy((VkLogicOp*)&logicOp, *readStreamPtrPtr, sizeof(VkLogicOp));
                 *readStreamPtrPtr += sizeof(VkLogicOp);
-                vk->vkCmdSetLogicOpEXT((VkCommandBuffer)dispatchHandle, logicOp);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetLogicOpEXT((VkCommandBuffer)dispatchHandle, logicOp);
+                }
                 break;
             }
             case OP_vkCmdSetPrimitiveRestartEnableEXT: {
@@ -3009,8 +3280,10 @@
                 VkBool32 primitiveRestartEnable;
                 memcpy((VkBool32*)&primitiveRestartEnable, *readStreamPtrPtr, sizeof(VkBool32));
                 *readStreamPtrPtr += sizeof(VkBool32);
-                vk->vkCmdSetPrimitiveRestartEnableEXT((VkCommandBuffer)dispatchHandle,
-                                                      primitiveRestartEnable);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetPrimitiveRestartEnableEXT((VkCommandBuffer)dispatchHandle,
+                                                          primitiveRestartEnable);
+                }
                 break;
             }
 #endif
@@ -3032,8 +3305,10 @@
                 memcpy((VkBool32*)pColorWriteEnables, *readStreamPtrPtr,
                        ((attachmentCount)) * sizeof(const VkBool32));
                 *readStreamPtrPtr += ((attachmentCount)) * sizeof(const VkBool32);
-                vk->vkCmdSetColorWriteEnableEXT((VkCommandBuffer)dispatchHandle, attachmentCount,
-                                                pColorWriteEnables);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetColorWriteEnableEXT((VkCommandBuffer)dispatchHandle,
+                                                    attachmentCount, pColorWriteEnables);
+                }
                 break;
             }
 #endif
@@ -3051,15 +3326,20 @@
                     transform_tohost_VkCommandBufferBeginInfo(
                         globalstate, (VkCommandBufferBeginInfo*)(pBeginInfo));
                 }
-                this->on_vkBeginCommandBufferAsyncGOOGLE(
-                    pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), pBeginInfo, context);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkBeginCommandBufferAsyncGOOGLE(
+                        pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), pBeginInfo,
+                        context);
+                }
                 break;
             }
             case OP_vkEndCommandBufferAsyncGOOGLE: {
                 GFXSTREAM_TRACE_EVENT(GFXSTREAM_TRACE_DECODER_CATEGORY,
                                       "VkSubDecoder vkEndCommandBufferAsyncGOOGLE");
-                this->on_vkEndCommandBufferAsyncGOOGLE(
-                    pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), context);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkEndCommandBufferAsyncGOOGLE(
+                        pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), context);
+                }
                 break;
             }
             case OP_vkResetCommandBufferAsyncGOOGLE: {
@@ -3069,8 +3349,10 @@
                 memcpy((VkCommandBufferResetFlags*)&flags, *readStreamPtrPtr,
                        sizeof(VkCommandBufferResetFlags));
                 *readStreamPtrPtr += sizeof(VkCommandBufferResetFlags);
-                this->on_vkResetCommandBufferAsyncGOOGLE(
-                    pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), flags);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkResetCommandBufferAsyncGOOGLE(
+                        pool, nullptr, (VkCommandBuffer)(boxed_dispatchHandle), flags);
+                }
                 break;
             }
             case OP_vkCommandBufferHostSyncGOOGLE: {
@@ -3082,9 +3364,11 @@
                 *readStreamPtrPtr += sizeof(uint32_t);
                 memcpy((uint32_t*)&sequenceNumber, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                this->on_vkCommandBufferHostSyncGOOGLE(pool, nullptr,
-                                                       (VkCommandBuffer)(boxed_dispatchHandle),
-                                                       needHostSync, sequenceNumber);
+                if (CC_LIKELY(vk)) {
+                    this->on_vkCommandBufferHostSyncGOOGLE(pool, nullptr,
+                                                           (VkCommandBuffer)(boxed_dispatchHandle),
+                                                           needHostSync, sequenceNumber);
+                }
                 break;
             }
 #endif
@@ -3148,9 +3432,12 @@
                         globalstate,
                         (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable));
                 }
-                vk->vkCmdTraceRaysKHR((VkCommandBuffer)dispatchHandle, pRaygenShaderBindingTable,
-                                      pMissShaderBindingTable, pHitShaderBindingTable,
-                                      pCallableShaderBindingTable, width, height, depth);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdTraceRaysKHR((VkCommandBuffer)dispatchHandle,
+                                          pRaygenShaderBindingTable, pMissShaderBindingTable,
+                                          pHitShaderBindingTable, pCallableShaderBindingTable,
+                                          width, height, depth);
+                }
                 break;
             }
             case OP_vkCmdTraceRaysIndirectKHR: {
@@ -3207,10 +3494,12 @@
                         globalstate,
                         (VkStridedDeviceAddressRegionKHR*)(pCallableShaderBindingTable));
                 }
-                vk->vkCmdTraceRaysIndirectKHR((VkCommandBuffer)dispatchHandle,
-                                              pRaygenShaderBindingTable, pMissShaderBindingTable,
-                                              pHitShaderBindingTable, pCallableShaderBindingTable,
-                                              indirectDeviceAddress);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdTraceRaysIndirectKHR(
+                        (VkCommandBuffer)dispatchHandle, pRaygenShaderBindingTable,
+                        pMissShaderBindingTable, pHitShaderBindingTable,
+                        pCallableShaderBindingTable, indirectDeviceAddress);
+                }
                 break;
             }
             case OP_vkCmdSetRayTracingPipelineStackSizeKHR: {
@@ -3219,8 +3508,10 @@
                 uint32_t pipelineStackSize;
                 memcpy((uint32_t*)&pipelineStackSize, *readStreamPtrPtr, sizeof(uint32_t));
                 *readStreamPtrPtr += sizeof(uint32_t);
-                vk->vkCmdSetRayTracingPipelineStackSizeKHR((VkCommandBuffer)dispatchHandle,
-                                                           pipelineStackSize);
+                if (CC_LIKELY(vk)) {
+                    vk->vkCmdSetRayTracingPipelineStackSizeKHR((VkCommandBuffer)dispatchHandle,
+                                                               pipelineStackSize);
+                }
                 break;
             }
 #endif
diff --git a/host/vulkan/VulkanBoxedHandles.h b/host/vulkan/VulkanBoxedHandles.h
index 209c6b3..1d2d4eb 100644
--- a/host/vulkan/VulkanBoxedHandles.h
+++ b/host/vulkan/VulkanBoxedHandles.h
@@ -55,12 +55,12 @@
     bool decRef() { return 0 == __atomic_sub_fetch(&refcount, 1, __ATOMIC_SEQ_CST); }
 };
 
-static void acquireOrderMaintInfo(OrderMaintenanceInfo* ord) {
+inline void acquireOrderMaintInfo(OrderMaintenanceInfo* ord) {
     if (!ord) return;
     ord->incRef();
 }
 
-static void releaseOrderMaintInfo(OrderMaintenanceInfo* ord) {
+inline void releaseOrderMaintInfo(OrderMaintenanceInfo* ord) {
     if (!ord) return;
     if (ord->decRef()) delete ord;
 }
diff --git a/host/vulkan/VulkanDispatch.cpp b/host/vulkan/VulkanDispatch.cpp
index 4f78ea2..4977b36 100644
--- a/host/vulkan/VulkanDispatch.cpp
+++ b/host/vulkan/VulkanDispatch.cpp
@@ -50,18 +50,6 @@
     android::base::setEnvironmentVariable("VK_ICD_FILENAMES", paths);
 }
 
-static const char* getTestIcdFilename() {
-#if defined(__APPLE__)
-    return "libvk_swiftshader.dylib";
-#elif defined(__linux__) || defined(__QNX__)
-    return "libvk_swiftshader.so";
-#elif defined(_WIN32) || defined(_MSC_VER)
-    return "vk_swiftshader.dll";
-#else
-#error Host operating system not supported
-#endif
-}
-
 static void initIcdPaths(bool forTesting) {
     auto androidIcd = android::base::getEnvironmentVariable("ANDROID_EMU_VK_ICD");
     if (androidIcd == "") {
diff --git a/host/vulkan/cereal/common/vk_struct_id.h b/host/vulkan/cereal/common/vk_struct_id.h
index 081d679..65f428b 100644
--- a/host/vulkan/cereal/common/vk_struct_id.h
+++ b/host/vulkan/cereal/common/vk_struct_id.h
@@ -105,6 +105,8 @@
                       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES);
 REGISTER_VK_STRUCT_ID(VkPhysicalDeviceInlineUniformBlockFeatures,
                       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES);
+REGISTER_VK_STRUCT_ID(VkPhysicalDeviceRobustness2FeaturesEXT,
+                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT);
 
 #if defined(VK_USE_PLATFORM_SCREEN_QNX)
 REGISTER_VK_STRUCT_ID(VkPhysicalDeviceExternalMemoryScreenBufferFeaturesQNX,
@@ -139,6 +141,10 @@
                       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV);
 REGISTER_VK_STRUCT_ID(VkDeviceGroupDeviceCreateInfo,
                       VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO);
+REGISTER_VK_STRUCT_ID(VkPhysicalDeviceVulkan11Features,
+                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES);
+REGISTER_VK_STRUCT_ID(VkPhysicalDeviceVulkan12Features,
+                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES);
 REGISTER_VK_STRUCT_ID(VkPhysicalDeviceVulkan13Features,
                       VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES);
 
diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt
index f725700..b012b31 100644
--- a/third-party/CMakeLists.txt
+++ b/third-party/CMakeLists.txt
@@ -217,6 +217,21 @@
     endif()
 endif()
 
+if(GFXSTREAM_ENABLE_HOST_TRACING)
+    if(DEPENDENCY_RESOLUTION STREQUAL "AOSP")
+        set(GFXSTREAM_PERFETTO_PATH ${PROJECT_SOURCE_DIR}/../../../external/perfetto)
+        if(NOT EXISTS ${GFXSTREAM_PERFETTO_PATH})
+            message(FATAL_ERROR "Perfetto is not found.")
+        endif()
+        add_library(perfetto
+                    STATIC
+                    ${GFXSTREAM_PERFETTO_PATH}/sdk/perfetto.cc)
+        target_include_directories(perfetto
+                                   INTERFACE
+                                   ${GFXSTREAM_PERFETTO_PATH}/sdk)
+    endif()
+endif()
+
 if(NOT TARGET libdrm_headers)
     if(DEPENDENCY_RESOLUTION STREQUAL "AOSP")
         set(LIBDRM_PATH ${PROJECT_SOURCE_DIR}/../../../external/libdrm)