88b2ebfaa9
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.
83 lines
2.4 KiB
CMake
83 lines
2.4 KiB
CMake
# SPDX-License-Identifier: BSD-2-Clause
|
||
#
|
||
# daedalus-v4l2 userspace daemon — CMake build.
|
||
#
|
||
# Notes:
|
||
# - FFmpeg is dlopen'd at runtime (Option γ), so we link only
|
||
# -ldl + -lpthread. Headers from libavformat-dev /
|
||
# libavcodec-dev / libavutil-dev are used at compile time
|
||
# for struct definitions.
|
||
# - Strict warnings enforced.
|
||
|
||
cmake_minimum_required(VERSION 3.20)
|
||
project(daedalus_v4l2_daemon C)
|
||
|
||
set(CMAKE_C_STANDARD 11)
|
||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||
|
||
if (NOT CMAKE_BUILD_TYPE)
|
||
set(CMAKE_BUILD_TYPE Release)
|
||
endif()
|
||
|
||
add_compile_options(-Wall -Wextra -Wpedantic
|
||
-Wno-unused-parameter)
|
||
|
||
# FFmpeg headers (we dlopen the libs but include the headers for
|
||
# struct definitions). pkg-config is the canonical way.
|
||
find_package(PkgConfig REQUIRED)
|
||
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET
|
||
libavformat libavcodec libavutil)
|
||
|
||
# daedalus-fourier — VC VII (V3D) + ARM NEON back-end kernel library.
|
||
# Linked statically. Today only the no-QPU smoke-test path is wired
|
||
# (a ctx_create_no_qpu at daemon startup, log-and-destroy at exit);
|
||
# follow-up patches (per daedalus-v4l2#11) substitute the
|
||
# `daedalus_recipe_dispatch_h264_*` family for libavcodec's per-MB
|
||
# pixel primitives, one cycle at a time.
|
||
#
|
||
# We bypass IMPORTED_TARGET and consume pkg-config's static variables
|
||
# (--static --libs path) directly so we control the link order:
|
||
# libdaedalus_core.a must precede -lvulkan because the static archive
|
||
# references vulkan symbols and the linker resolves left-to-right.
|
||
pkg_check_modules(DAEDALUS_FOURIER REQUIRED daedalus-fourier)
|
||
find_package(Vulkan REQUIRED)
|
||
|
||
add_executable(daedalus_v4l2_daemon
|
||
src/main.c
|
||
src/ffmpeg_loader.c
|
||
src/log.c
|
||
src/parser.c
|
||
src/decoder.c
|
||
src/chardev_client.c
|
||
src/dmabuf_capture.c
|
||
src/bitstream_writer.c
|
||
src/h264_nal_synth.c
|
||
)
|
||
|
||
target_include_directories(daedalus_v4l2_daemon
|
||
PRIVATE
|
||
src
|
||
${CMAKE_CURRENT_SOURCE_DIR}/../include
|
||
${FFMPEG_INCLUDE_DIRS}
|
||
${DAEDALUS_FOURIER_INCLUDE_DIRS}
|
||
)
|
||
|
||
# dl for dlopen, pthread for future threading work.
|
||
target_link_directories(daedalus_v4l2_daemon
|
||
PRIVATE
|
||
${DAEDALUS_FOURIER_LIBRARY_DIRS}
|
||
)
|
||
|
||
target_link_libraries(daedalus_v4l2_daemon
|
||
PRIVATE
|
||
dl
|
||
pthread
|
||
# Order matters: libdaedalus_core.a first (so its undefined
|
||
# vulkan symbols register), then -lvulkan to satisfy them.
|
||
${DAEDALUS_FOURIER_LIBRARIES}
|
||
Vulkan::Vulkan
|
||
)
|
||
|
||
install(TARGETS daedalus_v4l2_daemon
|
||
RUNTIME DESTINATION /usr/local/bin)
|