summaryrefslogtreecommitdiff
path: root/src/tests/common/test_3d_helpers.cc
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-14 12:50:27 +0100
committerskal <pascal.massimino@gmail.com>2026-02-14 12:50:27 +0100
commit5e33097e4649f1c886275db18dc532930487457b (patch)
treee4cee838e54a2aaf8fa66741f467f8fceefc808a /src/tests/common/test_3d_helpers.cc
parent48beb6b1c10d7ca42205000a5bb420a1e3282d92 (diff)
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 <noreply@anthropic.com>
Diffstat (limited to 'src/tests/common/test_3d_helpers.cc')
-rw-r--r--src/tests/common/test_3d_helpers.cc100
1 files changed, 100 insertions, 0 deletions
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 <cstdio>
+#include <cstdlib>
+
+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;
+}