daemon: link daedalus-fourier + log substrate availability at startup #13

Merged
marfrit merged 1 commits from noether/daemon-link-daedalus-fourier into main 2026-05-21 16:35:39 +00:00
Owner

First incremental step toward the H.264 daemon-rewrite plan in #11. Makes the daedalus-fourier kernel library available to the daemon process so subsequent patches can substitute its primitives (IDCT 4×4, IDCT 8×8, luma vertical deblock, etc.) for libavcodec's per-MB pixel math.

What this PR does

Nothing functional yet — purely linkage + observability:

  • daemon/CMakeLists.txt: pkg_check_modules(DAEDALUS_FOURIER REQUIRED daedalus-fourier) + explicit link ordering. libdaedalus_core.a must precede -lvulkan in the link line (the static archive references vulkan symbols; linker resolves left-to-right). We bypass IMPORTED_TARGET here because pkg-config's Requires.private chain leaves CMake's dependency graph reordering the archive after -lvulkan, breaking the static link.
  • daemon/src/main.c: daedalus_ctx_create_no_qpu() at startup, log line, daedalus_ctx_destroy() at exit. no_qpu mode skips V3D Vulkan probe — this just proves linkage works without depending on shader-path resolution (separate work; v3d_runner currently loads .spv files from cwd-relative paths, would need a search path API).

Sample journal line:

[2026-05-21 17:59:35.271 INFO] daedalus-fourier: linked, ctx alive (no_qpu mode; has_qpu=0)

Verified

