aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/scripts/test_ports/vcpkg-ci-dawn/project/webgpu_glfw3.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vcpkg/scripts/test_ports/vcpkg-ci-dawn/project/webgpu_glfw3.cpp')
-rw-r--r--vcpkg/scripts/test_ports/vcpkg-ci-dawn/project/webgpu_glfw3.cpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/vcpkg/scripts/test_ports/vcpkg-ci-dawn/project/webgpu_glfw3.cpp b/vcpkg/scripts/test_ports/vcpkg-ci-dawn/project/webgpu_glfw3.cpp
new file mode 100644
index 0000000..269ea1f
--- /dev/null
+++ b/vcpkg/scripts/test_ports/vcpkg-ci-dawn/project/webgpu_glfw3.cpp
@@ -0,0 +1,121 @@
+//
+// Copyright (c) 2025 xiaozhuai
+//
+
+#define GLFW_INCLUDE_NONE
+
+#include <memory>
+
+#include "GLFW/glfw3.h"
+#include "webgpu/webgpu_cpp.h"
+
+#if defined(_WIN32)
+#define GLFW_EXPOSE_NATIVE_WIN32
+#endif
+
+#if defined(__APPLE__)
+#define GLFW_EXPOSE_NATIVE_COCOA
+#endif
+
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)
+#define DAWN_USE_X11
+#endif
+
+#if defined(DAWN_USE_X11)
+#define GLFW_EXPOSE_NATIVE_X11
+#endif
+
+#if defined(DAWN_USE_WAYLAND)
+#define GLFW_EXPOSE_NATIVE_WAYLAND
+#endif
+
+#if defined(__EMSCRIPTEN__)
+#include "emscripten/emscripten.h"
+#else
+#include "GLFW/glfw3native.h"
+#endif
+
+#if defined(__APPLE__)
+#include <objc/message.h>
+#include <objc/objc.h>
+#include <objc/runtime.h>
+template <typename T, typename... Args>
+T objc_call(id obj, const char *sel, Args... args) {
+ using FuncPtr = T (*)(id, SEL, Args...);
+ return reinterpret_cast<FuncPtr>(objc_msgSend)(obj, sel_registerName(sel), args...);
+}
+template <typename T, typename... Args>
+T objc_call(const char *clazz, const char *sel, Args... args) {
+ return objc_call<T>(reinterpret_cast<id>(objc_getClass(clazz)), sel, args...);
+}
+#endif
+
+std::unique_ptr<wgpu::ChainedStruct> setup_window_and_get_surface_descriptor(GLFWwindow *window) {
+ if (glfwGetWindowAttrib(window, GLFW_CLIENT_API) != GLFW_NO_API) {
+ return nullptr;
+ }
+
+#if defined(__EMSCRIPTEN__)
+ auto desc = std::make_unique<wgpu::EmscriptenSurfaceSourceCanvasHTMLSelector>();
+ desc->selector = "#canvas";
+ return desc;
+#elif defined(_WIN32)
+ auto desc = std::make_unique<wgpu::SurfaceSourceWindowsHWND>();
+ desc->hwnd = glfwGetWin32Window(window);
+ desc->hinstance = GetModuleHandle(nullptr);
+ return desc;
+#elif defined(__APPLE__)
+ // NSWindow *ns_window = glfwGetCocoaWindow(window);
+ // NSView *view = [ns_window contentView];
+ // [view setWantsLayer:YES];
+ // CAMetalLayer *layer = [CAMetalLayer layer];
+ // CGFloat scale_factor = [ns_window backingScaleFactor];
+ // [layer setContentsScale:scale_factor];
+ // [view setLayer:layer];
+ auto ns_window = glfwGetCocoaWindow(window);
+ CFRetain(ns_window);
+ auto view = objc_call<id>(ns_window, "contentView");
+ CFRetain(view);
+ objc_call<void, BOOL>(view, "setWantsLayer:", YES);
+ auto layer = objc_call<id>("CAMetalLayer", "layer");
+ auto scale_factor = objc_call<CGFloat>(ns_window, "backingScaleFactor");
+ objc_call<void, CGFloat>(layer, "setContentsScale:", scale_factor);
+ objc_call<void, id>(view, "setLayer:", layer);
+ auto desc = std::make_unique<wgpu::SurfaceSourceMetalLayer>();
+ desc->layer = layer;
+ CFRelease(view);
+ CFRelease(ns_window);
+ return desc;
+#elif defined(DAWN_USE_WAYLAND) || defined(DAWN_USE_X11)
+#if defined(GLFW_PLATFORM_WAYLAND) && defined(DAWN_USE_WAYLAND)
+ if (glfwGetPlatform() == GLFW_PLATFORM_WAYLAND) {
+ auto desc = std::make_unique<wgpu::SurfaceSourceWaylandSurface>();
+ desc->display = glfwGetWaylandDisplay();
+ desc->surface = glfwGetWaylandWindow(window);
+ return desc;
+ } else // NOLINT(readability/braces)
+#endif
+#if defined(DAWN_USE_X11)
+ {
+ auto desc = std::make_unique<wgpu::SurfaceSourceXlibWindow>();
+ desc->display = glfwGetX11Display();
+ desc->window = glfwGetX11Window(window);
+ return desc;
+ }
+#else
+ {
+ return nullptr;
+ }
+#endif
+#else
+ return nullptr;
+#endif
+}
+
+wgpu::Surface create_surface(const wgpu::Instance &instance, GLFWwindow *window) {
+ auto chainedDescriptor = setup_window_and_get_surface_descriptor(window);
+ wgpu::SurfaceDescriptor descriptor;
+ descriptor.nextInChain = chainedDescriptor.get();
+ wgpu::Surface surface = instance.CreateSurface(&descriptor);
+ return surface;
+}