71{
72 display_service->present_frame = [this](const std::shared_ptr<void>& window_ptr, uint64_t command_buffer_bits) {
73 auto window = std::static_pointer_cast<Window>(window_ptr);
75 if (!ctx) {
77 "Window '{}' not registered for presentation", window->get_create_info().title);
78 return;
79 }
80 ctx->command_buffer = *reinterpret_cast<vk::CommandBuffer*>(&command_buffer_bits);
82 };
83
84 display_service->wait_idle = [this]() {
86 };
87
88 display_service->resize_surface = [this](const std::shared_ptr<void>& window_ptr, uint32_t width, uint32_t height) {
89 auto window = std::static_pointer_cast<Window>(window_ptr);
90 window->set_size(width, height);
92 if (ctx.window == window) {
93 ctx.needs_recreation = true;
94 break;
95 }
96 }
97 };
98
99 display_service->get_swapchain_image_count = [this](const std::shared_ptr<void>& window_ptr) -> uint32_t {
100 auto window = std::static_pointer_cast<Window>(window_ptr);
102 if (ctx.window == window) {
103 return static_cast<uint32_t>(ctx.swapchain->get_image_count());
104 }
105 }
106 return 0;
107 };
108
109 display_service->get_swapchain_format = [this](const std::shared_ptr<void>& window_ptr) -> uint32_t {
110 auto window = std::static_pointer_cast<Window>(window_ptr);
112 if (ctx.window == window) {
113 return static_cast<int>(ctx.swapchain->get_image_format());
114 }
115 }
116 return 0;
117 };
118
119 display_service->get_current_framebuffer = [this](const std::shared_ptr<void>& window_ptr) -> void* {
120 auto window = std::static_pointer_cast<Window>(window_ptr);
122
123 if (!context || context->framebuffers.empty()) {
124 return nullptr;
125 }
126
127 size_t frame_index = context->current_frame % context->framebuffers.size();
128 auto& handle = *context->framebuffers[frame_index];
129 return static_cast<void*>(&handle);
130 };
131
132 display_service->get_swapchain_extent = [this](
133 const std::shared_ptr<void>& window_ptr,
134 uint32_t& out_width,
135 uint32_t& out_height) {
136 auto window = std::static_pointer_cast<Window>(window_ptr);
138
139 if (context && context->swapchain) {
140 auto extent = context->swapchain->get_extent();
141 out_width = extent.width;
142 out_height = extent.height;
143 } else {
144 out_width = 0;
145 out_height = 0;
146 }
147 };
148
149 display_service->get_window_render_pass = [this](const std::shared_ptr<void>& window_ptr) -> void* {
150 auto window = std::static_pointer_cast<Window>(window_ptr);
152
153 if (!context || !context->render_pass) {
154 return nullptr;
155 }
156
157 vk::RenderPass rp = context->render_pass->get();
158 return static_cast<void*>(rp);
159 };
160
161 display_service->attach_render_pass = [this](
162 const std::shared_ptr<void>& window_ptr,
163 const std::shared_ptr<void>& render_pass_handle) -> bool {
164 auto window = std::static_pointer_cast<Window>(window_ptr);
165 auto render_pass = std::static_pointer_cast<Core::VKRenderPass>(render_pass_handle);
167 };
168}
#define MF_RT_ERROR(comp, ctx,...)
std::vector< WindowRenderContext > m_window_contexts
WindowRenderContext * find_window_context(const std::shared_ptr< Window > &window)
bool attach_render_pass(const std::shared_ptr< Window > &window, const std::shared_ptr< Core::VKRenderPass > &render_pass)
Attach a user render pass and recreate sync objects with it Used by Portal when registering a window ...
void render_window(const std::shared_ptr< Window > &window)
vk::Device get_device() const
Get logical device.
@ GraphicsCallback
Graphics/visual rendering callback - frame-rate real-time.
@ Core
Core engine, backend, subsystems.