@@ -15,6 +15,32 @@ function(detect_host_compiler)
1515 set (HOST_CXX_COMPILER "${HOST_CXX_COMPILER} " PARENT_SCOPE)
1616endfunction ()
1717
18+ # Function to test shader extension support
19+ # Parameters:
20+ # EXTENSION_NAME - Name of the extension to test (e.g., "GL_EXT_integer_dot_product")
21+ # TEST_SHADER_FILE - Path to the test shader file
22+ # RESULT_VARIABLE - Name of the variable to set (ON/OFF) based on test result
23+ function (test_shader_extension_support EXTENSION_NAME TEST_SHADER_FILE RESULT_VARIABLE )
24+ execute_process (
25+ COMMAND ${Vulkan_GLSLC_EXECUTABLE} -o - -fshader-stage=compute --target -env=vulkan1.3 "${TEST_SHADER_FILE} "
26+ OUTPUT_VARIABLE glslc_output
27+ ERROR_VARIABLE glslc_error
28+ )
29+
30+ if (${glslc_error} MATCHES ".*extension not supported: ${EXTENSION_NAME} .*" )
31+ message (STATUS "${EXTENSION_NAME} not supported by glslc" )
32+ set (${RESULT_VARIABLE} OFF PARENT_SCOPE)
33+ else ()
34+ message (STATUS "${EXTENSION_NAME} supported by glslc" )
35+ set (${RESULT_VARIABLE} ON PARENT_SCOPE)
36+ add_compile_definitions (${RESULT_VARIABLE} )
37+
38+ # Ensure the extension support is forwarded to vulkan-shaders-gen
39+ list (APPEND VULKAN_SHADER_GEN_CMAKE_ARGS -D${RESULT_VARIABLE} =ON )
40+ set (VULKAN_SHADER_GEN_CMAKE_ARGS "${VULKAN_SHADER_GEN_CMAKE_ARGS} " PARENT_SCOPE)
41+ endif ()
42+ endfunction ()
43+
1844if (Vulkan_FOUND)
1945 message (STATUS "Vulkan found" )
2046
@@ -23,69 +49,35 @@ if (Vulkan_FOUND)
2349 ../../include /ggml-vulkan.h
2450 )
2551
26- # Compile a test shader to determine whether GL_KHR_cooperative_matrix is supported.
27- # If it's not, there will be an error to stderr.
28- # If it's supported, set a define to indicate that we should compile those shaders
29- execute_process (COMMAND ${Vulkan_GLSLC_EXECUTABLE} -o - -fshader-stage=compute --target -env=vulkan1.3 "${CMAKE_CURRENT_SOURCE_DIR} /vulkan-shaders/test_coopmat_support.comp"
30- OUTPUT_VARIABLE glslc_output
31- ERROR_VARIABLE glslc_error)
32-
33- if (${glslc_error} MATCHES ".*extension not supported: GL_KHR_cooperative_matrix.*" )
34- message (STATUS "GL_KHR_cooperative_matrix not supported by glslc" )
35- set (GGML_VULKAN_COOPMAT_GLSLC_SUPPORT OFF )
36- else ()
37- message (STATUS "GL_KHR_cooperative_matrix supported by glslc" )
38- set (GGML_VULKAN_COOPMAT_GLSLC_SUPPORT ON )
39- add_compile_definitions (GGML_VULKAN_COOPMAT_GLSLC_SUPPORT)
40- endif ()
41-
42- # Compile a test shader to determine whether GL_NV_cooperative_matrix2 is supported.
43- # If it's not, there will be an error to stderr.
44- # If it's supported, set a define to indicate that we should compile those shaders
45- execute_process (COMMAND ${Vulkan_GLSLC_EXECUTABLE} -o - -fshader-stage=compute --target -env=vulkan1.3 "${CMAKE_CURRENT_SOURCE_DIR} /vulkan-shaders/test_coopmat2_support.comp"
46- OUTPUT_VARIABLE glslc_output
47- ERROR_VARIABLE glslc_error)
48-
49- if (${glslc_error} MATCHES ".*extension not supported: GL_NV_cooperative_matrix2.*" )
50- message (STATUS "GL_NV_cooperative_matrix2 not supported by glslc" )
51- set (GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT OFF )
52- else ()
53- message (STATUS "GL_NV_cooperative_matrix2 supported by glslc" )
54- set (GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT ON )
55- add_compile_definitions (GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT)
56- endif ()
52+ set (VULKAN_SHADER_GEN_CMAKE_ARGS
53+ -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}
54+ -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
55+ )
5756
58- # Compile a test shader to determine whether GL_EXT_integer_dot_product is supported.
59- # If it's not, there will be an error to stderr.
60- # If it's supported, set a define to indicate that we should compile those shaders
61- execute_process ( COMMAND ${Vulkan_GLSLC_EXECUTABLE} -o - -fshader-stage=compute -- target -env=vulkan1.3 "${CMAKE_CURRENT_SOURCE_DIR} /vulkan-shaders/test_integer_dot_support .comp"
62- OUTPUT_VARIABLE glslc_output
63- ERROR_VARIABLE glslc_error )
57+ # Test all shader extensions
58+ test_shader_extension_support(
59+ "GL_KHR_cooperative_matrix"
60+ "${CMAKE_CURRENT_SOURCE_DIR} /vulkan-shaders/test_coopmat_support .comp"
61+ "GGML_VULKAN_COOPMAT_GLSLC_SUPPORT"
62+ )
6463
65- if (${glslc_error} MATCHES ".*extension not supported: GL_EXT_integer_dot_product.*" )
66- message (STATUS "GL_EXT_integer_dot_product not supported by glslc" )
67- set (GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT OFF )
68- else ()
69- message (STATUS "GL_EXT_integer_dot_product supported by glslc" )
70- set (GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT ON )
71- add_compile_definitions (GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT)
72- endif ()
64+ test_shader_extension_support(
65+ "GL_NV_cooperative_matrix2"
66+ "${CMAKE_CURRENT_SOURCE_DIR} /vulkan-shaders/test_coopmat2_support.comp"
67+ "GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT"
68+ )
7369
74- # Compile a test shader to determine whether GL_EXT_bfloat16 is supported.
75- # If it's not, there will be an error to stderr.
76- # If it's supported, set a define to indicate that we should compile those shaders
77- execute_process (COMMAND ${Vulkan_GLSLC_EXECUTABLE} -o - -fshader-stage=compute --target -env=vulkan1.3 "${CMAKE_CURRENT_SOURCE_DIR} /vulkan-shaders/test_bfloat16_support.comp"
78- OUTPUT_VARIABLE glslc_output
79- ERROR_VARIABLE glslc_error)
70+ test_shader_extension_support(
71+ "GL_EXT_integer_dot_product"
72+ "${CMAKE_CURRENT_SOURCE_DIR} /vulkan-shaders/test_integer_dot_support.comp"
73+ "GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT"
74+ )
8075
81- if (${glslc_error} MATCHES ".*extension not supported: GL_EXT_bfloat16.*" )
82- message (STATUS "GL_EXT_bfloat16 not supported by glslc" )
83- set (GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT OFF )
84- else ()
85- message (STATUS "GL_EXT_bfloat16 supported by glslc" )
86- set (GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT ON )
87- add_compile_definitions (GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT)
88- endif ()
76+ test_shader_extension_support(
77+ "GL_EXT_bfloat16"
78+ "${CMAKE_CURRENT_SOURCE_DIR} /vulkan-shaders/test_bfloat16_support.comp"
79+ "GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT"
80+ )
8981
9082 target_link_libraries (ggml-vulkan PRIVATE Vulkan::Vulkan)
9183 target_include_directories (ggml-vulkan PRIVATE ${CMAKE_CURRENT_BINARY_DIR} )
@@ -124,16 +116,8 @@ if (Vulkan_FOUND)
124116 add_compile_definitions (GGML_VULKAN_RUN_TESTS)
125117 endif ()
126118
127- if (NOT CMAKE_CROSSCOMPILING )
128- add_subdirectory (vulkan-shaders)
129- if (MSVC )
130- foreach (CONFIG ${CMAKE_CONFIGURATION_TYPES} )
131- string (TOUPPER ${CONFIG} CONFIG)
132- set_target_properties (vulkan-shaders-gen PROPERTIES
133- RUNTIME_OUTPUT_DIRECTORY_${CONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} )
134- endforeach ()
135- endif ()
136- else ()
119+ # Set up toolchain for host compilation whether cross-compiling or not
120+ if (CMAKE_CROSSCOMPILING )
137121 if (GGML_VULKAN_SHADERS_GEN_TOOLCHAIN)
138122 set (HOST_CMAKE_TOOLCHAIN_FILE ${GGML_VULKAN_SHADERS_GEN_TOOLCHAIN} )
139123 else ()
@@ -146,25 +130,31 @@ if (Vulkan_FOUND)
146130 configure_file (${CMAKE_CURRENT_SOURCE_DIR} /cmake/host-toolchain.cmake.in ${CMAKE_BINARY_DIR} /host-toolchain.cmake @ONLY)
147131 set (HOST_CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR} /host-toolchain.cmake)
148132 endif ()
149- message (STATUS "vulkan-shaders-gen toolchain file: ${HOST_CMAKE_TOOLCHAIN_FILE} " )
133+ else ()
134+ # For non-cross-compiling, use empty toolchain (use host compiler)
135+ set (HOST_CMAKE_TOOLCHAIN_FILE "" )
136+ endif ()
137+
138+ # Always use ExternalProject_Add approach
139+ include (ExternalProject)
150140
151- include (ExternalProject)
152- # Native build through ExternalProject_Add
153- ExternalProject_Add(
154- vulkan-shaders-gen
155- SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} /vulkan-shaders
156- CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${HOST_CMAKE_TOOLCHAIN_FILE}
157- -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}
158- -DGGML_VULKAN_COOPMAT_GLSLC_SUPPORT=${GGML_VULKAN_COOPMAT_GLSLC_SUPPORT}
159- -DGGML_VULKAN_COOPMAT2_GLSLC_SUPPORT=${GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT}
160- -DGGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT=${GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT}
161- -DGGML_VULKAN_BFLOAT16_GLSLC_SUPPORT=${GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT}
162- BUILD_COMMAND ${CMAKE_COMMAND} --build .
163- INSTALL_COMMAND ${CMAKE_COMMAND} --install .
164- INSTALL_DIR ${CMAKE_BINARY_DIR}
165- )
166- ExternalProject_Add_StepTargets(vulkan-shaders-gen build install )
141+ # Add toolchain file if cross-compiling
142+ if (CMAKE_CROSSCOMPILING )
143+ list (APPEND VULKAN_SHADER_GEN_CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${HOST_CMAKE_TOOLCHAIN_FILE} )
144+ message (STATUS "vulkan-shaders-gen toolchain file: ${HOST_CMAKE_TOOLCHAIN_FILE} " )
167145 endif ()
146+
147+ # Native build through ExternalProject_Add
148+ ExternalProject_Add(
149+ vulkan-shaders-gen
150+ SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} /vulkan-shaders
151+ CMAKE_ARGS ${VULKAN_SHADER_GEN_CMAKE_ARGS}
152+ BUILD_COMMAND ${CMAKE_COMMAND} --build .
153+ INSTALL_COMMAND ${CMAKE_COMMAND} --install .
154+ INSTALL_DIR ${CMAKE_BINARY_DIR}
155+ )
156+ ExternalProject_Add_StepTargets(vulkan-shaders-gen build install )
157+
168158 set (_ggml_vk_host_suffix $<IF:$<STREQUAL :${CMAKE_HOST_SYSTEM_NAME} ,Windows>,.exe,>)
169159 set (_ggml_vk_genshaders_cmd ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /vulkan-shaders-gen${_ggml_vk_host_suffix} )
170160 set (_ggml_vk_header ${CMAKE_CURRENT_BINARY_DIR} /ggml-vulkan-shaders.hpp)
@@ -175,9 +165,8 @@ if (Vulkan_FOUND)
175165 file (GLOB _ggml_vk_shader_deps "${_ggml_vk_input_dir} /*.comp" )
176166 set (_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen)
177167
178- if (CMAKE_CROSSCOMPILING )
179- set (_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen-build vulkan-shaders-gen-install )
180- endif ()
168+ # Add build and install dependencies for all builds
169+ set (_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen-build vulkan-shaders-gen-install )
181170
182171 add_custom_command (
183172 OUTPUT ${_ggml_vk_header}
0 commit comments