Skip to content

Commit 1fa821d

Browse files
bandotiSilver267
authored andcommitted
cmake: simplify vulkan shader test logic (ggml-org#13263)
1 parent f30f486 commit 1fa821d

File tree

2 files changed

+95
-89
lines changed

2 files changed

+95
-89
lines changed

ggml/src/ggml-vulkan/CMakeLists.txt

Lines changed: 78 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,32 @@ function(detect_host_compiler)
1515
set(HOST_CXX_COMPILER "${HOST_CXX_COMPILER}" PARENT_SCOPE)
1616
endfunction()
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+
1844
if (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}

ggml/src/ggml-vulkan/vulkan-shaders/CMakeLists.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,35 @@ find_package (Threads REQUIRED)
55

66
if (GGML_VULKAN_COOPMAT_GLSLC_SUPPORT)
77
add_compile_definitions(GGML_VULKAN_COOPMAT_GLSLC_SUPPORT)
8+
message(STATUS "Enabling coopmat glslc support")
89
endif()
910
if (GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT)
1011
add_compile_definitions(GGML_VULKAN_COOPMAT2_GLSLC_SUPPORT)
12+
message(STATUS "Enabling coopmat2 glslc support")
1113
endif()
1214
if (GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT)
1315
add_compile_definitions(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT)
16+
message(STATUS "Enabling dot glslc support")
1417
endif()
1518
if (GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT)
1619
add_compile_definitions(GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT)
20+
message(STATUS "Enabling bfloat16 glslc support")
1721
endif()
22+
1823
set(TARGET vulkan-shaders-gen)
1924
add_executable(${TARGET} vulkan-shaders-gen.cpp)
2025
install(TARGETS ${TARGET} RUNTIME)
2126
target_compile_features(${TARGET} PRIVATE cxx_std_17)
2227
target_link_libraries(vulkan-shaders-gen PUBLIC Threads::Threads)
28+
29+
# Configure output directories for MSVC builds
30+
if(MSVC)
31+
# Get the main project's runtime output directory if possible
32+
if(DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY)
33+
foreach(CONFIG ${CMAKE_CONFIGURATION_TYPES})
34+
string(TOUPPER ${CONFIG} CONFIG)
35+
set_target_properties(${TARGET} PROPERTIES
36+
RUNTIME_OUTPUT_DIRECTORY_${CONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
37+
endforeach()
38+
endif()
39+
endif()

0 commit comments

Comments
 (0)