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}