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<ShaderReflection::DescriptorBinding>&
get_active_bindings()
const {
return m_active_bindings; }
326 [[nodiscard]]
const std::vector<uint32_t>&
get_spirv()
const {
return m_spirv_code; }
341 void set_specialization_constants(
const std::unordered_map<uint32_t, uint32_t>& constants);
355 [[nodiscard]]
Stage get_stage_type()
const;
363 return m_vertex_input;
371 return !m_vertex_input.attributes.empty();
380 return m_fragment_output;
389 return m_push_constants;
399 return m_reflection.workgroup_size;
407 static std::optional<vk::ShaderStageFlagBits> detect_stage_from_extension(
const std::string& filepath);
410 vk::ShaderModule m_module =
nullptr;
411 vk::ShaderStageFlagBits m_stage = vk::ShaderStageFlagBits::eCompute;
412 std::string m_entry_point =
"main";
418 bool m_preserve_spirv {};
437 bool reflect_spirv(
const std::vector<uint32_t>& spirv_code);
447 std::vector<uint32_t> compile_glsl_to_spirv(
448 const std::string& glsl_source,
449 vk::ShaderStageFlagBits stage,
450 const std::vector<std::string>& include_directories,
451 const std::unordered_map<std::string, std::string>& defines);
458 static std::vector<uint32_t> read_spirv_file(
const std::string& filepath);
465 static std::string read_text_file(
const std::string& filepath);
471 void update_specialization_info();
478 static vk::Format spirv_type_to_vk_format(
const spirv_cross::SPIRType&
type);