159 bool create_from_spirv(
161 const
std::vector<uint32_t>& spirv_code,
162 vk::ShaderStageFlagBits stage,
163 const
std::
string& entry_point = "
main",
164 bool enable_reflection = true);
177 bool create_from_spirv_file(
179 const
std::
string& spirv_path,
180 vk::ShaderStageFlagBits stage,
181 const
std::
string& entry_point = "
main",
182 bool enable_reflection = true);
198 bool create_from_spirv_asm(
200 const
std::
string& spirv_asm,
201 vk::ShaderStageFlagBits stage,
202 const
std::
string& entry_point = "
main",
203 bool enable_reflection = true);
219 bool create_from_glsl(
221 const
std::
string& glsl_source,
222 vk::ShaderStageFlagBits stage,
223 const
std::
string& entry_point = "
main",
224 bool enable_reflection = true,
225 const
std::vector<
std::
string>& include_directories = {},
226 const std::unordered_map<std::string, std::string>& defines = {});
248 bool create_from_glsl_file(
250 const std::string& glsl_path,
251 std::optional<vk::ShaderStageFlagBits> stage = std::nullopt,
252 const std::string& entry_point =
"main",
253 bool enable_reflection =
true,
254 const std::vector<std::string>& include_directories = {},
255 const std::unordered_map<std::string, std::string>& defines = {});
264 void cleanup(vk::Device device);
270 [[nodiscard]]
bool is_valid()
const {
return m_module !=
nullptr; }
276 [[nodiscard]] vk::ShaderModule
get()
const {
return m_module; }
282 [[nodiscard]] vk::ShaderStageFlagBits
get_stage()
const {
return m_stage; }
299 [[nodiscard]] vk::PipelineShaderStageCreateInfo get_stage_create_info()
const;
317 [[nodiscard]]
const std::vector<uint32_t>&
get_spirv()
const {
return m_spirv_code; }
332 void set_specialization_constants(
const std::unordered_map<uint32_t, uint32_t>& constants);
346 [[nodiscard]]
Stage get_stage_type()
const;
354 return m_vertex_input;
362 return !m_vertex_input.attributes.empty();
371 return m_fragment_output;
380 return m_push_constants;
390 return m_reflection.workgroup_size;
398 static std::optional<vk::ShaderStageFlagBits> detect_stage_from_extension(
const std::string& filepath);
401 vk::ShaderModule m_module =
nullptr;
402 vk::ShaderStageFlagBits m_stage = vk::ShaderStageFlagBits::eCompute;
403 std::string m_entry_point =
"main";
408 bool m_preserve_spirv {};
427 bool reflect_spirv(
const std::vector<uint32_t>& spirv_code);
437 std::vector<uint32_t> compile_glsl_to_spirv(
438 const std::string& glsl_source,
439 vk::ShaderStageFlagBits stage,
440 const std::vector<std::string>& include_directories,
441 const std::unordered_map<std::string, std::string>& defines);
448 static std::vector<uint32_t> read_spirv_file(
const std::string& filepath);
455 static std::string read_text_file(
const std::string& filepath);
461 void update_specialization_info();
468 static vk::Format spirv_type_to_vk_format(
const spirv_cross::SPIRType& type);