Files
punktfunk/crates/pyrowave-sys/vendor/pyrowave/CMakeLists.txt
T
enricobuehler 4c3b11445c feat(host): vendor PyroWave + minimal Granite subset as crates/pyrowave-sys
Phase 0 of design/pyrowave-codec-plan.md — the opt-in wired-LAN ultra-low-
latency codec. Vendored at upstream 509e4f88 (API 0.4.0, Granite 44362775,
volk + vulkan-headers pins in PUNKTFUNK-VENDOR.txt), pruned to the 6.6 MB
the standalone no-renderer build needs; scripts/vendor-pyrowave.sh
reproduces the tree (a pin bump is protocol-affecting, plan §4.2).

build.rs drives the wrapper CMakeLists (static archives incl. a static
C-API lib upstream only ships shared) + bindgen over pyrowave.h; Linux and
Windows only, empty stub elsewhere (Apple gets a native Metal port, §4.7).
Offline-safe by construction: no network, no system lib, vendored Vulkan
headers — same model as the opus dep (flatpak builder has no network).

Phase-0 validation on .21 (RTX 5070 Ti, driver 610.43.03):
- upstream pyrowave-c-test + interop test (incl. dmabuf/DRM-modifier
  Vulkan<->Vulkan) pass, from the pristine AND the pruned tree
- GPU kernel times at ~1.6 bpp noise: encode/decode 0.090/0.042 ms @800p,
  0.146/0.067 @1080p, 0.226/0.103 @1440p, 0.477/0.201 @4K — order of
  magnitude under NVENC's 1-2 ms retrieve, CBR lands within ~100 B of
  target
- cargo test -p pyrowave-sys green (static link + API-version pin check)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 00:35:10 +02:00

174 lines
8.5 KiB
CMake