Build-test on hertz (Pi 5 dev host) against an installed copy of daedalus-fourier r35+gd87239d (from marfrit/daedalus-fourier PR #1, just merged). Binary links cleanly, --help prints, daemon command runs through the daedalus-fourier init + then fails opening the chardev (expected on hertz — no daedalus_v4l2 kmod there; on higgs the chardev is present and the existing working path resumes).

Dependency

Needs daedalus-fourier-dev (or equivalent) at build time. marfrit-packages build-deb.sh will need to fetch + build + install daedalus-fourier into a temp prefix before invoking the daemon's cmake — that's a follow-up marfrit-packages PR after this lands.

Follow-up patches per #11

  1. Instrument the existing libavcodec decode path to count per-frame IDCT blocks / deblock edges / MC tiles so we have a baseline of what work the daemon dispatches for a typical YouTube H.264 stream.
  2. Substitute daedalus-fourier kernels one at a time, measuring CPU saved per substitution.
  3. Wire shader-path resolution into daedalus_ctx_create() for the QPU substrate (V3D opportunistic-helper paths, e.g. cycle 8 H.264 deblock).

Wire protocol

Unchanged. DAEDALUS_PROTO_VERSION stays at 0. No kmod rebuild needed.

First incremental step toward the H.264 daemon-rewrite plan in #11. Makes the daedalus-fourier kernel library available to the daemon process so subsequent patches can substitute its primitives (IDCT 4×4, IDCT 8×8, luma vertical deblock, etc.) for libavcodec's per-MB pixel math. ## What this PR does Nothing functional yet — purely linkage + observability: - `daemon/CMakeLists.txt`: `pkg_check_modules(DAEDALUS_FOURIER REQUIRED daedalus-fourier)` + explicit link ordering. libdaedalus_core.a must precede -lvulkan in the link line (the static archive references vulkan symbols; linker resolves left-to-right). We bypass IMPORTED_TARGET here because pkg-config's `Requires.private` chain leaves CMake's dependency graph reordering the archive after -lvulkan, breaking the static link. - `daemon/src/main.c`: `daedalus_ctx_create_no_qpu()` at startup, log line, `daedalus_ctx_destroy()` at exit. `no_qpu` mode skips V3D Vulkan probe — this just proves linkage works without depending on shader-path resolution (separate work; `v3d_runner` currently loads `.spv` files from cwd-relative paths, would need a search path API). Sample journal line: ``` [2026-05-21 17:59:35.271 INFO] daedalus-fourier: linked, ctx alive (no_qpu mode; has_qpu=0) ``` ## Verified Build-test on hertz (Pi 5 dev host) against an installed copy of daedalus-fourier `r35+gd87239d` (from marfrit/daedalus-fourier PR #1, just merged). Binary links cleanly, `--help` prints, `daemon` command runs through the daedalus-fourier init + then fails opening the chardev (expected on hertz — no `daedalus_v4l2` kmod there; on higgs the chardev is present and the existing working path resumes). ## Dependency Needs `daedalus-fourier-dev` (or equivalent) at build time. marfrit-packages build-deb.sh will need to fetch + build + install daedalus-fourier into a temp prefix before invoking the daemon's cmake — that's a follow-up marfrit-packages PR after this lands. ## Follow-up patches per #11 1. Instrument the existing libavcodec decode path to count per-frame IDCT blocks / deblock edges / MC tiles so we have a baseline of what work the daemon dispatches for a typical YouTube H.264 stream. 2. Substitute daedalus-fourier kernels one at a time, measuring CPU saved per substitution. 3. Wire shader-path resolution into `daedalus_ctx_create()` for the QPU substrate (V3D opportunistic-helper paths, e.g. cycle 8 H.264 deblock). ## Wire protocol Unchanged. `DAEDALUS_PROTO_VERSION` stays at 0. No kmod rebuild needed.
marfrit added 1 commit 2026-05-21 16:01:20 +00:00
First incremental step toward H.264 daemon-rewrite (daedalus-v4l2#11):
make the daedalus-fourier kernel library available to the daemon
process so subsequent patches can substitute its primitives
(IDCT 4×4, IDCT 8×8, luma vertical deblock, etc.) for libavcodec's
per-MB pixel math.

This patch does NOT yet dispatch any kernels.  It only:

  - Adds `pkg_check_modules(DAEDALUS_FOURIER REQUIRED daedalus-fourier)`
    to the daemon's CMakeLists, with explicit link ordering
    (libdaedalus_core.a must precede -lvulkan because the static
    archive references vulkan symbols and the linker resolves
    left-to-right).  We bypass IMPORTED_TARGET because pkg-config's
    Requires.private chain leaves CMake's dependency graph reordering
    the archive after -lvulkan, breaking the static link.

  - Calls daedalus_ctx_create_no_qpu() at daemon startup, logs the
    substrate-availability line, destroys the context at exit.
    no_qpu mode skips V3D Vulkan probe — proves linkage works
    without depending on shader-path resolution (which is a
    separate piece of work, since v3d_runner currently loads
    .spv files from cwd-relative paths and consumer would need
    a search path override).

Sample journal line:

  [2026-05-21 17:59:35.271 INFO] daedalus-fourier: linked, ctx alive
  (no_qpu mode; has_qpu=0)

Build-test verified on hertz (Pi 5 dev host) against an installed
copy of daedalus-fourier r35+gd87239d (from marfrit/daedalus-fourier
PR #1).  Binary links cleanly, --help prints, daemon mode opens
chardev (fails predictably on hertz which has no daedalus_v4l2
kmod; on higgs this is the existing working path).

Follow-up patches per daedalus-v4l2#11:

  1. Instrument the existing libavcodec decode path to count
     per-frame IDCT blocks / deblock edges / MC tiles so we have
     a baseline of what work the daemon dispatches for a typical
     YouTube H.264 stream.
  2. Substitute daedalus-fourier kernels one at a time, measuring
     CPU saved per substitution.
  3. Wire shader path resolution into daedalus_ctx_create() for
     the QPU substrate (V3D opportunistic helper paths).

Wire protocol unchanged.  DAEDALUS_PROTO_VERSION stays at 0.
marfrit merged commit 77e14e5a19 into main 2026-05-21 16:35:39 +00:00
marfrit deleted branch noether/daemon-link-daedalus-fourier 2026-05-21 16:35:39 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: reauktion/daedalus-v4l2#13