157 OUTPUT_WRITE = 1 << 1,
166 explicit ShaderProcessor(
const std::string& shader_path, uint32_t workgroup_x = 256);
180 void processing_function(std::shared_ptr<Buffer> buffer)
override;
181 void on_attach(std::shared_ptr<Buffer> buffer)
override;
182 void on_detach(std::shared_ptr<Buffer> buffer)
override;
184 [[nodiscard]]
bool is_compatible_with(std::shared_ptr<Buffer> buffer)
const override;
198 void bind_buffer(
const std::string& descriptor_name,
const std::shared_ptr<VKBuffer>& buffer);
204 void unbind_buffer(
const std::string& descriptor_name);
211 [[nodiscard]] std::shared_ptr<VKBuffer> get_bound_buffer(
const std::string& descriptor_name)
const;
221 void auto_bind_buffer(
const std::shared_ptr<VKBuffer>& buffer);
234 bool hot_reload_shader();
240 void set_shader(
const std::string& shader_path);
245 [[nodiscard]]
const std::string&
get_shader_path()
const {
return m_config.shader_path; }
257 void set_workgroup_size(uint32_t x, uint32_t y = 1, uint32_t z = 1);
271 void set_manual_dispatch(uint32_t x, uint32_t y = 1, uint32_t z = 1);
277 void set_custom_dispatch(std::function<std::array<uint32_t, 3>(
const std::shared_ptr<VKBuffer>&)> calculator);
292 void set_push_constant_size(
size_t size);
298 template <
typename T>
301 set_push_constant_size(
sizeof(T));
311 template <
typename T>
312 void set_push_constant_data(
const T& data);
319 void set_push_constant_data_raw(
const void* data,
size_t size);
338 void set_specialization_constant(uint32_t constant_id, uint32_t value);
343 void clear_specialization_constants();
367 void add_binding(
const std::string& descriptor_name,
const ShaderBinding& binding);
378 [[nodiscard]]
virtual BufferUsageHint get_buffer_usage_hint(
const std::string& descriptor_name)
const;
385 [[nodiscard]]
virtual bool is_in_place_operation(
const std::string& descriptor_name)
const;
392 [[nodiscard]]
bool has_binding(
const std::string& descriptor_name)
const;
400 [[nodiscard]] std::vector<std::string> get_binding_names()
const;
406 [[nodiscard]]
bool are_bindings_complete()
const;
415 [[nodiscard]]
bool is_shader_loaded()
const {
return m_shader_id != Portal::Graphics::INVALID_SHADER; }
420 [[nodiscard]]
bool is_pipeline_ready()
const {
return m_pipeline_id != Portal::Graphics::INVALID_COMPUTE_PIPELINE; }
442 [[nodiscard]]
virtual std::shared_ptr<VKBuffer>
get_output_buffer()
const {
return m_last_processed_buffer; }
450 return m_last_command_buffer != Portal::Graphics::INVALID_COMMAND_BUFFER;
464 virtual void on_before_compile(
const std::string& shader_path);
495 virtual void on_before_descriptors_create();
502 virtual void on_descriptors_created();
530 virtual std::array<uint32_t, 3> calculate_dispatch_size(
const std::shared_ptr<VKBuffer>& buffer);
548 bool m_initialized {};
549 bool m_needs_pipeline_rebuild =
true;
550 bool m_needs_descriptor_rebuild =
true;
552 size_t m_auto_bind_index {};
555 virtual void initialize_pipeline(
const std::shared_ptr<Buffer>& buffer);
556 virtual void cleanup();
563 void initialize_shader();
564 void initialize_descriptors();
565 void update_descriptors();
566 void execute_dispatch(
const std::shared_ptr<VKBuffer>& buffer);