Skip to content

Commit eb92e79

Browse files
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.
1 parent a1a4009 commit eb92e79

8 files changed

Lines changed: 103 additions & 7 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,6 @@ jobs:
212212
"libdrm-dev:$package_arch"
213213
"libgl-dev:$package_arch"
214214
"libglx-dev:$package_arch"
215-
"libvulkan-dev:$package_arch"
216215
"libwayland-dev:$package_arch"
217216
"libwayland-client0:$package_arch"
218217
"libx11-dev:$package_arch"
@@ -493,8 +492,6 @@ jobs:
493492
devel/pkgconf \
494493
graphics/libdrm \
495494
graphics/libglvnd \
496-
graphics/vulkan-headers \
497-
graphics/vulkan-loader \
498495
graphics/wayland \
499496
multimedia/libass \
500497
multimedia/libv4l \
@@ -506,6 +503,7 @@ jobs:
506503
x11/libxcb \
507504
x11/libXext \
508505
x11/libXfixes \
506+
x11/libXrandr \
509507
x11/xorgproto
510508
511509
# create symlink for shebang bash compatibility

.gitmodules

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,11 @@
2222
path = third-party/FFmpeg/SVT-AV1
2323
url = https://github.com/LizardByte-infrastructure/SVT-AV1.git
2424
branch = master
25+
[submodule "third-party/FFmpeg/Vulkan-Headers"]
26+
path = third-party/FFmpeg/Vulkan-Headers
27+
url = https://github.com/KhronosGroup/Vulkan-Headers.git
28+
branch = main
29+
[submodule "third-party/FFmpeg/Vulkan-Loader"]
30+
path = third-party/FFmpeg/Vulkan-Loader
31+
url = https://github.com/KhronosGroup/Vulkan-Loader.git
32+
branch = main

README.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,6 @@ pkg install -y \
7070
devel/nasm \
7171
devel/ninja \
7272
devel/pkgconf \
73-
graphics/vulkan-headers \
74-
graphics/vulkan-loader \
7573
multimedia/libass \
7674
multimedia/libv4l \
7775
multimedia/libva \
@@ -102,7 +100,6 @@ sudo apt install -y \
102100
libsdl2-dev \
103101
libtool \
104102
libvorbis-dev \
105-
libvulkan-dev \
106103
libxcb1-dev \
107104
libxcb-shm0-dev \
108105
libxcb-xfixes0-dev \

cmake/ffmpeg/_main.cmake

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# the destination directory needs to be same level down as the original source directory
2-
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/third-party/FFmpeg DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
2+
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/third-party/FFmpeg DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
3+
PATTERN "Vulkan-Loader/tests" EXCLUDE) # vulkan loader test files contain emojis in file names which can fail
34

45
set(FFMPEG_GENERATED_SRC_PATH ${CMAKE_CURRENT_BINARY_DIR}/FFmpeg/FFmpeg)
56
set(AVCODEC_GENERATED_SRC_PATH ${CMAKE_CURRENT_BINARY_DIR}/FFmpeg/libavcodec)
@@ -52,6 +53,10 @@ if(BUILD_FFMPEG_LIBVA)
5253
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/ffmpeg/libva.cmake)
5354
endif()
5455

56+
if(BUILD_FFMPEG_VULKAN)
57+
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/ffmpeg/vulkan.cmake)
58+
endif()
59+
5560
if(BUILD_FFMPEG_X264)
5661
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/ffmpeg/x264.cmake)
5762
endif()