cmake_minimum_required(VERSION 3.20)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_C_STANDARD 99)
project(pyrowave LANGUAGES CXX C)
if (CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang"))
set(PYROWAVE_CXX_FLAGS -Wshadow -Wall -Wextra -Wno-comment -Wno-missing-field-initializers -Wno-empty-body -fvisibility=hidden)
if (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
set(PYROWAVE_CXX_FLAGS ${PYROWAVE_CXX_FLAGS} -Wno-backslash-newline-escape)
endif()
if (NOT (${CMAKE_BUILD_TYPE} MATCHES "Release"))
message("Enabling frame pointer for profiling/debug.")
set(PYROWAVE_CXX_FLAGS ${PYROWAVE_CXX_FLAGS} -fno-omit-frame-pointer)
endif()
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)")
message("Enabling SSE3 support.")
set(PYROWAVE_CXX_FLAGS ${PYROWAVE_CXX_FLAGS} -msse3)
endif()
elseif (MSVC)
set(PYROWAVE_CXX_FLAGS /D_CRT_SECURE_NO_WARNINGS /wd4267 /wd4244 /wd4309 /wd4005 /MP)
endif()
add_library(pyrowave STATIC
pyrowave_config.hpp shaders/slangmosh.hpp
pyrowave_encoder.hpp pyrowave_encoder.cpp
pyrowave_decoder.hpp pyrowave_decoder.cpp
pyrowave_common.hpp pyrowave_common.cpp)
target_include_directories(pyrowave PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_compile_options(pyrowave PRIVATE ${PYROWAVE_CXX_FLAGS})
set_target_properties(pyrowave PROPERTIES POSITION_INDEPENDENT_CODE ON)
option(PYROWAVE_DEVEL "Build PyroWave as a standalone sandbox with development tooling." OFF)
if (ANDROID)
# Mobile chips really like FP16
target_compile_definitions(pyrowave PRIVATE PYROWAVE_PRECISION=0)
message("Forcing FP16 default on Android.")
else()
option(PYROWAVE_FP32_STORAGE "Configure for full FP32 and extended precision." OFF)
option(PYROWAVE_FP32_MATH "Configure for FP32 arithmetic, but reduced range storage." ON)
if (PYROWAVE_FP32_STORAGE)
target_compile_definitions(pyrowave PRIVATE PYROWAVE_PRECISION=2)
elseif(PYROWAVE_FP32_MATH)
target_compile_definitions(pyrowave PRIVATE PYROWAVE_PRECISION=1)
else()
target_compile_definitions(pyrowave PRIVATE PYROWAVE_PRECISION=0)
endif()
endif()
if (PYROWAVE_DEVEL)
add_library(pyrowave-utils STATIC yuv4mpeg.cpp yuv4mpeg.hpp)
# Standalone build, build the sandbox.
set(GRANITE_RENDERER ON CACHE BOOL "" FORCE)
set(GRANITE_VULKAN_FOSSILIZE OFF CACHE BOOL "" FORCE)
set(GRANITE_SHIPPING OFF CACHE BOOL "" FORCE)
set(GRANITE_PLATFORM "SDL" CACHE STRING "" FORCE)
set(GRANITE_HIDDEN ON CACHE BOOL "" FORCE)
set(GRANITE_POSITION_INDEPENDENT ON CACHE BOOL "" FORCE)
add_subdirectory(Granite EXCLUDE_FROM_ALL)
add_granite_offline_tool(pyrowave-sandbox sandbox.cpp)
target_link_libraries(pyrowave-sandbox PRIVATE pyrowave)
target_compile_definitions(pyrowave-sandbox PRIVATE ASSET_DIRECTORY=\"${CMAKE_CURRENT_SOURCE_DIR}/shaders\")
target_link_libraries(pyrowave-sandbox PRIVATE granite-renderer pyrowave-utils)
add_granite_offline_tool(pyrowave-bench bench.cpp)
target_link_libraries(pyrowave-bench PRIVATE pyrowave)
target_link_libraries(pyrowave-bench PRIVATE granite-vulkan pyrowave-utils)
add_granite_offline_tool(pyrowave-encode encode.cpp)
target_link_libraries(pyrowave-encode PRIVATE pyrowave)
target_link_libraries(pyrowave-encode PRIVATE granite-vulkan pyrowave-utils)
add_granite_offline_tool(pyrowave-decode decode.cpp)
target_link_libraries(pyrowave-decode PRIVATE pyrowave)
target_link_libraries(pyrowave-decode PRIVATE granite-vulkan pyrowave-utils)
add_granite_offline_tool(pyrowave-psnr psnr.cpp)
target_link_libraries(pyrowave-psnr PRIVATE pyrowave-utils)
add_granite_application(pyrowave-viewer viewer.cpp)
target_link_libraries(pyrowave-viewer PRIVATE pyrowave pyrowave-utils)
if (NOT ANDROID)
target_compile_definitions(pyrowave-viewer PRIVATE ASSET_DIRECTORY=\"${CMAKE_CURRENT_SOURCE_DIR}/shaders\")
endif()
elseif (${PROJECT_IS_TOP_LEVEL} AND (NOT TARGET granite-vulkan))
set(GRANITE_RENDERER OFF CACHE BOOL "" FORCE)
set(GRANITE_VULKAN_SPIRV_CROSS OFF CACHE BOOL "" FORCE)
set(GRANITE_VULKAN_SHADER_MANAGER_RUNTIME_COMPILER OFF CACHE BOOL "" FORCE)
set(GRANITE_VULKAN_SYSTEM_HANDLES OFF CACHE BOOL "" FORCE)
set(GRANITE_SHADER_COMPILER_OPTIMIZE OFF CACHE BOOL "" FORCE)
set(GRANITE_POSITION_INDEPENDENT ON CACHE BOOL "" FORCE)
set(GRANITE_VULKAN_FOSSILIZE OFF CACHE BOOL "" FORCE)
set(GRANITE_SHIPPING ON CACHE BOOL "" FORCE)
set(GRANITE_PLATFORM "null" CACHE STRING "" FORCE)
add_subdirectory(Granite EXCLUDE_FROM_ALL)
endif()
target_link_libraries(pyrowave PRIVATE granite-vulkan granite-math)
if (${PROJECT_IS_TOP_LEVEL})
add_library(pyrowave-shared SHARED pyrowave_c.cpp pyrowave.h)
target_link_libraries(pyrowave-shared PRIVATE pyrowave granite-vulkan)
target_compile_definitions(pyrowave-shared PRIVATE PYROWAVE_EXPORT_SYMBOLS)
target_compile_options(pyrowave-shared PRIVATE ${PYROWAVE_CXX_FLAGS})
add_executable(pyrowave-c-test pyrowave_c_test.cpp)
target_link_libraries(pyrowave-c-test PRIVATE pyrowave-shared granite-volk-headers)
target_compile_options(pyrowave-c-test PRIVATE ${PYROWAVE_CXX_FLAGS})
add_executable(pyrowave-c-interop-test pyrowave_c_interop_test.cpp com_ptr.hpp)
target_link_libraries(pyrowave-c-interop-test PRIVATE pyrowave-shared granite-vulkan)
target_compile_options(pyrowave-c-interop-test PRIVATE ${PYROWAVE_CXX_FLAGS})
add_executable(pyrowave-device-validation pyrowave_device_validation.cpp com_ptr.hpp)
target_link_libraries(pyrowave-device-validation PRIVATE pyrowave-shared granite-util granite-volk-headers)
target_compile_options(pyrowave-device-validation PRIVATE ${PYROWAVE_CXX_FLAGS})
set(PYROWAVE_API_VERSION_MAJOR 0)
set(PYROWAVE_API_VERSION_MINOR 4)
set(PYROWAVE_API_VERSION_PATCH 0)
set(PYROWAVE_API_VERSION ${PYROWAVE_API_VERSION_MAJOR}.${PYROWAVE_API_VERSION_MINOR}.${PYROWAVE_API_VERSION_PATCH})
# DLL_NAME_WITH_SOVERSION requires CMake 3.27+. SteamRT doesn't have CMake 3.27 yet though.
if (WIN32 AND (CMAKE_VERSION VERSION_LESS "3.27"))
message(FATAL_ERROR "CMake build on Windows expects version 3.27 at minimum.")
endif()
set_target_properties(pyrowave-shared
PROPERTIES VERSION ${PYROWAVE_API_VERSION}
SOVERSION ${PYROWAVE_API_VERSION_MAJOR}
DLL_NAME_WITH_SOVERSION ON)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/pyrowave.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pyrowave)
install(TARGETS pyrowave-shared EXPORT pyrowave-sharedConfig
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pyrowave)
install(EXPORT pyrowave-sharedConfig DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pyrowave-shared/cmake)
install(TARGETS pyrowave-device-validation RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
set(PYROWAVE_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
set(PYROWAVE_INSTALL_INC_DIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/pyrowave)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/pkg-config/pyrowave-shared.pc.in
${CMAKE_CURRENT_BINARY_DIR}/pyrowave-shared.pc @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pyrowave-shared.pc DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
if (WIN32 AND CMAKE_COMPILER_IS_GNUCXX)
target_link_libraries(pyrowave-shared PRIVATE -static gcc stdc++ winpthread)
target_link_libraries(pyrowave-c-test PRIVATE -static gcc stdc++ winpthread)
target_link_libraries(pyrowave-c-interop-test PRIVATE -static gcc stdc++ winpthread)
target_link_libraries(pyrowave-device-validation PRIVATE -static gcc stdc++ winpthread)
endif()
if (NOT WIN32)
target_link_libraries(pyrowave-shared PRIVATE -pthread)
target_link_libraries(pyrowave-c-test PRIVATE -pthread)
target_link_libraries(pyrowave-c-interop-test PRIVATE -pthread)
target_link_libraries(pyrowave-device-validation PRIVATE -pthread)
endif()
if (WIN32)
target_sources(pyrowave-shared PRIVATE pyrowave-shared.def)
set_target_properties(pyrowave-shared PROPERTIES PREFIX "lib")
target_link_libraries(pyrowave-c-interop-test PRIVATE d3d11 d3d12 dxgi)
else()
target_link_options(pyrowave-shared PRIVATE -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/link.T)
endif()
endif()