// This file is part of the 64k demo project. // Common WGPU initialization for 3D visual tests with surfaces. #include "test_3d_helpers.h" #include #include WgpuSurfaceContext init_wgpu_with_surface(PlatformState* platform_state) { WgpuSurfaceContext ctx = {}; WGPUInstance instance = wgpuCreateInstance(nullptr); if (!instance) { fprintf(stderr, "Failed to create WGPU instance.\n"); exit(1); } ctx.surface = platform_create_wgpu_surface(instance, platform_state); if (!ctx.surface) { fprintf(stderr, "Failed to create WGPU surface.\n"); exit(1); } WGPURequestAdapterOptions adapter_opts = {}; adapter_opts.compatibleSurface = ctx.surface; adapter_opts.powerPreference = WGPUPowerPreference_HighPerformance; #if defined(DEMO_CROSS_COMPILE_WIN32) auto on_adapter = [](WGPURequestAdapterStatus status, WGPUAdapter adapter, const char* message, void* userdata) { if (status == WGPURequestAdapterStatus_Success) { *(WGPUAdapter*)userdata = adapter; } }; wgpuInstanceRequestAdapter(instance, &adapter_opts, on_adapter, &ctx.adapter); #else auto on_adapter = [](WGPURequestAdapterStatus status, WGPUAdapter adapter, WGPUStringView message, void* userdata, void* user2) { (void)user2; if (status == WGPURequestAdapterStatus_Success) { *(WGPUAdapter*)userdata = adapter; } }; WGPURequestAdapterCallbackInfo adapter_cb = {}; adapter_cb.mode = WGPUCallbackMode_WaitAnyOnly; adapter_cb.callback = on_adapter; adapter_cb.userdata1 = &ctx.adapter; wgpuInstanceRequestAdapter(instance, &adapter_opts, adapter_cb); #endif while (!ctx.adapter) { platform_wgpu_wait_any(instance); } WGPUDeviceDescriptor device_desc = {}; #if defined(DEMO_CROSS_COMPILE_WIN32) auto on_device = [](WGPURequestDeviceStatus status, WGPUDevice device, const char* message, void* userdata) { if (status == WGPURequestDeviceStatus_Success) { *(WGPUDevice*)userdata = device; } }; wgpuAdapterRequestDevice(ctx.adapter, &device_desc, on_device, &ctx.device); #else auto on_device = [](WGPURequestDeviceStatus status, WGPUDevice device, WGPUStringView message, void* userdata, void* user2) { (void)user2; if (status == WGPURequestDeviceStatus_Success) { *(WGPUDevice*)userdata = device; } }; WGPURequestDeviceCallbackInfo device_cb = {}; device_cb.mode = WGPUCallbackMode_WaitAnyOnly; device_cb.callback = on_device; device_cb.userdata1 = &ctx.device; wgpuAdapterRequestDevice(ctx.adapter, &device_desc, device_cb); #endif while (!ctx.device) { platform_wgpu_wait_any(instance); } ctx.queue = wgpuDeviceGetQueue(ctx.device); WGPUSurfaceCapabilities caps = {}; wgpuSurfaceGetCapabilities(ctx.surface, ctx.adapter, &caps); ctx.format = caps.formats[0]; WGPUSurfaceConfiguration config = {}; config.device = ctx.device; config.format = ctx.format; config.usage = WGPUTextureUsage_RenderAttachment; config.width = platform_state->width; config.height = platform_state->height; config.presentMode = WGPUPresentMode_Fifo; config.alphaMode = WGPUCompositeAlphaMode_Opaque; wgpuSurfaceConfigure(ctx.surface, &config); return ctx; }