@@ -15,6 +15,32 @@ function(detect_host_compiler)
15
15
set (HOST_CXX_COMPILER "${HOST_CXX_COMPILER} " PARENT_SCOPE )
16
16
endfunction ()
17
17
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
+
18
44
if (Vulkan_FOUND )
19
45
message (STATUS "Vulkan found" )
20
46
@@ -23,69 +49,35 @@ if (Vulkan_FOUND)
23
49
../../include/ggml-vulkan.h
24
50
)
25
51
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
+ )
57
56
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
+ )
64
63
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
+ )
73
69
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
+ )
80
75
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
+ )
89
81
90
82
target_link_libraries (ggml-vulkan PRIVATE Vulkan::Vulkan )
91
83
target_include_directories (ggml-vulkan PRIVATE ${CMAKE_CURRENT_BINARY_DIR} )
@@ -124,16 +116,8 @@ if (Vulkan_FOUND)
124
116
add_compile_definitions (GGML_VULKAN_RUN_TESTS )
125
117
endif ()
126
118
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 )
137
121
if (GGML_VULKAN_SHADERS_GEN_TOOLCHAIN )
138
122
set (HOST_CMAKE_TOOLCHAIN_FILE ${GGML_VULKAN_SHADERS_GEN_TOOLCHAIN} )
139
123
else ()
@@ -146,25 +130,31 @@ if (Vulkan_FOUND)
146
130
configure_file (${CMAKE_CURRENT_SOURCE_DIR} /cmake/host-toolchain.cmake.in ${CMAKE_BINARY_DIR} /host-toolchain.cmake @ONLY )
147
131
set (HOST_CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR} /host-toolchain.cmake )
148
132
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 )
150
140
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} " )
167
145
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
+
168
158
set (_ggml_vk_host_suffix $< IF:$< STREQUAL:${CMAKE_HOST_SYSTEM_NAME} ,Windows> ,.exe,> )
169
159
set (_ggml_vk_genshaders_cmd ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} /vulkan-shaders-gen${_ggml_vk_host_suffix} )
170
160
set (_ggml_vk_header ${CMAKE_CURRENT_BINARY_DIR} /ggml-vulkan-shaders.hpp )
@@ -175,9 +165,8 @@ if (Vulkan_FOUND)
175
165
file (GLOB _ggml_vk_shader_deps "${_ggml_vk_input_dir} /*.comp" )
176
166
set (_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen )
177
167
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 )
181
170
182
171
add_custom_command (
183
172
OUTPUT ${_ggml_vk_header}
0 commit comments