src/glfw_surface.c
1#include "alba.h"
2
3#include <stdio.h>
4#include <stdlib.h>
5
6#include "webgpu.h"
7#include "GLFW/glfw3.h"
8
9#ifdef GLFW_X11
10# define GLFW_EXPOSE_NATIVE_X11
11#endif
12#ifdef GLFW_WAYLAND
13# define GLFW_EXPOSE_NATIVE_WAYLAND
14#endif
15#ifdef GLFW_COCOA
16# define GLFW_EXPOSE_NATIVE_COCOA
17#endif
18#ifdef GLFW_WIN32
19# define GLFW_EXPOSE_NATIVE_WIN32
20#endif
21
22#include <GLFW/glfw3native.h>
23
24
25WGPUSurface get_window_surface(const WGPUInstance instance, AlbaWindow* window)
26{
27 WGPUSurfaceDescriptor surfaceDescriptor = {0};
28 switch (glfwGetPlatform())
29 {
30#ifdef GLFW_X11
31 case GLFW_PLATFORM_X11:
32 Display* x11_display = glfwGetX11Display();
33 const Window x11_window = glfwGetX11Window(window->glfw_window);
34
35 WGPUSurfaceDescriptorFromXlibWindow fromXlibWindow = {0};
36 fromXlibWindow.chain.sType = WGPUSType_SurfaceDescriptorFromXlibWindow;
37 fromXlibWindow.display = x11_display;
38 fromXlibWindow.window = x11_window;
39
40 surfaceDescriptor.nextInChain = &fromXlibWindow.chain;
41 return wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
42#endif
43
44#ifdef GLFW_WAYLAND
45 case GLFW_PLATFORM_WAYLAND:
46 struct wl_display* wayland_display = glfwGetWaylandDisplay();
47 struct wl_surface* wayland_surface = glfwGetWaylandWindow(window->glfw_window);
48
49 WGPUSurfaceDescriptorFromWaylandSurface fromWaylandSurface = {0};
50 fromWaylandSurface.chain.sType = WGPUSType_SurfaceDescriptorFromWaylandSurface;
51 fromWaylandSurface.display = wayland_display;
52 fromWaylandSurface.surface = wayland_surface;
53
54 surfaceDescriptor.nextInChain = &fromWaylandSurface.chain;
55 return wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
56#endif
57
58#ifdef GLFW_COCOA
59 case GLFW_PLATFORM_COCOA:
60 id metal_layer = [CAMetalLayer layer];
61 NSWindow* ns_window = glfwGetCocoaWindow(window->glfw_window);
62 [ns_window.contentView setWantsLayer : YES] ;
63 [ns_window.contentView setLayer : metal_layer] ;
64
65 WGPUSurfaceDescriptorFromMetalLayer fromMetalLayer = {0};
66 fromMetalLayer.chain.sType = WGPUSType_SurfaceDescriptorFromMetalLayer;
67 fromMetalLayer.layer = metal_layer;
68
69 surfaceDescriptor.nextInChain = &fromMetalLayer.chain;
70 return wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
71#endif
72
73#ifdef GLFW_WIN32
74 case GLFW_PLATFORM_WIN32:
75 HWND hwnd = glfwGetWin32Window(window->glfw_window);
76 HINSTANCE hinstance = GetModuleHandle(NULL);
77
78 WGPUSurfaceDescriptorFromWindowsHWND fromWindowsHWND = {0]};
79 fromWindowsHWND.chain.sType = WGPUSType_SurfaceDescriptorFromWindowsHWND;
80 fromWindowsHWND.hinstance = hinstance;
81 fromWindowsHWND.hwnd = hwnd;
82
83 surfaceDescriptor.nextInChain = &fromWindowsHWND.chain;
84 return wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
85#endif
86
87 default:
88 printf("error: unsuppoerted platform: %d\n", glfwGetPlatform());
89 exit(1);
90 }
91}