From 5e33097e4649f1c886275db18dc532930487457b Mon Sep 17 00:00:00 2001 From: skal Date: Sat, 14 Feb 2026 12:50:27 +0100 Subject: Refactor: factorize WGPU init code for 3D tests Extracted duplicate WGPU initialization boilerplate from test_3d_physics, test_3d_render, and test_mesh into shared helper (test_3d_helpers). **Changes:** - New: src/tests/common/test_3d_helpers.{h,cc} (~120 LOC) - Removed ~280 LOC of duplicate init_wgpu() implementations - Net savings: -141 LOC **Benefits:** - Single source of truth for surface+device initialization - Eliminates cross-compile #ifdef duplication - Easier maintenance for callback API changes All 34 tests pass. Co-Authored-By: Claude Sonnet 4.5 --- src/tests/common/test_3d_helpers.cc | 100 ++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/tests/common/test_3d_helpers.cc (limited to 'src/tests/common/test_3d_helpers.cc') diff --git a/src/tests/common/test_3d_helpers.cc b/src/tests/common/test_3d_helpers.cc new file mode 100644 index 0000000..13e1cfe --- /dev/null +++ b/src/tests/common/test_3d_helpers.cc @@ -0,0 +1,100 @@ +// 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; +} -- cgit v1.2.3