Skip to content

Commit 51844b0

Browse files
elimadabrain34
authored andcommitted
cmake: improves cross-compilation detection and conditional compiler flags
AVX512 flags are currently being added regardless of the arch. This patch fixes that and improves cross-compilation handling.
1 parent c5155c0 commit 51844b0

File tree

1 file changed

+59
-10
lines changed

1 file changed

+59
-10
lines changed

vk_video_decoder/libs/NvVideoParser/CMakeLists.txt

Lines changed: 59 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,33 @@ include_directories(BEFORE ${VK_VIDEO_COMMON_LIBS_SOURCE_ROOT})
4747
add_library(${VULKAN_VIDEO_PARSER_LIB} SHARED ${LIBNVPARSER})
4848
add_library(${VULKAN_VIDEO_PARSER_STATIC_LIB} STATIC ${LIBNVPARSER})
4949

50-
if ((CMAKE_GENERATOR_PLATFORM MATCHES "^aarch64") OR (CMAKE_GENERATOR_PLATFORM MATCHES "^arm64") OR (CMAKE_GENERATOR_PLATFORM MATCHES "^ARM64"))
50+
# Check compiler-defined macros for architecture detection
51+
include(CheckCXXSourceCompiles)
52+
check_cxx_source_compiles("
53+
#if defined(__aarch64__) || defined(_M_ARM64)
54+
int main() { return 0; }
55+
#else
56+
#error Not AArch64
57+
#endif
58+
" IS_AARCH64)
59+
60+
check_cxx_source_compiles("
61+
#if defined(__arm__) || defined(_M_ARM)
62+
int main() { return 0; }
63+
#else
64+
#error Not ARM
65+
#endif
66+
" IS_ARM)
67+
68+
check_cxx_source_compiles("
69+
#if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)
70+
int main() { return 0; }
71+
#else
72+
#error Not x86
73+
#endif
74+
" IS_X86)
75+
76+
if (IS_AARCH64 OR (CMAKE_GENERATOR_PLATFORM MATCHES "^aarch64") OR (CMAKE_GENERATOR_PLATFORM MATCHES "^arm64") OR (CMAKE_GENERATOR_PLATFORM MATCHES "^ARM64"))
5177
MESSAGE(STATUS "Parser optimization for ARM64 ${CMAKE_SYSTEM_PROCESSOR}")
5278
if(WIN32)
5379
MESSAGE(STATUS "Parser optimizations selected for WIN32 armv8.0 and armv8.0+sve")
@@ -76,7 +102,7 @@ if ((CMAKE_GENERATOR_PLATFORM MATCHES "^aarch64") OR (CMAKE_GENERATOR_PLATFORM M
76102
target_link_libraries(${VULKAN_VIDEO_PARSER_LIB} next_start_code_c next_start_code_neon next_start_code_sve)
77103
target_link_libraries(${VULKAN_VIDEO_PARSER_STATIC_LIB} next_start_code_c next_start_code_neon next_start_code_sve)
78104
endif()
79-
elseif ((CMAKE_GENERATOR_PLATFORM MATCHES "^arm") OR (CMAKE_GENERATOR_PLATFORM MATCHES "^ARM"))
105+
elseif (IS_ARM OR (CMAKE_GENERATOR_PLATFORM MATCHES "^arm") OR (CMAKE_GENERATOR_PLATFORM MATCHES "^ARM"))
80106
MESSAGE(STATUS "Parser optimization for ARM ${CMAKE_SYSTEM_PROCESSOR}")
81107
if(WIN32)
82108
MESSAGE(STATUS "Parser optimizations selected for WIN32 VFPv4")
@@ -93,7 +119,7 @@ elseif ((CMAKE_GENERATOR_PLATFORM MATCHES "^arm") OR (CMAKE_GENERATOR_PLATFORM M
93119
MESSAGE(STATUS "Parser optimizations linking ARM next_start_code_c next_start_code_neon")
94120
target_link_libraries(${VULKAN_VIDEO_PARSER_LIB} next_start_code_c next_start_code_neon)
95121
target_link_libraries(${VULKAN_VIDEO_PARSER_STATIC_LIB} next_start_code_c next_start_code_neon)
96-
else()
122+
elseif (IS_X86)
97123
MESSAGE(STATUS "Parser optimization for X86 ${CMAKE_SYSTEM_PROCESSOR}")
98124
if(WIN32)
99125
MESSAGE(STATUS "Parser optimizations selected for WIN32 SSE2 AVX2")
@@ -114,15 +140,38 @@ else()
114140
add_library(next_start_code_avx2 OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/src/NextStartCodeAVX2.cpp include)
115141
set_target_properties(next_start_code_avx2 PROPERTIES COMPILE_FLAGS ${AVX2_CPU_FEATURE} )
116142
target_include_directories(next_start_code_avx2 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
117-
add_library(next_start_code_avx512 OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/src/NextStartCodeAVX512.cpp include)
118-
MESSAGE(STATUS "Parser optimizations adding x86 NextStartCodeSSSE3.cpp NextStartCodeAVX2.cpp NextStartCodeAVX512.cpp")
143+
# Check if compiler supports AVX512 before trying to use it
119144
if(NOT WIN32)
120-
set_target_properties(next_start_code_avx512 PROPERTIES COMPILE_FLAGS ${AVX512_CPU_FEATURE} )
145+
include(CheckCXXCompilerFlag)
146+
check_cxx_compiler_flag("-mavx512f -mavx512bw" COMPILER_SUPPORTS_AVX512)
147+
if(COMPILER_SUPPORTS_AVX512)
148+
add_library(next_start_code_avx512 OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/src/NextStartCodeAVX512.cpp include)
149+
set_target_properties(next_start_code_avx512 PROPERTIES COMPILE_FLAGS ${AVX512_CPU_FEATURE} )
150+
target_include_directories(next_start_code_avx512 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
151+
MESSAGE(STATUS "Parser optimizations linking x86 next_start_code_c next_start_code_ssse3 next_start_code_avx2 next_start_code_avx512")
152+
target_link_libraries(${VULKAN_VIDEO_PARSER_LIB} next_start_code_c next_start_code_ssse3 next_start_code_avx2 next_start_code_avx512)
153+
target_link_libraries(${VULKAN_VIDEO_PARSER_STATIC_LIB} next_start_code_c next_start_code_ssse3 next_start_code_avx2 next_start_code_avx512)
154+
else()
155+
MESSAGE(STATUS "Compiler doesn't support AVX512, falling back to AVX2")
156+
MESSAGE(STATUS "Parser optimizations linking x86 next_start_code_c next_start_code_ssse3 next_start_code_avx2")
157+
target_link_libraries(${VULKAN_VIDEO_PARSER_LIB} next_start_code_c next_start_code_ssse3 next_start_code_avx2)
158+
target_link_libraries(${VULKAN_VIDEO_PARSER_STATIC_LIB} next_start_code_c next_start_code_ssse3 next_start_code_avx2)
159+
endif()
160+
else()
161+
# Windows doesn't use AVX512 flags
162+
add_library(next_start_code_avx512 OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/src/NextStartCodeAVX512.cpp include)
163+
target_include_directories(next_start_code_avx512 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
164+
MESSAGE(STATUS "Parser optimizations linking x86 next_start_code_c next_start_code_ssse3 next_start_code_avx2 next_start_code_avx512")
165+
target_link_libraries(${VULKAN_VIDEO_PARSER_LIB} next_start_code_c next_start_code_ssse3 next_start_code_avx2 next_start_code_avx512)
166+
target_link_libraries(${VULKAN_VIDEO_PARSER_STATIC_LIB} next_start_code_c next_start_code_ssse3 next_start_code_avx2 next_start_code_avx512)
121167
endif()
122-
target_include_directories(next_start_code_avx512 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
123-
MESSAGE(STATUS "Parser optimizations linking x86 next_start_code_c next_start_code_ssse3 next_start_code_avx2 next_start_code_avx512")
124-
target_link_libraries(${VULKAN_VIDEO_PARSER_LIB} next_start_code_c next_start_code_ssse3 next_start_code_avx2 next_start_code_avx512)
125-
target_link_libraries(${VULKAN_VIDEO_PARSER_STATIC_LIB} next_start_code_c next_start_code_ssse3 next_start_code_avx2 next_start_code_avx512)
168+
else()
169+
# Fallback for non-x86/ARM architectures (RISC-V, PowerPC, MIPS, etc.)
170+
MESSAGE(STATUS "Parser optimization: Using generic C implementation for ${CMAKE_SYSTEM_PROCESSOR} architecture")
171+
add_library(next_start_code_c OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/src/NextStartCodeC.cpp include)
172+
target_include_directories(next_start_code_c PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
173+
target_link_libraries(${VULKAN_VIDEO_PARSER_LIB} next_start_code_c)
174+
target_link_libraries(${VULKAN_VIDEO_PARSER_STATIC_LIB} next_start_code_c)
126175
endif()
127176

128177
target_include_directories(${VULKAN_VIDEO_PARSER_LIB} PUBLIC ${VULKAN_VIDEO_PARSER_INCLUDE} ${VULKAN_VIDEO_PARSER_INCLUDE}/../NvVideoParser PRIVATE include)

0 commit comments

Comments
 (0)