Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ggml/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ option(GGML_VULKAN_MEMORY_DEBUG "ggml: enable Vulkan memory debug ou
option(GGML_VULKAN_SHADER_DEBUG_INFO "ggml: enable Vulkan shader debug info" OFF)
option(GGML_VULKAN_VALIDATE "ggml: enable Vulkan validation" OFF)
option(GGML_VULKAN_RUN_TESTS "ggml: run Vulkan tests" OFF)
option(GGML_VULKAN_SHADER_DEV "ggml: read shaders from disk, don't embed" OFF)
option(GGML_WEBGPU "ggml: use WebGPU" OFF)
option(GGML_WEBGPU_DEBUG "ggml: enable WebGPU debug output" OFF)
option(GGML_ZDNN "ggml: use zDNN" OFF)
Expand Down
30 changes: 28 additions & 2 deletions ggml/src/ggml-vulkan/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ if (Vulkan_FOUND)
set (_ggml_vk_source "${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.cpp")
set (_ggml_vk_input_dir "${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders")
set (_ggml_vk_output_dir "${CMAKE_CURRENT_BINARY_DIR}/vulkan-shaders.spv")
set (_ggml_vk_shaders_gen_output ${_ggml_vk_header} ${_ggml_vk_source})

file(GLOB _ggml_vk_shader_files CONFIGURE_DEPENDS "${_ggml_vk_input_dir}/*.comp")

Expand All @@ -174,9 +175,15 @@ if (Vulkan_FOUND)
CONFIGURE_DEPENDS "${_ggml_vk_input_dir}/*.cpp"
"${_ggml_vk_input_dir}/*.h")

if(GGML_VULKAN_SHADER_DEV)
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/vulkan-shaders")
set(_ggml_vk_shader_cmake_file "${CMAKE_CURRENT_BINARY_DIR}/vulkan-shaders/CMakeLists.txt")
set(_ggml_vk_shader_dev_args --no-embed --cmake ${_ggml_vk_shader_cmake_file})
set(_ggml_vk_shaders_gen_output ${_ggml_vk_shader_cmake_file})
endif()

add_custom_command(
OUTPUT ${_ggml_vk_header}
${_ggml_vk_source}
OUTPUT ${_ggml_vk_shaders_gen_output}

COMMAND ${_ggml_vk_genshaders_cmd}
--glslc ${Vulkan_GLSLC_EXECUTABLE}
Expand All @@ -185,6 +192,7 @@ if (Vulkan_FOUND)
--target-hpp ${_ggml_vk_header}
--target-cpp ${_ggml_vk_source}
--no-clean
${_ggml_vk_shader_dev_args}

DEPENDS ${_ggml_vk_shader_files}
${_ggml_vk_shaders_gen_sources}
Expand All @@ -193,6 +201,24 @@ if (Vulkan_FOUND)
COMMENT "Generate vulkan shaders"
)

if(GGML_VULKAN_SHADER_DEV)
add_custom_command(
OUTPUT ${_ggml_vk_output_dir}/CMakeCache.txt
COMMAND cmake -S ${CMAKE_CURRENT_BINARY_DIR}/vulkan-shaders -B ${_ggml_vk_output_dir} -G ${CMAKE_GENERATOR}
DEPENDS ${_ggml_vk_shader_cmake_file}
COMMENT "Configure vulkan shaders"
)
add_custom_command(
OUTPUT ${_ggml_vk_header}
${_ggml_vk_source}
DEPENDS ${_ggml_vk_output_dir}/CMakeCache.txt
${_ggml_vk_shader_cmake_file}
${_ggml_vk_shader_files}
COMMAND cmake --build ${_ggml_vk_output_dir} -j ${CMAKE_BUILD_PARALLEL_LEVEL}
COMMENT "Build vulkan shaders"
)
endif()

target_sources(ggml-vulkan PRIVATE ${_ggml_vk_source} ${_ggml_vk_header})

else()
Expand Down
23 changes: 23 additions & 0 deletions ggml/src/ggml-vulkan/ggml-vulkan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1536,6 +1536,29 @@ static void ggml_vk_create_pipeline_func(vk_device& device, vk_pipeline& pipelin
GGML_ASSERT(parameter_count <= MAX_PARAMETER_COUNT);
GGML_ASSERT(wg_denoms[0] > 0 && wg_denoms[1] > 0 && wg_denoms[2] > 0); // NOLINT

#ifdef GGML_VK_SHADER_DIR
std::vector<uint32_t> spv_storage;
if (spv_size == 0) {
const char * filename = (const char *)spv_data;
std::string filepath = std::string(GGML_VK_SHADER_DIR) + "/" + filename;
VK_LOG_DEBUG("ggml_vk_create_pipeline: loading shader from " << filepath);
FILE * file = fopen(filepath.c_str(), "rb");
if (!file) {
GGML_ABORT("ggml_vulkan: Failed to open shader file: %s", filepath.c_str());
}
fseek(file, 0, SEEK_END);
spv_size = ftell(file);
fseek(file, 0, SEEK_SET);
spv_storage.resize((spv_size + sizeof(uint32_t) - 1) / sizeof(uint32_t));
size_t read_size = fread(spv_storage.data(), sizeof(uint32_t), spv_storage.size(), file);
fclose(file);
if (read_size != spv_size / sizeof(uint32_t)) {
GGML_ABORT("ggml_vulkan: Failed to read shader file: %s", filepath.c_str());
}
spv_data = spv_storage.data();
}
#endif

vk::ShaderModuleCreateInfo shader_module_create_info({}, spv_size, reinterpret_cast<const uint32_t *>(spv_data));
pipeline->shader_module = device->device.createShaderModule(shader_module_create_info);

Expand Down
Loading
Loading