summaryrefslogtreecommitdiff
path: root/src/tests/offscreen_render_target.h
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-07 09:46:12 +0100
committerskal <pascal.massimino@gmail.com>2026-02-07 09:46:12 +0100
commit4965202fb03299fc351f20eb2eb13f3fa30f6704 (patch)
tree55cb51b8772faa67f8e6228fa71ef0e15a913672 /src/tests/offscreen_render_target.h
parent514d1b83562cbe63a24e8a53f90cda81f941b608 (diff)
test: Add GPU effects test infrastructure (Phase 1 Foundation)
Creates shared testing utilities for headless GPU effect testing. Enables testing visual effects without windows (CI-friendly). New Test Infrastructure (8 files): - webgpu_test_fixture.{h,cc}: Shared WebGPU initialization * Handles Win32 (old API) vs Native (new callback info structs) * Graceful skip if GPU unavailable * Eliminates 100+ lines of boilerplate per test - offscreen_render_target.{h,cc}: Headless rendering ("frame sink") * Creates offscreen WGPUTexture for rendering without windows * Pixel readback via wgpuBufferMapAsync for validation * 262,144 byte framebuffer (256x256 BGRA8) - effect_test_helpers.{h,cc}: Reusable validation utilities * has_rendered_content(): Detects non-black pixels * all_pixels_match_color(): Color matching with tolerance * hash_pixels(): Deterministic output verification (FNV-1a) - test_effect_base.cc: Comprehensive test suite (7 tests, all passing) * WebGPU fixture lifecycle * Offscreen rendering and pixel readback * Effect construction and initialization * Sequence add_effect and activation logic * Pixel validation helpers Coverage Impact: - GPU test infrastructure: 0% → Foundation ready for Phase 2 - Next: Individual effect tests (FlashEffect, GaussianBlur, etc.) Size Impact: ZERO - All test code wrapped in #if !defined(STRIP_ALL) - Test executables separate from demo64k - No impact on final binary (verified with guards) Test Output: ✓ 7/7 tests passing ✓ WebGPU initialization (adapter + device) ✓ Offscreen render target creation ✓ Pixel readback (262,144 bytes) ✓ Effect initialization via Sequence ✓ Sequence activation logic ✓ Pixel validation helpers Technical Details: - Uses WGPUTexelCopyTextureInfo/BufferInfo (not deprecated ImageCopy*) - Handles WGPURequestAdapterCallbackInfo (native) vs old API (Win32) - Polls wgpuInstanceProcessEvents for async operations - MapAsync uses WGPUMapMode_Read for pixel readback Analysis Document: - GPU_EFFECTS_TEST_ANALYSIS.md: Full roadmap (Phases 1-4, 44 hours) - Phase 1 complete, Phase 2 ready (individual effect tests) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Diffstat (limited to 'src/tests/offscreen_render_target.h')
-rw-r--r--src/tests/offscreen_render_target.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/tests/offscreen_render_target.h b/src/tests/offscreen_render_target.h
new file mode 100644
index 0000000..4163ec1
--- /dev/null
+++ b/src/tests/offscreen_render_target.h
@@ -0,0 +1,53 @@
+// This file is part of the 64k demo project.
+// It provides offscreen rendering without windows (headless testing).
+// Enables pixel readback for frame validation in tests.
+
+#pragma once
+
+#include "platform/platform.h"
+#include <cstdint>
+#include <vector>
+
+// Offscreen render target for headless GPU testing
+// Creates a texture that can be rendered to and read back
+class OffscreenRenderTarget {
+ public:
+ // Create an offscreen render target with specified dimensions
+ OffscreenRenderTarget(WGPUInstance instance,
+ WGPUDevice device,
+ int width,
+ int height,
+ WGPUTextureFormat format = WGPUTextureFormat_BGRA8Unorm);
+ ~OffscreenRenderTarget();
+
+ // Accessors
+ WGPUTexture texture() const { return texture_; }
+ WGPUTextureView view() const { return view_; }
+ int width() const { return width_; }
+ int height() const { return height_; }
+ WGPUTextureFormat format() const { return format_; }
+
+ // Read pixels from the render target
+ // Returns BGRA8 pixel data (width * height * 4 bytes)
+ std::vector<uint8_t> read_pixels();
+
+ private:
+ WGPUInstance instance_;
+ WGPUDevice device_;
+ WGPUTexture texture_;
+ WGPUTextureView view_;
+ int width_;
+ int height_;
+ WGPUTextureFormat format_;
+
+ // Helper: Create staging buffer for readback
+ WGPUBuffer create_staging_buffer();
+
+ // Callback state for async buffer mapping
+ struct MapState {
+ bool done = false;
+ WGPUMapAsyncStatus status = WGPUMapAsyncStatus_Unknown;
+ };
+
+ static void map_callback(WGPUMapAsyncStatus status, void* userdata);
+};