diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c
index 0097dc3e77..aac0b698d6 100644
--- a/gfx/common/vulkan_common.c
+++ b/gfx/common/vulkan_common.c
@@ -2561,19 +2561,8 @@ static void vulkan_destroy_swapchain(gfx_ctx_vulkan_data_t *vk)
 void vulkan_present(gfx_ctx_vulkan_data_t *vk, unsigned index)
 {
    VkPresentInfoKHR present;
-   VkResult result                    = VK_SUCCESS;
-   VkResult err                       = VK_SUCCESS;
-
-   if (!vk->context.has_acquired_swapchain)
-      return;
-   vk->context.has_acquired_swapchain = false;
-
-   /* We're still waiting for a proper swapchain, so just fake it. */
-   if (vk->swapchain == VK_NULL_HANDLE)
-   {
-      retro_sleep(10);
-      return;
-   }
+   VkResult result                 = VK_SUCCESS;
+   VkResult err                    = VK_SUCCESS;
 
    present.sType                   = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
    present.pNext                   = NULL;
@@ -2590,8 +2579,10 @@ void vulkan_present(gfx_ctx_vulkan_data_t *vk, unsigned index)
 #endif
    err = vkQueuePresentKHR(vk->context.queue, &present);
 
-   /* VK_SUBOPTIMAL_KHR can be returned on Android 10 when prerotate is not dealt with.
-    * This is not an error we need to care about, and we'll treat it as SUCCESS. */
+   /* VK_SUBOPTIMAL_KHR can be returned on 
+    * Android 10 when prerotate is not dealt with.
+    * This is not an error we need to care about, 
+    * and we'll treat it as SUCCESS. */
    if (result == VK_SUBOPTIMAL_KHR)
       result = VK_SUCCESS;
    if (err == VK_SUBOPTIMAL_KHR)
diff --git a/gfx/drivers_context/android_vk_ctx.c b/gfx/drivers_context/android_vk_ctx.c
index 91b66127e2..69a79b78a6 100644
--- a/gfx/drivers_context/android_vk_ctx.c
+++ b/gfx/drivers_context/android_vk_ctx.c
@@ -20,6 +20,7 @@
 #include <formats/image.h>
 #include <string/stdstring.h>
 #include <compat/strl.h>
+#include <retro_timers.h>
 
 #ifdef HAVE_CONFIG_H
 #include "../../config.h"
@@ -257,7 +258,14 @@ static void android_gfx_ctx_vk_swap_buffers(void *data)
 {
    android_ctx_data_vk_t *and  = (android_ctx_data_vk_t*)data;
 
-   vulkan_present(&and->vk, and->vk.context.current_swapchain_index);
+   if (and->vk.context.has_acquired_swapchain)
+   {
+      and->vk.context.has_acquired_swapchain = false;
+      if (and->vk.swapchain == VK_NULL_HANDLE)
+         retro_sleep(10);
+      else
+         vulkan_present(&and->vk, and->vk.context.current_swapchain_index);
+   }
    vulkan_acquire_next_image(&and->vk);
 }
 
diff --git a/gfx/drivers_context/cocoa_gl_ctx.m b/gfx/drivers_context/cocoa_gl_ctx.m
index 59e6b8fceb..561db293e1 100644
--- a/gfx/drivers_context/cocoa_gl_ctx.m
+++ b/gfx/drivers_context/cocoa_gl_ctx.m
@@ -33,6 +33,7 @@
 #endif
 
 #include <retro_assert.h>
+#include <retro_timers.h>
 #include <compat/apple_compat.h>
 #include <string/stdstring.h>
 
@@ -641,7 +642,14 @@ static void cocoagl_gfx_ctx_swap_buffers(void *data)
          break;
       case GFX_CTX_VULKAN_API:
 #ifdef HAVE_VULKAN
-         vulkan_present(&cocoa_ctx->vk, cocoa_ctx->vk.context.current_swapchain_index);
+         if (cocoa_ctx->vk.context.has_acquired_swapchain)
+         {
+            cocoa_ctx->vk.context.has_acquired_swapchain = false;
+            if (cocoa_ctx->vk.swapchain == VK_NULL_HANDLE)
+               retro_sleep(10);
+            else
+               vulkan_present(&cocoa_ctx->vk, cocoa_ctx->vk.context.current_swapchain_index);
+         }
          vulkan_acquire_next_image(&cocoa_ctx->vk);
 #endif
          break;
diff --git a/gfx/drivers_context/khr_display_ctx.c b/gfx/drivers_context/khr_display_ctx.c
index 9b06cfa942..d055a73069 100644
--- a/gfx/drivers_context/khr_display_ctx.c
+++ b/gfx/drivers_context/khr_display_ctx.c
@@ -15,6 +15,7 @@
 
 #include <compat/strl.h>
 #include <string/stdstring.h>
+#include <retro_timers.h>
 
 #ifdef HAVE_CONFIG_H
 #include "../../config.h"
@@ -230,7 +231,14 @@ static void gfx_ctx_khr_display_set_swap_interval(void *data,
 static void gfx_ctx_khr_display_swap_buffers(void *data)
 {
    khr_display_ctx_data_t *khr = (khr_display_ctx_data_t*)data;
-   vulkan_present(&khr->vk, khr->vk.context.current_swapchain_index);
+   if (khr->vk.context.has_acquired_swapchain)
+   {
+      khr->vk.context.has_acquired_swapchain = false;
+      if (khr->vk.swapchain == VK_NULL_HANDLE)
+         retro_sleep(10);
+      else
+         vulkan_present(&khr->vk, khr->vk.context.current_swapchain_index);
+   }
    vulkan_acquire_next_image(&khr->vk);
 }
 
diff --git a/gfx/drivers_context/w_vk_ctx.c b/gfx/drivers_context/w_vk_ctx.c
index ea0901701a..c0d8fd6abc 100644
--- a/gfx/drivers_context/w_vk_ctx.c
+++ b/gfx/drivers_context/w_vk_ctx.c
@@ -34,6 +34,7 @@
 
 #include <dynamic/dylib.h>
 #include <string/stdstring.h>
+#include <retro_timers.h>
 
 #ifdef HAVE_CONFIG_H
 #include "../../config.h"
@@ -101,7 +102,15 @@ static void gfx_ctx_w_vk_check_window(void *data, bool *quit,
 
 static void gfx_ctx_w_vk_swap_buffers(void *data)
 {
-   vulkan_present(&win32_vk, win32_vk.context.current_swapchain_index);
+   if (win32_vk.context.has_acquired_swapchain)
+   {
+      win32_vk.context.has_acquired_swapchain = false;
+      /* We're still waiting for a proper swapchain, so just fake it. */
+      if (win32_vk.swapchain == VK_NULL_HANDLE)
+         retro_sleep(10);
+      else
+         vulkan_present(&win32_vk, win32_vk.context.current_swapchain_index);
+   }
    vulkan_acquire_next_image(&win32_vk);
 }
 
diff --git a/gfx/drivers_context/wayland_vk_ctx.c b/gfx/drivers_context/wayland_vk_ctx.c
index 1b56c44015..8749e04f6e 100644
--- a/gfx/drivers_context/wayland_vk_ctx.c
+++ b/gfx/drivers_context/wayland_vk_ctx.c
@@ -45,6 +45,8 @@
 /* Generated from xdg-decoration-unstable-v1.h */
 #include "../common/wayland/xdg-decoration-unstable-v1.h"
 
+#include <retro_timers.h>
+
 #ifndef EGL_PLATFORM_WAYLAND_KHR
 #define EGL_PLATFORM_WAYLAND_KHR 0x31D8
 #endif
@@ -609,7 +611,14 @@ static void gfx_ctx_wl_swap_buffers(void *data)
 {
    gfx_ctx_wayland_data_t *wl = (gfx_ctx_wayland_data_t*)data;
 
-   vulkan_present(&wl->vk, wl->vk.context.current_swapchain_index);
+   if (wl->vk.context.has_acquired_swapchain)
+   {
+      wl->vk.context.has_acquired_swapchain = false;
+      if (wl->vk.swapchain == VK_NULL_HANDLE)
+         retro_sleep(10);
+      else
+         vulkan_present(&wl->vk, wl->vk.context.current_swapchain_index);
+   }
    vulkan_acquire_next_image(&wl->vk);
    flush_wayland_fd(&wl->input);
 }
diff --git a/gfx/drivers_context/x_vk_ctx.c b/gfx/drivers_context/x_vk_ctx.c
index 12423c2cc8..79bbe70d3d 100644
--- a/gfx/drivers_context/x_vk_ctx.c
+++ b/gfx/drivers_context/x_vk_ctx.c
@@ -25,6 +25,7 @@
 
 #include <string/stdstring.h>
 #include <compat/strcasestr.h>
+#include <retro_timers.h>
 #include <X11/Xatom.h>
 
 #include "../../configuration.h"
@@ -150,7 +151,14 @@ static void gfx_ctx_x_vk_swap_buffers(void *data)
 {
    gfx_ctx_x_vk_data_t *x = (gfx_ctx_x_vk_data_t*)data;
 
-   vulkan_present(&x->vk, x->vk.context.current_swapchain_index);
+   if (x->vk.context.has_acquired_swapchain)
+   {
+      x->vk.context.has_acquired_swapchain = false;
+      if (x->vk.swapchain == VK_NULL_HANDLE)
+         retro_sleep(10);
+      else
+         vulkan_present(&x->vk, x->vk.context.current_swapchain_index);
+   }
    vulkan_acquire_next_image(&x->vk);
 }