3#include "vulkan/vulkan.hpp"
14class VKCommandManager;
16class BackendResourceManager;
20 vk::DeviceMemory
mem {};
22 vk::CommandBuffer
cmd {};
28#ifdef MAYAFLUX_PLATFORM_MACOS
29 std::atomic<const std::vector<uint8_t>*>
last_frame {
nullptr };
31 static constexpr size_t LAST_FRAME_MAX_READERS = 32;
32 mutable std::array<std::atomic<const std::vector<uint8_t>*>, LAST_FRAME_MAX_READERS> last_frame_hazard_ptrs {};
33 mutable std::array<std::atomic<bool>, LAST_FRAME_MAX_READERS> last_frame_slot_active {
false };
35 void retire_last_frame(
const std::vector<uint8_t>*
ptr);
37 std::atomic<std::shared_ptr<std::vector<uint8_t>>>
last_frame;
40 std::vector<std::unique_ptr<CaptureSlot>>
slots;
48 const std::shared_ptr<std::vector<uint8_t>>&,
49 uint32_t, uint32_t, uint32_t)>;
50 using ObserverMap = std::unordered_map<uint32_t, FrameObserver>;
54#ifdef MAYAFLUX_PLATFORM_MACOS
55 std::atomic<const ObserverMap*>
observers {
nullptr };
57 static constexpr size_t OBSERVERS_MAX_READERS = 32;
58 mutable std::array<std::atomic<const ObserverMap*>, OBSERVERS_MAX_READERS> observers_hazard_ptrs {};
59 mutable std::array<std::atomic<bool>, OBSERVERS_MAX_READERS> observers_slot_active {
false };
63 std::atomic<std::shared_ptr<ObserverMap>>
observers {
64 std::make_shared<ObserverMap>()
74#ifdef MAYAFLUX_PLATFORM_MACOS
75 auto* old_frame =
last_frame.exchange(
nullptr);
77 retire_last_frame(old_frame);
79 auto* old_obs =
observers.exchange(
nullptr);
81 retire_observers(old_obs);
120 void setup_backend_service(
const std::shared_ptr<Registry::Service::DisplayService>& display_service);
131 bool register_window(const
std::shared_ptr<
Window>& window);
132 void unregister_window(const
std::shared_ptr<
Window>& window);
133 [[nodiscard]]
bool is_window_registered(const
std::shared_ptr<
Window>& window) const;
138 void render_window(const
std::shared_ptr<
Window>& window);
139 void render_all_windows();
140 void handle_window_resize();
142 void submit_and_present(
144 const vk::CommandBuffer& command_buffer);
153 [[nodiscard]] uint32_t get_swapchain_image_count(const
std::shared_ptr<
Window>& window) const;
233 void start_readback_thread(
CaptureState& state, vk::Device dev);
Manages Vulkan resources (buffers, images, samplers) for the graphics backend.
~BackendWindowHandler()=default
BackendWindowHandler(BackendWindowHandler &&) noexcept=default
VKCommandManager & m_command_manager
BackendWindowHandler & operator=(const BackendWindowHandler &)=delete
std::vector< WindowRenderContext > m_window_contexts
BackendWindowHandler(const BackendWindowHandler &)=delete
Manages Vulkan command pools and command buffers.
High-level wrapper for Vulkan instance and device.
Platform-agnostic window wrapper.
std::atomic< bool > pending
std::thread readback_thread
std::vector< std::unique_ptr< CaptureSlot > > slots
std::function< void(const std::shared_ptr< std::vector< uint8_t > > &, uint32_t, uint32_t, uint32_t)> FrameObserver
std::atomic< std::shared_ptr< ObserverMap > > observers
std::atomic< bool > readback_running
std::atomic< std::shared_ptr< std::vector< uint8_t > > > last_frame
std::unordered_map< uint32_t, FrameObserver > ObserverMap
std::atomic< uint32_t > next_observer_id
std::vector< vk::Semaphore > image_available
std::unique_ptr< CaptureState > capture
uint32_t current_image_index
std::shared_ptr< Window > window
std::vector< vk::Fence > in_flight
std::unique_ptr< VKSwapchain > swapchain
void cleanup(VKContext &context)
WindowRenderContext(WindowRenderContext &&)=default
std::vector< vk::Semaphore > render_finished
WindowRenderContext()=default
std::vector< vk::CommandBuffer > clear_command_buffers
std::shared_ptr< VKImage > depth_image
WindowRenderContext & operator=(WindowRenderContext &&)=default
WindowRenderContext(const WindowRenderContext &)=delete
WindowRenderContext & operator=(const WindowRenderContext &)=delete
~WindowRenderContext()=default