]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/windowview_backend.cpp
Initial implementation of Vulkan backend
[libs/gl.git] / source / backends / vulkan / windowview_backend.cpp
diff --git a/source/backends/vulkan/windowview_backend.cpp b/source/backends/vulkan/windowview_backend.cpp
new file mode 100644 (file)
index 0000000..433d372
--- /dev/null
@@ -0,0 +1,57 @@
+#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