From: Mikko Rasa Date: Thu, 26 Dec 2024 17:18:41 +0000 (+0200) Subject: Adjust behaviour of render functions in View X-Git-Url: https://git.tdb.fi/?a=commitdiff_plain;h=5a7022e4763be6dd07e53decf4c3298e9ae36361;p=libs%2Fgl.git Adjust behaviour of render functions in View They now call begin/end and present the rendered image regardless of whether an internal or external renderer was used. --- diff --git a/source/backends/opengl/windowview_backend.cpp b/source/backends/opengl/windowview_backend.cpp index 90a218ef..b388911e 100644 --- a/source/backends/opengl/windowview_backend.cpp +++ b/source/backends/opengl/windowview_backend.cpp @@ -5,9 +5,9 @@ namespace Msp { namespace GL { -void OpenGLWindowView::render() +void OpenGLWindowView::render(Renderer &renderer) { - View::render(); + View::render(renderer); Device &device = static_cast(this)->device; device.get_context().swap_buffers(); } diff --git a/source/backends/opengl/windowview_backend.h b/source/backends/opengl/windowview_backend.h index e22503da..573c9982 100644 --- a/source/backends/opengl/windowview_backend.h +++ b/source/backends/opengl/windowview_backend.h @@ -15,7 +15,7 @@ protected: OpenGLWindowView() = default; - void render() override; + void render(Renderer &) override; const Framebuffer &get_target() const override { return sys_framebuf; } void resize_framebuffer(unsigned, unsigned); diff --git a/source/backends/vulkan/windowview_backend.cpp b/source/backends/vulkan/windowview_backend.cpp index adc66f13..d59fa47c 100644 --- a/source/backends/vulkan/windowview_backend.cpp +++ b/source/backends/vulkan/windowview_backend.cpp @@ -12,19 +12,16 @@ namespace GL { // Hide Semaphore destructor since it's not exported VulkanWindowView::~VulkanWindowView() = default; -void VulkanWindowView::render() +void VulkanWindowView::render(Renderer &renderer) { Device &device = static_cast(this)->device; - if(!internal_renderer) - internal_renderer = make_unique(); - 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(); diff --git a/source/backends/vulkan/windowview_backend.h b/source/backends/vulkan/windowview_backend.h index b7b4c9b3..02427141 100644 --- a/source/backends/vulkan/windowview_backend.h +++ b/source/backends/vulkan/windowview_backend.h @@ -24,7 +24,7 @@ protected: 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); diff --git a/source/render/renderer.h b/source/render/renderer.h index 1703ddb1..56cd93a9 100644 --- a/source/render/renderer.h +++ b/source/render/renderer.h @@ -150,6 +150,8 @@ public: 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(); diff --git a/source/render/view.cpp b/source/render/view.cpp index 256d02a6..19913d7c 100644 --- a/source/render/view.cpp +++ b/source/render/view.cpp @@ -27,23 +27,28 @@ void View::render() { if(!internal_renderer) internal_renderer = make_unique(); - 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