From e6134023cb373a3b6f397f3d589447bee16b7abd Mon Sep 17 00:00:00 2001 From: neatnoise Date: Mon, 19 Jan 2026 17:20:37 +0100 Subject: [PATCH 1/5] Add Vulkan video encoder support to FFmpeg build --- CMakeLists.txt | 1 + cmake/ffmpeg/ffmpeg.cmake | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index c4c8f0e2..3824f475 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,7 @@ option(BUILD_FFMPEG_X264 "Build FFmpeg x264" ON) option(BUILD_FFMPEG_X264_PATCHES "Apply FFmpeg x264 patches" ON) option(BUILD_FFMPEG_X265 "Build FFmpeg x265" ON) option(BUILD_FFMPEG_X265_PATCHES "Apply FFmpeg x265 patches" ON) +option(BUILD_FFMPEG_VULKAN "Build FFmpeg with Vulkan video encoding support" ON) # common includes include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/apply_git_patch.cmake) diff --git a/cmake/ffmpeg/ffmpeg.cmake b/cmake/ffmpeg/ffmpeg.cmake index 05b9ae0a..f76eca65 100644 --- a/cmake/ffmpeg/ffmpeg.cmake +++ b/cmake/ffmpeg/ffmpeg.cmake @@ -83,6 +83,12 @@ if(BUILD_FFMPEG_LIBVA) --enable-encoder=h264_vaapi,hevc_vaapi,av1_vaapi ) endif() +if(BUILD_FFMPEG_VULKAN) + list(APPEND FFMPEG_EXTRA_CONFIGURE + --enable-vulkan + --enable-encoder=h264_vulkan,hevc_vulkan,av1_vulkan + ) +endif() if(BUILD_FFMPEG_X264) list(APPEND FFMPEG_EXTRA_CONFIGURE --enable-libx264 From 2b873ffa392bd44dd7776d1d6dbf0594087afd40 Mon Sep 17 00:00:00 2001 From: neatnoise Date: Mon, 26 Jan 2026 13:03:51 +0100 Subject: [PATCH 2/5] Add Vulkan dependencies for Linux and FreeBSD --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dec1cc38..a93c83e6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -212,6 +212,7 @@ jobs: "libdrm-dev:$package_arch" "libgl-dev:$package_arch" "libglx-dev:$package_arch" + "libvulkan-dev:$package_arch" "libwayland-dev:$package_arch" "libwayland-client0:$package_arch" "libx11-dev:$package_arch" @@ -492,6 +493,8 @@ jobs: devel/pkgconf \ graphics/libdrm \ graphics/libglvnd \ + graphics/vulkan-headers \ + graphics/vulkan-loader \ graphics/wayland \ multimedia/libass \ multimedia/libv4l \ From 5346d21e1920189ba8eca7a506e25fcf9c4a831a Mon Sep 17 00:00:00 2001 From: neatnoise Date: Mon, 26 Jan 2026 13:08:18 +0100 Subject: [PATCH 3/5] Disable Vulkan on Windows and macOS --- cmake/ffmpeg/_main.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/ffmpeg/_main.cmake b/cmake/ffmpeg/_main.cmake index acf90440..2f0f511c 100644 --- a/cmake/ffmpeg/_main.cmake +++ b/cmake/ffmpeg/_main.cmake @@ -6,6 +6,7 @@ set(AVCODEC_GENERATED_SRC_PATH ${CMAKE_CURRENT_BINARY_DIR}/FFmpeg/libavcodec) if(WIN32) set(BUILD_FFMPEG_LIBVA OFF) + set(BUILD_FFMPEG_VULKAN OFF) # We must disable CUDA and NVENC on ARM64 until following issues is resolved # https://github.com/FFmpeg/FFmpeg/blob/4e5523c98597a417eb43555933b1075d18ec5f8b/configure#L7443 @@ -17,6 +18,7 @@ elseif(APPLE) set(BUILD_FFMPEG_MF OFF) set(BUILD_FFMPEG_NV_CODEC_HEADERS OFF) set(BUILD_FFMPEG_LIBVA OFF) + set(BUILD_FFMPEG_VULKAN OFF) elseif(FREEBSD) set(BUILD_FFMPEG_AMF OFF) set(BUILD_FFMPEG_MF OFF) From aec3c1b21a4ffac80cd6b458bf635a0e3afc9262 Mon Sep 17 00:00:00 2001 From: neatnoise Date: Mon, 26 Jan 2026 13:09:43 +0100 Subject: [PATCH 4/5] Add Vulkan dependencies to README --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ba3798ef..10ebd706 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,8 @@ pkg install -y \ devel/nasm \ devel/ninja \ devel/pkgconf \ + graphics/vulkan-headers \ + graphics/vulkan-loader \ multimedia/libass \ multimedia/libv4l \ multimedia/libva \ @@ -86,7 +88,7 @@ pkg install -y \ ```bash sudo apt install -y \ -autoconf \ + autoconf \ automake \ build-essential \ cmake \ @@ -100,6 +102,7 @@ autoconf \ libsdl2-dev \ libtool \ libvorbis-dev \ + libvulkan-dev \ libxcb1-dev \ libxcb-shm0-dev \ libxcb-xfixes0-dev \ From 1425ccc11914437c9174bfd67853ccacaca7ff94 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Mon, 9 Feb 2026 20:39:10 -0500 Subject: [PATCH 5/5] Add Vulkan submodules and CMake build support Integrate Vulkan into the FFmpeg build by adding Vulkan-Headers and Vulkan-Loader as git submodules and new CMake support. Adds cmake/ffmpeg/vulkan.cmake which creates vulkan-headers and vulkan-loader targets (with installation into the build tree, pkg-config support, cross-compiling args and WSI options for Linux), wires the new target into cmake/ffmpeg/_main.cmake, and updates ffmpeg.cmake to pass include/lib paths and add a vulkan-loader dependency. Also updates .gitmodules and adds the gitlinks for the two submodules, and adjusts the CI workflow to stop installing distro Vulkan packages in favor of building the bundled components. --- .github/workflows/ci.yml | 4 +- .gitmodules | 8 +++ README.md | 3 -- cmake/ffmpeg/_main.cmake | 7 ++- cmake/ffmpeg/ffmpeg.cmake | 5 ++ cmake/ffmpeg/vulkan.cmake | 81 +++++++++++++++++++++++++++++++ third-party/FFmpeg/Vulkan-Headers | 1 + third-party/FFmpeg/Vulkan-Loader | 1 + 8 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 cmake/ffmpeg/vulkan.cmake create mode 160000 third-party/FFmpeg/Vulkan-Headers create mode 160000 third-party/FFmpeg/Vulkan-Loader diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a93c83e6..d856d540 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -212,7 +212,6 @@ jobs: "libdrm-dev:$package_arch" "libgl-dev:$package_arch" "libglx-dev:$package_arch" - "libvulkan-dev:$package_arch" "libwayland-dev:$package_arch" "libwayland-client0:$package_arch" "libx11-dev:$package_arch" @@ -493,8 +492,6 @@ jobs: devel/pkgconf \ graphics/libdrm \ graphics/libglvnd \ - graphics/vulkan-headers \ - graphics/vulkan-loader \ graphics/wayland \ multimedia/libass \ multimedia/libv4l \ @@ -506,6 +503,7 @@ jobs: x11/libxcb \ x11/libXext \ x11/libXfixes \ + x11/libXrandr \ x11/xorgproto # create symlink for shebang bash compatibility diff --git a/.gitmodules b/.gitmodules index b8bf2fb6..98980f7c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,3 +22,11 @@ path = third-party/FFmpeg/SVT-AV1 url = https://github.com/LizardByte-infrastructure/SVT-AV1.git branch = master +[submodule "third-party/FFmpeg/Vulkan-Headers"] + path = third-party/FFmpeg/Vulkan-Headers + url = https://github.com/KhronosGroup/Vulkan-Headers.git + branch = main +[submodule "third-party/FFmpeg/Vulkan-Loader"] + path = third-party/FFmpeg/Vulkan-Loader + url = https://github.com/KhronosGroup/Vulkan-Loader.git + branch = main diff --git a/README.md b/README.md index 10ebd706..b56f47a8 100644 --- a/README.md +++ b/README.md @@ -70,8 +70,6 @@ pkg install -y \ devel/nasm \ devel/ninja \ devel/pkgconf \ - graphics/vulkan-headers \ - graphics/vulkan-loader \ multimedia/libass \ multimedia/libv4l \ multimedia/libva \ @@ -102,7 +100,6 @@ sudo apt install -y \ libsdl2-dev \ libtool \ libvorbis-dev \ - libvulkan-dev \ libxcb1-dev \ libxcb-shm0-dev \ libxcb-xfixes0-dev \ diff --git a/cmake/ffmpeg/_main.cmake b/cmake/ffmpeg/_main.cmake index 2f0f511c..95aaadad 100644 --- a/cmake/ffmpeg/_main.cmake +++ b/cmake/ffmpeg/_main.cmake @@ -1,5 +1,6 @@ # the destination directory needs to be same level down as the original source directory -file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/third-party/FFmpeg DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/third-party/FFmpeg DESTINATION ${CMAKE_CURRENT_BINARY_DIR} + PATTERN "Vulkan-Loader/tests" EXCLUDE) # vulkan loader test files contain emojis in file names which can fail set(FFMPEG_GENERATED_SRC_PATH ${CMAKE_CURRENT_BINARY_DIR}/FFmpeg/FFmpeg) set(AVCODEC_GENERATED_SRC_PATH ${CMAKE_CURRENT_BINARY_DIR}/FFmpeg/libavcodec) @@ -52,6 +53,10 @@ if(BUILD_FFMPEG_LIBVA) include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/ffmpeg/libva.cmake) endif() +if(BUILD_FFMPEG_VULKAN) + include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/ffmpeg/vulkan.cmake) +endif() + if(BUILD_FFMPEG_X264) include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/ffmpeg/x264.cmake) endif() diff --git a/cmake/ffmpeg/ffmpeg.cmake b/cmake/ffmpeg/ffmpeg.cmake index f76eca65..49ddcda5 100644 --- a/cmake/ffmpeg/ffmpeg.cmake +++ b/cmake/ffmpeg/ffmpeg.cmake @@ -31,9 +31,11 @@ list(APPEND FFMPEG_EXTRA_CONFIGURE --extra-cflags='-I${CMAKE_CURRENT_BINARY_DIR_UNIX}/usr/local/include' --extra-cflags='-I${CMAKE_CURRENT_BINARY_DIR_UNIX}/x264/include' --extra-cflags='-I${CMAKE_CURRENT_BINARY_DIR_UNIX}/libva/include' + --extra-cflags='-I${CMAKE_CURRENT_BINARY_DIR_UNIX}/vulkan/include' --extra-ldflags='-L${CMAKE_CURRENT_BINARY_DIR_UNIX}/usr/local/lib' --extra-ldflags='-L${CMAKE_CURRENT_BINARY_DIR_UNIX}/x264/lib' --extra-ldflags='-L${CMAKE_CURRENT_BINARY_DIR_UNIX}/libva/lib' + --extra-ldflags='-L${CMAKE_CURRENT_BINARY_DIR_UNIX}/vulkan/lib' --extra-libs='-lpthread -lm' --disable-all --disable-autodetect @@ -173,6 +175,9 @@ endif() if(BUILD_FFMPEG_LIBVA) add_dependencies(ffmpeg libva) endif() +if(BUILD_FFMPEG_VULKAN) + add_dependencies(ffmpeg vulkan-loader) +endif() if(BUILD_FFMPEG_X264) add_dependencies(ffmpeg x264) endif() diff --git a/cmake/ffmpeg/vulkan.cmake b/cmake/ffmpeg/vulkan.cmake new file mode 100644 index 00000000..40788578 --- /dev/null +++ b/cmake/ffmpeg/vulkan.cmake @@ -0,0 +1,81 @@ +# Vulkan Headers +set(VULKAN_HEADERS_GENERATED_SRC_PATH ${CMAKE_CURRENT_BINARY_DIR}/FFmpeg/Vulkan-Headers) + +add_custom_target(vulkan-headers ALL + COMMAND ${CMAKE_COMMAND} + -S ${VULKAN_HEADERS_GENERATED_SRC_PATH} + -B ${CMAKE_CURRENT_BINARY_DIR}/vulkan-headers-build + -G "${CMAKE_GENERATOR}" + -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/vulkan + -DCMAKE_BUILD_TYPE=Release + COMMAND ${CMAKE_COMMAND} + --build ${CMAKE_CURRENT_BINARY_DIR}/vulkan-headers-build + --target install + WORKING_DIRECTORY ${VULKAN_HEADERS_GENERATED_SRC_PATH} + COMMENT "Target: Vulkan-Headers" + VERBATIM +) +add_dependencies(${CMAKE_PROJECT_NAME} vulkan-headers) + +# Vulkan Loader +set(VULKAN_LOADER_GENERATED_SRC_PATH ${CMAKE_CURRENT_BINARY_DIR}/FFmpeg/Vulkan-Loader) + +# Configure options for Vulkan-Loader +set(VULKAN_LOADER_CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/vulkan + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} + -DVULKAN_HEADERS_INSTALL_DIR=${CMAKE_CURRENT_BINARY_DIR}/vulkan + -DBUILD_STATIC_LOADER=ON + -DBUILD_SHARED_LIBS=OFF + -DBUILD_TESTS=OFF + -DENABLE_WERROR=OFF +) + +# Enable Wayland and X11 WSI for Linux and FreeBSD builds +if(UNIX AND NOT APPLE) + list(APPEND VULKAN_LOADER_CMAKE_ARGS + -DBUILD_WSI_WAYLAND_SUPPORT=ON + -DBUILD_WSI_XCB_SUPPORT=ON + -DBUILD_WSI_XLIB_SUPPORT=ON + ) +endif() + +if(CMAKE_CROSSCOMPILING) + list(APPEND VULKAN_LOADER_CMAKE_ARGS + -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} + -DCMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR} + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + ) + if(UNIX AND NOT APPLE) + list(APPEND VULKAN_LOADER_CMAKE_ARGS + -DCMAKE_C_COMPILER_TARGET=${CMAKE_C_COMPILER_TARGET} + -DCMAKE_CXX_COMPILER_TARGET=${CMAKE_CXX_COMPILER_TARGET} + ) + endif() +endif() + +add_custom_target(vulkan-loader ALL + COMMAND ${CMAKE_COMMAND} + -S ${VULKAN_LOADER_GENERATED_SRC_PATH} + -B ${CMAKE_CURRENT_BINARY_DIR}/vulkan-loader-build + -G "${CMAKE_GENERATOR}" + ${VULKAN_LOADER_CMAKE_ARGS} + COMMAND ${CMAKE_COMMAND} + --build ${CMAKE_CURRENT_BINARY_DIR}/vulkan-loader-build + --config Release + --target install + -- --jobs=${N_PROC} + WORKING_DIRECTORY ${VULKAN_LOADER_GENERATED_SRC_PATH} + COMMENT "Target: Vulkan-Loader" + VERBATIM + BYPRODUCTS + "${CMAKE_CURRENT_BINARY_DIR}/vulkan/lib/libvulkan.a" +) +add_dependencies(vulkan-loader vulkan-headers) +add_dependencies(${CMAKE_PROJECT_NAME} vulkan-loader) + +# Add to PKG_CONFIG_PATH for FFmpeg to find +set(PKG_CONFIG_PATH "${CMAKE_CURRENT_BINARY_DIR_UNIX}/vulkan/lib/pkgconfig:${PKG_CONFIG_PATH}") diff --git a/third-party/FFmpeg/Vulkan-Headers b/third-party/FFmpeg/Vulkan-Headers new file mode 160000 index 00000000..49f1a381 --- /dev/null +++ b/third-party/FFmpeg/Vulkan-Headers @@ -0,0 +1 @@ +Subproject commit 49f1a381e2aec33ef32adf4a377b5a39ec016ec4 diff --git a/third-party/FFmpeg/Vulkan-Loader b/third-party/FFmpeg/Vulkan-Loader new file mode 160000 index 00000000..5ad4fe5f --- /dev/null +++ b/third-party/FFmpeg/Vulkan-Loader @@ -0,0 +1 @@ +Subproject commit 5ad4fe5f3eaf7db453b8719ba170021b6c4ddbab