]> git.tdb.fi Git - libs/gl.git/commitdiff
Adjust behaviour of render functions in View
authorMikko Rasa <tdb@tdb.fi>
Thu, 26 Dec 2024 17:18:41 +0000 (19:18 +0200)
committerMikko Rasa <tdb@tdb.fi>
Thu, 26 Dec 2024 17:18:41 +0000 (19:18 +0200)
They now call begin/end and present the rendered image regardless of
whether an internal or external renderer was used.

source/backends/opengl/windowview_backend.cpp
source/backends/opengl/windowview_backend.h
source/backends/vulkan/windowview_backend.cpp
source/backends/vulkan/windowview_backend.h
source/render/renderer.h
source/render/view.cpp

index 90a218efdec98c856bb3ff6846a12a2cafddb4f7..b388911e421caaef06a6b1ee6c1461a4106f7236 100644 (file)
@@ -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<WindowView *>(this)->device;
        device.get_context().swap_buffers();
 }
index e22503da2d12269f1b8c5792f1b25e423eca2140..573c9982e5ecb7b220f583f55c64056c179006a4 100644 (file)
@@ -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);
index adc66f13364e5b06e29bc598b4616b327708a84a..d59fa47c61ac1bb73b7dd5b2602bb379d23ada91 100644 (file)
@@ -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<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();
index b7b4c9b358619230836feab68c9030281efce9e1..024271412d30034aaf4e44dff31c18da5d316aed 100644 (file)
@@ -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);
index 1703ddb19d8f37a8d2f4d37cb6a9ba19b2fb7758..56cd93a90c758d7b59709f77293c22420b7f858a 100644 (file)
@@ -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();
 
index 256d02a649edc89815aebc34421c4e6f2ca5b7a4..19913d7c0263c71cc27005d687092e7fb53f3799 100644 (file)
@@ -27,23 +27,28 @@ void View::render()
 {
        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