Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 27 additions & 7 deletions clients/deck/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ pkg_check_modules(NOVA_DECK_FFMPEG_VAAPI REQUIRED IMPORTED_TARGET
libavutil
libva
libva-drm
egl
glesv2
)
pkg_check_modules(NOVA_DECK_LINUX_AUDIO REQUIRED IMPORTED_TARGET
libpipewire-0.3
Expand All @@ -23,7 +25,7 @@ add_library(nova_deck_core
src/deck_gamepad.cpp
src/deck_layout.cpp
src/polaris_game_fixture.cpp
src/stream/deck_moonlight_handoff_preflight.cpp
src/backend/deck_backend_interfaces.cpp
src/stream/deck_stream_core.cpp
src/stream/deck_stream_media_adapters.cpp
)
Expand Down Expand Up @@ -80,19 +82,37 @@ if(BUILD_TESTING)
target_link_libraries(nova_deck_stream_media_adapters_test PRIVATE nova_deck_core)
add_test(NAME nova_deck_stream_media_adapters_test COMMAND nova_deck_stream_media_adapters_test)

add_executable(nova_deck_moonlight_handoff_preflight_test
tests/deck_moonlight_handoff_preflight_test.cpp
add_executable(nova_deck_backend_interfaces_test
tests/deck_backend_interfaces_test.cpp
)
target_link_libraries(nova_deck_moonlight_handoff_preflight_test PRIVATE nova_deck_core)
add_test(NAME nova_deck_moonlight_handoff_preflight_test COMMAND nova_deck_moonlight_handoff_preflight_test)
target_link_libraries(nova_deck_backend_interfaces_test PRIVATE nova_deck_core)
add_test(NAME nova_deck_backend_interfaces_test COMMAND nova_deck_backend_interfaces_test)

add_test(NAME nova_deck_moonlight_handoff_source_guard_test
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tests/deck_moonlight_handoff_source_guard_test.py
add_executable(nova_deck_qsg_render_node_scenegraph_smoke
tests/deck_qsg_render_node_scenegraph_smoke.cpp
)
target_link_libraries(nova_deck_qsg_render_node_scenegraph_smoke PRIVATE nova_deck_core)
add_test(NAME nova_deck_qsg_render_node_scenegraph_smoke COMMAND nova_deck_qsg_render_node_scenegraph_smoke)
set_tests_properties(nova_deck_qsg_render_node_scenegraph_smoke PROPERTIES
ENVIRONMENT "QT_QPA_PLATFORM=offscreen;QSG_RHI_BACKEND=opengl"
TIMEOUT 15
)

add_test(NAME nova_deck_gamemode_capture_harness_test
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tests/deck_gamemode_capture_test.py
)
add_test(NAME nova_deck_media_assert_guard_test
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tests/deck_media_assert_guard_test.py
)
add_test(NAME nova_deck_t31_podman_validation_route_test
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tests/deck_t31_podman_validation_test.py
)
add_test(NAME nova_deck_t32_preview_pump_oracle_test
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tests/deck_t32_preview_pump_oracle_test.py
)
add_test(NAME nova_deck_frontend_smoke_route_test
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tests/deck_frontend_smoke_test.py
)
endif()

option(NOVA_DECK_BUILD_QT_SHELL "Build the experimental Qt/QML Steam Deck shell" ON)
Expand Down
16 changes: 16 additions & 0 deletions clients/deck/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,22 @@ Full Qt shell smoke, when Qt deps are present:

The Qt smoke runs nova-deck --smoke-exit with QT_QPA_PLATFORM=offscreen, so it verifies QML object creation and sample library-card data binding without launching a visible desktop window. It does not verify real D-pad focus or game launch behavior yet.

Steam Deck Game Mode rootless Podman validation route, for preview/QSG render cards that must run against the actual Deck gamescope socket:

python3 clients/deck/scripts/deck_t31_podman_validation.py

The script syncs the current source tree to `deck@<deck-host>:/var/tmp/nova-t31-src`, runs `localhost/nova-t24-arch-qt-buildtools` with `/run/user/1000` and `/dev/dri` mounted, builds `clients/deck` with CMake/Ninja, runs Deck CTest, runs `nova_deck_qsg_render_node_scenegraph_smoke` directly with `QT_QPA_PLATFORM=wayland WAYLAND_DISPLAY=gamescope-0 QSG_RHI_BACKEND=opengl LIBVA_DRIVER_NAME=radeonsi` so the CTest offscreen property cannot mask the live gamescope route, and pulls logs into `build/deck-t31-artifacts`. Use `--dry-run` to print the exact sync/container/artifact commands, or `--skip-sync` when the Deck source directory is already prepared.

The route now runs the T32 preview pump oracle after pulling artifacts, so the same command exits non-zero unless the Deck artifacts machine-prove all of the following: `nova_deck_stream_media_adapters_test` covered newest-frame coalescing and invalid-reset stale-presentation clearing, full remote CTest passed, `qsg-gamescope-smoke.log` contains a real Deck render proof with `status=ready objects=1 layers=2 ready=1`, and the route source still avoids host streaming, discovery, pairing, credential, and Polaris launch paths. To check already-pulled artifacts directly, run:

python3 clients/deck/scripts/deck_t32_preview_pump_oracle.py --artifacts build/deck-t31-artifacts

Visible frontend smoke route, for judging the Deck product shell on the actual Game Mode Wayland path without host networking:

python3 clients/deck/scripts/deck_frontend_smoke.py --local-artifacts build/deck-frontend-smoke-artifacts

The frontend smoke uses the same rootless Deck Podman image with `--network=none`, launches `nova-deck` visibly through `QT_QPA_PLATFORM=wayland WAYLAND_DISPLAY=gamescope-0`, and asks the app to save its own `frontend-frame-capture.png`. Artifacts include `environment-summary.txt`, `ui-launch.log`, `qml-runtime.log`, `smoke-summary.txt`, and the frame capture when Qt can grab the window.

## Shared Polaris DTO boundary

Native C++ cannot include Kotlin source directly. For this first slice, fixtures/sample_polaris_game.json is a generated/shared-contract sample using the same snake_case keys covered by the Kotlin shared DTO tests. src/polaris_game_fixture.h and src/polaris_game_fixture.cpp load that fixture into a tiny native projection so the Deck shell can exercise a real library-card shape while the actual native Polaris API/client bridge is still future work.
Expand Down
Loading
Loading