diff --git a/dep/vulkan-loader/CMakeLists.txt b/dep/vulkan-loader/CMakeLists.txt
index 8ce9b7fed..7341af2aa 100644
--- a/dep/vulkan-loader/CMakeLists.txt
+++ b/dep/vulkan-loader/CMakeLists.txt
@@ -30,3 +30,6 @@ if(USE_X11)
   target_compile_definitions(vulkan-loader PUBLIC "VULKAN_USE_X11=1")
 endif()
 
+if(USE_WAYLAND)
+  target_compile_definitions(vulkan-loader PUBLIC "VULKAN_USE_WAYLAND=1")
+endif()
diff --git a/dep/vulkan-loader/include/vulkan_entry_points.inl b/dep/vulkan-loader/include/vulkan_entry_points.inl
index 42ae6ab28..155710f05 100644
--- a/dep/vulkan-loader/include/vulkan_entry_points.inl
+++ b/dep/vulkan-loader/include/vulkan_entry_points.inl
@@ -50,6 +50,10 @@ VULKAN_INSTANCE_ENTRY_POINT(vkCreateXlibSurfaceKHR, false)
 VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceXlibPresentationSupportKHR, false)
 #endif
 
+#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
+VULKAN_INSTANCE_ENTRY_POINT(vkCreateWaylandSurfaceKHR, false)
+#endif
+
 #if defined(VK_USE_PLATFORM_ANDROID_KHR)
 VULKAN_INSTANCE_ENTRY_POINT(vkCreateAndroidSurfaceKHR, false)
 #endif
diff --git a/dep/vulkan-loader/include/vulkan_loader.h b/dep/vulkan-loader/include/vulkan_loader.h
index 999039d80..1da06fe46 100644
--- a/dep/vulkan-loader/include/vulkan_loader.h
+++ b/dep/vulkan-loader/include/vulkan_loader.h
@@ -33,6 +33,10 @@
 #define VK_USE_PLATFORM_XLIB_KHR
 #endif
 
+#if defined(VULKAN_USE_WAYLAND)
+#define VK_USE_PLATFORM_WAYLAND_KHR
+#endif
+
 #if defined(ANDROID)
 #define VK_USE_PLATFORM_ANDROID_KHR
 #endif
diff --git a/src/common/vulkan/context.cpp b/src/common/vulkan/context.cpp
index f827574b9..505c7bf31 100644
--- a/src/common/vulkan/context.cpp
+++ b/src/common/vulkan/context.cpp
@@ -186,19 +186,24 @@ bool Context::SelectInstanceExtensions(ExtensionList* extension_list, bool enabl
 #if defined(VK_USE_PLATFORM_WIN32_KHR)
   if (enable_surface && !SupportsExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, true))
     return false;
-#elif defined(VK_USE_PLATFORM_XLIB_KHR)
+#endif
+#if defined(VK_USE_PLATFORM_XLIB_KHR)
   if (enable_surface && !SupportsExtension(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, true))
     return false;
-#elif defined(VK_USE_PLATFORM_XCB_KHR)
-  if (enable_surface && !SupportsExtension(VK_KHR_XCB_SURFACE_EXTENSION_NAME, true))
+#endif
+#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
+  if (enable_surface && !SupportsExtension(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, true))
     return false;
-#elif defined(VK_USE_PLATFORM_ANDROID_KHR)
+#endif
+#if defined(VK_USE_PLATFORM_ANDROID_KHR)
   if (enable_surface && !SupportsExtension(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, true))
     return false;
-#elif defined(VK_USE_PLATFORM_MACOS_MVK)
+#endif
+#if defined(VK_USE_PLATFORM_MACOS_MVK)
   if (enable_surface && !SupportsExtension(VK_MVK_MACOS_SURFACE_EXTENSION_NAME, true))
     return false;
-#elif defined(VK_USE_PLATFORM_METAL_EXT)
+#endif
+#if defined(VK_USE_PLATFORM_METAL_EXT)
   if (enable_surface && !SupportsExtension(VK_EXT_METAL_SURFACE_EXTENSION_NAME, true))
     return false;
 #endif
diff --git a/src/common/vulkan/swap_chain.cpp b/src/common/vulkan/swap_chain.cpp
index c7c0f686b..cb06a386a 100644
--- a/src/common/vulkan/swap_chain.cpp
+++ b/src/common/vulkan/swap_chain.cpp
@@ -135,6 +135,25 @@ VkSurfaceKHR SwapChain::CreateVulkanSurface(VkInstance instance, WindowInfo& wi)
   }
 #endif
 
+#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
+  if (wi.type == WindowInfo::Type::Wayland)
+  {
+    VkWaylandSurfaceCreateInfoKHR surface_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, nullptr, 0,
+                                                         static_cast<struct wl_display*>(wi.display_connection),
+                                                         static_cast<struct wl_surface*>(wi.window_handle)};
+
+    VkSurfaceKHR surface;
+    VkResult res = vkCreateWaylandSurfaceKHR(instance, &surface_create_info, nullptr, &surface);
+    if (res != VK_SUCCESS)
+    {
+      LOG_VULKAN_ERROR(res, "vkCreateWaylandSurfaceEXT failed: ");
+      return VK_NULL_HANDLE;
+    }
+
+    return surface;
+  }
+#endif
+
 #if defined(VK_USE_PLATFORM_ANDROID_KHR)
   if (wi.type == WindowInfo::Type::Android)
   {