17 const std::shared_ptr<AudioBuffer>& source,
18 const std::shared_ptr<VKBuffer>& target)
26 const std::shared_ptr<AudioBuffer>& audio_buffer,
27 const std::shared_ptr<VKBuffer>& gpu_buffer,
41 const std::shared_ptr<AudioBuffer>& source,
42 const std::shared_ptr<VKBuffer>& target)
44 if (!source || !target) {
46 "TransferProcessor::connect_audio_to_gpu: null buffer provided");
55 const std::shared_ptr<VKBuffer>& source,
56 const std::shared_ptr<AudioBuffer>& target)
58 if (!source || !target) {
60 "TransferProcessor::connect_gpu_to_audio: null buffer provided");
69 const std::shared_ptr<VKBuffer>& target,
70 std::shared_ptr<VKBuffer> staging_buffer)
74 "TransferProcessor::setup_staging: null target provided");
84 [&target](
const auto& pair) {
return pair.second == target; });
90 [&target](
const auto& pair) {
return pair.second == target; });
96 if (
auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
99 "TransferProcessor not configured for the attached VKBuffer instance (audio→gpu).");
103 if (!vk_buffer->is_initialized()) {
105 "VKBuffer not initialized - register with BufferManager first.");
109 if (!vk_buffer->is_host_visible()) {
113 "No staging buffer configured for device-local VKBuffer. Create one for efficient transfers.");
118 std::source_location::current(),
119 "TransferProcessor (audio→gpu) requires VKBuffer attachment");
123 if (
auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
126 "TransferProcessor not configured for the attached AudioBuffer instance (gpu→audio).");
131 std::source_location::current(),
132 "TransferProcessor (gpu→audio) requires AudioBuffer attachment");
140 if (
auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
143 if (it->second == vk_buffer) {
151 if (
auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
153 if (it->second == audio_buffer) {
174 auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(gpu_buffer);
177 "TransferProcessor (audio→gpu) requires VKBuffer.");
182 [&vk_buffer](
const auto& pair) {
return pair.second == vk_buffer; });
186 "No source AudioBuffer configured for this VKBuffer.");
190 auto source_audio = transfer_it->first;
192 if (vk_buffer->is_host_visible()) {
198 "No staging buffer configured for device-local VKBuffer.");
207 auto audio = std::dynamic_pointer_cast<AudioBuffer>(audio_buffer);
210 "TransferProcessor (gpu→audio) requires AudioBuffer.");
215 [&audio](
const auto& pair) {
return pair.second == audio; });
219 "No source VKBuffer configured for this AudioBuffer.");
223 auto source_gpu = transfer_it->first;
226 std::shared_ptr<VKBuffer> staging = (staging_it !=
m_staging_map.end()) ? staging_it->second :
nullptr;
#define MF_ERROR(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
ProcessingToken m_processing_token
bool validate_audio_to_gpu(const std::shared_ptr< VKBuffer > &target) const
void processing_function(const std::shared_ptr< Buffer > &buffer) override
The core processing function that must be implemented by derived classes.
void connect_audio_to_gpu(const std::shared_ptr< AudioBuffer > &source, const std::shared_ptr< VKBuffer > &target)
Configure audio→GPU transfer.
void connect_gpu_to_audio(const std::shared_ptr< VKBuffer > &source, const std::shared_ptr< AudioBuffer > &target)
Configure GPU→audio transfer.
void setup_staging(const std::shared_ptr< VKBuffer > &target, std::shared_ptr< VKBuffer > staging_buffer)
Set up staging buffer for device-local GPU buffer.
std::unordered_map< std::shared_ptr< VKBuffer >, std::shared_ptr< AudioBuffer > > m_gpu_to_audio_map
void on_attach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is attached to a buffer.
bool validate_gpu_to_audio(const std::shared_ptr< AudioBuffer > &target) const
void process_gpu_to_audio(const std::shared_ptr< Buffer > &audio_buffer)
TransferDirection m_direction
std::unordered_map< std::shared_ptr< VKBuffer >, std::shared_ptr< VKBuffer > > m_staging_map
void process_audio_to_gpu(const std::shared_ptr< Buffer > &gpu_buffer)
void on_detach(const std::shared_ptr< Buffer > &buffer) override
Called when this processor is detached from a buffer.
std::unordered_map< std::shared_ptr< AudioBuffer >, std::shared_ptr< VKBuffer > > m_audio_to_gpu_map
void upload_audio_to_gpu(const std::shared_ptr< AudioBuffer > &audio_buffer, const std::shared_ptr< VKBuffer > &gpu_buffer, const std::shared_ptr< VKBuffer > &staging)
Upload AudioBuffer to GPU (always double precision)
@ GRAPHICS_BACKEND
Standard graphics processing backend configuration.
void download_audio_from_gpu(const std::shared_ptr< VKBuffer > &gpu_buffer, const std::shared_ptr< AudioBuffer > &audio_buffer, const std::shared_ptr< VKBuffer > &staging)
Download GPU buffer to AudioBuffer (expects double precision)
TransferDirection
Specifies the direction of data transfer.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Buffers
Buffers, Managers, processors and processing chains.