--- /dev/null
+#include "device.h"
+#include "renderer.h"
+#include "vulkan.h"
+#include "windowview.h"
+#include "windowview_backend.h"
+
+namespace Msp {
+namespace GL {
+
+VulkanWindowView::~VulkanWindowView()
+{
+ delete swap_chain;
+}
+
+void VulkanWindowView::render()
+{
+ Device &device = static_cast<const WindowView *>(this)->device;
+
+ Semaphore *sem = semaphores+frame_index*2;
+ unsigned image_index = swap_chain->begin_frame(sem[0]);
+ current_target = &framebuffers[image_index];
+
+ if(!internal_renderer)
+ internal_renderer = new Renderer;
+ internal_renderer->begin(sem[0]);
+ View::render(*internal_renderer);
+ internal_renderer->end(sem[1]);
+
+ swap_chain->present_frame(sem[1]);
+ frame_index = (frame_index+1)%device.get_n_frames_in_flight();
+
+ device.get_destroy_queue().tick();
+}
+
+void VulkanWindowView::resize_framebuffer(unsigned w, unsigned h)
+{
+ Device &device = static_cast<const WindowView *>(this)->device;
+
+ framebuffers.clear();
+ delete swap_chain;
+
+ swap_chain = new SwapChain(w, h, device.get_n_frames_in_flight());
+
+ unsigned n_images = swap_chain->get_n_images();
+ framebuffers.reserve(n_images);
+ for(unsigned i=0; i<n_images; ++i)
+ {
+ const SwapChainTexture &image = swap_chain->get_image(i);
+ framebuffers.emplace_back((COLOR_ATTACHMENT, image.get_format()));
+ framebuffers.back().attach(COLOR_ATTACHMENT, swap_chain->get_image(i));
+ }
+
+ current_target = &framebuffers.front();
+}
+
+} // namespace GL
+} // namespace Msp