diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dec1cc38..d856d540 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -503,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/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/README.md b/README.md index ba3798ef..b56f47a8 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ pkg install -y \ ```bash sudo apt install -y \ -autoconf \ + autoconf \ automake \ build-essential \ cmake \ diff --git a/cmake/ffmpeg/_main.cmake b/cmake/ffmpeg/_main.cmake index acf90440..95aaadad 100644 --- a/cmake/ffmpeg/_main.cmake +++ b/cmake/ffmpeg/_main.cmake @@ -1,11 +1,13 @@ # 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) 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 +19,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) @@ -50,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 05b9ae0a..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 @@ -83,6 +85,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 @@ -167,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