From 6094c907b26e21f13373bae6bf3306dbae40af3c Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Wed, 26 Aug 2026 15:08:16 -0400 Subject: Update deps, small changes and cleanup Signed-off-by: Andrew Opalach --- cross/x86_64-w64-clang.txt | 19 ++++ cross/x86_64-w64-mingw32.txt | 1 + docs/references/references.txt | 5 + env/build_cmds.txt | 50 +++++----- env/msvc_build.sh | 6 +- env/nixpkgs-patches/539430.diff | 81 ++++++++++++++++ flake.lock | 30 +++--- flake.nix | 107 ++++++++++++--------- meson.build | 91 ++++++++++++++---- meson_options.txt | 27 +++--- scripts/line_count.sh | 4 +- scripts/shaderc_deps.sh | 15 +-- src/buffer/clock.c | 5 +- src/cache/backings/memory.c | 6 +- src/cache/handlers/file.c | 8 +- src/cache/meson.build | 8 +- src/codec/codec.h | 6 +- src/codec/ffmpeg/meson.build | 14 ++- src/codec/ffmpeg/packet_ext.c | 14 ++- src/codec/meson.build | 19 +++- src/codec/stb_image.c | 23 +++++ src/codec/wuffs.c | 2 +- src/fruits/cmc/meson.build | 5 +- src/fruits/cmsrv/cmsrv.c | 2 + src/fruits/cmv/cmv.c | 19 ++-- src/fruits/meson.build | 24 ++--- src/liana/handlers/codec_client.c | 4 +- src/liana/handlers/codec_server.c | 1 + src/portal/src/search.c | 3 + src/render/meson.build | 56 ++++++----- src/render/shaders/vr_video.h | 16 +-- src/server/server.c | 2 +- src/util/color_palette.h | 14 +++ src/util/meson.build | 5 +- subprojects/SPIRV-Tools.wrap | 4 +- subprojects/ffmpeg9.wrap | 8 ++ subprojects/glslang.wrap | 4 +- subprojects/harfbuzz.wrap | 4 +- subprojects/libalabaster.wrap | 4 +- subprojects/libcdio-paranoia.wrap | 6 +- subprojects/libnaunet.wrap | 4 +- subprojects/libplacebo.wrap | 4 +- subprojects/packagefiles/ffmpeg/meson.build | 9 +- subprojects/packagefiles/ffmpeg/meson_options.txt | 3 +- subprojects/packagefiles/ffmpeg/version_9.0.1.diff | 29 ++++++ .../packagefiles/libcdio-paranoia/meson.build | 3 +- .../libplacebo/android_opengl_custom_dispatch.diff | 54 +++++++++++ .../libplacebo/glslang_meson_wrap.diff | 40 ++++++++ .../libplacebo/no_uniforms_in_vert.diff | 89 +++++++++++++++++ .../libplacebo/shaderc_optimize_size.diff | 13 +++ subprojects/shaderc.wrap | 5 +- subprojects/stela.wrap | 4 +- tests/cue_splitter.c | 2 +- 53 files changed, 729 insertions(+), 252 deletions(-) create mode 100644 cross/x86_64-w64-clang.txt create mode 100644 env/nixpkgs-patches/539430.diff create mode 100644 subprojects/ffmpeg9.wrap create mode 100644 subprojects/packagefiles/ffmpeg/version_9.0.1.diff create mode 100644 subprojects/packagefiles/libplacebo/android_opengl_custom_dispatch.diff create mode 100644 subprojects/packagefiles/libplacebo/glslang_meson_wrap.diff create mode 100644 subprojects/packagefiles/libplacebo/no_uniforms_in_vert.diff create mode 100644 subprojects/packagefiles/libplacebo/shaderc_optimize_size.diff diff --git a/cross/x86_64-w64-clang.txt b/cross/x86_64-w64-clang.txt new file mode 100644 index 0000000..251122c --- /dev/null +++ b/cross/x86_64-w64-clang.txt @@ -0,0 +1,19 @@ +[binaries] +c = ['x86_64-w64-mingw32-clang', '-fuse-ld=lld'] +cpp = ['x86_64-w64-mingw32-clang++', '-fuse-ld=lld'] +ar = 'x86_64-w64-mingw32-ar' +strip = 'x86_64-w64-mingw32-strip' +windres = 'x86_64-w64-mingw32-windres' +dlltool = 'x86_64-w64-mingw32-dlltool' +exe_wrapper = 'wine64' + +[properties] +ar = 'x86_64-w64-mingw32-ar' +nm = 'x86_64-w64-mingw32-nm' +needs_exe_wrapper = true + +[host_machine] +system = 'windows' +cpu_family = 'x86_64' +cpu = 'x86_64' +endian = 'little' diff --git a/cross/x86_64-w64-mingw32.txt b/cross/x86_64-w64-mingw32.txt index 8d75e8d..13289b2 100644 --- a/cross/x86_64-w64-mingw32.txt +++ b/cross/x86_64-w64-mingw32.txt @@ -8,6 +8,7 @@ cpp = 'x86_64-w64-mingw32-g++' # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106103 # https://embeddedartistry.com/blog/2020/04/13/prefer-gcc-ar-to-ar-in-your-buildsystems/ ar = 'x86_64-w64-mingw32-gcc-ar' +nm = 'x86_64-w64-mingw32-gcc-nm' strip = 'x86_64-w64-mingw32-strip' windres = 'x86_64-w64-mingw32-windres' dlltool = 'x86_64-w64-mingw32-dlltool' diff --git a/docs/references/references.txt b/docs/references/references.txt index f39942c..cbd1702 100644 --- a/docs/references/references.txt +++ b/docs/references/references.txt @@ -28,6 +28,11 @@ Vsync/VRR * https://blurbusters.com/gsync/gsync101-input-lag-tests-and-settings/15/ * https://old.reddit.com/r/Amd/comments/4ypw5k/freesync_is_so_fcking_awesome/d6zl13v/ +Displays +~~~~~~~~ +* https://forums.blurbusters.com/viewtopic.php?t=12235 +* https://app.box.com/s/vcocw3z73ta09txiskj7cnk6289j356b/folder/143475297509 + Latency/Present ~~~~~~~~~~~~~~~ * https://themaister.net/blog/2023/11/12/my-scuffed-game-streaming-adventure-pyrofling/ diff --git a/env/build_cmds.txt b/env/build_cmds.txt index 06dab23..896ba55 100644 --- a/env/build_cmds.txt +++ b/env/build_cmds.txt @@ -1,39 +1,37 @@ # Testing -meson setup build -Dserver=enabled -Dclient=enabled -Dportal=enabled -Dtests=enabled \ - --force-fallback-for=libplacebo +meson setup build -Dfruits=cmsrv,cmc,cmv \ + -Dportal=enabled -Dtests=enabled --force-fallback-for=libplacebo # Android -meson setup build-android -Dserver=disabled -Drenderer-api=gl -Dwindow=glfm \ - -Dcodec-ffmpeg-version=8 -Dcodec-hwaccels=mediacodec -Dtests=disabled \ - --cross-file ./cross/aarch64-linux-android.txt --default-library=static +meson setup build-android -Dfruits=cmv \ + -Dsources=file,http -Dcodec-hwaccels=mediacodec \ + --cross-file ./cross/aarch64-linux-android.txt \ + --default-library=static # MingW DX11 (Preferred) -meson setup build-mingw64-dx11 -Drenderer-api=dx11 -Drenderer=libplacebo -Dwindow=win32 \ - -Dsink-only=false -Dserver=enabled -Dportal=disabled -Dclient=disabled \ - -Dsources=file -Dcodecs=ffmpeg -Dcodec-ffmpeg-version=8 -Dcodec-hwaccels=d3d11va -Dsubtitles=enabled \ - -Dtests=disabled -Dwin32-compat=false --cross-file ./cross/x86_64-w64-mingw32.txt \ - --default-library=static --strip --buildtype=release -Ddebug=false --optimization=s -Db_lto=true +meson setup build-mingw64-dx11 -Dfruits=cmv \ + -Dcodecs=ffmpeg -Dcodec-hwaccels=d3d11va \ + --cross-file ./cross/x86_64-w64-mingw32.txt \ + --default-library=static --buildtype=release --optimization=s -Db_lto=true # MingW Vulkan -meson setup build-mingw64-vulkan -Drenderer-api=vulkan -Drenderer=libplacebo -Dwindow=win32 \ - -Dsink-only=false -Dserver=enabled -Dportal=disabled -Dclient=disabled \ - -Dsources=file -Dcodecs=ffmpeg,stb_image -Dcodec-ffmpeg-version=8 -Dcodec-hwaccels=vulkan -Dsubtitles=enabled \ - -Dtests=disabled -Dwin32-compat=false --cross-file ./cross/x86_64-w64-mingw32.txt \ - --default-library=static --strip --buildtype=release -Ddebug=false --optimization=2 +meson setup build-mingw64-vulkan -Dfruits=cmv \ + -Drenderer-api=vulkan -Dcodecs=ffmpeg -Dcodec-hwaccels=vulkan \ + --cross-file ./cross/x86_64-w64-mingw32.txt \ + --default-library=static --buildtype=release --optimization=2 # Windows XP 32bit Support. -meson setup build-mingw32-min -Drenderer-api=gl -Drenderer=momo -Dwindow=win32 \ - -Dsink-only=false -Dserver=enabled -Dportal=disabled -Dclient=disabled \ - -Dsources=file -Dcodecs=ffmpeg -Dcodec-ffmpeg-version=3 -Dsubtitles=enabled \ - -Dtests=disabled -Dwin32-compat=true --cross-file ./cross/i686-w64-mingw32.txt \ - --default-library=static --strip --buildtype=release -Ddebug=false --optimization=s -Db_lto=true +meson setup build-mingw32-min -Dfruits=cmv \ + -Drenderer-api=gl -Drenderer=momo -Dcodecs=ffmpeg -Dcodec-ffmpeg-version=3 \ + -Dwin32-compat=true --cross-file ./cross/i686-w64-mingw32.txt \ + --default-library=static --buildtype=release --optimization=s -Db_lto=true # ASan -meson setup build-asan --buildtype=debug -Db_sanitize=address -Db_lundef=false \ - -Dclient=enabled -Dportal=enabled -Dtests=enabled \ - -Dcodecs=ffmpeg,wuffs,stb_image --force-fallback-for=libplacebo +meson setup build-asan -Dfruits=cmsrv,cmc,cmv \ + -Dportal=enabled -Dtests=enabled --force-fallback-for=libplacebo \ + --buildtype=debug -Db_sanitize=address -Db_lundef=false # UBSan -meson setup build-ubsan --buildtype=debug -Db_sanitize=undefined -Db_lundef=false \ - -Dclient=enabled -Dportal=enabled -Dtests=enabled \ - -Dcodecs=ffmpeg --force-fallback-for=libplacebo +meson setup build-ubsan -Dfruits=cmsrv,cmc,cmv \ + -Dportal=enabled -Dtests=enabled --force-fallback-for=libplacebo \ + --buildtype=debug -Db_sanitize=undefined -Db_lundef=false diff --git a/env/msvc_build.sh b/env/msvc_build.sh index 13c4eca..bf077a9 100644 --- a/env/msvc_build.sh +++ b/env/msvc_build.sh @@ -3,10 +3,10 @@ # nix develop .#mingw64 # meson subprojects download msvc-wine # cd subprojects/msvc-wine-514f8ea/ -# ./vsdownload.py --dest ../../env/msvc-root -# ./install.sh ../../env/msvc-root +# ./vsdownload.py --dest /opt/msvc-root +# ./install.sh /opt/msvc-root -BIN=env/msvc-root/bin/x64 . subprojects/msvc-wine-514f8ea/msvcenv-native.sh +BIN=/opt/msvc-root/bin/x64 . subprojects/msvc-wine-514f8ea/msvcenv-native.sh export INCLUDE="$INCLUDE:$HOME/c/camu/subprojects/vulkan-headers-1.4.325/include" diff --git a/env/nixpkgs-patches/539430.diff b/env/nixpkgs-patches/539430.diff new file mode 100644 index 0000000..9c4ec07 --- /dev/null +++ b/env/nixpkgs-patches/539430.diff @@ -0,0 +1,81 @@ +diff --git a/pkgs/development/compilers/llvm/common/compiler-rt/default.nix b/pkgs/development/compilers/llvm/common/compiler-rt/default.nix +index 567462e3eba68..da799c93d08e0 100644 +--- a/pkgs/development/compilers/llvm/common/compiler-rt/default.nix ++++ b/pkgs/development/compilers/llvm/common/compiler-rt/default.nix +@@ -36,7 +36,8 @@ + # implementation of the routines instead of the implementation + # using ad-hoc mutexes (which doesn't depend on libc at all). + # Use of pthreads helps code play better with sanitizers. +- withAtomicsPthread ? lib.versionAtLeast release_version "19" && stdenv.cc.libc != null, ++ withAtomicsPthread ? ++ lib.versionAtLeast release_version "19" && stdenv.cc.libc != null && !stdenv.hostPlatform.isMinGW, + + # In recent releases, the compiler-rt build seems to produce + # many `libclang_rt*` libraries, but not a single unified +@@ -214,7 +215,7 @@ stdenv.mkDerivation (finalAttrs: { + # Fixes https://github.com/NixOS/nixpkgs/issues/393603 + (lib.cmakeBool "COMPILER_RT_DISABLE_AARCH64_FMV" true) + ++ lib.optionals withAtomics [ +- (lib.cmakeBool "COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN" (!withAtomicsLib)) ++ (lib.cmakeBool "COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN" withAtomicsLib) + (lib.cmakeBool "COMPILER_RT_BUILD_STANDALONE_LIBATOMIC" withAtomicsLib) + (lib.cmakeBool "COMPILER_RT_LIBATOMIC_USE_PTHREAD" withAtomicsPthread) + ] +@@ -291,11 +292,21 @@ stdenv.mkDerivation (finalAttrs: { + + lib.optionalString forceLinkCompilerRt '' + ln -s $out/lib/*/libclang_rt.builtins-*.a $out/lib/libcompiler_rt.a + '' +- + lib.optionalString (withAtomics && withAtomicsLib) '' +- ln -s $out/lib/*/libclang_rt.atomic-*.so $out/lib/libatomic.so +- # create a link with the original soname as well, so it's found at runtime +- ln -s $out/lib/*/libclang_rt.atomic-*.so $out/lib/ +- ''; ++ + lib.optionalString (withAtomics && withAtomicsLib) ( ++ let ++ isMinGW = stdenv.hostPlatform.isMinGW; ++ sharedLibrary = stdenv.hostPlatform.extensions.sharedLibrary; ++ linkLibrarySuffix = lib.optionalString isMinGW ".a"; ++ runtimeDirectory = if isMinGW then "$out/bin" else "$out/lib"; ++ atomicLibrary = "libclang_rt.atomic" + lib.optionalString isMinGW "_dynamic" + "-*${sharedLibrary}"; ++ in ++ '' ++ mkdir -p ${runtimeDirectory} ++ ln -s $out/lib/*/${atomicLibrary}${linkLibrarySuffix} $out/lib/libatomic${sharedLibrary}${linkLibrarySuffix} ++ # Link the original runtime name where the loader searches for shared libraries. ++ ln -s $out/lib/*/${atomicLibrary} ${runtimeDirectory}/ ++ '' ++ ); + + meta = llvm_meta // { + homepage = "https://compiler-rt.llvm.org/"; +diff --git a/pkgs/development/compilers/llvm/common/default.nix b/pkgs/development/compilers/llvm/common/default.nix +index af2e39dced099..9afc972ce7c31 100644 +--- a/pkgs/development/compilers/llvm/common/default.nix ++++ b/pkgs/development/compilers/llvm/common/default.nix +@@ -308,9 +308,11 @@ makeScopeWithSplicing' { + && stdenv.targetPlatform.useLLVM or false + ) "-lunwind" + ++ lib.optional stdenv.targetPlatform.isWasm "-fno-exceptions"; +- nixSupport.cc-ldflags = lib.optionals ( +- !stdenv.targetPlatform.isWasm && !stdenv.targetPlatform.isFreeBSD +- ) [ "-L${targetLlvmPackages.libunwind}/lib" ]; ++ nixSupport.cc-ldflags = ++ lib.optionals (!stdenv.targetPlatform.isWasm && !stdenv.targetPlatform.isFreeBSD) [ ++ "-L${targetLlvmPackages.libunwind}/lib" ++ ] ++ ++ lib.optional stdenv.targetPlatform.isMinGW "-L${targetLlvmPackages.compiler-rt}/lib"; + }; + + clangWithLibcAndBasicRtAndLibcxx = wrapCCWith rec { +@@ -424,6 +426,11 @@ makeScopeWithSplicing' { + + compiler-rt-no-libc = callPackage ./compiler-rt { + doFakeLibgcc = stdenv.hostPlatform.useLLVM or false; ++ # This runtime is used to bootstrap the libc-capable toolchain. Keep ++ # atomics in builtins.a until that toolchain can link the shared atomic ++ # runtime against libc (and pthreads, when enabled). ++ withAtomicsLib = false; ++ withAtomicsPthread = false; + stdenv = + # Darwin needs to use a bootstrap stdenv to avoid an infinite recursion when cross-compiling. + if stdenv.hostPlatform.isDarwin then diff --git a/flake.lock b/flake.lock index fcc10a7..d9d541a 100644 --- a/flake.lock +++ b/flake.lock @@ -41,11 +41,11 @@ ] }, "locked": { - "lastModified": 1783358420, - "narHash": "sha256-UEyBpf+XmQe8laXfDzIlo11Er7E0rKrLS8jeMnMj0Ds=", + "lastModified": 1787540599, + "narHash": "sha256-MHwk52ty3NsLhq9a1IbIfBJZlCUJIdiUYFo52JLK9hY=", "owner": "nix-community", "repo": "home-manager", - "rev": "0d33882bd46c1f9ef62276700f5e5f2bd6ff6604", + "rev": "03f4cd46bc1dd4f3a96da778d2ce9f7ce39dd450", "type": "github" }, "original": { @@ -79,11 +79,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1782562157, - "narHash": "sha256-a7+T6QSeowynwZ1ZJJbP8T8ntAytvrui8kFGJmIZt2c=", + "lastModified": 1787144466, + "narHash": "sha256-HHfv2/HkNSKbbSyU9iD/g8lbP6r4tl33sSw1W4rXCk0=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "a9cf7546a938c737b079e738de73934a13de9784", + "rev": "0471accf8d0a8210b31d947497d179ecc99e0021", "type": "github" }, "original": { @@ -99,11 +99,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1783336371, - "narHash": "sha256-ZisTtweyb7JUwPP54HAXE9TypT8m89dIxDI36Ak0hAs=", + "lastModified": 1784642409, + "narHash": "sha256-hcbDqFuySAJawljt5r0sKBCJKYnbtGD0T/ZIozH1Dq0=", "owner": "nix-community", "repo": "NixOS-WSL", - "rev": "a9620cfa43f0c1c30a46c31ae3c6e58cdb124a14", + "rev": "eaeb18da90024448a60eb1ec7132eafa4003404e", "type": "github" }, "original": { @@ -143,11 +143,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1780243769, - "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=", + "lastModified": 1783776592, + "narHash": "sha256-UgCQzxeWI75XM8G+hPrPh+MKzEPjG3SpAj7dtqSbksA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c", + "rev": "e7a3ca8092b61ff85b6a45bf863ea2b2d6a661b3", "type": "github" }, "original": { @@ -159,11 +159,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1783224372, - "narHash": "sha256-8i/87eeoqiGE4yOTjwSA3Eh/ziJRQEmd/unYU+K27sk=", + "lastModified": 1787498568, + "narHash": "sha256-9i/VTdusq/+NM/tz+J1Re+ojkMB8MBf0QshnYfzHz30=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "d407951447dcd00442e97087bf374aad70c04cea", + "rev": "56c02bc00adcf003215cc4bd996d6efaf4cff188", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 8caf0fa..fc793c4 100644 --- a/flake.nix +++ b/flake.nix @@ -69,7 +69,9 @@ function (import (nixpkgs.legacyPackages.${system}.applyPatches { src = nixpkgs; name = "nixpkgs-camu"; - patches = [ ]; + patches = [ + ./env/nixpkgs-patches/539430.diff + ]; }) { inherit system; inherit overlays; @@ -227,7 +229,22 @@ ''; }); - devShells = forAllDevSystems (pkgs: rec { + devShells = forAllDevSystems (pkgs: let + mingw-deps = crossPkgs: with crossPkgs; [ + ((buildWithFlags zlib "-Os").override { shared = false; }) + ((buildWithFlags bzip2 "-Os").override { enableStatic = true; enableShared = false; }) + ((buildWithFlags soxr "-Os").overrideAttrs (oldAttrs: { + cmakeFlags = oldAttrs.cmakeFlags ++ [ "-DBUILD_STATIC_LIBS=ON" "-DBUILD_SHARED_LIBS=OFF" ]; + })) + ((buildWithFlags dav1d "-Os").overrideAttrs (oldAttrs: { + mesonFlags = oldAttrs.mesonFlags ++ [ "--default-library=static" ]; + })) + ((buildWithFlags openssl "-Os").override { static = true; }) + (buildWithFlags xxhash "-Os") + ((buildWithFlags libiconv "-Os").override { enableStatic = true; enableShared = false; }) + vulkan-headers + ]; + in rec { default = with pkgs; mkShell rec { NIX_HARDENING_ENABLE = ""; nativeBuildInputs = packages.${stdenv.hostPlatform.system}.default.nativeBuildInputs ++ [ @@ -245,7 +262,8 @@ #pandoc #emscripten #makemkv - mesa-demos + #mesa-demos + vulkan-validation-layers # mesa build #buildPackages.mesa.cross_tools #mesa.depsBuildBuild @@ -325,20 +343,22 @@ }; mingw64 = with pkgs; let - gcc = pkgsCross.ucrt64.buildPackages.wrapCCWith { - cc = (pkgsCross.ucrt64.buildPackages.gcc.cc.override ({ + crossPkgs = pkgsCross.ucrt64; + gcc = crossPkgs.buildPackages.wrapCCWith { + cc = (crossPkgs.buildPackages.gcc.cc.override ({ + # @TODO: gcc 16 native tls. + # https://github.com/msys2/MINGW-packages/issues/29272 threadsCross = { model = "win32"; package = null; }; })); }; - gccWin32Stdenv = overrideCC pkgsCross.ucrt64.stdenv gcc; - in mkShell.override { stdenv = gccWin32Stdenv; } { + gccWin32Stdenv = overrideCC crossPkgs.stdenv gcc; + in crossPkgs.mkShell.override { stdenv = gccWin32Stdenv; } { # Note that `cc` has to invoke a native compiler not a cross compiler. # If meson complains that a compiler for the "build machine" is not found, # it may be due to NIX_COMPILE_FLAGS, or NIX_LDFLAGS. NIX_HARDENING_ENABLE = ""; nativeBuildInputs = [ git - buildPackages.gcc nasm pkg-config autoconf @@ -374,41 +394,53 @@ # vkd3d-proton build glslang ]; - buildInputs = with pkgsCross.ucrt64; [ - (zlib.override { shared = false; }) - (bzip2.override { enableStatic = true; enableShared = false; }) - (soxr.overrideAttrs (oldAttrs: { - cmakeFlags = oldAttrs.cmakeFlags ++ [ "-DBUILD_STATIC_LIBS=ON" "-DBUILD_SHARED_LIBS=OFF" ]; - })) - (dav1d.overrideAttrs (oldAttrs: { - mesonFlags = oldAttrs.mesonFlags ++ [ "--default-library=static" ]; - })) - (openssl.override { static = true; }) - xxhash - (libiconv.override { enableStatic = true; enableShared = false; }) - vulkan-headers - #(shaderc.overrideAttrs (oldAttrs: { - # cmakeFlags = oldAttrs.cmakeFlags ++ [ "-DBUILD_STATIC_LIBS=ON" "-DBUILD_SHARED_LIBS=OFF" ]; - #})) - ]; + buildInputs = mingw-deps pkgsStatic.pkgsCross.ucrt64; # https://old.reddit.com/r/NixOS/comments/1c4lc1n/how_to_run_this_minimal_python_script_with/kzpao62/ shellHook = '' export SHELL="${pkgs.bashInteractive}/bin/bash" - # For native compiler. - export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${pkgs.stdenv.cc.cc.lib}/lib" export XDG_DATA_DIRS="${pkgs.mesa}/share:$XDG_DATA_DIRS" # Using x86_64-w64-mingw32-ar (as opposed to x86_64-w64-mingw32-gcc-ar) breaks lto. unset AR NM #alias wine="${pkgs.nixgl.nixGLIntel}/bin/nixGLIntel wine" # Silence Wine logging and enable Esync by default. export WINEDEBUG=-all - export WINEESYNC=1 export NIX_BUILD_SHELL=$SHELL export NIX_SHELL="camu-mingw64" export PS1="(\$NIX_SHELL)"$PS1 ''; }; + mingw64-clang = with pkgs; let + crossPkgs = pkgsCross.ucrt64.pkgsLLVM; + clang = crossPkgs.buildPackages.wrapCCWith { + cc = crossPkgs.buildPackages.llvmPackages.clang; + bintools = crossPkgs.buildPackages.llvmPackages.bintools; + libcxx = crossPkgs.llvmPackages.libcxx; + }; + clangWin32Stdenv = overrideCC crossPkgs.llvmPackages.libcxxStdenv clang; + #clang = crossPkgs.buildPackages.wrapCCWith { + # cc = crossPkgs.buildPackages.llvmPackages.clangUseLLVM; + # bintools = crossPkgs.buildPackages.llvmPackages.bintools; + # libc = crossPkgs.buildPackages.llvmPackages.bintools.libc; + # libcxx = crossPkgs.buildPackages.llvmPackages.libcxx; + #}; + #clangWin32Stdenv = crossPkgs.overrideCC (crossPkgs.llvmPackages.libcxxStdenv.override { + # targetPlatform.useLLVM = true; + #}) clang; + in crossPkgs.mkShell.override { stdenv = clangWin32Stdenv; } { + nativeBuildInputs = mingw64.nativeBuildInputs; + buildInputs = mingw-deps pkgsStatic.pkgsCross.ucrt64; + shellHook = '' + export SHELL="${pkgs.bashInteractive}/bin/bash" + unset AR NM + alias wine="${pkgs.nixgl.nixGLIntel}/bin/nixGLIntel wine" + export WINEDEBUG=-all + export NIX_BUILD_SHELL=$SHELL + export NIX_SHELL="camu-mingw64-clang" + export PS1="(\$NIX_SHELL)"$PS1 + ''; + }; + mingw32 = with pkgs; let gcc = pkgsCross.mingw32.buildPackages.wrapCCWith { cc = (pkgsCross.mingw32.buildPackages.gcc-unwrapped.override (old: { @@ -419,23 +451,12 @@ in mkShell.override { stdenv = gccWin32Stdenv; } { NIX_HARDENING_ENABLE = ""; nativeBuildInputs = mingw64.nativeBuildInputs; - buildInputs = with pkgsCross.mingw32; [ - (buildWithFlags (zlib.override { shared = false; }) "-Os") - ((buildWithFlags bzip2 "-Os").override { enableStatic = true; enableShared = false; }) - ((buildWithFlags soxr "-Os").overrideAttrs (oldAttrs: { - cmakeFlags = oldAttrs.cmakeFlags ++ [ "-DBUILD_STATIC_LIBS=ON" "-DBUILD_SHARED_LIBS=OFF" ]; - })) - ((buildWithFlags openssl "-Os").override { static = true; }) - (buildWithFlags xxhash "-Os") - ((buildWithFlags libiconv "-Os").override { enableStatic = true; enableShared = false; }) - vulkan-headers - ]; + buildInputs = mingw-deps pkgsStatic.pkgsCross.mingw32; shellHook = '' export SHELL="${pkgs.bashInteractive}/bin/bash" - export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${pkgs.stdenv.cc.cc.lib}/lib" + unset AR NM alias wine="${pkgs.nixgl.nixGLIntel}/bin/nixGLIntel wine" export WINEDEBUG=-all - export WINEESYNC=1 export NIX_BUILD_SHELL=$SHELL export NIX_SHELL="camu-mingw32" export PS1="(\$NIX_SHELL)"$PS1 @@ -447,7 +468,7 @@ androidComposition = androidenv.composeAndroidPackages { cmdLineToolsVersion = "19.0"; toolsVersion = "26.1.1"; - platformToolsVersion = "36.0.2"; + platformToolsVersion = "37.0.1"; buildToolsVersions = [ "36.1.0" ]; includeEmulator = false; emulatorVersion = "35.2.5"; @@ -459,7 +480,7 @@ cmakeVersions = [ cmakeVersion ]; includeNDK = true; # latest = 28.0.13004108, _counted_by conflict. - ndkVersion = "23.2.8568313"; + ndkVersion = "29.0.14206865"; useGoogleAPIs = false; useGoogleTVAddOns = false; includeExtras = [ "extras;google;gcm" ]; diff --git a/meson.build b/meson.build index e817842..2126ef2 100644 --- a/meson.build +++ b/meson.build @@ -8,7 +8,6 @@ project('camu', ['c', 'cpp'], # Marking cpp here is required for subproject cros add_languages('c', 'cpp', native: true) compiler = meson.get_compiler('c') -cmake = import('cmake') is_debug = get_option('debug') is_minsize = get_option('optimization') == 's' @@ -16,33 +15,85 @@ is_linux = host_machine.system() == 'linux' is_windows = host_machine.system() == 'windows' is_msvc = compiler.get_id() == 'msvc' or compiler.get_id() == 'clang-cl' is_android = host_machine.system() == 'android' +is_static_shared_lib = is_android + +cmake = import('cmake') +cmake_reltype = is_minsize ? 'MinSizeRel' : 'Release' + +need_server = get_option('server').enabled() +need_client = get_option('client').enabled() +need_sink = get_option('sink').enabled() +no_video = get_option('sink-no-video') +if 'cmsrv' in get_option('fruits') + if get_option('server').disabled() + error('cmsrv requires the server component.') + endif + need_server = true +endif +if 'cmc' in get_option('fruits') + if get_option('client').disabled() + error('cmc requires the client component.') + endif + need_client = true +endif +if 'cmv' in get_option('fruits') + if get_option('sink').disabled() + error('cmv requires the sink component.') + endif + if not get_option('sink-only') + if get_option('server').disabled() + error('cmv requires the server component unless in a sink-only configuration.') + endif + need_server = true + endif + need_sink = true +endif alabaster = subproject('libalabaster') naunet_opts = [] +if need_server and 'http' in get_option('sources') + naunet_opts += ['curl=enabled'] +endif if get_option('portal').enabled() - naunet_opts += ['json=enabled', 'curl=enabled'] + naunet_opts += ['json=enabled'] endif naunet = subproject('libnaunet', default_options: naunet_opts) naunet_has_curl = naunet.get_variable('naunet_has_curl') naunet_has_mmap = naunet.get_variable('naunet_has_mmap') common_deps = [alabaster.get_variable('alabaster'), naunet.get_variable('naunet')] -no_video = meson.is_subproject() -# @TODO: Does it make sense for stela to be a dependency for server-side (headless) transcode. -#if not no_video - stela_opts = ['poll=inline', 'event-buffer=false', 'pause=true', 'window=' + get_option('window')] - if get_option('renderer-api') == 'vulkan' - stela_opts += ['api=vulkan'] - elif get_option('renderer-api') == 'dx11' - stela_opts += ['api=dx11'] +window = get_option('window') +if window == 'auto' + if is_windows + window = 'win32' + elif is_android + window = 'glfm' else - stela_opts += [is_android ? 'api=gles' : 'api=gl'] - if get_option('renderer-api') == 'gl-rpi' - stela_opts += ['egl-brcm=true'] - endif + window = 'wayland' + endif +endif +renderer_api = get_option('renderer-api') +if renderer_api == 'auto' + if is_windows + renderer_api = 'dx11' + elif is_android + renderer_api = 'gl' + else + renderer_api = 'vulkan' endif - stela = subproject('stela', default_options: stela_opts).get_variable('stela') -#endif +endif +stela_opts = ['poll=inline', 'event-buffer=false', 'pause=true', 'window=' + window] +if renderer_api == 'vulkan' + stela_opts += ['api=vulkan'] +elif renderer_api == 'dx11' + stela_opts += ['api=dx11'] +elif renderer_api in ['gl', 'gl-rpi'] + stela_opts += [is_android ? 'api=gles' : 'api=gl'] + if renderer_api == 'gl-rpi' + stela_opts += ['egl-brcm=true'] + endif +endif +stela = subproject('stela', default_options: stela_opts).get_variable('stela') subdir('src/util') common_deps += [util] @@ -55,15 +106,15 @@ if get_option('portal').enabled() subdir('src/portal') endif -if get_option('server').enabled() +if need_server subdir('src/server') endif -if get_option('client').enabled() +if need_client subdir('src/libclient') endif -if get_option('sink').enabled() +if need_sink subdir('src/buffer') subdir('src/mixer') if not no_video @@ -73,7 +124,7 @@ if get_option('sink').enabled() subdir('src/libsink') endif -if not meson.is_subproject() +if get_option('fruits') != [] subdir('src/fruits') endif diff --git a/meson_options.txt b/meson_options.txt index f7d0f7d..23df945 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,21 +1,24 @@ +# Executables ("Fruits") +option('fruits', type: 'array', choices: ['cmsrv', 'cmc', 'cmv'], value: []) +# Core components +option('server', type: 'feature', value: 'auto') +option('client', type: 'feature', value: 'auto') +option('sink', type: 'feature', value: 'auto') +option('portal', type: 'feature', value: 'disabled') # Options -option('sources', type: 'array', choices: ['file', 'http', 'cdio', 'libdvd'], value: ['file', 'http']) +option('sink-only', type: 'boolean', value: false, yield: true) +option('sink-no-video', type: 'boolean', value: false) +option('sources', type: 'array', choices: ['file', 'http', 'cdio', 'libdvd'], value: ['file']) option('codecs', type: 'array', choices: ['ffmpeg', 'stb_image', 'wuffs', 'spng'], value: ['ffmpeg', 'stb_image']) option('codec-hwaccels', type: 'array', choices: ['vulkan', 'vaapi', 'mediacodec', 'd3d11va', 'dxva2'], value: [], yield: true) -option('codec-ffmpeg-version', type: 'combo', choices: ['system', '8', '7', '6', '5', '4', '3', '2'], value: 'system') +option('codec-ffmpeg-version', type: 'combo', choices: ['auto', 'system', '9', '8', '7', '6', '5', '4', '3', '2'], value: 'auto') +option('codec-stbi-use-wuffs', type: 'boolean', value: true) option('audio-backends', type: 'array', choices: ['miniaudio'], value: ['miniaudio']) option('renderer', type: 'combo', choices: ['libplacebo', 'momo'], value: 'libplacebo') -option('renderer-api', type: 'combo', choices: ['vulkan', 'dx11', 'gl', 'gl-rpi'], value: 'vulkan', yield: true) +option('renderer-api', type: 'combo', choices: ['auto', 'vulkan', 'dx11', 'gl', 'gl-rpi'], value: 'auto', yield: true) option('renderer-compiler', type: 'combo', choices: ['glslang', 'shaderc'], value: 'shaderc') option('subtitles', type: 'feature', value: 'enabled', yield: true) -option('window', type: 'combo', choices: ['wayland', 'x11', 'win32', 'glfw', 'glfm'], value: 'wayland') +option('window', type: 'combo', choices: ['auto', 'wayland', 'x11', 'win32', 'glfw', 'glfm'], value: 'auto') option('win32-compat', type: 'boolean', value: false, yield: true) option('release-asserts', type: 'boolean', value: true, yield: true) -option('tests', type: 'feature', value: 'auto', yield: true) - -# Executables ("Fruits") -option('portal', type: 'feature', value: 'disabled') -option('server', type: 'feature', value: 'enabled') -option('sink', type: 'feature', value: 'enabled') -option('sink-only', type: 'boolean', value: false, yield: true) -option('client', type: 'feature', value: 'disabled') +option('tests', type: 'feature', value: 'disabled', yield: true) diff --git a/scripts/line_count.sh b/scripts/line_count.sh index 215c7d0..83b89bb 100755 --- a/scripts/line_count.sh +++ b/scripts/line_count.sh @@ -2,15 +2,15 @@ export LC_ALL="C" find ./src ./scripts ./env -type f \ -not -path "*__pycache__*" \ - -not -path "./env/msvc-root/*" \ -not -path "./env/nixpkgs-patches/*" \ + -not -path "./src/fruits/cmv/icon.*" \ -not -path "./src/fruits/droid/*" \ -not -path "./src/portal/cpy/portal.c" \ -not -path "./src/portal/cpy/portal.h" \ -not -path "./src/portal/patches/*" \ - -not -path "./src/portal/py/.mypy_cache/*" \ -not -path "./src/portal/py/tests/*" \ -not -path "./src/portal/vendor/*" \ + -not -path "./src/render/shaders/*.glsl" \ -exec sloccount {} + #-exec sed -i 's///g' {} + diff --git a/scripts/shaderc_deps.sh b/scripts/shaderc_deps.sh index c9c793f..fb3991a 100755 --- a/scripts/shaderc_deps.sh +++ b/scripts/shaderc_deps.sh @@ -4,17 +4,18 @@ # https://github.com/google/shaderc/blob/known-good/known_good.json +git clone https://github.com/KhronosGroup/glslang.git glslang +cd glslang +git checkout 168d452a4f460d24b588fed08477a81c44ee27a1 +cd ../ + git clone https://github.com/KhronosGroup/SPIRV-Tools.git spirv-tools cd spirv-tools -git checkout c1cb30bb04e2bf911755a40df1242cc6e3d83e26 +git checkout b707790a898e44038547df54580022fc1cf89c3d +git apply ../../../packagefiles/shaderc/spirv_tools_build_version.diff cd ../ git clone https://github.com/KhronosGroup/SPIRV-Headers.git spirv-headers cd spirv-headers -git checkout ad9184e76a66b1001c29db9b0a3e87f646c64de0 -cd ../ - -git clone https://github.com/KhronosGroup/glslang.git glslang -cd glslang -git checkout 5ed4003a18a10a9d1bd7e43aaf1664499abffa83 +git checkout 29981f65241605e08b0ede4cfeb999fe3b723c6a cd ../ diff --git a/src/buffer/clock.c b/src/buffer/clock.c index 86d6739..fbe7ec5 100644 --- a/src/buffer/clock.c +++ b/src/buffer/clock.c @@ -40,6 +40,7 @@ static inline void offset_tick(struct camu_clock *clock, f64 diff) void camu_clock_set(struct camu_clock *clock, f64 base) { clock->base = base; + clock->offset = 0.0; atomic_store(f64)(&clock->tick, SET, AL_ATOMIC_RELAXED); atomic_store(f64)(&clock->pause, PAUSED, AL_ATOMIC_RELAXED); atomic_store(bool)(&clock->external_pause, false, AL_ATOMIC_RELAXED); @@ -165,7 +166,7 @@ f64 camu_clock_get_pts(struct camu_clock *clock, f64 latency, bool allow_set, bo } } - f64 pts = (clock->base - clock->offset) + (current - tick); + f64 pts = clock->base + (current - tick); bool signal_pause = false; *armed_for_pause = pause != RUNNING || atomic_load(bool)(&clock->external_pause, AL_ATOMIC_RELAXED); @@ -182,7 +183,7 @@ f64 camu_clock_get_pts(struct camu_clock *clock, f64 latency, bool allow_set, bo atomic_store(f64)(&clock->last_pts, pts, AL_ATOMIC_RELAXED); } - return signal_pause ? CAMU_PTS_SIGNAL_PAUSE : pts + latency; + return signal_pause ? CAMU_PTS_SIGNAL_PAUSE : (pts - clock->offset) + latency; } f64 camu_clock_get_last_pts(struct camu_clock *clock) diff --git a/src/cache/backings/memory.c b/src/cache/backings/memory.c index 063c1c5..ba0bb54 100644 --- a/src/cache/backings/memory.c +++ b/src/cache/backings/memory.c @@ -6,7 +6,11 @@ static void ensure_allocated(struct cch_backing_memory *mem, off_t amount) { if (amount > mem->expanse) mem->expanse = amount; if (amount > mem->alloc) { - mem->alloc = al_next_power_of_two(amount); + if (amount < MB(8)) { + mem->alloc = al_next_power_of_two(amount); + } else { + mem->alloc = amount; + } mem->data = (u8 *)al_realloc(mem->data, mem->alloc); } } diff --git a/src/cache/handlers/file.c b/src/cache/handlers/file.c index 1a70350..4ca8f47 100644 --- a/src/cache/handlers/file.c +++ b/src/cache/handlers/file.c @@ -30,11 +30,11 @@ static s32 handler_file_guess_format(struct cch_handler *handler) struct cch_backing_file *backing = (struct cch_backing_file *)file->backing; str *path = &backing->file.path; u32 dot = al_str_rfind(path, '.'); - if (dot != AL_STR_NO_POS) { - str ext = al_str_substr(path, dot, path->length); - return camu_guess_format(NULL, &ext, NULL); + if (dot == AL_STR_NO_POS) { + return CAMU_CODEC_FALLBACK; } - return -1; + str ext = al_str_substr(path, dot, path->length); + return camu_guess_format(NULL, &ext, NULL); } static void handler_file_free(struct cch_handler **handler) diff --git a/src/cache/meson.build b/src/cache/meson.build index 816b101..8243893 100644 --- a/src/cache/meson.build +++ b/src/cache/meson.build @@ -8,7 +8,8 @@ cache_deps = [] cache_args = [] if 'file' in get_option('sources') - if naunet_has_mmap + # @TODO: file mapped vs non-mapped should be selectable at runtime. + if naunet_has_mmap and not is_android cache_src += ['backings/file_mapped.c'] else cache_src += ['backings/file.c'] @@ -22,11 +23,12 @@ if 'http' in get_option('sources') and naunet_has_curl endif if 'cdio' in get_option('sources') + libcdio = dependency('libcdio', allow_fallback: true) libcdio_paranoia = dependency('libcdio_paranoia', allow_fallback: true) libcdio_cdda = dependency('libcdio_cdda', allow_fallback: true) - if libcdio_paranoia.found() and libcdio_cdda.found() + if libcdio.found() and libcdio_paranoia.found() and libcdio_cdda.found() cache_src += ['handlers/cdio.c'] - cache_deps += [libcdio_paranoia, libcdio_cdda] + cache_deps += [libcdio, libcdio_paranoia, libcdio_cdda] cache_args += ['-DCACHE_HAVE_CDIO'] endif endif diff --git a/src/codec/codec.h b/src/codec/codec.h index f1c979b..bb54b3b 100644 --- a/src/codec/codec.h +++ b/src/codec/codec.h @@ -210,7 +210,7 @@ struct camu_demuxer { bool (*seek)(struct camu_demuxer *, u64, bool); void (*free)(struct camu_demuxer **); array(struct camu_codec_stream) streams; - // @TODO: .mkv can probably have more than 64 streams. + // @TODO: .mkv (at least) can probably have more than 64 streams. u64 subscribed; }; @@ -440,7 +440,7 @@ static inline s32 camu_guess_format(str *short_name, str *ext, str *mime_type) char *c_short_name = short_name ? al_str_to_c_str(short_name) : NULL; char *c_ext = ext ? al_str_to_c_str(ext) : NULL; char *c_mime_type = mime_type ? al_str_to_c_str(mime_type) : NULL; - // Empty short_name to attempt avoiding image2 probing. + // Empty short_name to avoid image2 probing. const AVOutputFormat *fmt = av_guess_format(c_short_name ? c_short_name : "", c_ext, c_mime_type); if (c_short_name) al_free(c_short_name); if (c_ext) al_free(c_ext); @@ -448,5 +448,5 @@ static inline s32 camu_guess_format(str *short_name, str *ext, str *mime_type) // In FFmpeg AV_CODEC_ID_MJPEG also means "image2". if (fmt) return (fmt->audio_codec != AV_CODEC_ID_NONE) ? fmt->audio_codec : fmt->video_codec; #endif - return -1; + return CAMU_CODEC_FALLBACK; } diff --git a/src/codec/ffmpeg/meson.build b/src/codec/ffmpeg/meson.build index e34cc92..1691c29 100644 --- a/src/codec/ffmpeg/meson.build +++ b/src/codec/ffmpeg/meson.build @@ -19,15 +19,23 @@ foreach dep: ['ffmpeg', 'libavutil', 'libavformat', 'libavcodec', 'libavdevice', endif endforeach ffmpeg_version_option = get_option('codec-ffmpeg-version') +if ffmpeg_version_option == 'auto' + expect_system = not (is_windows or is_android) + if expect_system + ffmpeg_version_option = 'system' + else # Latest. + ffmpeg_version_option = '9' + endif +endif # Check for FFmpeg version in the environment. if not ffmpeg_force_fallback - libavutil_version_map = { '54': '2', '55': '3', '56': '4', '57': '5', '58': '6', '59': '7', '60': '8' } - libavutil_version_rev = { '2': '54', '3': '55', '4': '56', '5': '57', '6': '58', '7': '59', '8': '60' } + libavutil_version_map = { '54': '2', '55': '3', '56': '4', '57': '5', '58': '6', '59': '7', '60': '8', '61': '9' } + libavutil_version_rev = { '2': '54', '3': '55', '4': '56', '5': '57', '6': '58', '7': '59', '8': '60', '9': '61' } if ffmpeg_version_option != 'system' ffmpeg_version_int = ffmpeg_version_option.to_int() # Overriding a found dependency will error but overriding a found dependency of the wrong version is allowed. libavutil_version_request = ['>=' + libavutil_version_rev[(ffmpeg_version_int).to_string()] + '.0.0'] - if ffmpeg_version_int < 8 + if ffmpeg_version_int < 9 libavutil_version_request += ['<' + libavutil_version_rev[(ffmpeg_version_int + 1).to_string()] + '.0.0'] endif libavutil = dependency('libavutil', required: false, allow_fallback: false, version: libavutil_version_request) diff --git a/src/codec/ffmpeg/packet_ext.c b/src/codec/ffmpeg/packet_ext.c index 6934cfe..8f44caa 100644 --- a/src/codec/ffmpeg/packet_ext.c +++ b/src/codec/ffmpeg/packet_ext.c @@ -6,7 +6,9 @@ void nn_packet_write_av_codec_parameters(struct nn_packet *packet, AVCodecParame NNWT_PACKET_WRITE_TYPE(packet, enum AVCodecID, codecpar->codec_id); NNWT_PACKET_WRITE_TYPE(packet, u32, codecpar->codec_tag); NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->extradata_size); - NNWT_PACKET_WRITE_DATA(packet, codecpar->extradata, codecpar->extradata_size); + if (codecpar->extradata_size) { + NNWT_PACKET_WRITE_DATA(packet, codecpar->extradata, codecpar->extradata_size); + } NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->format); NNWT_PACKET_WRITE_TYPE(packet, s64, codecpar->bit_rate); NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->bits_per_coded_sample); @@ -118,10 +120,12 @@ void nn_packet_read_av_codec_parameters(struct nn_packet *packet, AVCodecParamet NNWT_PACKET_READ_TYPE(packet, enum AVCodecID, codecpar->codec_id); NNWT_PACKET_READ_TYPE(packet, u32, codecpar->codec_tag); NNWT_PACKET_READ_TYPE(packet, s32, codecpar->extradata_size); - codecpar->extradata = (u8 *)av_malloc(codecpar->extradata_size); - u8 *extradata; - NNWT_PACKET_READ_DATA(packet, codecpar->extradata_size, extradata); - al_memcpy(codecpar->extradata, extradata, codecpar->extradata_size); + if (codecpar->extradata_size > 0) { + codecpar->extradata = (u8 *)av_malloc(codecpar->extradata_size); + u8 *extradata; + NNWT_PACKET_READ_DATA(packet, codecpar->extradata_size, extradata); + al_memcpy(codecpar->extradata, extradata, codecpar->extradata_size); + } NNWT_PACKET_READ_TYPE(packet, s32, codecpar->format); NNWT_PACKET_READ_TYPE(packet, s64, codecpar->bit_rate); NNWT_PACKET_READ_TYPE(packet, s32, codecpar->bits_per_coded_sample); diff --git a/src/codec/meson.build b/src/codec/meson.build index a92a23d..7dfc668 100644 --- a/src/codec/meson.build +++ b/src/codec/meson.build @@ -10,12 +10,23 @@ endif if 'stb_image' in get_option('codecs') stb = [] stb_args = ['-DCAMU_HAVE_STB_IMAGE'] - if not compiler.check_header('stb/stb_image.h') - stb = [subproject('stb').get_variable('stb')] - stb_args += ['-DCAMU_LOCAL_STB'] + stb_deps = [] + if get_option('codec-stbi-use-wuffs') + stb_args += ['-DCAMU_STBI_USE_WUFFS'] + if not compiler.check_header('wuffs/wuffs-v0.4.c') + wuffs = [subproject('wuffs').get_variable('wuffs')] + stb_deps += [wuffs] + stb_args += ['-DCAMU_LOCAL_WUFFS'] + endif + else + if not compiler.check_header('stb/stb_image.h') + stb = [subproject('stb').get_variable('stb')] + stb_deps += [stb] + stb_args += ['-DCAMU_LOCAL_STB'] + endif endif stb_codec = declare_dependency(sources: ['stb_image.c'], - dependencies: stb, compile_args: stb_args) + dependencies: stb_deps, compile_args: stb_args) codec_server_deps += [stb_codec] codec_client_deps += [stb_codec] endif diff --git a/src/codec/stb_image.c b/src/codec/stb_image.c index b37d6da..39b3a13 100644 --- a/src/codec/stb_image.c +++ b/src/codec/stb_image.c @@ -1,5 +1,27 @@ #define AL_LOG_SECTION "stb_image" #include + +#ifdef CAMU_STBI_USE_WUFFS +#define WUFFS_IMPLEMENTATION +#define WUFFS_CONFIG__MODULES +#define WUFFS_CONFIG__MODULE__BASE +#define WUFFS_CONFIG__MODULE__ADLER32 +#define WUFFS_CONFIG__MODULE__DEFLATE +#define WUFFS_CONFIG__MODULE__ZLIB +#define WUFFS_CONFIG__MODULE__CRC32 +#define WUFFS_CONFIG__MODULE__PNG +#define WUFFS_CONFIG__MODULE__JPEG +#define WUFFS_CONFIG__MODULE__IMAGE +#define WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST +#define WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_Y +#define WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL +#define WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB +#ifdef CAMU_LOCAL_WUFFS +#include +#else +#include +#endif +#else #include "common.h" #define STBI_MALLOC camu_page_alloc #define STBI_FREE al_free @@ -13,6 +35,7 @@ #else #include #endif +#endif #include "stb_image.h" diff --git a/src/codec/wuffs.c b/src/codec/wuffs.c index 7050fb4..53d181b 100644 --- a/src/codec/wuffs.c +++ b/src/codec/wuffs.c @@ -1,3 +1,4 @@ +#define WUFFS_IMPLEMENTATION #define WUFFS_CONFIG__MODULES #define WUFFS_CONFIG__MODULE__BASE #define WUFFS_CONFIG__MODULE__ADLER32 @@ -7,7 +8,6 @@ #define WUFFS_CONFIG__MODULE__PNG #define WUFFS_CONFIG__MODULE__JPEG #define WUFFS_CONFIG__MODULE__IMAGE -#define WUFFS_IMPLEMENTATION #ifdef CAMU_LOCAL_WUFFS #include #else diff --git a/src/fruits/cmc/meson.build b/src/fruits/cmc/meson.build index bb9d38d..0728532 100644 --- a/src/fruits/cmc/meson.build +++ b/src/fruits/cmc/meson.build @@ -19,8 +19,9 @@ if use_tui cmc_deps += [notcurses, notcurses_core, codecs_client] endif +cmc_link_args = [] if is_windows and not is_msvc - cmc_args += ['-static', '-static-libgcc', '-static-libstdc++', '-mwindows', '-municode'] + cmc_link_args += ['-mconsole', '-municode', '-static', '-static-libgcc', '-static-libstdc++'] endif -executable('cmc', cmc_src, dependencies: cmc_deps, c_args: cmc_args, link_args: cmc_args, install: true) +executable('cmc', cmc_src, dependencies: cmc_deps, c_args: cmc_args, link_args: cmc_link_args, install: true) diff --git a/src/fruits/cmsrv/cmsrv.c b/src/fruits/cmsrv/cmsrv.c index 53fbc98..b0793d1 100644 --- a/src/fruits/cmsrv/cmsrv.c +++ b/src/fruits/cmsrv/cmsrv.c @@ -1,7 +1,9 @@ #define AL_LOG_SECTION "cmsrv" #include #include +#ifndef NAUNET_ON_WINDOWS #define CMSRV_LOCAL_SOCKET +#endif #ifdef CMSRV_LOCAL_SOCKET #include #endif diff --git a/src/fruits/cmv/cmv.c b/src/fruits/cmv/cmv.c index a525377..58c8e32 100644 --- a/src/fruits/cmv/cmv.c +++ b/src/fruits/cmv/cmv.c @@ -109,12 +109,20 @@ s32 window_system_main(u32 argc, str *argv, void *extra) { (void)extra; - bool local = argc > 1; + bool local; #ifdef CAMU_SINK_ONLY + local = argc > 1; if (local) { log_warn("Got arguments in a sink-only configuration."); return EXIT_FAILURE; } +#else + char *SINK_SERVER = getenv("SINK_SERVER"); + if (SINK_SERVER && al_strscmp(SINK_SERVER, "1") == 0) { + local = true; + } else { + local = argc > 1; + } #endif #ifdef CAMU_HAVE_FFMPEG @@ -177,14 +185,7 @@ s32 window_system_main(u32 argc, str *argv, void *extra) } #endif - char *home_env = getenv("HOME"); - if (home_env) { - str color_palette; - al_str_from(&color_palette, home_env); - al_str_cat(&color_palette, &al_str_c("/.config/colors.json")); - camu_colors_maybe_init(&color_palette); - al_str_free(&color_palette); - } + camu_colors_default_init(); str window_name; al_str_from(&window_name, "Sink ("); diff --git a/src/fruits/meson.build b/src/fruits/meson.build index f53a653..b152990 100644 --- a/src/fruits/meson.build +++ b/src/fruits/meson.build @@ -1,6 +1,6 @@ -use_tuis = not is_windows - -if use_tuis and (get_option('server').enabled() or get_option('client').enabled()) +use_tuis = not is_windows and not is_android +use_tuis = use_tuis and ('cmsrv' in get_option('fruits') or 'cmc' in get_option('fruits')) +if use_tuis notcurses = dependency('notcurses', required: false, allow_fallback: false) notcurses_core = dependency('notcurses-core', required: false, allow_fallback: false) if not notcurses.found() or not notcurses_core.found() @@ -26,18 +26,6 @@ if use_tuis and (get_option('server').enabled() or get_option('client').enabled( endif endif -if get_option('server').enabled() - subdir('cmsrv') -endif - -if get_option('client').enabled() - subdir('cmc') -endif - -if get_option('sink').enabled() - if is_android - subdir('ctv') - else - subdir('cmv') - endif -endif +foreach fruit : get_option('fruits') + subdir(fruit) +endforeach diff --git a/src/liana/handlers/codec_client.c b/src/liana/handlers/codec_client.c index c3dded1..5c8e94d 100644 --- a/src/liana/handlers/codec_client.c +++ b/src/liana/handlers/codec_client.c @@ -84,7 +84,7 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc } // Push packet. - u32 rindex = packet->rindex; + const u32 rindex = packet->rindex; bool success; u8 mode = nn_packet_read_u8(packet); // @TODO: default: shouldn't be a case. We should check for an invalid packet. @@ -138,7 +138,7 @@ static bool codec_client_handle_packet(struct lia_client_handler *handler, struc al_assert_and_return(false); } - // Restore packet rindex in case we resue it. + // Restore packet rindex in case we reuse it. packet->rindex = rindex; if (!success) { diff --git a/src/liana/handlers/codec_server.c b/src/liana/handlers/codec_server.c index a7fc587..31fbef8 100644 --- a/src/liana/handlers/codec_server.c +++ b/src/liana/handlers/codec_server.c @@ -17,6 +17,7 @@ static bool codec_server_init(struct lia_server_handler *handler, struct cch_han codec->demux = NULL; codec->codec_info = camu_codec_info_by_type(cch_entry_guess_format(handle->entry)); if (!codec->codec_info) { + log_warn("No codec for this format."); return false; } log_info("Selected demuxer: %.*s.", al_str_x(&codec->codec_info->name)); diff --git a/src/portal/src/search.c b/src/portal/src/search.c index d442d94..7af4bea 100644 --- a/src/portal/src/search.c +++ b/src/portal/src/search.c @@ -3,6 +3,8 @@ #include "../../server/common.h" +#undef _XOPEN_SOURCE +#undef _POSIX_C_SOURCE #include "../cpy/portal.c" #include "search.h" @@ -174,6 +176,7 @@ static void results_signal_callback(void *userdata) } // @TODO: Fully defer init. +// - And fix init() -> (no close()) -> free() complications. void camu_portal_init(struct camu_portal_bridge *bridge, struct camu_post_cache *cache, struct nn_event_loop *loop, void *userdata) { diff --git a/src/render/meson.build b/src/render/meson.build index d342312..ee0017a 100644 --- a/src/render/meson.build +++ b/src/render/meson.build @@ -23,15 +23,11 @@ elif get_option('renderer') == 'libplacebo' 'xxhash=auto' ] - if get_option('renderer-api') == 'vulkan' or get_option('renderer-api') == 'dx11' + if renderer_api == 'vulkan' or renderer_api == 'dx11' if get_option('renderer-compiler') == 'shaderc' shaderc_found = false if 'shaderc' not in get_option('force_fallback_for') and get_option('wrap_mode') != 'forcefallback' - if is_windows - shaderc = dependency('shaderc_combined', required: false, allow_fallback: false) - else - shaderc = dependency('shaderc', required: false, allow_fallback: false) - endif + shaderc = dependency('shaderc', required: false, allow_fallback: false) shaderc_found = shaderc.found() endif if shaderc_found @@ -39,30 +35,35 @@ elif get_option('renderer') == 'libplacebo' else shaderc_opts = cmake.subproject_options() shaderc_opts.set_override_option('warning_level', '0') # Doesn't work. - reltype = is_minsize ? 'MinSizeRel' : 'Release' - shaderc_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype }) + shaderc_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_reltype }) + shaderc_opts.add_cmake_defines({ 'BUILD_SHARED_LIBS': false }) shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_INSTALL': true }) shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_TESTS': true }) shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_EXAMPLES': true }) shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_COPYRIGHT_CHECK': true }) + shaderc_opts.add_cmake_defines({ 'SHADERC_ENABLE_HLSL': false }) + # glslang & spirv-tools + shaderc_opts.add_cmake_defines({ 'ENABLE_RTTI': false }) # glslang shaderc_opts.add_cmake_defines({ 'ENABLE_GLSLANG_BINARIES': false }) + shaderc_opts.add_cmake_defines({ 'ENABLE_GLSLANG_JS': false }) shaderc_opts.add_cmake_defines({ 'ENABLE_HLSL': false }) - shaderc_opts.add_cmake_defines({ 'ENABLE_SPVREMAPPER': false }) shaderc_opts.add_cmake_defines({ 'ENABLE_EXCEPTIONS': false }) spirv_optimizer = true shaderc_opts.add_cmake_defines({ 'ENABLE_OPT': spirv_optimizer }) # spirv-tools + shaderc_opts.add_cmake_defines({ 'SPIRV_ALLOW_TIMERS': false }) + shaderc_opts.add_cmake_defines({ 'SPIRV_COLOR_TERMINAL': false }) shaderc_opts.add_cmake_defines({ 'ENABLE_EXCEPTIONS_ON_MSVC': false }) shaderc_proj = cmake.subproject('shaderc', options: shaderc_opts) shaderc = shaderc_proj.dependency('shaderc') meson.override_dependency('shaderc', declare_dependency(dependencies: shaderc, version: '2026.2')) render_deps += [ shaderc_proj.dependency('shaderc_util'), - shaderc_proj.dependency('glslang'), shaderc_proj.dependency('MachineIndependent'), shaderc_proj.dependency('OSDependent'), shaderc_proj.dependency('GenericCodeGen'), + shaderc_proj.dependency('glslang'), shaderc_proj.dependency('SPIRV'), shaderc_proj.dependency('SPIRV-Tools-static') ] @@ -72,17 +73,21 @@ elif get_option('renderer') == 'libplacebo' endif libplacebo_opts += ['shaderc=enabled', 'glslang=disabled'] else - glslang = dependency('glslang', required: false, allow_fallback: false) - if glslang.found() + glslang_found = false + if 'glslang' not in get_option('force_fallback_for') and get_option('wrap_mode') != 'forcefallback' + glslang = dependency('glslang', required: false, allow_fallback: false) + glslang_found = glslang.found() + endif + if glslang_found render_deps += [glslang] else # Currently does not build. - prefer_static = get_option('prefer_static') + spirv_headers_proj = cmake.subproject('SPIRV-Headers') + spirv_headers = spirv_headers_proj.dependency('SPIRV-Headers') spirv_optimizer = false if spirv_optimizer - spirv_headers_proj = cmake.subproject('SPIRV-Headers') - spirv_headers = spirv_headers_proj.dependency('SPIRV-Headers') spirv_tools_opts = cmake.subproject_options() + spirv_tools_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_reltype }) spirv_tools_opts.add_cmake_defines({ 'SPIRV-Headers_SOURCE_DIR': meson.source_root() + '/subprojects/SPIRV-Headers-b824a46' }) spirv_tools_opts.add_cmake_defines({ 'ENABLE_EXCEPTIONS_ON_MSVC': false }) spirv_tools_proj = cmake.subproject('SPIRV-Tools', options: spirv_tools_opts) @@ -91,8 +96,7 @@ elif get_option('renderer') == 'libplacebo' endif glslang_opts = cmake.subproject_options() glslang_opts.set_override_option('warning_level', '0') - reltype = is_minsize ? 'MinSizeRel' : 'Release' - glslang_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype }) + glslang_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_reltype }) glslang_opts.add_cmake_defines({ 'ENABLE_GLSLANG_BINARIES': false }) glslang_opts.add_cmake_defines({ 'ENABLE_HLSL': false }) glslang_opts.add_cmake_defines({ 'ENABLE_SPVREMAPPER': false }) @@ -100,24 +104,25 @@ elif get_option('renderer') == 'libplacebo' glslang_opts.add_cmake_defines({ 'ENABLE_OPT': spirv_optimizer }) glslang_opts.add_cmake_defines({ 'ALLOW_EXTERNAL_SPIRV_TOOLS': spirv_optimizer }) glslang_proj = cmake.subproject('glslang', options: glslang_opts) - spirv = glslang_proj.dependency('SPIRV') glslang = glslang_proj.dependency('glslang') glslang_default_resource_limits = glslang_proj.dependency('glslang-default-resource-limits') - meson.override_dependency('SPIRV', spirv, static: prefer_static) + spirv = glslang_proj.dependency('SPIRV') + prefer_static = get_option('prefer_static') meson.override_dependency('glslang', glslang, static: prefer_static) meson.override_dependency('glslang-default-resource-limits', glslang_default_resource_limits, static: prefer_static) + meson.override_dependency('SPIRV', spirv, static: prefer_static) render_deps += [ glslang_proj.dependency('MachineIndependent'), glslang_proj.dependency('OSDependent'), glslang_proj.dependency('GenericCodeGen'), - spirv, glslang, - glslang_default_resource_limits + glslang_default_resource_limits, + spirv, + spirv_headers ] if spirv_optimizer render_deps += [ spirv_tools, - spirv_headers, spirv_tools_opt ] endif @@ -128,12 +133,11 @@ elif get_option('renderer') == 'libplacebo' libplacebo_opts += ['glslang=disabled', 'shaderc=disabled'] endif - if get_option('renderer-api') == 'vulkan' + if renderer_api == 'vulkan' libplacebo_opts += ['vulkan=enabled', 'd3d11=disabled', 'opengl=disabled'] - elif get_option('renderer-api') == 'dx11' + elif renderer_api == 'dx11' spirv_cross_opts = cmake.subproject_options() - reltype = is_minsize ? 'MinSizeRel' : 'Release' - spirv_cross_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype }) + spirv_cross_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_reltype }) spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_CLI': false }) spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_TESTS': false }) spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_MSL': false }) diff --git a/src/render/shaders/vr_video.h b/src/render/shaders/vr_video.h index c892601..2dc54bd 100644 --- a/src/render/shaders/vr_video.h +++ b/src/render/shaders/vr_video.h @@ -33,18 +33,18 @@ static char vr_video_shader[] = \ "vec4 hook() {" " float yaw = M_PI*mouse_x;" " float pitch = M_PI*(-0.5+mouse_y);" -" float roll = M_PI*0.0;" -" float t = tan(fov/2.0);" +" float roll = M_PI*0.;" +" float t = tan(fov/2.);" " float c = cos(pitch);" " float s = sin(pitch);" " float r = target_size.y/target_size.x;" " float sR = sin(roll);" " float cR = cos(roll);" -" mat3 m = mat3(2.0*t*cR, 2.0*sR*t*r, -t*(cR+sR*r), -2.0*sR*t*c, 2.0*cR*t*c*r, t*c*(sR-cR*r)-s, -2.0*sR*t*s, 2.0*cR*t*s*r, t*s*(sR-cR*r)+c);" -" vec3 p = vec3(HOOKED_pos, 1.0)*m;" -" float theta = atan(p.x, p.z)+yaw;" -" float phi = atan(p.y, length(p.xz))+M_PI/2.0;" -" float x = fract(theta/(2.0*M_PI));" +" mat3 m = mat3(2.*t*cR,2.*sR*t*r,-t*(cR+sR*r),-2.*sR*t*c,2.*cR*t*c*r,t*c*(sR-cR*r)-s,-2.*sR*t*s,2.*cR*t*s*r,t*s*(sR-cR*r)+c);" +" vec3 p = vec3(HOOKED_pos,1.)*m;" +" float theta = atan(p.x,p.z)+yaw;" +" float phi = atan(p.y,length(p.xz))+M_PI/2.;" +" float x = fract(theta/(2.*M_PI));" " float y = phi/M_PI;" // Range: [M_PI, 2.0*M_PI] = Right eye 180 degrees. float(max(theta, mode-1.0) > 0.0) = Always true except mode = 0.0 and theta < 0.0. -" return HOOKED_tex(vec2(x, y))*clamp(abs((1.0-mode)-(step(M_PI, theta)-step(2.0*M_PI, theta)))*float(max(theta, mode-1.0)>=0.0), 0.0, 1.0);" +" return HOOKED_tex(vec2(x,y))*clamp(abs((1.-mode)-(step(M_PI,theta)-step(2.*M_PI,theta)))*float(max(theta,mode-1.)>=0.),0.,1.);" "}"; diff --git a/src/server/server.c b/src/server/server.c index 41633d2..c547b5d 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -862,7 +862,7 @@ static bool multiplex_callback(void *userdata, u8 id, struct nn_packet_stream *s void camu_server_init(struct camu_server *server, struct nn_event_loop *loop) { server->loop = loop; - server->addr = al_str_null(); + server->addr = AL_STR_EMPTY; al_array_init(server->users); al_array_init(server->nodes); al_array_init(server->clients); diff --git a/src/util/color_palette.h b/src/util/color_palette.h index 7330135..b0cc9f4 100644 --- a/src/util/color_palette.h +++ b/src/util/color_palette.h @@ -2,6 +2,7 @@ #include #include +#include enum { CAMU_COLOR_BACKGROUND = 0, @@ -33,3 +34,16 @@ struct camu_color_palette { extern struct camu_color_palette global_color_palette; bool camu_colors_maybe_init(str *path); + +static inline void camu_colors_default_init() +{ + char *home_env = getenv("HOME"); + if (home_env) { + str color_palette; + al_str_from(&color_palette, home_env); + nn_path_append(&color_palette, &al_str_c(".config")); + nn_path_append(&color_palette, &al_str_c("colors.json")); + camu_colors_maybe_init(&color_palette); + al_str_free(&color_palette); + } +} diff --git a/src/util/meson.build b/src/util/meson.build index c2c3c3d..2da5b08 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -4,9 +4,8 @@ if get_option('portal').enabled() blake3 = dependency('libblake3', required: false, allow_fallback: false) if not blake3.found() blake3_opts = cmake.subproject_options() - reltype = is_minsize ? 'MinSizeRel' : 'Release' - blake3_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype }) - blake3_opts.add_cmake_defines({ 'CMAKE_POSITION_INDEPENDENT_CODE': true }) + blake3_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : cmake_reltype }) + blake3_opts.add_cmake_defines({ 'CMAKE_POSITION_INDEPENDENT_CODE': is_static_shared_lib }) blake3 = cmake.subproject('BLAKE3', options: blake3_opts).dependency('blake3') endif util_deps += [blake3] diff --git a/subprojects/SPIRV-Tools.wrap b/subprojects/SPIRV-Tools.wrap index 1586b61..347a62d 100644 --- a/subprojects/SPIRV-Tools.wrap +++ b/subprojects/SPIRV-Tools.wrap @@ -1,6 +1,6 @@ [wrap-git] -directory = SPIRV-Tools-v2025.4 +directory = SPIRV-Tools-v2026.2 url = https://github.com/KhronosGroup/SPIRV-Tools.git -revision = v2025.4 +revision = v2026.2 depth = 1 method = cmake diff --git a/subprojects/ffmpeg9.wrap b/subprojects/ffmpeg9.wrap new file mode 100644 index 0000000..313d731 --- /dev/null +++ b/subprojects/ffmpeg9.wrap @@ -0,0 +1,8 @@ +[wrap-file] +directory = ffmpeg-9.0.1 +source_url = https://ffmpeg.org/releases/ffmpeg-9.0.1.tar.gz +source_filename = ffmpeg-9.0.1.tar.gz +source_hash = 657dbf258cce6c0681714b6e40b8ca69e988c67ecfc2f7aab47574e6ebaceb38 + +patch_directory = ffmpeg +diff_files = ffmpeg/version_9.0.1.diff diff --git a/subprojects/glslang.wrap b/subprojects/glslang.wrap index e06e2f6..ef7a4dc 100644 --- a/subprojects/glslang.wrap +++ b/subprojects/glslang.wrap @@ -1,6 +1,6 @@ [wrap-git] -directory = glslang-16.0.0 +directory = glslang-16.4.0 url = https://github.com/KhronosGroup/glslang.git -revision = 16.0.0 +revision = 16.4.0 depth = 1 method = cmake diff --git a/subprojects/harfbuzz.wrap b/subprojects/harfbuzz.wrap index 5d721b0..a497a7d 100644 --- a/subprojects/harfbuzz.wrap +++ b/subprojects/harfbuzz.wrap @@ -1,7 +1,7 @@ [wrap-git] -directory = harfbuzz-14.2.1 +directory = harfbuzz-14.3.1 url = https://github.com/harfbuzz/harfbuzz.git -revision = 14.2.1 +revision = 14.3.1 depth = 1 patch_directory = harfbuzz diff_files = harfbuzz/no_bigobj_windows.diff diff --git a/subprojects/libalabaster.wrap b/subprojects/libalabaster.wrap index 7a55d18..f2c94fd 100644 --- a/subprojects/libalabaster.wrap +++ b/subprojects/libalabaster.wrap @@ -1,5 +1,5 @@ [wrap-git] -directory = libalabaster-c633226 +directory = libalabaster-b617e3c url = https://git.akon.city/libalabaster.git push-url = git@git.akon.city:libalabaster.git -revision = c633226d2b615f46ef38cc99603775dccdf96ecd +revision = b617e3ccb25a0ac3c22f8c02722c8108b2f78d6e diff --git a/subprojects/libcdio-paranoia.wrap b/subprojects/libcdio-paranoia.wrap index c271d48..b408b0f 100644 --- a/subprojects/libcdio-paranoia.wrap +++ b/subprojects/libcdio-paranoia.wrap @@ -1,7 +1,7 @@ [wrap-git] -directory = libcdio-paranoia-717f126 -url = https://github.com/rocky/libcdio-paranoia.git -revision = 717f1263910695e8bc66ad33d08a61ff572c0691 +directory = libcdio-paranoia-384f4da +url = https://github.com/libcdio/libcdio-paranoia.git +revision = 384f4dac7e211cce67a14f3df53fc596965b6c94 depth = 1 patch_directory = libcdio-paranoia diff --git a/subprojects/libnaunet.wrap b/subprojects/libnaunet.wrap index 25cdba2..df8ee63 100644 --- a/subprojects/libnaunet.wrap +++ b/subprojects/libnaunet.wrap @@ -1,5 +1,5 @@ [wrap-git] -directory = libnaunet-a389b8f +directory = libnaunet-3a51988 url = https://git.akon.city/libnaunet.git push-url = git@git.akon.city:libnaunet.git -revision = a389b8f2f9c55b76fe5a28c3f1fea798ed37aa98 +revision = 3a51988d764d54723288dc31a1779ece44cac1e9 diff --git a/subprojects/libplacebo.wrap b/subprojects/libplacebo.wrap index a16dd82..e960982 100644 --- a/subprojects/libplacebo.wrap +++ b/subprojects/libplacebo.wrap @@ -1,7 +1,7 @@ [wrap-git] -directory = libplacebo-05ac2cc +directory = libplacebo-22ee762 url = https://code.videolan.org/videolan/libplacebo.git -revision = 05ac2cca6571c04d06369a26825d207781b73f32 +revision = 22ee762e8e0890fc54068beb670310f0edce7263 clone-recursive = true depth = 1 diff --git a/subprojects/packagefiles/ffmpeg/meson.build b/subprojects/packagefiles/ffmpeg/meson.build index ed3617c..aa881bc 100644 --- a/subprojects/packagefiles/ffmpeg/meson.build +++ b/subprojects/packagefiles/ffmpeg/meson.build @@ -12,6 +12,7 @@ is_windows = host_machine.system() == 'windows' is_msvc = compiler.get_id() == 'msvc' or compiler.get_id() == 'clang-cl' is_mingw = is_windows and not is_msvc is_android = host_machine.system() == 'android' +is_static_shared_lib = is_android args = ['-DFFMPEG_VERSION="' + meson.project_version() + '"'] deps = [] @@ -33,9 +34,6 @@ endif extra_options += ['--arch=' + cpu] extra_options += ['--cc=' + compiler.cmd_array()[0]] if meson.is_cross_build() - if is_msvc - extra_options += ['--ld=' + meson.get_external_property('ld')] - endif extra_options += ['--ar=' + meson.get_external_property('ar', 'ar')] extra_options += ['--nm=' + meson.get_external_property('nm', 'nm')] endif @@ -45,6 +43,9 @@ if cpu == 'x86_64' or cpu == 'x86' endif extra_options += ['--enable-static', '--disable-shared'] +if is_static_shared_lib + extra_options += ['--enable-pic'] +endif if is_windows if get_option('win32-compat') @@ -211,7 +212,6 @@ extra_options += [ '--disable-nvdec', '--disable-nvenc', '--disable-vdpau', - '--disable-audiotoolbox', '--disable-videotoolbox' ] @@ -262,7 +262,6 @@ proj = ext_proj.add_project('configure', '--prefix=@PREFIX@', '--libdir=@PREFIX@/@LIBDIR@', '--incdir=@PREFIX@/@INCLUDEDIR@', - '--enable-pic', '--disable-all', '--disable-autodetect', '--disable-everything', diff --git a/subprojects/packagefiles/ffmpeg/meson_options.txt b/subprojects/packagefiles/ffmpeg/meson_options.txt index d58d8fd..7854d28 100644 --- a/subprojects/packagefiles/ffmpeg/meson_options.txt +++ b/subprojects/packagefiles/ffmpeg/meson_options.txt @@ -1,6 +1,5 @@ # Copy-paste from top-level project. +option('sink-only', type: 'boolean', value: false, yield: true) option('codec-hwaccels', type: 'array', choices: ['vulkan', 'vaapi', 'mediacodec', 'd3d11va', 'dxva2'], value: [], yield: true) -option('renderer-api', type: 'combo', choices: ['vulkan', 'dx11', 'gl', 'gl-rpi'], value: 'vulkan', yield: true) option('subtitles', type: 'feature', value: 'enabled', yield: true) option('win32-compat', type: 'boolean', value: false, yield: true) -option('sink-only', type: 'boolean', value: false, yield: true) diff --git a/subprojects/packagefiles/ffmpeg/version_9.0.1.diff b/subprojects/packagefiles/ffmpeg/version_9.0.1.diff new file mode 100644 index 0000000..8c10f1c --- /dev/null +++ b/subprojects/packagefiles/ffmpeg/version_9.0.1.diff @@ -0,0 +1,29 @@ +--- a/meson.build 2025-08-23 18:44:34.634014892 -0400 ++++ b/meson.build 2025-08-25 15:33:36.209533531 -0400 +@@ -1,4 +1,4 @@ +-project('ffmpeg', 'c', version: '', meson_version: '>=0.57.0') ++project('ffmpeg', 'c', version: '9.0.1', meson_version: '>=0.57.0') + + compiler = meson.get_compiler('c') + +@@ -268,14 +268,14 @@ + swscale = proj.dependency('swscale') + include = include_directories('.', 'build/') + meson.override_dependency('libavutil', declare_dependency( +- dependencies: [avutil, deps], compile_args: args, include_directories: include, version: '')) ++ dependencies: [avutil, deps], compile_args: args, include_directories: include, version: '61.1.100')) + meson.override_dependency('libavformat', declare_dependency( +- dependencies: [avformat], include_directories: include, version: '')) ++ dependencies: [avformat], include_directories: include, version: '63.1.100')) + meson.override_dependency('libavcodec', declare_dependency( +- dependencies: [avcodec], include_directories: include, version: '')) ++ dependencies: [avcodec], include_directories: include, version: '63.1.100')) + meson.override_dependency('libavdevice', declare_dependency( +- dependencies: [avdevice], include_directories: include, version: '')) ++ dependencies: [avdevice], include_directories: include, version: '63.1.100')) + meson.override_dependency('libswresample', declare_dependency( +- dependencies: [swresample], include_directories: include, version: '')) ++ dependencies: [swresample], include_directories: include, version: '7.1.100')) + meson.override_dependency('libswscale', declare_dependency( +- dependencies: [swscale], include_directories: include, version: '')) ++ dependencies: [swscale], include_directories: include, version: '10.1.100')) diff --git a/subprojects/packagefiles/libcdio-paranoia/meson.build b/subprojects/packagefiles/libcdio-paranoia/meson.build index 82b07b3..c8ee719 100644 --- a/subprojects/packagefiles/libcdio-paranoia/meson.build +++ b/subprojects/packagefiles/libcdio-paranoia/meson.build @@ -1,7 +1,8 @@ -project('libcdio-paranoia', 'c', version: 'git-717f126', meson_version: '>=0.57.0') +project('libcdio-paranoia', 'c', version: 'git-384f4da', meson_version: '>=0.57.0') ext_proj = import('unstable-external_project') +# @TODO: Couldn't this work for shaderc? run_command('autoreconf', '-fi', check: true) proj = ext_proj.add_project('configure', diff --git a/subprojects/packagefiles/libplacebo/android_opengl_custom_dispatch.diff b/subprojects/packagefiles/libplacebo/android_opengl_custom_dispatch.diff new file mode 100644 index 0000000..e8b2ecf --- /dev/null +++ b/subprojects/packagefiles/libplacebo/android_opengl_custom_dispatch.diff @@ -0,0 +1,54 @@ +diff --git a/src/dispatch.c b/src/dispatch.c +index 218b556..70be9aa 100644 +--- a/src/dispatch.c ++++ b/src/dispatch.c +@@ -1541,7 +1541,7 @@ bool pl_dispatch_vertex(pl_dispatch dp, const struct pl_dispatch_vertex_params * + case PL_COORDS_NORMALIZED: + if (params->vertex_flipped) { + proj.mat.m[1][1] = -proj.mat.m[1][1]; +- proj.c[1] += 2.0; ++ //proj.c[1] += 2.0; + } + break; + } +@@ -1566,7 +1566,7 @@ bool pl_dispatch_vertex(pl_dispatch dp, const struct pl_dispatch_vertex_params * + + // Update the scissors + rparams->scissors = params->scissors; +- if (params->vertex_flipped) { ++ if (params->vertex_flipped && rparams->scissors.y0 != rparams->scissors.y1) { + rparams->scissors.y0 = tpars->h - rparams->scissors.y0; + rparams->scissors.y1 = tpars->h - rparams->scissors.y1; + } +diff --git a/src/shaders/custom_mpv.c b/src/shaders/custom_mpv.c +index 1c93da5..bd6450d 100644 +--- a/src/shaders/custom_mpv.c ++++ b/src/shaders/custom_mpv.c +@@ -1191,10 +1191,10 @@ static bool bind_pass_tex(pl_shader sh, pl_str name, + GLSLH("#define HOOKED_pt %.*s_pt \n", PL_STR_FMT(name)); + GLSLH("#define HOOKED_map %.*s_map \n", PL_STR_FMT(name)); + GLSLH("#define HOOKED_mul %.*s_mul \n", PL_STR_FMT(name)); +- GLSLH("#define HOOKED_tex %.*s_tex \n", PL_STR_FMT(name)); +- GLSLH("#define HOOKED_texOff %.*s_texOff \n", PL_STR_FMT(name)); ++ GLSLH("#define HOOKED_tex(pos) %.*s_tex(pos) \n", PL_STR_FMT(name)); ++ GLSLH("#define HOOKED_texOff(off) %.*s_texOff(off) \n", PL_STR_FMT(name)); + if (can_gather) +- GLSLH("#define HOOKED_gather %.*s_gather \n", PL_STR_FMT(name)); ++ GLSLH("#define HOOKED_gather(pos, c) %.*s_gather(pos, c) \n", PL_STR_FMT(name)); + } + + if (mainpresub) { +@@ -1206,10 +1206,10 @@ static bool bind_pass_tex(pl_shader sh, pl_str name, + GLSLH("#define MAIN_pt MAINPRESUB_pt \n"); + GLSLH("#define MAIN_map MAINPRESUB_map \n"); + GLSLH("#define MAIN_mul MAINPRESUB_mul \n"); +- GLSLH("#define MAIN_tex MAINPRESUB_tex \n"); +- GLSLH("#define MAIN_texOff MAINPRESUB_texOff \n"); ++ GLSLH("#define MAIN_tex(pos) MAINPRESUB_tex(pos) \n"); ++ GLSLH("#define MAIN_texOff(off) MAINPRESUB_texOff(off) \n"); + if (can_gather) +- GLSLH("#define MAIN_gather MAINPRESUB_gather \n"); ++ GLSLH("#define MAIN_gather(pos, c) MAINPRESUB_gather(pos, c) \n"); + } + + return true; diff --git a/subprojects/packagefiles/libplacebo/glslang_meson_wrap.diff b/subprojects/packagefiles/libplacebo/glslang_meson_wrap.diff new file mode 100644 index 0000000..d722bef --- /dev/null +++ b/subprojects/packagefiles/libplacebo/glslang_meson_wrap.diff @@ -0,0 +1,40 @@ +diff --git a/src/glsl/meson.build b/src/glsl/meson.build +index c9a8542..499042a 100644 +--- a/src/glsl/meson.build ++++ b/src/glsl/meson.build +@@ -30,7 +30,7 @@ if glslang_req.auto() and shaderc.found() + elif not glslang_req.disabled() + + glslang_deps = [ +- cxx.find_library('glslang-default-resource-limits', required: false) ++ dependency('glslang-default-resource-limits', required: false) + ] + + # meson doesn't respect generator expressions in INTERFACE_LINK_LIBRARIES +@@ -49,7 +49,7 @@ elif not glslang_req.disabled() + static = arg[0] + required = arg[1] + +- spirv = cxx.find_library('SPIRV', required: required, static: static, dirs: vulkan_lib_dirs) ++ spirv = dependency('SPIRV', required: required, static: static) + + if not spirv.found() + continue +@@ -59,7 +59,7 @@ elif not glslang_req.disabled() + + # Glslang 15.0.0 moved some code around, add also linking to glslang, while + # this is not needed for older versions, it will still work. +- glslang_deps += cxx.find_library('glslang', required: required, static: static) ++ glslang_deps += dependency('glslang', required: required, static: static) + + if static + glslang_deps += [ +@@ -78,7 +78,7 @@ elif not glslang_req.disabled() + break + endforeach + +- if found_lib and cc.has_header('glslang/build_info.h') ++ if found_lib + glslang = declare_dependency(dependencies: glslang_deps) + endif + diff --git a/subprojects/packagefiles/libplacebo/no_uniforms_in_vert.diff b/subprojects/packagefiles/libplacebo/no_uniforms_in_vert.diff new file mode 100644 index 0000000..8797d34 --- /dev/null +++ b/subprojects/packagefiles/libplacebo/no_uniforms_in_vert.diff @@ -0,0 +1,89 @@ +diff --git a/src/dispatch.c b/src/dispatch.c +index 218b556..067efc7 100644 +--- a/src/dispatch.c ++++ b/src/dispatch.c +@@ -29,6 +29,7 @@ + + enum { + TMP_PRELUDE, // GLSL version, global definitions, etc. ++ TMP_UNIFORMS, + TMP_MAIN, // main GLSL shader body + TMP_VERT_HEAD, // vertex shader inputs/outputs + TMP_VERT_BODY, // vertex shader body +@@ -304,15 +305,16 @@ static void generate_shaders(pl_dispatch dp, + pl_str_builder shader_body = sh_finalize_internal(sh); + + pl_str_builder pre = dp->tmp[TMP_PRELUDE]; ++ pl_str_builder uni = dp->tmp[TMP_UNIFORMS]; + ADD(pre, "#version %d%s\n", gpu->glsl.version, + (gpu->glsl.gles && gpu->glsl.version > 100) ? " es" : ""); + if (pass_params->type == PL_PASS_COMPUTE) +- ADD(pre, "#extension GL_ARB_compute_shader : enable\n"); ++ ADD(uni, "#extension GL_ARB_compute_shader : enable\n"); + + // Enable this unconditionally if the GPU supports it, since we have no way + // of knowing whether subgroups are being used or not + if (gpu->glsl.subgroup_size) { +- ADD(pre, "#extension GL_KHR_shader_subgroup_basic : enable \n" ++ ADD(uni, "#extension GL_KHR_shader_subgroup_basic : enable \n" + "#extension GL_KHR_shader_subgroup_vote : enable \n" + "#extension GL_KHR_shader_subgroup_arithmetic : enable \n" + "#extension GL_KHR_shader_subgroup_ballot : enable \n" +@@ -360,24 +362,24 @@ static void generate_shaders(pl_dispatch dp, + } + + if (has_img && !gpu->glsl.gles) +- ADD(pre, "#extension GL_ARB_shader_image_load_store : enable\n"); ++ ADD(uni, "#extension GL_ARB_shader_image_load_store : enable\n"); + if (has_ubo) +- ADD(pre, "#extension GL_ARB_uniform_buffer_object : enable\n"); ++ ADD(uni, "#extension GL_ARB_uniform_buffer_object : enable\n"); + if (has_ssbo) +- ADD(pre, "#extension GL_ARB_shader_storage_buffer_object : enable\n"); ++ ADD(uni, "#extension GL_ARB_shader_storage_buffer_object : enable\n"); + if (has_texel) +- ADD(pre, "#extension GL_ARB_texture_buffer_object : enable\n"); ++ ADD(uni, "#extension GL_ARB_texture_buffer_object : enable\n"); + if (has_ext) { + if (gpu->glsl.version >= 300) { +- ADD(pre, "#extension GL_OES_EGL_image_external_essl3 : enable\n"); ++ ADD(uni, "#extension GL_OES_EGL_image_external_essl3 : enable\n"); + } else { +- ADD(pre, "#extension GL_OES_EGL_image_external : enable\n"); ++ ADD(uni, "#extension GL_OES_EGL_image_external : enable\n"); + } + } + if (has_nofmt) +- ADD(pre, "#extension GL_EXT_shader_image_load_formatted : enable\n"); ++ ADD(uni, "#extension GL_EXT_shader_image_load_formatted : enable\n"); + if (has_gather && !gpu->glsl.gles) +- ADD(pre, "#extension GL_ARB_texture_gather : enable\n"); ++ ADD(uni, "#extension GL_ARB_texture_gather : enable\n"); + + if (gpu->glsl.gles) { + // Use 32-bit precision for floats if possible +@@ -527,12 +529,12 @@ static void generate_shaders(pl_dispatch dp, + + case PL_DESC_BUF_UNIFORM: + if (gpu->glsl.vulkan) { +- ADD(pre, "layout(std140, binding=%d) ", desc->binding); ++ ADD(uni, "layout(std140, binding=%d) ", desc->binding); + } else { +- ADD(pre, "layout(std140) "); ++ ADD(uni, "layout(std140) "); + } +- ADD(pre, "uniform "$" ", sh_ident_unpack(desc->name)); +- add_buffer_vars(dp, tmp, pre, sd->buffer_vars, sd->num_buffer_vars); ++ ADD(uni, "uniform "$" ", sh_ident_unpack(desc->name)); ++ add_buffer_vars(dp, tmp, uni, sd->buffer_vars, sd->num_buffer_vars); + break; + + case PL_DESC_BUF_STORAGE: +@@ -599,6 +601,7 @@ static void generate_shaders(pl_dispatch dp, + + pl_str_builder glsl = dp->tmp[TMP_MAIN]; + ADD_CAT(glsl, pre); ++ ADD_CAT(glsl, uni); + + switch(pass_params->type) { + case PL_PASS_RASTER: { diff --git a/subprojects/packagefiles/libplacebo/shaderc_optimize_size.diff b/subprojects/packagefiles/libplacebo/shaderc_optimize_size.diff new file mode 100644 index 0000000..90d75e1 --- /dev/null +++ b/subprojects/packagefiles/libplacebo/shaderc_optimize_size.diff @@ -0,0 +1,13 @@ +diff --git a/src/glsl/spirv_shaderc.c b/src/glsl/spirv_shaderc.c +index 3afd750..8c3d5e0 100644 +--- a/src/glsl/spirv_shaderc.c ++++ b/src/glsl/spirv_shaderc.c +@@ -112,7 +112,7 @@ static pl_str shaderc_compile(pl_spirv spirv, void *alloc, + return (pl_str) {0}; + + shaderc_compile_options_set_optimization_level(opts, +- shaderc_optimization_level_performance); ++ shaderc_optimization_level_size); + shaderc_compile_options_set_target_spirv(opts, spirv->version.spv_version); + shaderc_compile_options_set_target_env(opts, shaderc_target_env_vulkan, + spirv->version.env_version); diff --git a/subprojects/shaderc.wrap b/subprojects/shaderc.wrap index f541df9..9bbe1d7 100644 --- a/subprojects/shaderc.wrap +++ b/subprojects/shaderc.wrap @@ -1,8 +1,7 @@ [wrap-git] -directory = shaderc-v2026.2 +directory = shaderc-v2026.3 url = https://github.com/google/shaderc.git -revision = v2026.2 +revision = v2026.3 depth = 1 method = cmake patch_directory = shaderc -diff_files = shaderc/third_party_fix_build.diff, shaderc/no_hlsl_compile.diff diff --git a/subprojects/stela.wrap b/subprojects/stela.wrap index a1889c4..40cb968 100644 --- a/subprojects/stela.wrap +++ b/subprojects/stela.wrap @@ -1,5 +1,5 @@ [wrap-git] -directory = stela-a35c47d +directory = stela-0c43dca url = https://git.akon.city/stela.git push-url = git@git.akon.city:stela.git -revision = a35c47d401335e81f25c2c78611dcb7785f703da +revision = 0c43dcac12f606c0ac46b5f87dd3de324ff9ef04 diff --git a/tests/cue_splitter.c b/tests/cue_splitter.c index 3450aaa..47171f2 100644 --- a/tests/cue_splitter.c +++ b/tests/cue_splitter.c @@ -129,7 +129,7 @@ s32 main(s32 argc, char *argv[]) return EXIT_FAILURE; } - str output_dir = al_str_null(); + str output_dir = AL_STR_EMPTY; if (argc == 3) { output_dir = al_str_cr(argv[2]); if (!nn_dir_exists(&output_dir)) { -- cgit v1.2.3-101-g0448