diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-08 08:33:55 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-08 08:33:55 +0100 |
| commit | 16c2cdce6ad1d89d3c537f2c2cff743449925125 (patch) | |
| tree | 44792b3f8909dba5622143179c95787fd4de5149 /src/platform/platform.cc | |
| parent | d19aec6690bdf515435f4052275828b061c3f71f (diff) | |
feat(platform): Centralize platform-specific WebGPU code and improve shader composition
Diffstat (limited to 'src/platform/platform.cc')
| -rw-r--r-- | src/platform/platform.cc | 87 |
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 |
