19 std::optional<Kakshya::DataVariant> select_operation_data(
20 const std::unordered_map<BufferOperation*, Kakshya::DataVariant>& operation_data,
22 bool graphics_read_pending)
24 if (
const auto own = operation_data.find(&op); own != operation_data.end()) {
28 if (!operation_data.empty()) {
29 return operation_data.begin()->second;
32 if (graphics_read_pending) {
41 const auto size_of = [](
const auto&
values) {
return values.size(); };
42 return a.index() ==
b.index() && std::visit(size_of,
a) == std::visit(size_of,
b);
85 "Unknown operation type in pipeline : {} : {}",
89 }
catch (
const std::exception& e) {
92 std::source_location::current(),
93 "Error processing operation in BufferPipeline: {}",
104 auto input_data = std::move(*selected);
110 const bool has_downstream_route = std::ranges::any_of(
116 if (!has_downstream_route) {
117 for (
auto& candidate : std::ranges::reverse_view(
m_operations)) {
118 if (&candidate == &op)
124 if (
const auto buf = candidate.m_capture.get_audio_buffer()) {
125 if (std::holds_alternative<std::vector<double>>(transformed)
126 && std::get<std::vector<double>>(transformed).
size() == buf->get_data().size()) {
132 if (
const auto target = candidate.m_capture.get_graphics_buffer()) {
136 && same_extent(captured->second, transformed)) {
171 const auto& data_to_route = *selected;
177 std::source_location::current(),
178 "BufferPipeline has no BufferManager for ROUTE-to-buffer operation");
182 auto writer = std::make_shared<Buffers::AudioWriteProcessor>();
189 ->set_data(data_to_route);
219 std::vector<Kakshya::DataVariant> fusion_inputs;
224 fusion_inputs.push_back(buffer_data);
229 fusion_inputs.push_back(container_data);
232 bool graphics_ready =
true;
235 fusion_inputs.push_back(std::move(*buffer_data));
237 graphics_ready =
false;
241 if (!graphics_ready) {
283 std::source_location::current(),
284 "BufferPipeline has no BufferManager for MODIFY operation");
321 if (!op.m_render || op.m_display_attached || !op.m_target_graphics_stream) {
328 std::source_location::current(),
329 "BufferPipeline has no IOManager to display a stream route");
332 auto display =
m_io_manager->hook_video_container_to_buffer(op.m_target_graphics_stream);
336 std::source_location::current(),
337 "Failed to hook the stream to a display buffer");
341 op.m_display_attached =
true;
355 std::source_location::current(),
356 "BufferPipeline has no BufferManager for graphics buffer write");
362 std::source_location::current(),
363 "Graphics buffer regenerates its own storage; write its owner, source or image instead");
367 auto writer = std::make_shared<Buffers::DataWriteProcessor>();
#define MF_ERROR(comp, ctx,...)
std::vector< std::byte > values
ProcessingControl get_processing_control() const
Buffers::GraphicsProcessingFunction m_graphics_buffer_modifier
std::vector< std::shared_ptr< Buffers::AudioBuffer > > m_source_audio_buffers
std::vector< std::shared_ptr< Buffers::VKBuffer > > m_source_graphics_buffers
std::shared_ptr< Kakshya::DynamicVideoStream > m_target_graphics_stream
Buffers::AudioProcessingFunction m_audio_buffer_modifier
Buffers::ProcessingToken get_token() const
Return the operation's processing token.
std::shared_ptr< Buffers::VKBuffer > m_source_graphics_buffer
std::shared_ptr< Buffers::AudioBuffer > m_target_audio_buffer
std::shared_ptr< Kakshya::VideoStreamContainer > m_source_graphics_stream
bool is_streaming() const
Check if this operation is a streaming operation.
TransformVectorFunction m_fusion_function
std::vector< std::shared_ptr< Core::VKImage > > m_source_images
std::shared_ptr< Buffers::BufferProcessor > m_attached_processor
OpType get_type() const
Getters for internal state (read-only)
std::vector< std::shared_ptr< Kakshya::DynamicVideoStream > > m_source_graphics_streams
uint32_t m_modify_cycle_count
std::shared_ptr< Kakshya::DynamicSoundStream > m_source_audio_stream
std::vector< std::shared_ptr< Kakshya::DynamicSoundStream > > m_source_audio_streams
TransformationFunction m_transformer
uint32_t m_target_audio_channel
OperationFunction m_dispatch_handler
std::shared_ptr< Kakshya::DynamicSoundStream > m_target_audio_stream
@ LOAD
Load data from container to buffer with position control.
@ CONDITION
Conditional operation for branching logic.
@ FUSE
Fuse multiple sources using custom fusion functions.
@ ROUTE
Route data to destination (buffer or container)
@ CAPTURE
Capture data from source buffer using BufferCapture strategy.
@ MODIFY
Modify Buffer Data using custom quick process.
@ DISPATCH
Dispatch to external handler for custom processing.
@ TRANSFORM
Apply transformation function to data variants.
std::shared_ptr< Buffers::VKBuffer > m_target_graphics_buffer
Fundamental unit of operation in buffer processing pipelines.
std::unordered_map< BufferOperation *, Kakshya::DataVariant > m_operation_data
std::shared_ptr< IO::IOManager > m_io_manager
void queue_graphics_write(BufferOperation &op, const std::shared_ptr< Buffers::VKBuffer > &target, const Kakshya::DataVariant &data)
void process_transform(BufferOperation &op, uint64_t cycle)
void process_operation(BufferOperation &op, uint64_t cycle)
void process_modify(BufferOperation &op, uint64_t cycle)
void process_route(BufferOperation &op)
std::map< std::pair< const BufferOperation *, const Buffers::VKBuffer * >, GraphicsReader > m_readers
std::optional< Kakshya::DataVariant > read_graphics_buffer(BufferOperation &op, const std::shared_ptr< Buffers::VKBuffer > &buffer)
void capture_operation(BufferOperation &op, uint64_t cycle)
std::vector< BufferOperation > m_operations
void process_dispatch(BufferOperation &op, uint64_t cycle)
void process_load(BufferOperation &op)
std::shared_ptr< Buffers::BufferManager > m_buffer_manager
void process_fuse(BufferOperation &op, uint64_t cycle)
@ AUDIO_BACKEND
Standard audio processing backend configuration.
@ GRAPHICS_BACKEND
Standard graphics processing backend configuration.
@ CoroutineScheduling
Coroutine scheduling and temporal coordination (Vruta::TaskScheduler)
@ Kriya
Automatable tasks and fluent scheduling api for Nodes and Buffers.
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
void write_layer(const std::shared_ptr< Buffers::VKBuffer > &target, uint32_t layer, const Kakshya::DataVariant &data)
Write a DataVariant into one layer of a layered buffer.
bool accepts_layer_write(const std::shared_ptr< Buffers::VKBuffer > &buffer)
Whether the buffer holds its frames as layers that can be written one at a time.
Kakshya::DataVariant read_from_container(const std::shared_ptr< Kakshya::DynamicSoundStream > &container, uint64_t, uint32_t length)
void write_to_buffer(const std::shared_ptr< Buffers::AudioBuffer > &buffer, const Kakshya::DataVariant &data)
bool ensure_rendering(const std::shared_ptr< Buffers::VKBuffer > &buffer, const Portal::Graphics::RenderConfig &config)
Make a buffer draw to the window in a render config, unless it already does.
Kakshya::DataVariant extract_buffer_data(const std::shared_ptr< Buffers::AudioBuffer > &buffer, bool should_process)
void write_to_container(const std::shared_ptr< Kakshya::DynamicSoundStream > &container, const Kakshya::DataVariant &data, uint32_t channel)
bool accepts_raw_write(const std::shared_ptr< Buffers::VKBuffer > &buffer)
Whether a DataVariant can be written to the buffer's primary storage.
constexpr std::string_view enum_to_string(EnumType value) noexcept
Universal enum to string converter using magic_enum (original case)