SDL: video: Add a hint to allow Vulkan surfaces on foreign windows

From 0bf8ccfb60b828ec6e3451efbf307c45336000da Mon Sep 17 00:00:00 2001
From: Ethan Lee <[EMAIL REDACTED]>
Date: Tue, 8 Feb 2022 22:15:11 -0500
Subject: [PATCH] video: Add a hint to allow Vulkan surfaces on foreign windows

---
 include/SDL_hints.h   | 11 +++++++++++
 src/video/SDL_video.c | 10 ++++++++++
 2 files changed, 21 insertions(+)

diff --git a/include/SDL_hints.h b/include/SDL_hints.h
index 384320e0665..ec228fb27fd 100644
--- a/include/SDL_hints.h
+++ b/include/SDL_hints.h
@@ -1453,6 +1453,17 @@ extern "C" {
 */
 #define SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT    "SDL_VIDEO_WINDOW_SHARE_PIXEL_FORMAT"
 
+/**
+ *  \brief  When calling SDL_CreateWindowFrom(), make the window compatible with Vulkan.
+ *
+ * This variable can be set to the following values:
+ * "0" - Don't add any graphics flags to the SDL_WindowFlags
+ * "1" - Add SDL_WINDOW_VULKAN to the SDL_WindowFlags
+ *
+ * By default SDL will not make the foreign window compatible with Vulkan.
+ */
+#define SDL_HINT_VIDEO_FOREIGN_WINDOW_VULKAN "SDL_VIDEO_FOREIGN_WINDOW_VULKAN"
+
 /**
 *  \brief  A variable specifying which shader compiler to preload when using the Chrome ANGLE binaries
 *
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index 2648c44c6e4..6fd668c8d47 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -1703,6 +1703,16 @@ SDL_CreateWindowFrom(const void *data)
     }
     _this->windows = window;
 
+#if SDL_VIDEO_VULKAN
+    if (SDL_GetHintBoolean(SDL_HINT_VIDEO_FOREIGN_WINDOW_VULKAN, SDL_FALSE)) {
+        window->flags |= SDL_WINDOW_VULKAN;
+        if (SDL_Vulkan_LoadLibrary(NULL) < 0) {
+            SDL_DestroyWindow(window);
+            return NULL;
+        }
+    }
+#endif
+
     if (_this->CreateSDLWindowFrom(_this, window, data) < 0) {
         SDL_DestroyWindow(window);
         return NULL;