12 : m_config({ shader_path })
15 initialize_buffer_service();
16 initialize_compute_service();
20 : m_config(
std::move(config))
38 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
41 "ShaderProcessor can only process VKBuffers");
47 "on_before_execute() reported failure, skipping shader execution");
75 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
84 "ShaderProcessor attached to VKBuffer (size: {} bytes, modality: {})",
85 vk_buffer->get_size_bytes(),
86 static_cast<int>(vk_buffer->get_modality()));
91 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer);
96 if (it->second == vk_buffer) {
107 return std::dynamic_pointer_cast<VKBuffer>(buffer) !=
nullptr;
118 "Cannot bind null buffer to descriptor '{}'", descriptor_name);
124 default_binding.
set = 0;
126 default_binding.
type = vk::DescriptorType::eStorageBuffer;
159 std::string descriptor_name;
161 descriptor_name =
"input";
163 descriptor_name =
"output";
199 "Shader hot-reloaded successfully (ID: {})",
m_shader_id);
225 "Push constant data size {} exceeds configured size {}",
274 if (descriptor_name ==
"input")
276 if (descriptor_name ==
"output")
294 std::vector<std::string> names;
297 names.push_back(name);
304 return std::ranges::all_of(
306 [
this](
const auto& pair) {
307 return m_bound_buffers.find(pair.first) != m_bound_buffers.end();
353 auto& descriptor_bindings = buffer->get_pipeline_context().descriptor_buffer_bindings;
355 std::set<std::pair<uint32_t, uint32_t>> updated_pairs;
357 for (
const auto& binding : descriptor_bindings) {
360 "Descriptor set index {} out of range", binding.set);
364 foundry.update_descriptor_buffer(
368 binding.buffer_info.buffer,
369 binding.buffer_info.offset,
370 binding.buffer_info.range);
372 updated_pairs.emplace(binding.set, binding.binding);
381 const auto& binding = binding_it->second;
382 auto key = std::make_pair(binding.set, binding.binding);
384 if (updated_pairs.count(key)) {
390 "Invalid descriptor set index {} for binding '{}'",
391 binding.set, descriptor_name);
395 foundry.update_descriptor_buffer(
399 buffer->get_buffer(),
401 buffer->get_size_bytes());
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
#define MF_RT_DEBUG(comp, ctx,...)
ProcessingToken m_processing_token
virtual void initialize_pipeline(const std::shared_ptr< VKBuffer > &buffer)=0
ShaderProcessor(const std::string &shader_path)
Construct processor with shader path.
Portal::Graphics::CommandBufferID m_last_command_buffer
bool are_bindings_complete() const
Check if all required bindings are satisfied.
virtual void execute_shader(const std::shared_ptr< VKBuffer > &buffer)=0
std::unordered_map< std::string, std::shared_ptr< VKBuffer > > m_bound_buffers
void unbind_buffer(const std::string &descriptor_name)
Unbind a buffer from a descriptor.
Portal::Graphics::ShaderID m_shader_id
std::vector< uint8_t > m_push_constant_data
virtual void on_after_execute(Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer)
Called after each process callback.
virtual void on_descriptors_created()
Called after descriptor sets are created.
virtual void initialize_descriptors(const std::shared_ptr< VKBuffer > &buffer)=0
bool m_needs_descriptor_rebuild
std::shared_ptr< VKBuffer > get_bound_buffer(const std::string &descriptor_name) const
Get bound buffer for a descriptor name.
virtual void update_descriptors(const std::shared_ptr< VKBuffer > &buffer)
virtual void on_before_compile(const std::string &shader_path)
Called before shader compilation.
virtual bool on_before_execute(Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer)
Called before each process callback.
void on_detach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is detached from a buffer.
void auto_bind_buffer(const std::shared_ptr< VKBuffer > &buffer)
Auto-bind buffer based on attachment order.
bool has_binding(const std::string &descriptor_name) const
Check if a descriptor binding exists.
void set_push_constant_size()
Set push constant size from type.
void processing_function(const std::shared_ptr< Buffer > &buffer) override
The core processing function that must be implemented by derived classes.
virtual void on_pipeline_created(Portal::Graphics::ComputePipelineID pipeline_id)
Called after pipeline is created.
~ShaderProcessor() override
virtual bool is_in_place_operation(const std::string &descriptor_name) const
Check if shader modifies a specific buffer in-place.
virtual void on_shader_loaded(Portal::Graphics::ShaderID shader_id)
Called after shader is loaded.
void add_binding(const std::string &descriptor_name, const ShaderBinding &binding)
Add descriptor binding configuration.
bool hot_reload_shader()
Hot-reload shader from ShaderFoundry.
virtual void on_before_descriptors_create()
Called before descriptor sets are created.
void set_config(const ShaderConfig &config)
Update entire configuration.
void set_shader(const std::string &shader_path)
Update shader path and reload.
bool is_compatible_with(const std::shared_ptr< Buffer > &buffer) const override
Checks if this processor can handle the specified buffer type.
virtual BufferUsageHint get_buffer_usage_hint(const std::string &descriptor_name) const
Get buffer usage hint for a descriptor.
BufferUsageHint
Get buffer usage characteristics needed for safe data flow.
@ OUTPUT_WRITE
Shader writes output (modifies)
@ INPUT_READ
Shader reads input.
std::vector< std::string > get_binding_names() const
Get all configured descriptor names.
void set_specialization_constant(uint32_t constant_id, uint32_t value)
Set specialization constant.
bool m_needs_pipeline_rebuild
void on_attach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is attached to a buffer.
void bind_buffer(const std::string &descriptor_name, const std::shared_ptr< VKBuffer > &buffer)
Bind a VKBuffer to a named shader descriptor.
std::vector< Portal::Graphics::DescriptorSetID > m_descriptor_set_ids
void clear_specialization_constants()
Clear all specialization constants.
void set_push_constant_data_raw(const void *data, size_t size)
Update push constant data (raw bytes)
void initialize_compute_service()
void initialize_buffer_service()
@ GRAPHICS_BACKEND
Standard graphics processing backend configuration.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.
uint64_t ComputePipelineID
constexpr ShaderID INVALID_SHADER
MAYAFLUX_API ShaderFoundry & get_shader_foundry()
Get the global shader compiler instance.
MAYAFLUX_API ComputePress & get_compute_press()
uint32_t binding
Binding point within set.
uint32_t set
Descriptor set index.
Describes how a VKBuffer binds to a shader descriptor.
std::string shader_path
Path to shader file.
std::unordered_map< uint32_t, uint32_t > specialization_constants
std::unordered_map< std::string, ShaderBinding > bindings
size_t push_constant_size
Portal::Graphics::ShaderStage stage