diff options
author | BoredGuy <osome3717@gmail.com> | 2025-09-26 14:11:24 +0300 |
---|---|---|
committer | BoredGuy <osome3717@gmail.com> | 2025-09-26 14:11:24 +0300 |
commit | 3394a279b34c81d411abe010a2f45ca60370a1eb (patch) | |
tree | 6edc08c1bc6b50da7bbc7f1d4b50d89bca1f7f53 /src/renderwindow.c | |
parent | a23d279dfa284c1faf13ef0100bb6434a8e83617 (diff) |
Working on RenderWindow
Diffstat (limited to 'src/renderwindow.c')
-rw-r--r-- | src/renderwindow.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/renderwindow.c b/src/renderwindow.c index d3bea0c..e9b7a80 100644 --- a/src/renderwindow.c +++ b/src/renderwindow.c @@ -2,6 +2,11 @@ #include <dawn/webgpu.h> #include "renderwindow.h" +#if defined(SDL_PLATFORM_LINUX) +#include <X11/Xlib.h> +#include <wayland-client.h> +#endif + RenderWindow InitRenderWindow(int width, int height, const char* title) { RenderWindow renderWindow = {0}; SDL_Init(SDL_INIT_VIDEO); @@ -12,11 +17,58 @@ RenderWindow InitRenderWindow(int width, int height, const char* title) { .requiredFeatures = (WGPUInstanceFeatureName[]) { WGPUInstanceFeatureName_TimedWaitAny } }); + SDL_PropertiesID windowProperties = SDL_GetWindowProperties(renderWindow.window); +#if defined(SDL_PLATFORM_LINUX) + if (SDL_strcmp(SDL_GetCurrentVideoDriver(), "x11") == 0) { + Display* xdisplay = + (Display *)SDL_GetPointerProperty(windowProperties, SDL_PROP_WINDOW_X11_DISPLAY_POINTER, NULL); + Window xwindow = + (Window)SDL_GetNumberProperty(windowProperties, SDL_PROP_WINDOW_X11_WINDOW_NUMBER, 0); + + if (xdisplay && xwindow) { + renderWindow.wgpuSurface = + wgpuInstanceCreateSurface(renderWindow.wgpuInstance, &(const WGPUSurfaceDescriptor){ + .nextInChain = (WGPUChainedStruct*)&(const WGPUSurfaceSourceXlibWindow) { + .chain = (WGPUChainedStruct) { + .next = NULL, + .sType = WGPUSType_SurfaceSourceXlibWindow + }, + + .display = xdisplay, + .window = xwindow + } + }); + } + } else if (SDL_strcmp(SDL_GetCurrentVideoDriver(), "wayland") == 0) { + struct wl_display* wl_display = + (struct wl_display*)SDL_GetPointerProperty(windowProperties, SDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER, NULL); + struct wl_surface* wl_surface = + (struct wl_surface*)SDL_GetPointerProperty(windowProperties, SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER, NULL); + + if (wl_display && wl_surface) { + renderWindow.wgpuSurface = + wgpuInstanceCreateSurface(renderWindow.wgpuInstance, &(const WGPUSurfaceDescriptor){ + .nextInChain = (WGPUChainedStruct*)&(const WGPUSurfaceSourceWaylandSurface) { + .chain = (WGPUChainedStruct) { + .next = NULL, + .sType = WGPUSType_SurfaceSourceWaylandSurface + }, + + .display = wl_display, + .surface = wl_surface + } + }); + } + } +#endif + return renderWindow; } void QuitRenderWindow(RenderWindow* renderWindow) { + wgpuSurfaceRelease(renderWindow->wgpuSurface); wgpuInstanceRelease(renderWindow->wgpuInstance); SDL_DestroyWindow(renderWindow->window); + SDL_memset(renderWindow, 0, sizeof(RenderWindow)); SDL_Quit(); } |