@@ -47,7 +47,33 @@ include_directories(BEFORE ${VK_VIDEO_COMMON_LIBS_SOURCE_ROOT})
4747add_library (${VULKAN_VIDEO_PARSER_LIB} SHARED ${LIBNVPARSER} )
4848add_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)
126175endif ()
127176
128177target_include_directories (${VULKAN_VIDEO_PARSER_LIB} PUBLIC ${VULKAN_VIDEO_PARSER_INCLUDE} ${VULKAN_VIDEO_PARSER_INCLUDE} /../NvVideoParser PRIVATE include )
0 commit comments