summaryrefslogtreecommitdiff
path: root/src/platform/platform.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/platform.cc')
-rw-r--r--src/platform/platform.cc87
1 files changed, 86 insertions, 1 deletions
diff --git a/src/platform/platform.cc b/src/platform/platform.cc
index 29b3af3..2b8529a 100644
--- a/src/platform/platform.cc
+++ b/src/platform/platform.cc
@@ -5,6 +5,7 @@
#include "platform/platform.h"
#include "glfw3webgpu.h"
#include <GLFW/glfw3.h>
+#include <cstdio>
// --- Callbacks ---
@@ -128,4 +129,88 @@ WGPUSurface platform_create_wgpu_surface(WGPUInstance instance,
double platform_get_time() {
return glfwGetTime();
-} \ No newline at end of file
+}
+
+// --- WebGPU Request Helpers ---
+
+#if defined(DEMO_CROSS_COMPILE_WIN32)
+static void _platform_adapter_cb_win32(WGPURequestAdapterStatus status,
+ WGPUAdapter adapter, const char* message,
+ void* userdata) {
+ if (status == WGPURequestAdapterStatus_Success) {
+ *((WGPUAdapter*)userdata) = adapter;
+ } else {
+ printf("Request adapter failed: %s\n", message ? message : "Unknown");
+ }
+}
+
+void platform_wgpu_request_adapter(WGPUInstance instance,
+ const WGPURequestAdapterOptions* options,
+ WGPUAdapter* out_adapter) {
+ wgpuInstanceRequestAdapter(instance, options, _platform_adapter_cb_win32,
+ out_adapter);
+}
+
+static void _platform_device_cb_win32(WGPURequestDeviceStatus status,
+ WGPUDevice device, const char* message,
+ void* userdata) {
+ if (status == WGPURequestDeviceStatus_Success) {
+ *((WGPUDevice*)userdata) = device;
+ } else {
+ printf("Request device failed: %s\n", message ? message : "Unknown");
+ }
+}
+
+void platform_wgpu_request_device(WGPUAdapter adapter,
+ const WGPUDeviceDescriptor* descriptor,
+ WGPUDevice* out_device) {
+ wgpuAdapterRequestDevice(adapter, descriptor, _platform_device_cb_win32,
+ out_device);
+}
+
+#else
+
+static void _platform_adapter_cb_native(WGPURequestAdapterStatus status,
+ WGPUAdapter adapter,
+ WGPUStringView message, void* userdata,
+ void* userdata2) {
+ (void)userdata2;
+ if (status == WGPURequestAdapterStatus_Success) {
+ *((WGPUAdapter*)userdata) = adapter;
+ } else {
+ printf("Request adapter failed: %.*s\n", (int)message.length, message.data);
+ }
+}
+
+void platform_wgpu_request_adapter(WGPUInstance instance,
+ const WGPURequestAdapterOptions* options,
+ WGPUAdapter* out_adapter) {
+ WGPURequestAdapterCallbackInfo cb = {};
+ cb.mode = WGPUCallbackMode_WaitAnyOnly;
+ cb.callback = _platform_adapter_cb_native;
+ cb.userdata1 = out_adapter;
+ wgpuInstanceRequestAdapter(instance, options, cb);
+}
+
+static void _platform_device_cb_native(WGPURequestDeviceStatus status,
+ WGPUDevice device,
+ WGPUStringView message, void* userdata,
+ void* userdata2) {
+ (void)userdata2;
+ if (status == WGPURequestDeviceStatus_Success) {
+ *((WGPUDevice*)userdata) = device;
+ } else {
+ printf("Request device failed: %.*s\n", (int)message.length, message.data);
+ }
+}
+
+void platform_wgpu_request_device(WGPUAdapter adapter,
+ const WGPUDeviceDescriptor* descriptor,
+ WGPUDevice* out_device) {
+ WGPURequestDeviceCallbackInfo cb = {};
+ cb.mode = WGPUCallbackMode_WaitAnyOnly;
+ cb.callback = _platform_device_cb_native;
+ cb.userdata1 = out_device;
+ wgpuAdapterRequestDevice(adapter, descriptor, cb);
+}
+#endif