// This file is part of the 64k demo project. // It provides shared WebGPU initialization for GPU tests. // Eliminates boilerplate and enables graceful skipping if GPU unavailable. #pragma once #include "gpu/gpu.h" #include "platform/platform.h" // Shared test fixture for WebGPU tests // Handles device/queue initialization and cleanup class WebGPUTestFixture { public: WebGPUTestFixture(); ~WebGPUTestFixture(); // Initialize WebGPU device and queue // Returns true on success, false if GPU unavailable (test should skip) bool init(); // Cleanup resources void shutdown(); // Accessors WGPUInstance instance() const { return instance_; } WGPUDevice device() const { return device_; } WGPUQueue queue() const { return queue_; } WGPUTextureFormat format() const { return WGPUTextureFormat_BGRA8Unorm; } GpuContext ctx() const { return {device_, queue_, format()}; } // Check if fixture is ready bool is_initialized() const { return device_ != nullptr; } private: WGPUInstance instance_ = nullptr; WGPUAdapter adapter_ = nullptr; WGPUDevice device_ = nullptr; WGPUQueue queue_ = nullptr; // Callback state for async device request struct RequestState { WGPUAdapter adapter = nullptr; WGPUDevice device = nullptr; bool done = false; }; static void adapter_callback(WGPURequestAdapterStatus status, WGPUAdapter adapter, const char* message, void* userdata); static void device_callback(WGPURequestDeviceStatus status, WGPUDevice device, const char* message, void* userdata); };