From 9f502500a282f6b6a7bda1bbd2b0230ddab48ede Mon Sep 17 00:00:00 2001 From: The Stickmahn Date: Sat, 30 May 2026 16:16:55 +0200 Subject: [PATCH] Added Windows support (untested though, sorry) Added Windows support for WGPU, although it is untested since I don't have a Windows machine to test it on. --- src/video/SDL_wgpu_defs.h | 6 ++++ src/video/windows/SDL_windowswgpu.c | 52 +++++++++++++++++++++++++++++ src/video/windows/SDL_windowswgpu.h | 12 +++++++ 3 files changed, 70 insertions(+) create mode 100644 src/video/windows/SDL_windowswgpu.c create mode 100644 src/video/windows/SDL_windowswgpu.h diff --git a/src/video/SDL_wgpu_defs.h b/src/video/SDL_wgpu_defs.h index 19a584b357..72c2018485 100644 --- a/src/video/SDL_wgpu_defs.h +++ b/src/video/SDL_wgpu_defs.h @@ -96,6 +96,12 @@ typedef struct WGPUSurfaceSourceXlibWindow { uint64_t window; } WGPUSurfaceSourceXlibWindow; +typedef struct WGPUSurfaceSourceWindowsHWND { + WGPUChainedStruct chain; + void * hinstance; + void * hwnd; +} WGPUSurfaceSourceWindowsHWND; + typedef WGPUSurface (*WGPUProcInstanceCreateSurface)(WGPUInstance instance, WGPUSurfaceDescriptor const *descriptor) WGPU_FUNCTION_ATTRIBUTE; #if defined(WGPU_STATIC) diff --git a/src/video/windows/SDL_windowswgpu.c b/src/video/windows/SDL_windowswgpu.c new file mode 100644 index 0000000000..6b1cba111d --- /dev/null +++ b/src/video/windows/SDL_windowswgpu.c @@ -0,0 +1,52 @@ + +#include "SDL_internal.h" + +#if defined(SDL_VIDEO_WGPU) && defined(SDL_VIDEO_DRIVER_WINDOWS) +#include "SDL_windowsvideo.h" + +#include "../SDL_wgpu_defs.h" +#include "SDL_windoiwswgpu.h" + +WGPUSurface WIN_WGPU_CreateSurface(SDL_VideoDevice *_this, SDL_Window *window, WGPUInstance instance) +{ + SDL_PropertiesID windowProperties = SDL_GetWindowProperties(window); + + void *hwnd = SDL_GetPointerProperty(windowProperties, SDL_PROP_WINDOW_WIN32_HWND_POINTER, 0); + void *hinstance = SDL_GetPointerProperty(windowProperties, SDL_PROP_WINDOW_WIN32_INSTANCE_POINTER, 0); + + WGPUSurfaceDescriptor desc; + WGPUSurfaceSourceWindowsHWND source; + + source.hwnd = hwnd; + source.hinstance = hinstance; + source.chain.sType = WGPUSType_SurfaceSourceXlibWindow; + source.chain.next = NULL; + + desc.label = (WGPUStringView){ NULL, WGPU_STRLEN }; + desc.nextInChain = &source.chain; + +#if defined(WGPU_STATIC) + return wgpuInstanceCreateSurface(instance, &desc); +#else + SDL_SharedObject *wgpuLib = SDL_LoadObject("libwgpu_native.so"); + + if (wgpuLib == NULL) { + SDL_SetError("Failed to load wgpu-native shared library 'libwgpu_native.so'"); + goto fail; + } + + WGPUProcInstanceCreateSurface proc = (WGPUProcInstanceCreateSurface)SDL_LoadFunction(wgpuLib, "wgpuInstanceCreateSurface"); + + if (proc == NULL) { + SDL_SetError("Failed to load function 'wgpuInstanceCreateSurface' from loaded wgpu-native library!"); + goto fail; + } + + return proc(instance, &desc); +fail: + SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "Failed to create WGPU surface: %s", SDL_GetError()); + return NULL; +#endif +} + +#endif diff --git a/src/video/windows/SDL_windowswgpu.h b/src/video/windows/SDL_windowswgpu.h new file mode 100644 index 0000000000..be899ec27f --- /dev/null +++ b/src/video/windows/SDL_windowswgpu.h @@ -0,0 +1,12 @@ +// NOTE: I don't have a Windows machine to test this on. - TheStickmahn + +#ifndef SDL_windowswgpu_h_ +#define SDL_windowswgpu_h_ + +#include + +#if defined(SDL_VIDEO_WGPU) && defined(SDL_VIDEO_DRIVER_WINDOWS) +extern WGPUSurface WIN_WGPU_CreateSurface(SDL_VSDL_VideoDevice *_this, SDL_Window *window, WGPUInstance instance); +#endif + +#endif // SDL_windowswgpu_h_