]> git.tdb.fi Git - libs/gl.git/commitdiff
Reset the default pipeline state when rendering ends
authorMikko Rasa <tdb@tdb.fi>
Mon, 3 Apr 2023 13:15:31 +0000 (16:15 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 3 Apr 2023 13:15:31 +0000 (16:15 +0300)
This avoids invalid accesses to resources which get destroyed before
the next frame, particularly with the OpenGL backend.

source/core/pipelinestate.cpp
source/core/pipelinestate.h
source/render/renderer.cpp

index 6078db5d0aa24d39bfb9fcf0a8ce1187e5215dcf..374f892608c35d8a7f6c600239f9619dd894548e 100644 (file)
@@ -11,6 +11,30 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
+void PipelineState::reset()
+{
+       set(framebuffer, static_cast<const Framebuffer *>(0), FRAMEBUFFER);
+       set(viewport, Rect::max(), VIEWPORT);
+       set(scissor, Rect::max(), SCISSOR);
+       set(shprog, static_cast<const Program *>(0), SHPROG);
+       for(BoundResource &r: resources)
+       {
+               r.changed = (r.type!=NO_RESOURCE);
+               r.type = NO_RESOURCE;
+               r.used = false;
+               r.block = 0;
+               r.buffer = 0;
+       }
+       set(vertex_setup, static_cast<const VertexSetup *>(0), VERTEX_SETUP);
+       set(primitive_type, TRIANGLES, PRIMITIVE_TYPE);
+       set(patch_size, 0U, PATCH_SIZE);
+       set(front_face, COUNTERCLOCKWISE, FACE_CULL);
+       set(face_cull, NO_CULL, FACE_CULL);
+       set(depth_test, DepthTest(), DEPTH_TEST);
+       set(stencil_test, StencilTest(), STENCIL_TEST);
+       set(blend, Blend(), BLEND);
+}
+
 template<typename T>
 void PipelineState::set(T &target, const T &value, unsigned flag)
 {
index 9284f5d4e5ac621b7c4824f975780d0a8817af12..a7c1c82f7376dde175a9e463b45d0cb7501d104a 100644 (file)
@@ -91,6 +91,10 @@ private:
        StencilTest stencil_test;
        Blend blend;
 
+public:
+       void reset();
+
+private:
        template<typename T>
        void set(T &, const T &, unsigned);
 public:
index 97c492eb989b9ca17786da013c8338608284218d..34d18d0916ade96a62082fb991ad75f705d69d69 100644 (file)
@@ -58,6 +58,9 @@ void Renderer::end()
        state_stack.clear();
        texture_stack.clear();
        shdata_stack.clear();
+
+       RendererBackend::set_pipeline_key(0);
+       RendererBackend::get_pipeline_state().reset();
 }
 
 void Renderer::push_state()