MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ setup_backend_service()

void MayaFlux::Core::BackendResourceManager::setup_backend_service ( const std::shared_ptr< Registry::Service::BufferService > &  buffer_service)

Definition at line 26 of file BackendResoureManager.cpp.

27{
28 buffer_service->initialize_buffer = [this](const std::shared_ptr<void>& vk_buf) -> void {
29 auto buffer = std::static_pointer_cast<Buffers::VKBuffer>(vk_buf);
30 this->initialize_buffer(buffer);
31 };
32
33 buffer_service->destroy_buffer = [this](const std::shared_ptr<void>& vk_buf) {
34 auto buffer = std::static_pointer_cast<Buffers::VKBuffer>(vk_buf);
35 this->cleanup_buffer(buffer);
36 };
37
38 buffer_service->get_buffer_device_address = [this](const std::shared_ptr<void>& vk_buf) -> uint64_t {
39 auto buffer = std::static_pointer_cast<Buffers::VKBuffer>(vk_buf);
40 auto address = this->get_buffer_device_address(buffer);
41 return static_cast<uint64_t>(address);
42 };
43
44 buffer_service->execute_immediate = [this](const std::function<void(void*)>& recorder) {
45 this->execute_immediate_commands([recorder](vk::CommandBuffer cmd) {
46 recorder(static_cast<void*>(cmd));
47 });
48 };
49
50 buffer_service->record_deferred = [this](const std::function<void(void*)>& recorder) {
51 this->record_deferred_commands([recorder](vk::CommandBuffer cmd) {
52 recorder(static_cast<void*>(cmd));
53 });
54 };
55
56 buffer_service->flush_range = [this](void* memory, size_t offset, size_t size) {
57 vk::DeviceMemory mem(reinterpret_cast<VkDeviceMemory>(memory));
58 vk::MappedMemoryRange range { mem, offset, size == 0 ? VK_WHOLE_SIZE : size };
59 if (auto result = m_context.get_device().flushMappedMemoryRanges(1, &range); result != vk::Result::eSuccess) {
61 "Failed to flush mapped memory range: {}", vk::to_string(result));
62 }
63 };
64
65 buffer_service->invalidate_range = [this](void* memory, size_t offset, size_t size) {
66 vk::DeviceMemory mem(reinterpret_cast<VkDeviceMemory>(memory));
67 vk::MappedMemoryRange range { mem, offset, size == 0 ? VK_WHOLE_SIZE : size };
68 if (auto result = m_context.get_device().invalidateMappedMemoryRanges(1, &range); result != vk::Result::eSuccess) {
70 "Failed to invalidate mapped memory range: {}", vk::to_string(result));
71 }
72 };
73
74 buffer_service->map_buffer = [this](void* memory, size_t offset, size_t size) -> void* {
75 vk::DeviceMemory mem(reinterpret_cast<VkDeviceMemory>(memory));
76 return m_context.get_device().mapMemory(mem, offset, size == 0 ? VK_WHOLE_SIZE : size);
77 };
78
79 buffer_service->unmap_buffer = [this](void* memory) {
80 vk::DeviceMemory mem(reinterpret_cast<VkDeviceMemory>(memory));
81 m_context.get_device().unmapMemory(mem);
82 };
83
84 buffer_service->execute_fenced = [this](const std::function<void(void*)>& recorder)
85 -> std::shared_ptr<void> {
87
88 recorder(static_cast<void*>(cmd));
89
90 cmd.end();
91
92 auto device = m_context.get_device();
93 vk::FenceCreateInfo fence_info {};
94 vk::Fence fence = device.createFence(fence_info);
95
96 vk::SubmitInfo submit_info {};
97 submit_info.commandBufferCount = 1;
98 submit_info.pCommandBuffers = &cmd;
99
100 if (auto result = m_context.get_graphics_queue().submit(1, &submit_info, fence);
101 result != vk::Result::eSuccess) {
103 "execute_fenced: queue submit failed: {}", vk::to_string(result));
104 device.destroyFence(fence);
106 return nullptr;
107 }
108
109 auto handle = std::make_shared<FencedSubmission>();
110 handle->cmd = cmd;
111 handle->fence = fence;
112 return handle;
113 };
114
115 buffer_service->wait_fenced = [this](const std::shared_ptr<void>& handle) {
116 if (!handle)
117 return;
118 auto sub = std::static_pointer_cast<FencedSubmission>(handle);
119 if (!sub->fence)
120 return;
121
122 auto device = m_context.get_device();
123 if (auto result = device.waitForFences(1, &sub->fence, VK_TRUE, UINT64_MAX);
124 result != vk::Result::eSuccess) {
126 "wait_fenced: waitForFences failed: {}", vk::to_string(result));
127 }
128 };
129
130 buffer_service->release_fenced = [this](const std::shared_ptr<void>& handle) {
131 if (!handle)
132 return;
133 auto sub = std::static_pointer_cast<FencedSubmission>(handle);
134
135 auto device = m_context.get_device();
136 if (sub->fence) {
137 device.destroyFence(sub->fence);
138 sub->fence = nullptr;
139 }
140 if (sub->cmd) {
142 sub->cmd = nullptr;
143 }
144 };
145}
#define MF_ERROR(comp, ctx,...)
vk::Fence fence
vk::CommandBuffer cmd
Range size
void cleanup_buffer(const std::shared_ptr< Buffers::VKBuffer > &buffer)
Cleanup a buffer and release associated resources.
vk::DeviceAddress get_buffer_device_address(const std::shared_ptr< Buffers::VKBuffer > &buffer) const
Query the Vulkan device address of an initialized BDA-capable buffer.
void execute_immediate_commands(const std::function< void(vk::CommandBuffer)> &recorder)
Execute immediate command recording for buffer operations.
void initialize_buffer(const std::shared_ptr< Buffers::VKBuffer > &buffer)
Initialize a buffer for use with the graphics backend.
void record_deferred_commands(const std::function< void(vk::CommandBuffer)> &recorder)
Record deferred command recording for buffer operations.
void free_command_buffer(vk::CommandBuffer command_buffer)
Free a command buffer back to the pool.
vk::CommandBuffer begin_single_time_commands()
Begin single-time command (for transfers, etc.)
vk::Device get_device() const
Get logical device.
Definition VKContext.hpp:49
vk::Queue get_graphics_queue() const
Get graphics queue.
Definition VKContext.hpp:54
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.
std::vector< double > range(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Value range (max - min) per window.
Definition Analysis.cpp:452

References MayaFlux::Core::VKCommandManager::begin_single_time_commands(), cleanup_buffer(), cmd, MayaFlux::Journal::Core, execute_immediate_commands(), fence, MayaFlux::Core::VKCommandManager::free_command_buffer(), get_buffer_device_address(), MayaFlux::Core::VKContext::get_device(), MayaFlux::Core::VKContext::get_graphics_queue(), MayaFlux::Journal::GraphicsBackend, initialize_buffer(), m_command_manager, m_context, MF_ERROR, record_deferred_commands(), and size.

+ Here is the call graph for this function: