Skip to content

perf(pyrowave): convert on a high-priority D3D12 compute queue by default - #374

Open
RamazanKara wants to merge 1 commit into
canaryfrom
perf/pyrowave-d3d12-conversion-default
Open

RamazanKara wants to merge 1 commit into
canaryfrom
perf/pyrowave-d3d12-conversion-default

Conversation

@RamazanKara

Copy link
Copy Markdown
Collaborator

co-written by Claude Opus 5.5

Split out of #354 so the default-on policy can be evaluated apart from the PyroWave SDK 1.0 move. It doesn't depend on SDK 1.0 and applies on canary as is.

Why

The D3D11 conversion runs on the immediate context, so under a game load it queues behind the game's own submissions. The D3D12 backend converts on its own compute queue, and this makes it the default at HIGH priority.

Changes

  • SUNSHINE_EXPERIMENTAL_PYROWAVE_D3D12 becomes SUNSHINE_PYROWAVE_D3D12_CONVERSION, default ON, and sessions request the D3D12 conversion by default.
  • The compute queue is created at D3D12_COMMAND_QUEUE_PRIORITY_HIGH, with a logged NORMAL fallback. Realtime is never requested.
  • Fallback, decided and logged once per session:
    • RTX HDR sessions and builds without the backend use D3D11.
    • VIBESHINE_PYROWAVE_CONVERSION=d3d11 forces D3D11, with a warning.
    • An unavailable D3D12 device or queue warns with its HRESULT.
    • An unsupported source logs once and stays on D3D11.
    • A submission error still ends the session.
  • PyroWave still reads the capture image's own texture and keyed mutex, so the late-join copy-path rule from perf(wgc): encode the helper frame directly and publish it with one copy #347 holds.
  • The design doc moves to docs/windows-pyrowave-d3d12-conversion.md. A new test_pyrowave_d3d12_default.py pins the default, the priority, the override and the session-start warning.

Still to qualify on hardware

  • D3D12 debug layer clean.
  • Plane parity against the D3D11 conversion.
  • Repeat detection under load.
  • Device loss and teardown.
  • Latency and game frame time against VIBESHINE_PYROWAVE_CONVERSION=d3d11 on AMD, NVIDIA and Intel.
  • Whether HIGH is honoured beside a GPU-bound game.

…ault

The D3D12 conversion backend was an OFF-by-default prototype. Make it the
default Windows PyroWave conversion path so the colour conversion no longer
queues behind the game's own work on the D3D11 immediate context.

- The compute queue is created at HIGH priority. If the driver refuses it,
  the queue is created at NORMAL and the host log says so. Realtime
  priority is never requested.
- The option is now SUNSHINE_PYROWAVE_D3D12_CONVERSION, default ON, and the
  core config field is d3d12_conversion. The "experimental" and "prototype"
  wording is gone from code, logs, CTest labels and docs; the doc moves to
  docs/windows-pyrowave-d3d12-conversion.md.
- Fallback is decided once at session start and logged: RTX HDR sessions,
  the VIBESHINE_PYROWAVE_CONVERSION=d3d11 override and a build without the
  backend use D3D11 with a log line; an unavailable D3D12 device or queue
  is a warning, not a silent per-frame switch. A source the backend cannot
  convert still falls back to D3D11 for the rest of the session with one
  warning. A submission error still ends the session.
- PyroWave keeps using the capture image's own texture and keyed mutex.
- test_pyrowave_d3d12_default.py pins the default, the HIGH priority with a
  NORMAL fallback, the override and the session-start warning. The existing
  source-text harnesses are updated for the renamed macro and warning text.

This does not depend on the PyroWave SDK 1.0 move; the native qualification
list is in the doc.

Signed-off-by: Ramazan Kara <github@r-kara.de>
@RamazanKara
RamazanKara marked this pull request as ready for review October 27, 2026 23:03

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant