diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-09 19:34:46 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-09 19:34:46 +0100 |
| commit | f449fe7f78e059d455dfefcf4b09d763363f6344 (patch) | |
| tree | 0a1e6ebfc42025e4e72200d3c34e2bf799a32aa8 /CMakeLists.txt | |
| parent | dd42eeef53df8ea36f436986f915f29986c094a3 (diff) | |
feat: Add headless mode for testing without GPU
Implements DEMO_HEADLESS build option for fast iteration cycles:
- Functional GPU/platform stubs (not pure no-ops like STRIP_EXTERNAL_LIBS)
- Audio and timeline systems work normally
- No rendering overhead
- Useful for CI, audio development, timeline validation
Files added:
- doc/HEADLESS_MODE.md - Documentation
- src/gpu/headless_gpu.cc - Validated GPU stubs
- src/platform/headless_platform.cc - Time simulation (60Hz)
- scripts/test_headless.sh - End-to-end test script
Usage:
cmake -B build_headless -DDEMO_HEADLESS=ON
cmake --build build_headless -j4
./build_headless/demo64k --headless --duration 30
Progress printed every 5s. Compatible with --dump_wav mode.
handoff(Claude): Task #76 follow-up - headless mode complete
Diffstat (limited to 'CMakeLists.txt')
| -rw-r--r-- | CMakeLists.txt | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index c35695f..ede06ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,7 @@ option(DEMO_BUILD_TESTS "Build tests" OFF) option(DEMO_BUILD_TOOLS "Build tools" OFF) option(DEMO_ENABLE_COVERAGE "Enable code coverage generation (macOS only)" OFF) option(DEMO_ENABLE_DEBUG_LOGS "Enable all debug logging (for pre-commit checks)" OFF) +option(DEMO_HEADLESS "Build headless mode (functional stubs for testing)" OFF) option(DEMO_ALL_OPTIONS "Activate all options at once" OFF) set(DEMO_WORKSPACE "main" CACHE STRING "Active workspace (main, test, etc.)") @@ -56,6 +57,12 @@ if (DEMO_ENABLE_DEBUG_LOGS) add_definitions(-DDEBUG_LOG_ALL) endif() +if (DEMO_HEADLESS) + add_definitions(-DDEMO_HEADLESS) + add_definitions(-DMA_ENABLE_ONLY_SPECIFIC_BACKENDS -DMA_ENABLE_NULL) + message(STATUS "DEMO_HEADLESS enabled - functional stubs (audio works, no GPU)") +endif() + #-- - Workspace Configuration -- - include(cmake/ParseWorkspace.cmake) set(WORKSPACE_DIR "${CMAKE_SOURCE_DIR}/workspaces/${DEMO_WORKSPACE}") @@ -113,7 +120,35 @@ endif() #-- - Source Groups -- - set(AUDIO_SOURCES src/audio/audio.cc src/audio/ring_buffer.cc src/audio/backend/miniaudio_backend.cc src/audio/backend/wav_dump_backend.cc src/audio/backend/silent_backend.cc src/audio/gen.cc src/audio/fdct.cc src/audio/idct.cc src/audio/fft.cc src/audio/window.cc src/audio/synth.cc src/audio/tracker.cc src/audio/spectrogram_resource_manager.cc src/audio/audio_engine.cc src/audio/spectral_brush.cc) set(PROCEDURAL_SOURCES src/procedural/generator.cc) -if (DEMO_STRIP_EXTERNAL_LIBS) +if (DEMO_HEADLESS) + # Headless mode: Functional stubs (timeline/audio work) + # Include all effect classes to satisfy timeline loading + set(GPU_SOURCES + src/gpu/headless_gpu.cc + src/gpu/demo_effects.cc + src/gpu/effect.cc + src/gpu/effects/heptagon_effect.cc + src/gpu/effects/particles_effect.cc + src/gpu/effects/passthrough_effect.cc + src/gpu/effects/moving_ellipse_effect.cc + src/gpu/effects/particle_spray_effect.cc + src/gpu/effects/gaussian_blur_effect.cc + src/gpu/effects/solarize_effect.cc + src/gpu/effects/chroma_aberration_effect.cc + src/gpu/effects/vignette_effect.cc + src/gpu/effects/post_process_helper.cc + src/gpu/effects/shaders.cc + src/gpu/effects/hybrid_3d_effect.cc + src/gpu/effects/flash_cube_effect.cc + src/gpu/effects/theme_modulation_effect.cc + src/gpu/effects/fade_effect.cc + src/gpu/effects/flash_effect.cc + src/gpu/effects/shader_composer.cc + src/gpu/effects/circle_mask_effect.cc + src/gpu/effects/rotating_cube_effect.cc + src/gpu/texture_manager.cc + ) +elseif (DEMO_STRIP_EXTERNAL_LIBS) # Size measurement mode: Minimal GPU stubs only set(GPU_SOURCES src/gpu/stub_gpu.cc) else() @@ -143,8 +178,20 @@ else() src/gpu/texture_manager.cc ) endif() -if (DEMO_STRIP_EXTERNAL_LIBS) - # Size measurement mode: Stub 3D (it depends on WebGPU) +if (DEMO_HEADLESS) + # Headless mode: Full 3D (needed for Hybrid3DEffect) + set(3D_SOURCES + src/3d/renderer.cc + src/3d/renderer_draw.cc + src/3d/renderer_pipelines.cc + src/3d/renderer_resources.cc + src/3d/visual_debug.cc + src/3d/bvh.cc + src/3d/physics.cc + src/3d/scene_loader.cc + ) +elseif (DEMO_STRIP_EXTERNAL_LIBS) + # Size measurement mode: Stub 3D (depends on WebGPU) set(3D_SOURCES src/3d/bvh.cc src/3d/physics.cc src/3d/scene_loader.cc) else() # Normal mode: Full 3D implementation @@ -159,7 +206,9 @@ else() src/3d/scene_loader.cc ) endif() -if (DEMO_STRIP_EXTERNAL_LIBS) +if (DEMO_HEADLESS) + set(PLATFORM_SOURCES src/platform/headless_platform.cc) +elseif (DEMO_STRIP_EXTERNAL_LIBS) set(PLATFORM_SOURCES src/platform/stub_platform.cc) else() set(PLATFORM_SOURCES src/platform/platform.cc third_party/glfw3webgpu/glfw3webgpu.c) |