cmake/ffmpeg/ffmpeg.cmake

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ list(APPEND FFMPEG_EXTRA_CONFIGURE
3131
--extra-cflags='-I${CMAKE_CURRENT_BINARY_DIR_UNIX}/usr/local/include'
3232
--extra-cflags='-I${CMAKE_CURRENT_BINARY_DIR_UNIX}/x264/include'
3333
--extra-cflags='-I${CMAKE_CURRENT_BINARY_DIR_UNIX}/libva/include'
34+
--extra-cflags='-I${CMAKE_CURRENT_BINARY_DIR_UNIX}/vulkan/include'
3435
--extra-ldflags='-L${CMAKE_CURRENT_BINARY_DIR_UNIX}/usr/local/lib'
3536
--extra-ldflags='-L${CMAKE_CURRENT_BINARY_DIR_UNIX}/x264/lib'
3637
--extra-ldflags='-L${CMAKE_CURRENT_BINARY_DIR_UNIX}/libva/lib'
38+
--extra-ldflags='-L${CMAKE_CURRENT_BINARY_DIR_UNIX}/vulkan/lib'
3739
--extra-libs='-lpthread -lm'
3840
--disable-all
3941
--disable-autodetect
@@ -173,6 +175,9 @@ endif()
173175
if(BUILD_FFMPEG_LIBVA)
174176
add_dependencies(ffmpeg libva)
175177
endif()
178+
if(BUILD_FFMPEG_VULKAN)
179+
add_dependencies(ffmpeg vulkan-loader)
180+
endif()
176181
if(BUILD_FFMPEG_X264)
177182
add_dependencies(ffmpeg x264)
178183
endif()

cmake/ffmpeg/vulkan.cmake

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# Vulkan Headers
2+
set(VULKAN_HEADERS_GENERATED_SRC_PATH ${CMAKE_CURRENT_BINARY_DIR}/FFmpeg/Vulkan-Headers)
3+
4+
add_custom_target(vulkan-headers ALL
5+
COMMAND ${CMAKE_COMMAND}
6+
-S ${VULKAN_HEADERS_GENERATED_SRC_PATH}
7+
-B ${CMAKE_CURRENT_BINARY_DIR}/vulkan-headers-build
8+
-G "${CMAKE_GENERATOR}"
9+
-DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/vulkan
10+
-DCMAKE_BUILD_TYPE=Release
11+
COMMAND ${CMAKE_COMMAND}
12+
--build ${CMAKE_CURRENT_BINARY_DIR}/vulkan-headers-build
13+
--target install
14+
WORKING_DIRECTORY ${VULKAN_HEADERS_GENERATED_SRC_PATH}
15+
COMMENT "Target: Vulkan-Headers"
16+
VERBATIM
17+
)
18+
add_dependencies(${CMAKE_PROJECT_NAME} vulkan-headers)
19+
20+
# Vulkan Loader
21+
set(VULKAN_LOADER_GENERATED_SRC_PATH ${CMAKE_CURRENT_BINARY_DIR}/FFmpeg/Vulkan-Loader)
22+
23+
# Configure options for Vulkan-Loader
24+
set(VULKAN_LOADER_CMAKE_ARGS
25+
-DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/vulkan
26+
-DCMAKE_BUILD_TYPE=Release
27+
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
28+
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
29+
-DVULKAN_HEADERS_INSTALL_DIR=${CMAKE_CURRENT_BINARY_DIR}/vulkan
30+
-DBUILD_STATIC_LOADER=ON
31+
-DBUILD_SHARED_LIBS=OFF
32+
-DBUILD_TESTS=OFF
33+
-DENABLE_WERROR=OFF
34+
)
35+
36+
# Enable Wayland and X11 WSI for Linux and FreeBSD builds
37+
if(UNIX AND NOT APPLE)
38+
list(APPEND VULKAN_LOADER_CMAKE_ARGS
39+
-DBUILD_WSI_WAYLAND_SUPPORT=ON
40+
-DBUILD_WSI_XCB_SUPPORT=ON
41+
-DBUILD_WSI_XLIB_SUPPORT=ON
42+
)
43+
endif()
44+
45+
if(CMAKE_CROSSCOMPILING)
46+
list(APPEND VULKAN_LOADER_CMAKE_ARGS
47+
-DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}
48+
-DCMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}
49+
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
50+
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
51+
)
52+
if(UNIX AND NOT APPLE)
53+
list(APPEND VULKAN_LOADER_CMAKE_ARGS
54+
-DCMAKE_C_COMPILER_TARGET=${CMAKE_C_COMPILER_TARGET}
55+
-DCMAKE_CXX_COMPILER_TARGET=${CMAKE_CXX_COMPILER_TARGET}
56+
)
57+
endif()
58+
endif()
59+
60+
add_custom_target(vulkan-loader ALL
61+
COMMAND ${CMAKE_COMMAND}
62+
-S ${VULKAN_LOADER_GENERATED_SRC_PATH}
63+
-B ${CMAKE_CURRENT_BINARY_DIR}/vulkan-loader-build
64+
-G "${CMAKE_GENERATOR}"
65+
${VULKAN_LOADER_CMAKE_ARGS}
66+
COMMAND ${CMAKE_COMMAND}
67+
--build ${CMAKE_CURRENT_BINARY_DIR}/vulkan-loader-build
68+
--config Release
69+
--target install
70+
-- --jobs=${N_PROC}
71+
WORKING_DIRECTORY ${VULKAN_LOADER_GENERATED_SRC_PATH}
72+
COMMENT "Target: Vulkan-Loader"
73+
VERBATIM
74+
BYPRODUCTS
75+
"${CMAKE_CURRENT_BINARY_DIR}/vulkan/lib/libvulkan.a"
76+
)
77+
add_dependencies(vulkan-loader vulkan-headers)
78+
add_dependencies(${CMAKE_PROJECT_NAME} vulkan-loader)
79+
80+
# Add to PKG_CONFIG_PATH for FFmpeg to find
81+
set(PKG_CONFIG_PATH "${CMAKE_CURRENT_BINARY_DIR_UNIX}/vulkan/lib/pkgconfig:${PKG_CONFIG_PATH}")

third-party/FFmpeg/Vulkan-Headers

Submodule Vulkan-Headers added at 49f1a38

third-party/FFmpeg/Vulkan-Loader

Submodule Vulkan-Loader added at 5ad4fe5

0 commit comments

Comments
 (0)