From e1df88366bd2ecb4b93cdb59248814307714a0e8 Mon Sep 17 00:00:00 2001 From: Srinath Kumarapuram Date: Tue, 3 Jun 2025 10:24:23 +0530 Subject: [PATCH 1/6] Use the SHADERC_SHARED_LIBRARY variable/target for shaderc linkage There are multiple paths in the build scripts for either finding shaderc on the filesystem or fetching the source and building it, before linking it into the sample applications. These paths use separate CMake variable/target names, which makes it confusing to understand dependencies and makes refactoring / bug-fixing difficult. This change attempts to slightly improve this situation by consistently using the SHADERC_SHARED_LIBRARY variable/target wherever linkage to shaderc is necessary. This means removing the use of explicit linker flags for linking on Linux and letting CMake infer the required linker flags/options from the specified variable/target. SHADERC_SHARED_LIBRARY has been chosen instead of SHADERC_LIB_SHARED because the latter is a hard-coded name ("shaderc_shared") in the build script and does not correspond to the actual library name in all cases (for example, the library installed by using the package manager on Ubuntu 24.04 is named libshaderc.so.1). The SHADERC_LIB_SHARED_DIR variable was only used along with explicit linker flags, to specify the directory to search for shaderc. With the removal of explicit linker flags, this variable is no longer used. Signed-off-by: Srinath Kumarapuram --- cmake/FindShaderc.cmake | 2 ++ vk_video_decoder/demos/vk-video-dec/CMakeLists.txt | 4 ++-- vk_video_decoder/libs/CMakeLists.txt | 6 +++--- vk_video_decoder/test/vulkan-video-dec/CMakeLists.txt | 4 ++-- .../test/vulkan-video-simple-dec/CMakeLists.txt | 4 ++-- vk_video_encoder/demos/vk-video-enc/CMakeLists.txt | 6 ++---- vk_video_encoder/libs/CMakeLists.txt | 4 ++-- vk_video_encoder/test/vulkan-video-enc/CMakeLists.txt | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/cmake/FindShaderc.cmake b/cmake/FindShaderc.cmake index f810245e..9d05158f 100644 --- a/cmake/FindShaderc.cmake +++ b/cmake/FindShaderc.cmake @@ -164,6 +164,8 @@ else() # Ensure the linker knows where to find these libraries link_directories(${SHADERC_LIBRARY_DIR}) + set(SHADERC_SHARED_LIBRARY ${SHADERC_LIB}) + # Set explicit dependencies if(TARGET glslang) add_dependencies(glslang SPIRV-Tools) diff --git a/vk_video_decoder/demos/vk-video-dec/CMakeLists.txt b/vk_video_decoder/demos/vk-video-dec/CMakeLists.txt index f99fa2fa..e47c1c2e 100644 --- a/vk_video_decoder/demos/vk-video-dec/CMakeLists.txt +++ b/vk_video_decoder/demos/vk-video-dec/CMakeLists.txt @@ -96,10 +96,10 @@ link_directories( ) if(WIN32) - list(APPEND libraries PUBLIC ${VULKAN_VIDEO_PARSER_LIB} ${SHADERC_LIB_SHARED}) + list(APPEND libraries PUBLIC ${VULKAN_VIDEO_PARSER_LIB} ${SHADERC_SHARED_LIBRARY}) else() list(APPEND libraries PRIVATE -lX11) - list(APPEND libraries PRIVATE -L${SHADERC_LIB_SHARED_DIR} -l${SHADERC_LIB_SHARED}) + list(APPEND libraries PRIVATE ${SHADERC_SHARED_LIBRARY}) list(APPEND libraries PRIVATE -L${CMAKE_INSTALL_LIBDIR} -l${VULKAN_VIDEO_PARSER_LIB}) list(APPEND libraries PRIVATE -L${LIBNVPARSER_BINARY_ROOT} -l${VULKAN_VIDEO_PARSER_LIB}) endif() diff --git a/vk_video_decoder/libs/CMakeLists.txt b/vk_video_decoder/libs/CMakeLists.txt index 8821bb0a..3486280c 100644 --- a/vk_video_decoder/libs/CMakeLists.txt +++ b/vk_video_decoder/libs/CMakeLists.txt @@ -82,9 +82,9 @@ link_directories( ) if(WIN32) - list(APPEND libraries PRIVATE ${VULKAN_VIDEO_PARSER_LIB} ${SHADERC_LIB_SHARED}) + list(APPEND libraries PRIVATE ${VULKAN_VIDEO_PARSER_LIB} ${SHADERC_SHARED_LIBRARY}) else() - list(APPEND libraries PRIVATE -L${SHADERC_LIB_SHARED_DIR} -l${SHADERC_LIB_SHARED}) + list(APPEND libraries PRIVATE ${SHADERC_SHARED_LIBRARY}) list(APPEND libraries PRIVATE -L${CMAKE_INSTALL_LIBDIR} -l${VULKAN_VIDEO_PARSER_LIB}) list(APPEND libraries PRIVATE -L${LIBNVPARSER_BINARY_ROOT} -l${VULKAN_VIDEO_PARSER_LIB}) endif() @@ -154,4 +154,4 @@ if(WIN32) ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) -endif() \ No newline at end of file +endif() diff --git a/vk_video_decoder/test/vulkan-video-dec/CMakeLists.txt b/vk_video_decoder/test/vulkan-video-dec/CMakeLists.txt index 83b25865..45881602 100644 --- a/vk_video_decoder/test/vulkan-video-dec/CMakeLists.txt +++ b/vk_video_decoder/test/vulkan-video-dec/CMakeLists.txt @@ -68,10 +68,10 @@ link_directories( if(WIN32) list(APPEND VULKAN_VIDEO_DEC_LIBRARIES PUBLIC ${VULKAN_VIDEO_PARSER_LIB}) - list(APPEND VULKAN_VIDEO_DEC_LIBRARIES PUBLIC ${SHADERC_LIB_SHARED}) + list(APPEND VULKAN_VIDEO_DEC_LIBRARIES PUBLIC ${SHADERC_SHARED_LIBRARY}) list(APPEND VULKAN_VIDEO_DEC_LIBRARIES PUBLIC ${VULKAN_VIDEO_DECODER_LIB}) else() - list(APPEND VULKAN_VIDEO_DEC_LIBRARIES PRIVATE -L${SHADERC_LIB_SHARED_DIR} -l${SHADERC_LIB_SHARED}) + list(APPEND VULKAN_VIDEO_DEC_LIBRARIES PRIVATE ${SHADERC_SHARED_LIBRARY}) list(APPEND VULKAN_VIDEO_DEC_LIBRARIES PRIVATE -L${CMAKE_INSTALL_LIBDIR} -l${VULKAN_VIDEO_DECODER_LIB}) list(APPEND VULKAN_VIDEO_DEC_LIBRARIES PRIVATE -L${LIBVKVIDEODECODER_BINARY_ROOT} -l${VULKAN_VIDEO_DECODER_LIB}) list(APPEND VULKAN_VIDEO_DEC_LIBRARIES PRIVATE -L${LIBNVPARSER_BINARY_ROOT} -L${CMAKE_INSTALL_LIBDIR} -l${VULKAN_VIDEO_PARSER_LIB}) diff --git a/vk_video_decoder/test/vulkan-video-simple-dec/CMakeLists.txt b/vk_video_decoder/test/vulkan-video-simple-dec/CMakeLists.txt index a0885542..b4466eb6 100644 --- a/vk_video_decoder/test/vulkan-video-simple-dec/CMakeLists.txt +++ b/vk_video_decoder/test/vulkan-video-simple-dec/CMakeLists.txt @@ -27,10 +27,10 @@ link_directories( ) if(WIN32) - list(APPEND VULKAN_VIDEO_SIMPLE_DEC_LIBRARIES PUBLIC ${SHADERC_LIB_SHARED}) + list(APPEND VULKAN_VIDEO_SIMPLE_DEC_LIBRARIES PUBLIC ${SHADERC_SHARED_LIBRARY}) list(APPEND VULKAN_VIDEO_SIMPLE_DEC_LIBRARIES PUBLIC ${VULKAN_VIDEO_DECODER_LIB}) else() - list(APPEND VULKAN_VIDEO_SIMPLE_DEC_LIBRARIES PRIVATE -L${SHADERC_LIB_SHARED_DIR} -l${SHADERC_LIB_SHARED}) + list(APPEND VULKAN_VIDEO_SIMPLE_DEC_LIBRARIES PRIVATE ${SHADERC_SHARED_LIBRARY}) list(APPEND VULKAN_VIDEO_SIMPLE_DEC_LIBRARIES PRIVATE -L${CMAKE_INSTALL_LIBDIR} -l${VULKAN_VIDEO_DECODER_LIB}) list(APPEND VULKAN_VIDEO_SIMPLE_DEC_LIBRARIES PRIVATE -L${LIBVKVIDEODECODER_BINARY_ROOT} -l${VULKAN_VIDEO_DECODER_LIB}) endif() diff --git a/vk_video_encoder/demos/vk-video-enc/CMakeLists.txt b/vk_video_encoder/demos/vk-video-enc/CMakeLists.txt index d7dd8d5d..e8af8053 100644 --- a/vk_video_encoder/demos/vk-video-enc/CMakeLists.txt +++ b/vk_video_encoder/demos/vk-video-enc/CMakeLists.txt @@ -107,12 +107,10 @@ link_directories( ) if(WIN32) - find_library(SHADERC_LIB_WITH_PATH NAMES ${SHADERC_LIB_SHARED} PATHS ${VULKAN_LIB_DIR} ${VULKAN_LIB_DIR}../bin) - message(STATUS "SHADERC_LIB_SHARED PATH: ${SHADERC_LIB_WITH_PATH}" ) - list(APPEND libraries PRIVATE ${VULKAN_VIDEO_PARSER_LIB} ${SHADERC_LIB_SHARED}) + list(APPEND libraries PRIVATE ${VULKAN_VIDEO_PARSER_LIB} ${SHADERC_SHARED_LIBRARY}) else() list(APPEND libraries PRIVATE -lX11) - list(APPEND libraries PRIVATE -L${SHADERC_LIB_SHARED_DIR} -l${SHADERC_LIB_SHARED}) + list(APPEND libraries PRIVATE ${SHADERC_SHARED_LIBRARY}) list(APPEND libraries PRIVATE -L${CMAKE_INSTALL_LIBDIR} -l${VULKAN_VIDEO_PARSER_LIB}) list(APPEND libraries PRIVATE -L${LIBNVPARSER_BINARY_ROOT} -l${VULKAN_VIDEO_PARSER_LIB}) endif() diff --git a/vk_video_encoder/libs/CMakeLists.txt b/vk_video_encoder/libs/CMakeLists.txt index a3729e87..941001e5 100644 --- a/vk_video_encoder/libs/CMakeLists.txt +++ b/vk_video_encoder/libs/CMakeLists.txt @@ -114,7 +114,7 @@ add_library(${VULKAN_VIDEO_ENCODER_LIB} SHARED ${LIBVKVIDEOENCODER_SRC}) if(USE_SHADERC) # Link the libraries - target_link_libraries(${VULKAN_VIDEO_ENCODER_LIB} PUBLIC ${SHADERC_LIB_SHARED}) + target_link_libraries(${VULKAN_VIDEO_ENCODER_LIB} PUBLIC ${SHADERC_SHARED_LIBRARY}) # Ensure the library depends on the generation of these files list(APPEND LIBVKVIDEOENCODER_DEPENDENCIES ${SHADERC_LIB}) endif() @@ -143,7 +143,7 @@ endif() add_library(${VULKAN_VIDEO_ENCODER_STATIC_LIB} STATIC ${LIBVKVIDEOENCODER_SRC}) if(USE_SHADERC) # Link the libraries - target_link_libraries(${VULKAN_VIDEO_ENCODER_STATIC_LIB} PUBLIC ${SHADERC_LIB_SHARED}) + target_link_libraries(${VULKAN_VIDEO_ENCODER_STATIC_LIB} PUBLIC ${SHADERC_SHARED_LIBRARY}) endif() # Ensure the library depends on the generation of these files add_dependencies(${VULKAN_VIDEO_ENCODER_STATIC_LIB} ${LIBVKVIDEOENCODER_DEPENDENCIES}) diff --git a/vk_video_encoder/test/vulkan-video-enc/CMakeLists.txt b/vk_video_encoder/test/vulkan-video-enc/CMakeLists.txt index a997c978..3dfa2f10 100644 --- a/vk_video_encoder/test/vulkan-video-enc/CMakeLists.txt +++ b/vk_video_encoder/test/vulkan-video-enc/CMakeLists.txt @@ -23,7 +23,7 @@ link_directories( if(WIN32) list(APPEND VULKAN_VIDEO_ENC_LIBRARIES PRIVATE ${VULKAN_VIDEO_ENCODER_LIB}) else() - list(APPEND VULKAN_VIDEO_ENC_LIBRARIES PRIVATE -L${SHADERC_LIB_SHARED_DIR} -l${SHADERC_LIB_SHARED}) + list(APPEND VULKAN_VIDEO_ENC_LIBRARIES PRIVATE ${SHADERC_SHARED_LIBRARY}) list(APPEND VULKAN_VIDEO_ENC_LIBRARIES PRIVATE -L${CMAKE_INSTALL_LIBDIR} -l${VULKAN_VIDEO_ENCODER_LIB}) list(APPEND VULKAN_VIDEO_ENC_LIBRARIES PRIVATE -L${LIBVKVIDEOENCODER_BINARY_ROOT} -l${VULKAN_VIDEO_ENCODER_LIB}) endif() From 43984244d7da0100ce8bc340ae0fbd928424bcfd Mon Sep 17 00:00:00 2001 From: Srinath Kumarapuram Date: Tue, 3 Jun 2025 10:24:53 +0530 Subject: [PATCH 2/6] Remove unused variables and code related to shaderc These went out of use after the previous commit. Signed-off-by: Srinath Kumarapuram --- cmake/FindShaderc.cmake | 30 +----------------------------- 1 file changed, 1 insertion(+), 29 deletions(-) diff --git a/cmake/FindShaderc.cmake b/cmake/FindShaderc.cmake index 9d05158f..a2e96525 100644 --- a/cmake/FindShaderc.cmake +++ b/cmake/FindShaderc.cmake @@ -51,13 +51,11 @@ if( USE_SYSTEM_SHADERC) endif() endif() -set(SHADERC_LIB_SHARED "shaderc_shared" CACHE PATH "The name of the shaderc library the decoder/encoder are using." FORCE) - if(USE_SYSTEM_SHADERC AND shaderc_FOUND) message(STATUS "Using system shaderc") set(SHADERC_LIB "") else() - set(SHADERC_LIB ${SHADERC_LIB_SHARED} CACHE PATH "The name of the shaderc library target decoder/encoder are using." FORCE) + set(SHADERC_LIB "shaderc_shared" CACHE PATH "The name of the shaderc library target decoder/encoder are using." FORCE) message(STATUS "Building shaderc and dependencies from source") set(VULKAN_SDK_VERSION vulkan-sdk-1.4.313) # Fetch SPIRV-Headers first (needed by SPIRV-Tools) @@ -177,9 +175,6 @@ else() add_dependencies(shaderc_shared glslang SPIRV-Tools) endif() - set(SHADERC_LIB_SHARED_DIR ${SHADERC_LIBRARY_DIR}) - message(STATUS "shaderc lib directory: " ${SHADERC_LIB_SHARED_DIR}) - find_path(SHADERC_INCLUDE_DIR NAMES shaderc/shaderc.h PATHS "${CMAKE_BINARY_DIR}/_deps/shaderc-src/libshaderc/include" NO_DEFAULT_PATH) message(STATUS "shaderc inlcude directory: " ${SHADERC_INCLUDE_DIR}) include_directories(${SHADERC_INCLUDE_DIR}) @@ -265,26 +260,3 @@ if(SHADERC_INCLUDE_DIR AND SHADERC_LIBRARY) else() message(FATAL_ERROR "Could not find or build Shaderc") endif() - -# Add this section to check for system-installed shaderc on Linux -if(NOT DEFINED SHADERC_LIB_SHARED_DIR AND UNIX) - # Try to find system-installed shaderc on Linux - find_library(SHADERC_SHARED_LIB - NAMES shaderc_shared - PATHS - /usr/lib - /usr/lib64 - /usr/lib/x86_64-linux-gnu - /usr/local/lib - /usr/local/lib64 - /lib - /lib64 - ) - - if(SHADERC_SHARED_LIB) - get_filename_component(SHADERC_LIB_SHARED_DIR ${SHADERC_SHARED_LIB} DIRECTORY) - message(STATUS "Found Linux system shaderc at: ${SHADERC_LIB_SHARED_DIR}") - else() - message(WARNING "Could not find shaderc_shared library on Linux. Please install it using your package manager (e.g., apt install libshaderc-dev) or specify SHADERC_LIB_SHARED_DIR manually.") - endif() -endif() From 5ec1f566f22716adeaf8744fb4db7c26f52cbaf6 Mon Sep 17 00:00:00 2001 From: Srinath Kumarapuram Date: Tue, 3 Jun 2025 11:38:23 +0530 Subject: [PATCH 3/6] Remove duplicate messages about finding shaderc This limits the "shaderc found" message to the case where shaderc was actually found, and also slightly reduces the verbosity of the output. Signed-off-by: Srinath Kumarapuram --- cmake/FindShaderc.cmake | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cmake/FindShaderc.cmake b/cmake/FindShaderc.cmake index a2e96525..7f5cc14d 100644 --- a/cmake/FindShaderc.cmake +++ b/cmake/FindShaderc.cmake @@ -14,10 +14,9 @@ if( USE_SYSTEM_SHADERC) find_library(SHADERC_SHARED_LIBRARY NAMES shaderc_shared PATHS "${VULKAN_SDK_PATH}/lib" NO_DEFAULT_PATH) - message(STATUS "shaderc_shared found at " ${SHADERC_SHARED_LIBRARY}) if(SHADERC_SHARED_LIBRARY) - message(STATUS "Found shaderc in Vulkan SDK: ${SHADERC_SHARED_LIBRARY}") + message(STATUS "Found shaderc at: ${SHADERC_SHARED_LIBRARY}") set(shaderc_FOUND TRUE) # Store the Bin directory for later use get_filename_component(VULKAN_SDK_BIN_DIR "${SHADERC_SHARED_LIBRARY}" DIRECTORY) @@ -28,10 +27,9 @@ if( USE_SYSTEM_SHADERC) endif() else() find_library(SHADERC_SHARED_LIBRARY NAMES shaderc_shared shaderc) - message(STATUS "shaderc_shared found at " ${SHADERC_SHARED_LIBRARY}) if(SHADERC_SHARED_LIBRARY) - message(STATUS "Found shaderc in Vulkan SDK: ${SHADERC_SHARED_LIBRARY}") + message(STATUS "Found shaderc at: ${SHADERC_SHARED_LIBRARY}") set(shaderc_FOUND TRUE) # Store the Bin directory for later use get_filename_component(VULKAN_SDK_BIN_DIR "${SHADERC_SHARED_LIBRARY}" DIRECTORY) From bc2f4a8be197b697d7193a9afa6a0550e2bc037c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Thu, 26 Jun 2025 18:31:16 +0200 Subject: [PATCH 4/6] cmake: reorganize version detection in FindVulkanSDK First it detects if the system version is sufficient to support a given version such as VP9 decode extension 1.3.317 then if not it will use the main branch of Vulkan-Headers. --- CMakeLists.txt | 6 ++ cmake/FindVulkanSDK.cmake | 172 +++++++++++++++++++++----------------- 2 files changed, 100 insertions(+), 78 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index abc465e4..3713d318 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,12 @@ string(TOLOWER ${API_NAME} API_LOWERCASE) # Include common modules include(FindVulkanSDK) +# Search for Vulkan SDK minimum version +set (VULKAN_SDK_MIN_MAJOR_VERSION 1) +set (VULKAN_SDK_MIN_MINOR_VERSION 3) +set (VULKAN_SDK_MIN_PATCH_VERSION 317) +FIND_VULKAN_SDK(${VULKAN_SDK_MIN_MAJOR_VERSION} ${VULKAN_SDK_MIN_MINOR_VERSION} ${VULKAN_SDK_MIN_PATCH_VERSION}) + include(FindShaderc) ############ VULKAN_FFMPEG_LIB_PATH ###################################### diff --git a/cmake/FindVulkanSDK.cmake b/cmake/FindVulkanSDK.cmake index 4bdad99c..b1ec5f43 100644 --- a/cmake/FindVulkanSDK.cmake +++ b/cmake/FindVulkanSDK.cmake @@ -1,88 +1,104 @@ -# Fetch the latest Vulkan headers -FetchContent_Declare( - vulkan-headers - GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Headers.git - GIT_TAG main -) -FetchContent_MakeAvailable(vulkan-headers) - -set(Vulkan_INCLUDE_DIR ${vulkan-headers_SOURCE_DIR}/include CACHE PATH "Path to Vulkan include headers directory" FORCE) -set(VULKAN_HEADERS_INCLUDE_DIR ${vulkan-headers_SOURCE_DIR}/include CACHE PATH "Path to Vulkan local include headers directory" FORCE) - -message(STATUS "VULKAN_HEADERS_INCLUDE_DIR: ${VULKAN_HEADERS_INCLUDE_DIR}") - -if(EXISTS "${VULKAN_HEADERS_INCLUDE_DIR}/vulkan/vulkan_core.h") - file(STRINGS "${VULKAN_HEADERS_INCLUDE_DIR}/vulkan/vulkan_core.h" VK_HEADER_VERSION_LINE - REGEX "^#define VK_HEADER_VERSION ") - file(STRINGS "${VULKAN_HEADERS_INCLUDE_DIR}/vulkan/vulkan_core.h" VK_HEADER_VERSION_COMPLETE_LINE - REGEX "^#define VK_HEADER_VERSION_COMPLETE ") +MACRO(FIND_VULKAN_SDK minimum_major_version minimum_minor_version minimum_patch_version) + # Download and make the Vulkan Headers first before find_package because otherwise + # it will fait with: + # add_library cannot create ALIAS target "Vulkan::Headers" because another + # target with the same name already exists. + message(STATUS "Downloading Vulkan Headers") + FetchContent_Declare( + vulkan-headers + GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Headers.git + GIT_TAG main + ) + FetchContent_MakeAvailable(vulkan-headers) + + set (VK_MINIMUM_MAJOR_VERSION ${minimum_major_version}) + set (VK_MINIMUM_MINOR_VERSION ${minimum_minor_version}) + set (VK_MINIMUM_PATCH_VERSION ${minimum_patch_version}) + + # Find Vulkan SDK + if(WIN32) + # Try to find Vulkan SDK Bin directory + if(DEFINED ENV{VULKAN_SDK}) + file(TO_CMAKE_PATH "$ENV{VULKAN_SDK}" VULKAN_SDK_PATH) + set(VULKAN_HEADERS_INCLUDE_DIR ${VULKAN_SDK_PATH}/Include CACHE PATH "Path to Vulkan SDK include headers directory" FORCE) + endif() + else() + find_package(Vulkan QUIET) - message(STATUS "Vulkan Header Version Line: ${VK_HEADER_VERSION_LINE}") - message(STATUS "Vulkan Complete Version Line: ${VK_HEADER_VERSION_COMPLETE_LINE}") + if(Vulkan_FOUND) + # Set Vulkan headers path (we are using the local headers) + set(VULKAN_HEADERS_INCLUDE_DIR ${Vulkan_INCLUDE_DIR}) - # Extract version number from VK_HEADER_VERSION - string(REGEX MATCH "([0-9]+)$" _ ${VK_HEADER_VERSION_LINE}) - set(VK_PATCH_VERSION ${CMAKE_MATCH_1}) + # Additional Vulkan-related variables + set(VULKAN_LIBRARIES ${Vulkan_LIBRARIES}) - # Extract major and minor version - file(STRINGS "${VULKAN_HEADERS_INCLUDE_DIR}/vulkan/vulkan_core.h" VK_VERSION_1_3_LINE - REGEX "^#define VK_API_VERSION_1_3") - if(VK_VERSION_1_3_LINE) - set(VK_MAJOR_VERSION 1) - set(VK_MINOR_VERSION 3) + message(STATUS "VULKAN_HEADERS_INCLUDE_DIR: ${VULKAN_HEADERS_INCLUDE_DIR}") + else() + message(STATUS "Vulkan SDK not found. Will fetch and build required version.") + endif() endif() - # Compare versions - if(VK_MAJOR_VERSION EQUAL 1 AND VK_MINOR_VERSION EQUAL 3 AND VK_PATCH_VERSION LESS 302) - message(STATUS "System Vulkan SDK version ${VK_MAJOR_VERSION}.${VK_MINOR_VERSION}.${VK_PATCH_VERSION} is too old, will fetch and build required version") - set(USE_SYSTEM_VULKAN OFF) + if(EXISTS "${VULKAN_HEADERS_INCLUDE_DIR}/vulkan/vulkan_core.h") + file(STRINGS "${VULKAN_HEADERS_INCLUDE_DIR}/vulkan/vulkan_core.h" VK_HEADER_VERSION_LINE + REGEX "^#define VK_HEADER_VERSION ") + file(STRINGS "${VULKAN_HEADERS_INCLUDE_DIR}/vulkan/vulkan_core.h" VK_HEADER_VERSION_COMPLETE_LINE + REGEX "^#define VK_HEADER_VERSION_COMPLETE ") + + message(STATUS "Vulkan Header Version Line: ${VK_HEADER_VERSION_LINE}") + message(STATUS "Vulkan Complete Version Line: ${VK_HEADER_VERSION_COMPLETE_LINE}") + + # Extract version number from VK_HEADER_VERSION + string(REGEX MATCH "([0-9]+)$" _ ${VK_HEADER_VERSION_LINE}) + set(VK_PATCH_VERSION ${CMAKE_MATCH_1}) + + # Extract major and minor version + file(STRINGS "${VULKAN_HEADERS_INCLUDE_DIR}/vulkan/vulkan_core.h" VK_VERSION_1_3_LINE + REGEX "^#define VK_API_VERSION_1_3") + if(VK_VERSION_1_3_LINE) + set(VK_MAJOR_VERSION 1) + set(VK_MINOR_VERSION 3) + endif() + + # Compare versions + message(STATUS "Found Vulkan version: ${VK_MAJOR_VERSION}.${VK_MINOR_VERSION}.${VK_PATCH_VERSION}") + if(VK_MAJOR_VERSION LESS ${VK_MINIMUM_MAJOR_VERSION} OR VK_MINOR_VERSION LESS ${VK_MINIMUM_MINOR_VERSION} OR VK_PATCH_VERSION LESS ${VK_MINIMUM_PATCH_VERSION}) + message(STATUS "System Vulkan SDK version ${VK_MAJOR_VERSION}.${VK_MINOR_VERSION}.${VK_PATCH_VERSION} is too old, the minimum required version is ${VK_MINIMUM_MAJOR_VERSION}.${VK_MINIMUM_MINOR_VERSION}.${VK_MINIMUM_PATCH_VERSION}. Will fetch and build required version") + set(USE_SYSTEM_VULKAN OFF) + else() + message(STATUS "Found suitable Vulkan version on the system: ${VK_MAJOR_VERSION}.${VK_MINOR_VERSION}.${VK_PATCH_VERSION}") + set(USE_SYSTEM_VULKAN ON) + endif() else() - message(STATUS "Found suitable Vulkan version: ${VK_MAJOR_VERSION}.${VK_MINOR_VERSION}.${VK_PATCH_VERSION}") - set(USE_SYSTEM_VULKAN ON) + message(STATUS "Could not find vulkan_core.h in ${VULKAN_HEADERS_INCLUDE_DIR}. Will fetch and build required version") + set(USE_SYSTEM_VULKAN OFF) endif() -else() - set(USE_SYSTEM_VULKAN OFF) -endif() - -# Find Vulkan SDK -find_package(Vulkan QUIET) -if(Vulkan_FOUND) - # Set Vulkan headers path (we are using the local headers) - # set(VULKAN_HEADERS_INCLUDE_DIR ${Vulkan_INCLUDE_DIR}) + # Optional: Find other dependencies like SPIRV-Tools if needed - # Additional Vulkan-related variables - set(VULKAN_LIBRARIES ${Vulkan_LIBRARIES}) - - # Check for required components - if(NOT EXISTS "${VULKAN_HEADERS_INCLUDE_DIR}/vulkan/vulkan.h") - message(STATUS "Could not find vulkan.h in ${VULKAN_HEADERS_INCLUDE_DIR}") + if(USE_SYSTEM_VULKAN) + # Use system Vulkan + message(STATUS "Using system Vulkan SDK") + get_filename_component(VULKAN_LIB_DIR "${Vulkan_LIBRARIES}" DIRECTORY) + else() + # Fetch the latest Vulkan headers + message(STATUS "Building Vulkan components from source") + + set(Vulkan_INCLUDE_DIR ${vulkan-headers_SOURCE_DIR}/include CACHE PATH "Path to Vulkan include headers directory" FORCE) + set(VULKAN_HEADERS_INCLUDE_DIR ${vulkan-headers_SOURCE_DIR}/include CACHE PATH "Path to Vulkan local include headers directory" FORCE) + # Fetch and build our own Vulkan components + message(STATUS "VULKAN_HEADERS_INCLUDE_DIR: ${VULKAN_HEADERS_INCLUDE_DIR}") + + # Set Vulkan Loader options to disable tests + set(BUILD_TESTS OFF CACHE BOOL "Disable Vulkan-Loader tests" FORCE) + + # Fetch the Vulkan Loader + FetchContent_Declare( + vulkan-loader + GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Loader.git + GIT_TAG main + ) + FetchContent_MakeAvailable(vulkan-loader) + set(VULKAN_LOADER_LIBRARY_DIR "${CMAKE_BINARY_DIR}/_deps/vulkan-loader-build/loader") + link_directories(${VULKAN_LOADER_LIBRARY_DIR}) endif() -else() - message(STATUS "Vulkan SDK not found. Please install Vulkan SDK.") -endif() - -# Optional: Find other dependencies like SPIRV-Tools if needed - -if(USE_SYSTEM_VULKAN) - # Use system Vulkan - message(STATUS "Using system Vulkan SDK") - get_filename_component(VULKAN_LIB_DIR "${Vulkan_LIBRARIES}" DIRECTORY) -else() - # Fetch and build our own Vulkan components - message(STATUS "Building Vulkan components from source") - - # Set Vulkan Loader options to disable tests - set(BUILD_TESTS OFF CACHE BOOL "Disable Vulkan-Loader tests" FORCE) - - # Fetch the Vulkan Loader - FetchContent_Declare( - vulkan-loader - GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Loader.git - GIT_TAG main - ) - FetchContent_MakeAvailable(vulkan-loader) - set(VULKAN_LOADER_LIBRARY_DIR "${CMAKE_BINARY_DIR}/_deps/vulkan-loader-build/loader") - link_directories(${VULKAN_LOADER_LIBRARY_DIR}) -endif() - +ENDMACRO(FIND_VULKAN_SDK) \ No newline at end of file From 030eef625d529f85352cae7dcd762520d153b763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Thu, 26 Jun 2025 18:34:47 +0200 Subject: [PATCH 5/6] cmake: add include directory after vulkan headers in FindShaderc As the system can have a vulkan sdk but not the sufficient version such as 1.3.317 for VP9 decode extension,VULKAN_HEADERS_INCLUDE_DIR should go first and then SHADERC_INCLUDE_DIR in the list of include dirs because SHADERC_INCLUDE_DIR might be the Vulkan headers include dir. So include_directories has been removed from FindShaderc and SHADERC_INCLUDE_DIR has been added in root CMakeLists.txt --- CMakeLists.txt | 1 + cmake/FindShaderc.cmake | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3713d318..85cfde04 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -159,6 +159,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/include ${CMAKE_BINARY_DIR} ${VULKAN_HEADERS_INCLUDE_DIR} + ${SHADERC_INCLUDE_DIR} ${Vulkan_INCLUDE_DIR} ) diff --git a/cmake/FindShaderc.cmake b/cmake/FindShaderc.cmake index 7f5cc14d..4b84cb02 100644 --- a/cmake/FindShaderc.cmake +++ b/cmake/FindShaderc.cmake @@ -174,8 +174,7 @@ else() endif() find_path(SHADERC_INCLUDE_DIR NAMES shaderc/shaderc.h PATHS "${CMAKE_BINARY_DIR}/_deps/shaderc-src/libshaderc/include" NO_DEFAULT_PATH) - message(STATUS "shaderc inlcude directory: " ${SHADERC_INCLUDE_DIR}) - include_directories(${SHADERC_INCLUDE_DIR}) + message(STATUS "shaderc include directory: " ${SHADERC_INCLUDE_DIR}) # After all the FetchContent_MakeAvailable calls and dependencies setup, add: if(WIN32) @@ -254,7 +253,6 @@ endif() if(SHADERC_INCLUDE_DIR AND SHADERC_LIBRARY) message(STATUS "Found Shaderc: ${SHADERC_LIBRARY}") message(STATUS "Shaderc include: ${SHADERC_INCLUDE_DIR}") - include_directories(${SHADERC_INCLUDE_DIR}) else() message(FATAL_ERROR "Could not find or build Shaderc") endif() From ca4cebe57bb21fd2a2d1fe3e3b656cab0b9cf944 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Fri, 27 Jun 2025 17:21:35 +0200 Subject: [PATCH 6/6] doc: update BUILD.md libmirclient-dev does not exist anymore. Fix the CMAKE_INSTALL_PREFIX setting for Windows. --- BUILD.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BUILD.md b/BUILD.md index fba73836..df50975e 100644 --- a/BUILD.md +++ b/BUILD.md @@ -78,9 +78,9 @@ Windows 10 or Windows 11 with the following software packages: For Debug build: ```bash For X86_64 based platforms: - cmake . -B build -DCMAKE_GENERATOR_PLATFORM=x64 -DCMAKE_INSTALL_PREFIX="$(PWD)/build/install/Debug" -DCMAKE_BUILD_TYPE=Debug + cmake . -B build -DCMAKE_GENERATOR_PLATFORM=x64 -DCMAKE_INSTALL_PREFIX="./build/install/Debug" -DCMAKE_BUILD_TYPE=Debug For ARM64 based platforms: - cmake . -B build -DCMAKE_GENERATOR_PLATFORM=ARM64 -DCMAKE_INSTALL_PREFIX="$(PWD)/build/install/Debug" -DCMAKE_BUILD_TYPE=Debug + cmake . -B build -DCMAKE_GENERATOR_PLATFORM=ARM64 -DCMAKE_INSTALL_PREFIX="./build/install/Debug" -DCMAKE_BUILD_TYPE=Debug cmake --build build --parallel 16 --config Debug cmake --build build --config Debug --target INSTALL ``` @@ -107,7 +107,7 @@ This repository has been tested on recent Ubuntu LTS versions. Minimum requireme Required packages: ```bash sudo apt-get install git cmake build-essential libx11-xcb-dev libxkbcommon-dev \ - libmirclient-dev libwayland-dev libxrandr-dev libavcodec-dev \ + libwayland-dev libxrandr-dev libavcodec-dev \ libavformat-dev libavutil-dev ninja-build ```