summaryrefslogtreecommitdiff
path: root/src/tests/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/common')
-rw-r--r--src/tests/common/test_3d_helpers.cc100
-rw-r--r--src/tests/common/test_3d_helpers.h20
2 files changed, 120 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;
+}
diff --git a/src/tests/common/test_3d_helpers.h b/src/tests/common/test_3d_helpers.h
new file mode 100644
index 0000000..5e9c72c
--- /dev/null
+++ b/src/tests/common/test_3d_helpers.h
@@ -0,0 +1,20 @@
+// This file is part of the 64k demo project.
+// Common WGPU initialization for 3D visual tests with surfaces.
+
+#pragma once
+
+#include "platform/platform.h"
+#include <webgpu.h>
+
+// Result of WGPU initialization with surface
+struct WgpuSurfaceContext {
+ WGPUDevice device;
+ WGPUQueue queue;
+ WGPUSurface surface;
+ WGPUAdapter adapter;
+ WGPUTextureFormat format;
+};
+
+// Initialize WGPU with surface for rendering tests
+// Returns context with device/queue/surface/adapter/format
+WgpuSurfaceContext init_wgpu_with_surface(PlatformState* platform_state);