namespace Msp {
namespace GL {
-void OpenGLWindowView::render()
+void OpenGLWindowView::render(Renderer &renderer)
{
- View::render();
+ View::render(renderer);
Device &device = static_cast<WindowView *>(this)->device;
device.get_context().swap_buffers();
}
OpenGLWindowView() = default;
- void render() override;
+ void render(Renderer &) override;
const Framebuffer &get_target() const override { return sys_framebuf; }
void resize_framebuffer(unsigned, unsigned);
// Hide Semaphore destructor since it's not exported
VulkanWindowView::~VulkanWindowView() = default;
-void VulkanWindowView::render()
+void VulkanWindowView::render(Renderer &renderer)
{
Device &device = static_cast<const WindowView *>(this)->device;
- if(!internal_renderer)
- internal_renderer = make_unique<Renderer>();
-
Semaphore *sem = semaphores+frame_index*2;
- internal_renderer->begin(sem[0]);
+ renderer.begin(sem[0]);
unsigned image_index = swap_chain->begin_frame(sem[0]);
current_target = &framebuffers[image_index];
- View::render(*internal_renderer);
- internal_renderer->end(sem[1]);
+ View::render(renderer);
+ renderer.end(sem[1]);
swap_chain->present_frame(sem[1]);
frame_index = (frame_index+1)%device.get_n_frames_in_flight();
VulkanWindowView() = default;
~VulkanWindowView() override;
- void render() override;
+ void render(Renderer &) override;
const Framebuffer &get_target() const override { return *current_target; }
void resize_framebuffer(unsigned, unsigned);
using RendererBackend::begin;
using RendererBackend::end;
+ bool is_rendering() const { return current_state; }
+
/** Saves the current state so it can be restored later. */
void push_state();
{
if(!internal_renderer)
internal_renderer = make_unique<Renderer>();
- internal_renderer->begin();
render(*internal_renderer);
- internal_renderer->end();
}
void View::render(Renderer &renderer)
{
- Renderer::Push _push(renderer);
- renderer.set_framebuffer(&get_target());
+ bool was_rendering = renderer.is_rendering();
+ if(!was_rendering)
+ renderer.begin();
+
if(content)
{
+ Renderer::Push _push(renderer);
+ renderer.set_framebuffer(&get_target());
if(camera)
renderer.set_camera(*camera);
content->setup_frame(renderer);
content->render(renderer);
content->finish_frame();
}
+
+ if(!was_rendering)
+ renderer.end();
}
} // namespace GL