|
MayaFlux 0.5.0
Digital-First Multimedia Processing Framework
|
ComputeProcessor operating on named fields of a VolumeGridBuffer. More...
#include <VolumeFieldProcessor.hpp>
Inheritance diagram for MayaFlux::Buffers::VolumeFieldProcessor:
Collaboration diagram for MayaFlux::Buffers::VolumeFieldProcessor:Classes | |
| struct | FieldBinding |
| One shader binding and the field slot it draws from. More... | |
Public Types | |
| enum class | FieldAccess { READ , WRITE } |
| Which slot of a field a binding resolves to. More... | |
Public Types inherited from MayaFlux::Buffers::ShaderProcessor | |
| enum class | BufferUsageHint : uint8_t { NONE = 0 , INPUT_READ = 1 << 0 , OUTPUT_WRITE = 1 << 1 , BIDIRECTIONAL = INPUT_READ | OUTPUT_WRITE } |
| Get buffer usage characteristics needed for safe data flow. More... | |
| using | FeedSource = std::function< FeedValue()> |
| A callable pulled once per processing cycle. | |
| using | FeedValue = std::variant< double, Kakshya::DataVariant > |
| What a feed callable returns. | |
Public Member Functions | |
| const std::shared_ptr< VolumeGridBuffer > & | get_volume () const |
| The attached volume, or null if attachment failed validation. | |
Public Member Functions inherited from MayaFlux::Buffers::ComputeProcessor | |
| ComputeProcessor (const Portal::Graphics::ShaderSpec &spec) | |
| Construct processor from a generated ShaderSpec. | |
| ComputeProcessor (const std::string &shader_path, uint32_t workgroup_x=256) | |
| Construct processor with shader path. | |
| const ShaderDispatchConfig & | get_dispatch_config () const |
| Get current dispatch configuration. | |
| uint32_t | get_iteration_count () const |
| Dispatches recorded per execute cycle. | |
| bool | is_pipeline_ready () const |
| Check if pipeline is created. | |
| void | set_custom_dispatch (std::function< std::array< uint32_t, 3 >(const std::shared_ptr< VKBuffer > &)> calculator) |
| Set custom dispatch calculator. | |
| void | set_dispatch_mode (ShaderDispatchConfig::DispatchMode mode) |
| Set dispatch mode. | |
| void | set_iteration_count (uint32_t count) |
| Set how many dispatches are recorded per execute cycle. | |
| void | set_manual_dispatch (uint32_t x, uint32_t y=1, uint32_t z=1) |
| Set manual dispatch group counts. | |
| void | set_workgroup_size (uint32_t x, uint32_t y=1, uint32_t z=1) |
| Set workgroup size (should match shader local_size) | |
Public Member Functions inherited from MayaFlux::Buffers::ShaderProcessor | |
| void | add_binding (const std::string &descriptor_name, const ShaderBinding &binding) |
| Add descriptor binding configuration. | |
| bool | are_bindings_complete () const |
| Check if all required bindings are satisfied. | |
| bool | are_descriptors_ready () const |
| Check if descriptors are initialized. | |
| void | auto_bind_buffer (const std::shared_ptr< VKBuffer > &buffer) |
| Auto-bind buffer based on attachment order. | |
| void | bind_buffer (const std::string &descriptor_name, const std::shared_ptr< VKBuffer > &buffer) |
| Bind a VKBuffer to a named shader descriptor. | |
| void | clear_specialization_constants () |
| Clear all specialization constants. | |
| template<typename T > | |
| bool | download_bound (const std::string &descriptor_name, std::vector< T > &data) const |
| bool | download_bound (const std::string &descriptor_name, void *data, size_t size, const std::shared_ptr< VKBuffer > &staging=nullptr) const |
| Download the buffer currently bound to a named descriptor. | |
| void | feed (const std::string &name, FeedSource source) |
| Supply a shader input from a callable, resolved by name. | |
| void | feed (const std::string &name, FeedSource source, uint32_t offset, size_t size=sizeof(float)) |
| Supply a push constant from a callable at an explicit offset. | |
| std::vector< std::string > | get_binding_names () const |
| Get all configured descriptor names. | |
| std::shared_ptr< VKBuffer > | get_bound_buffer (const std::string &descriptor_name) const |
| Get bound buffer for a descriptor name. | |
| size_t | get_bound_buffer_count () const |
| Get number of bound buffers. | |
| virtual BufferUsageHint | get_buffer_usage_hint (const std::string &descriptor_name) const |
| Get buffer usage hint for a descriptor. | |
| const ShaderConfig & | get_config () const |
| Get current configuration. | |
| std::vector< std::string > | get_feed_names () const |
| Names of every registered feed. | |
| virtual std::shared_ptr< VKBuffer > | get_output_buffer () const |
| Get the output buffer after compute dispatch. | |
| std::vector< uint8_t > & | get_push_constant_data () |
| const std::vector< uint8_t > & | get_push_constant_data () const |
| Get current push constant data. | |
| const std::string & | get_shader_path () const |
| Get current shader path. | |
| bool | has_binding (const std::string &descriptor_name) const |
| Check if a descriptor binding exists. | |
| virtual bool | has_executed () const |
| Check if compute has been executed at least once. | |
| bool | has_feed (const std::string &name) const |
| Whether a feed of this name is registered. | |
| bool | hot_reload_shader () |
| Hot-reload shader from ShaderFoundry. | |
| bool | is_compatible_with (const std::shared_ptr< Buffer > &buffer) const override |
| Checks if this processor can handle the specified buffer type. | |
| bool | is_deferred_submission () const |
| Whether this processor submits asynchronously. | |
| bool | is_dispatch_pending () const |
| True while an asynchronous submission is outstanding. | |
| virtual bool | is_in_place_operation (const std::string &descriptor_name) const |
| Check if shader modifies a specific buffer in-place. | |
| bool | is_shader_loaded () const |
| Check if shader is loaded. | |
| void | on_detach (const std::shared_ptr< Buffer > &buffer) override |
| Called when this processor is detached from a buffer. | |
| void | remove_feed (const std::string &name) |
| Remove a feed. | |
| bool | resolve_pending_dispatch (bool block) |
| Resolve an outstanding asynchronous submission. | |
| void | set_config (const ShaderConfig &config) |
| Update entire configuration. | |
| void | set_deferred_submission (bool deferred) |
| Submit asynchronously and resolve at the top of a later cycle. | |
| template<typename T > | |
| void | set_push_constant_data (const T &data) |
| Update push constant data (type-safe) | |
| virtual void | set_push_constant_data_raw (const void *data, size_t size) |
| Update push constant data (raw bytes) | |
| template<typename T > | |
| void | set_push_constant_size () |
| Set push constant size from type. | |
| void | set_push_constant_size (size_t size) |
| Set push constant size. | |
| void | set_shader (const std::string &shader_path) |
| Update shader path and reload. | |
| void | set_specialization_constant (uint32_t constant_id, uint32_t value) |
| Set specialization constant. | |
| ShaderProcessor (const std::string &shader_path) | |
| Construct processor with shader path. | |
| ShaderProcessor (ShaderConfig config) | |
| Construct processor with full configuration. | |
| void | unbind_buffer (const std::string &descriptor_name) |
| Unbind a buffer from a descriptor. | |
| ~ShaderProcessor () override | |
Public Member Functions inherited from MayaFlux::Buffers::BufferProcessor | |
| virtual ProcessingToken | get_processing_token () const |
| Gets the current processing token for this buffer. | |
| void | process (const std::shared_ptr< Buffer > &buffer) |
| Applies a computational transformation to the data in the provided buffer. | |
| virtual void | set_processing_token (ProcessingToken token) |
| Gets the preferred processing backend for this processor. | |
| virtual | ~BufferProcessor ()=default |
| Virtual destructor for proper cleanup of derived classes. | |
Protected Member Functions | |
| void | add_swap_field (std::string field) |
| Register a field to swap after each dispatch. | |
| void | on_attach (const std::shared_ptr< Buffer > &buffer) override |
| Cache and validate the volume, size the dispatch, write the shared parameter prefix, then call on_volume_ready. | |
| bool | on_before_execute (Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer) override |
| Reject buffers that are not the validated volume. | |
| void | on_descriptors_created () override |
| Write every binding in the table for the current slot assignment. | |
| virtual void | on_volume_ready () |
| Hook for subclass parameters, called at the end of on_attach. | |
| void | processing_function (const std::shared_ptr< Buffer > &buffer) override |
| Rewrite field descriptors, run the shader, then swap. | |
| void | reserve_param_size (size_t size) |
| Raise the push constant block to at least this size. | |
| VolumeFieldProcessor (std::vector< FieldBinding > bindings, const Portal::Graphics::ShaderSpec &spec) | |
| Construct from a generated ShaderSpec. | |
| VolumeFieldProcessor (std::vector< FieldBinding > bindings, const std::string &shader_path) | |
| Construct from a shader path. | |
| virtual bool | wants_swap () const |
| Whether this cycle's dispatch should be followed by a swap. | |
| void | write_lattice_params () |
| Write the lattice dimensions and cell size into the staged push constant block, preserving word three. | |
| void | write_lattice_word3 (uint32_t value) |
| Write word three of the shared prefix. | |
| void | write_lattice_word7 (float value) |
| Write word seven of the parameter prefix, at byte offset 28. | |
| void | write_param_tail (size_t offset, const void *data, size_t size) |
| Write subclass parameters past the shared prefix. | |
Protected Member Functions inherited from MayaFlux::Buffers::ComputeProcessor | |
| virtual std::array< uint32_t, 3 > | calculate_dispatch_size (const std::shared_ptr< VKBuffer > &buffer) |
| Calculate dispatch size from buffer. | |
| void | cleanup () override |
| void | initialize_descriptors (const std::shared_ptr< VKBuffer > &buffer) override |
| void | initialize_pipeline (const std::shared_ptr< VKBuffer > &buffer) override |
| virtual bool | on_iteration (Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer, uint32_t index) |
| Called before each iteration's push constants and dispatch. | |
| virtual void | on_iteration_barrier (Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer, uint32_t index) |
| Called after each iteration except the last. | |
Protected Member Functions inherited from MayaFlux::Buffers::ShaderProcessor | |
| virtual void | on_after_execute (Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer) |
| Called after each process callback. | |
| virtual void | on_before_compile (const std::string &shader_path) |
| Called before shader compilation. | |
| virtual void | on_before_descriptors_create () |
| Called before descriptor sets are created. | |
| virtual void | on_before_pipeline_create (Portal::Graphics::ComputePipelineID pipeline_id) |
| Called before pipeline creation. | |
| virtual void | on_dispatch_complete (const std::shared_ptr< VKBuffer > &buffer) |
| Called once when an asynchronous submission is observed complete. | |
| virtual void | on_pipeline_created (Portal::Graphics::ComputePipelineID pipeline_id) |
| Called after pipeline is created. | |
| virtual void | on_shader_loaded (Portal::Graphics::ShaderID shader_id) |
| Called after shader is loaded. | |
| void | pump_feeds () |
| Pull every feed and write its result. | |
| std::optional< uint32_t > | resolve_ds_index (uint32_t set) const |
| Resolve logical descriptor set index to actual index. | |
| size_t | resolve_push_constant_size (const std::shared_ptr< VKBuffer > &buffer) const |
| Byte width of this processor's push constant block, extended to cover any fragment staged on the buffer. | |
| std::vector< uint8_t > | resolve_push_constants (const std::shared_ptr< VKBuffer > &buffer) const |
| This processor's push constant data with buffer-staged fragments overlaid at their declared offsets. | |
| void | submit_recorded (Portal::Graphics::CommandBufferID cmd_id, const std::shared_ptr< VKBuffer > &buffer) |
| Submit a recorded command buffer honoring the submission mode. | |
| virtual void | update_descriptors (const std::shared_ptr< VKBuffer > &buffer) |
Protected Member Functions inherited from MayaFlux::Buffers::VKBufferProcessor | |
| void | ensure_initialized (const std::shared_ptr< VKBuffer > &buffer) |
| void | initialize_buffer_service () |
| void | initialize_compute_service () |
Private Member Functions | |
| void | register_bindings () |
| Register the binding table into m_config.bindings. | |
| void | size_dispatch () |
| Size the manual dispatch to cover the lattice. | |
| bool | validate_fields () |
| Check every named field exists and that read-write fields carry two slots. | |
| void | write_field_descriptors () |
| Issue descriptor writes for every entry in the binding table. | |
Private Attributes | |
| std::vector< FieldBinding > | m_bindings |
| std::vector< std::string > | m_swap_fields |
| std::shared_ptr< VolumeGridBuffer > | m_volume |
| The attached volume, null until on_attach validates it. | |
ComputeProcessor operating on named fields of a VolumeGridBuffer.
Holds everything the lattice stages share: validating field names against the attached volume, sizing the dispatch from the lattice, writing the common leading push constant words, rewriting field descriptors every cycle, and swapping slots after the dispatch. Subclasses supply only a binding table and whatever parameter words follow the shared prefix.
The parameter block opens with a fixed prefix: three lattice extents, a subclass word, three cell sizes, a second subclass word. The layout is private to the base. Subclasses reach it through write_lattice_word3, write_lattice_word7, and write_param_tail, which rejects any offset overlapping the prefix.
The binding table drives both descriptor writes and validation. A field appearing with both READ and WRITE access is required to be double-buffered, since the stage would otherwise read a neighbourhood of the storage it is writing. A field appearing only as WRITE carries no such requirement.
Descriptors are written directly through ShaderFoundry::update_descriptor_buffer rather than bind_buffer, since VolumeGridBuffer's field storage consists of raw handle pairs with no VKBuffer wrapper. The write happens in processing_function, before execute_shader binds the set into the command buffer, because a descriptor set already bound into an open command buffer cannot be rewritten.
Slot swaps happen in processing_function after the parent call rather than in on_after_execute, which fires more than once per cycle. A swap is not idempotent.
Definition at line 44 of file VolumeFieldProcessor.hpp.