vulkan: fix spv shadowing (#22760)

This commit is contained in:
miyan
2026-05-08 15:35:22 +08:00
committed by GitHub
parent 3e941b813b
commit 6d57a49a70
+10 -10
View File
@@ -2149,11 +2149,11 @@ static void ggml_vk_create_pipeline_func(vk_device& device, vk_pipeline& pipelin
// Patch SPIR-V to enable RTE rounding for FP16, avoiding the need for // Patch SPIR-V to enable RTE rounding for FP16, avoiding the need for
// separate shader variants compiled with -DRTE16. // separate shader variants compiled with -DRTE16.
std::vector<uint32_t> spv; std::vector<uint32_t> spirv;
if (device->float_controls_rte_fp16) { if (device->float_controls_rte_fp16) {
const uint32_t* spv_words = reinterpret_cast<const uint32_t *>(spv_data); const uint32_t* spv_words = reinterpret_cast<const uint32_t *>(spv_data);
size_t word_count = spv_size / sizeof(uint32_t); size_t word_count = spv_size / sizeof(uint32_t);
spv.assign(spv_words, spv_words + word_count); spirv.assign(spv_words, spv_words + word_count);
// Find insertion points respecting SPIR-V layout order: // Find insertion points respecting SPIR-V layout order:
// Header(5) -> OpCapability -> OpExtension -> ... -> OpEntryPoint -> OpExecutionMode -> ... // Header(5) -> OpCapability -> OpExtension -> ... -> OpEntryPoint -> OpExecutionMode -> ...
@@ -2163,9 +2163,9 @@ static void ggml_vk_create_pipeline_func(vk_device& device, vk_pipeline& pipelin
size_t exec_insert_pos = pos; size_t exec_insert_pos = pos;
uint32_t entry_point_id = 0; uint32_t entry_point_id = 0;
while (pos < spv.size()) { while (pos < spirv.size()) {
uint32_t opcode = spv[pos] & spv::OpCodeMask; uint32_t opcode = spirv[pos] & spv::OpCodeMask;
uint32_t len = spv[pos] >> spv::WordCountShift; uint32_t len = spirv[pos] >> spv::WordCountShift;
if (len == 0) break; if (len == 0) break;
if (opcode == spv::OpCapability) { if (opcode == spv::OpCapability) {
@@ -2174,7 +2174,7 @@ static void ggml_vk_create_pipeline_func(vk_device& device, vk_pipeline& pipelin
} else if (opcode == spv::OpExtension) { } else if (opcode == spv::OpExtension) {
ext_insert_pos = pos + len; ext_insert_pos = pos + len;
} else if (opcode == spv::OpEntryPoint) { } else if (opcode == spv::OpEntryPoint) {
entry_point_id = spv[pos + 2]; entry_point_id = spirv[pos + 2];
exec_insert_pos = pos + len; exec_insert_pos = pos + len;
} else if (opcode == spv::OpExecutionMode || opcode == spv::OpExecutionModeId) { } else if (opcode == spv::OpExecutionMode || opcode == spv::OpExecutionModeId) {
exec_insert_pos = pos + len; exec_insert_pos = pos + len;
@@ -2189,7 +2189,7 @@ static void ggml_vk_create_pipeline_func(vk_device& device, vk_pipeline& pipelin
// OpExecutionMode %entrypoint RoundingModeRTE 16 // OpExecutionMode %entrypoint RoundingModeRTE 16
uint32_t exec_mode[] = { (4u << spv::WordCountShift) | spv::OpExecutionMode, entry_point_id, spv::ExecutionModeRoundingModeRTE, 16 }; uint32_t exec_mode[] = { (4u << spv::WordCountShift) | spv::OpExecutionMode, entry_point_id, spv::ExecutionModeRoundingModeRTE, 16 };
spv.insert(spv.begin() + exec_insert_pos, std::begin(exec_mode), std::end(exec_mode)); spirv.insert(spirv.begin() + exec_insert_pos, std::begin(exec_mode), std::end(exec_mode));
// OpExtension "SPV_KHR_float_controls" // OpExtension "SPV_KHR_float_controls"
const char ext_str[] = "SPV_KHR_float_controls"; const char ext_str[] = "SPV_KHR_float_controls";
@@ -2197,13 +2197,13 @@ static void ggml_vk_create_pipeline_func(vk_device& device, vk_pipeline& pipelin
std::vector<uint32_t> extension(1 + ext_str_words, 0); std::vector<uint32_t> extension(1 + ext_str_words, 0);
extension[0] = (uint32_t)((1 + ext_str_words) << spv::WordCountShift) | spv::OpExtension; extension[0] = (uint32_t)((1 + ext_str_words) << spv::WordCountShift) | spv::OpExtension;
memcpy(&extension[1], ext_str, sizeof(ext_str)); memcpy(&extension[1], ext_str, sizeof(ext_str));
spv.insert(spv.begin() + ext_insert_pos, extension.begin(), extension.end()); spirv.insert(spirv.begin() + ext_insert_pos, extension.begin(), extension.end());
// OpCapability RoundingModeRTE // OpCapability RoundingModeRTE
uint32_t capability[] = { (2u << spv::WordCountShift) | spv::OpCapability, spv::CapabilityRoundingModeRTE }; uint32_t capability[] = { (2u << spv::WordCountShift) | spv::OpCapability, spv::CapabilityRoundingModeRTE };
spv.insert(spv.begin() + cap_insert_pos, std::begin(capability), std::end(capability)); spirv.insert(spirv.begin() + cap_insert_pos, std::begin(capability), std::end(capability));
shader_module_create_info = vk::ShaderModuleCreateInfo({}, spv.size() * sizeof(uint32_t), spv.data()); shader_module_create_info = vk::ShaderModuleCreateInfo({}, spirv.size() * sizeof(uint32_t), spirv.data());
} }
pipeline->shader_module = device->device.createShaderModule(shader_module_create_info); pipeline->shader_module = device->device.createShaderModule(shader_module_create_info);