MayaFlux 0.5.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
BufferUploadProcessor.hpp
Go to the documentation of this file.
1#pragma once
2
4
5namespace MayaFlux::Buffers {
6
7/**
8 * @class BufferUploadProcessor
9 * @brief Transfers data from CPU source buffer to GPU VKBuffer
10 *
11 * This processor can be attached to multiple VKBuffers and configured with
12 * different source buffers for each target. The mapping is maintained internally,
13 * adhering to the n-to-n processor-buffer relationship.
14 *
15 * Usage:
16 * auto upload = std::make_shared<BufferUploadProcessor>();
17 * upload->configure_source(gpu_buffer1, cpu_source1);
18 * upload->configure_source(gpu_buffer2, cpu_source2);
19 *
20 * chain->add_processor(upload, gpu_buffer1);
21 * chain->add_processor(upload, gpu_buffer2);
22 *
23 * Each process() call uploads data from the configured source for that specific buffer.
24 */
25class MAYAFLUX_API BufferUploadProcessor : public VKBufferProcessor {
26public:
28 ~BufferUploadProcessor() override;
29
30 void processing_function(const std::shared_ptr<Buffer>& buffer) override;
31 void on_attach(const std::shared_ptr<Buffer>& buffer) override;
32 void on_detach(const std::shared_ptr<Buffer>& buffer) override;
33
34 [[nodiscard]] bool is_compatible_with(const std::shared_ptr<Buffer>& buffer) const override;
35
36 /**
37 * @brief Configure source buffer for a specific target
38 * @param target VKBuffer that will receive uploads
39 * @param source CPU-side buffer to read from (AudioBuffer, etc.)
40 */
41 void configure_source(const std::shared_ptr<Buffer>& target, std::shared_ptr<Buffer> source);
42
43 /**
44 * @brief Remove source configuration for a target
45 * @param target VKBuffer to remove configuration for
46 */
47 void remove_source(const std::shared_ptr<Buffer>& target);
48
49 /**
50 * @brief Configure sources to upload into every entry in a VKBuffer's
51 * back_buffers, re-read every processing cycle.
52 * @param target VKBuffer whose back_buffers is being written in full.
53 * @param sources CPU-side buffers to read from, one per back_buffers
54 * entry, in order.
55 *
56 * back_buffers.size() is read fresh each call. If sources.size() does not
57 * match at process time, the call is skipped with an error rather than
58 * partially applied. Direct memcpy per entry; entries without a mapped_ptr
59 * are unsupported and logged as an error rather than silently skipped.
60 */
61 void configure_back_buffers(
62 const std::shared_ptr<Buffer>& target,
63 std::vector<std::shared_ptr<Buffer>> sources);
64
65 /**
66 * @brief Remove back_buffers configuration for a target.
67 */
68 void remove_back_buffers(const std::shared_ptr<Buffer>& target);
69
70 /**
71 * @brief Get configured source for a target
72 * @param target VKBuffer to query
73 * @return Source buffer, or nullptr if not configured
74 */
75 [[nodiscard]] std::shared_ptr<Buffer> get_source(const std::shared_ptr<Buffer>& target) const;
76
77private:
78 std::unordered_map<std::shared_ptr<Buffer>, std::shared_ptr<Buffer>> m_source_map; ///< Maps target VKBuffer -> source Buffer
79 std::unordered_map<std::shared_ptr<Buffer>, std::shared_ptr<VKBuffer>> m_staging_buffers; ///< Maps target VKBuffer -> staging buffer (for device-local transfers)
80 std::unordered_map<std::shared_ptr<Buffer>, std::vector<std::shared_ptr<Buffer>>> m_back_buffers_source_map; ///< Maps target VKBuffer -> vector of source Buffers for back_buffers
81
82 void ensure_staging_buffer(const std::shared_ptr<VKBuffer>& target);
83 void upload_device_local(const std::shared_ptr<VKBuffer>& target, const Kakshya::DataVariant& data);
84 void upload_back_buffers(const std::shared_ptr<VKBuffer>& target);
85};
86
87}
std::unordered_map< std::shared_ptr< Buffer >, std::shared_ptr< Buffer > > m_source_map
Maps target VKBuffer -> source Buffer.
std::unordered_map< std::shared_ptr< Buffer >, std::vector< std::shared_ptr< Buffer > > > m_back_buffers_source_map
Maps target VKBuffer -> vector of source Buffers for back_buffers.
std::unordered_map< std::shared_ptr< Buffer >, std::shared_ptr< VKBuffer > > m_staging_buffers
Maps target VKBuffer -> staging buffer (for device-local transfers)
Transfers data from CPU source buffer to GPU VKBuffer.
void upload_device_local(const std::shared_ptr< VKBuffer > &target, const std::shared_ptr< VKBuffer > &staging_buffer, const Kakshya::DataVariant &data, size_t dst_offset)
Upload data to a device-local buffer using a staging buffer.
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.
Definition NDData.hpp:102