vk: Respect shader compile flags when linking

This commit is contained in:
kd-11 2025-06-12 23:00:41 +03:00 committed by kd-11
parent 20b54f3086
commit 64866098e7
2 changed files with 31 additions and 16 deletions

View file

@ -36,12 +36,12 @@ namespace vk
{ {
if (job.is_graphics_job) if (job.is_graphics_job)
{ {
auto compiled = int_compile_graphics_pipe(job.graphics_data, job.graphics_modules, job.inputs, {}); auto compiled = int_compile_graphics_pipe(job.graphics_data, job.graphics_modules, job.inputs, {}, job.flags);
job.callback_func(compiled); job.callback_func(compiled);
} }
else else
{ {
auto compiled = int_compile_compute_pipe(job.compute_data, job.inputs); auto compiled = int_compile_compute_pipe(job.compute_data, job.inputs, job.flags);
job.callback_func(compiled); job.callback_func(compiled);
} }
} }
@ -52,20 +52,22 @@ namespace vk
std::unique_ptr<glsl::program> pipe_compiler::int_compile_compute_pipe( std::unique_ptr<glsl::program> pipe_compiler::int_compile_compute_pipe(
const VkComputePipelineCreateInfo& create_info, const VkComputePipelineCreateInfo& create_info,
const std::vector<glsl::program_input>& cs_inputs) const std::vector<glsl::program_input>& cs_inputs,
op_flags flags)
{ {
auto program = std::make_unique<glsl::program>(*m_device, create_info, cs_inputs); auto program = std::make_unique<glsl::program>(*m_device, create_info, cs_inputs);
program->link(false); program->link(flags & SEPARATE_SHADER_OBJECTS);
return program; return program;
} }
std::unique_ptr<glsl::program> pipe_compiler::int_compile_graphics_pipe( std::unique_ptr<glsl::program> pipe_compiler::int_compile_graphics_pipe(
const VkGraphicsPipelineCreateInfo& create_info, const VkGraphicsPipelineCreateInfo& create_info,
const std::vector<glsl::program_input>& vs_inputs, const std::vector<glsl::program_input>& vs_inputs,
const std::vector<glsl::program_input>& fs_inputs) const std::vector<glsl::program_input>& fs_inputs,
op_flags flags)
{ {
auto program = std::make_unique<glsl::program>(*m_device, create_info, vs_inputs, fs_inputs); auto program = std::make_unique<glsl::program>(*m_device, create_info, vs_inputs, fs_inputs);
program->link(true); program->link(flags & SEPARATE_SHADER_OBJECTS);
return program; return program;
} }
@ -73,7 +75,8 @@ namespace vk
const vk::pipeline_props &create_info, const vk::pipeline_props &create_info,
VkShaderModule modules[2], VkShaderModule modules[2],
const std::vector<glsl::program_input>& vs_inputs, const std::vector<glsl::program_input>& vs_inputs,
const std::vector<glsl::program_input>& fs_inputs) const std::vector<glsl::program_input>& fs_inputs,
op_flags flags)
{ {
VkPipelineShaderStageCreateInfo shader_stages[2] = {}; VkPipelineShaderStageCreateInfo shader_stages[2] = {};
shader_stages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; shader_stages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
@ -167,7 +170,7 @@ namespace vk
info.basePipelineHandle = VK_NULL_HANDLE; info.basePipelineHandle = VK_NULL_HANDLE;
info.renderPass = vk::get_renderpass(*m_device, create_info.renderpass_key); info.renderPass = vk::get_renderpass(*m_device, create_info.renderpass_key);
return int_compile_graphics_pipe(info, vs_inputs, fs_inputs); return int_compile_graphics_pipe(info, vs_inputs, fs_inputs, flags);
} }
std::unique_ptr<glsl::program> pipe_compiler::compile( std::unique_ptr<glsl::program> pipe_compiler::compile(
@ -177,10 +180,10 @@ namespace vk
{ {
if (flags & COMPILE_INLINE) if (flags & COMPILE_INLINE)
{ {
return int_compile_compute_pipe(create_info, cs_inputs); return int_compile_compute_pipe(create_info, cs_inputs, flags);
} }
m_work_queue.push(create_info, cs_inputs, callback); m_work_queue.push(create_info, cs_inputs, flags, callback);
return {}; return {};
} }
@ -192,7 +195,7 @@ namespace vk
{ {
// It is very inefficient to defer this as all pointers need to be saved // It is very inefficient to defer this as all pointers need to be saved
ensure(flags & COMPILE_INLINE); ensure(flags & COMPILE_INLINE);
return int_compile_graphics_pipe(create_info, vs_inputs, fs_inputs); return int_compile_graphics_pipe(create_info, vs_inputs, fs_inputs, flags);
} }
std::unique_ptr<glsl::program> pipe_compiler::compile( std::unique_ptr<glsl::program> pipe_compiler::compile(
@ -206,10 +209,10 @@ namespace vk
VkShaderModule modules[] = { vs, fs }; VkShaderModule modules[] = { vs, fs };
if (flags & COMPILE_INLINE) if (flags & COMPILE_INLINE)
{ {
return int_compile_graphics_pipe(create_info, modules, vs_inputs, fs_inputs); return int_compile_graphics_pipe(create_info, modules, vs_inputs, fs_inputs, flags);
} }
m_work_queue.push(create_info, modules, vs_inputs, fs_inputs, callback); m_work_queue.push(create_info, modules, vs_inputs, fs_inputs, flags, callback);
return {}; return {};
} }

View file

@ -117,11 +117,14 @@ namespace vk
VkShaderModule graphics_modules[2]; VkShaderModule graphics_modules[2];
std::vector<glsl::program_input> inputs; std::vector<glsl::program_input> inputs;
op_flags flags;
pipe_compiler_job( pipe_compiler_job(
const vk::pipeline_props& props, const vk::pipeline_props& props,
VkShaderModule modules[2], VkShaderModule modules[2],
const std::vector<glsl::program_input>& vs_in, const std::vector<glsl::program_input>& vs_in,
const std::vector<glsl::program_input>& fs_in, const std::vector<glsl::program_input>& fs_in,
op_flags flags_,
callback_t func) callback_t func)
{ {
callback_func = func; callback_func = func;
@ -129,6 +132,7 @@ namespace vk
graphics_modules[0] = modules[0]; graphics_modules[0] = modules[0];
graphics_modules[1] = modules[1]; graphics_modules[1] = modules[1];
is_graphics_job = true; is_graphics_job = true;
flags = flags_;
inputs.reserve(vs_in.size() + fs_in.size()); inputs.reserve(vs_in.size() + fs_in.size());
inputs.insert(inputs.end(), vs_in.begin(), vs_in.end()); inputs.insert(inputs.end(), vs_in.begin(), vs_in.end());
@ -138,11 +142,16 @@ namespace vk
pipe_compiler_job( pipe_compiler_job(
const VkComputePipelineCreateInfo& props, const VkComputePipelineCreateInfo& props,
const std::vector<glsl::program_input>& cs_in, const std::vector<glsl::program_input>& cs_in,
op_flags flags_,
callback_t func) callback_t func)
{ {
callback_func = func; callback_func = func;
compute_data = props; compute_data = props;
is_graphics_job = false; is_graphics_job = false;
flags = flags_;
graphics_modules[0] = VK_NULL_HANDLE;
graphics_modules[1] = VK_NULL_HANDLE;
inputs = cs_in; inputs = cs_in;
} }
@ -153,18 +162,21 @@ namespace vk
std::unique_ptr<glsl::program> int_compile_compute_pipe( std::unique_ptr<glsl::program> int_compile_compute_pipe(
const VkComputePipelineCreateInfo& create_info, const VkComputePipelineCreateInfo& create_info,
const std::vector<glsl::program_input>& cs_inputs); const std::vector<glsl::program_input>& cs_inputs,
op_flags flags);
std::unique_ptr<glsl::program> int_compile_graphics_pipe( std::unique_ptr<glsl::program> int_compile_graphics_pipe(
const VkGraphicsPipelineCreateInfo& create_info, const VkGraphicsPipelineCreateInfo& create_info,
const std::vector<glsl::program_input>& vs_inputs, const std::vector<glsl::program_input>& vs_inputs,
const std::vector<glsl::program_input>& fs_inputs); const std::vector<glsl::program_input>& fs_inputs,
op_flags flags);
std::unique_ptr<glsl::program> int_compile_graphics_pipe( std::unique_ptr<glsl::program> int_compile_graphics_pipe(
const vk::pipeline_props &create_info, const vk::pipeline_props &create_info,
VkShaderModule modules[2], VkShaderModule modules[2],
const std::vector<glsl::program_input>& vs_inputs, const std::vector<glsl::program_input>& vs_inputs,
const std::vector<glsl::program_input>& fs_inputs); const std::vector<glsl::program_input>& fs_inputs,
op_flags flags);
}; };
void initialize_pipe_compiler(int num_worker_threads = -1); void initialize_pipe_compiler(int num_worker_threads = -1);