From 171d522bbbd60d783709399e009b7821590bb61e Mon Sep 17 00:00:00 2001 From: Michael Baetgen Date: Sun, 8 Mar 2026 22:17:39 -0500 Subject: [PATCH] Fix: ensure to preserve gl state of calling application --- .../MilkdropPreset/MilkdropPreset.cpp | 7 +- src/libprojectM/ProjectM.cpp | 12 +- src/libprojectM/Renderer/CMakeLists.txt | 1 + src/libprojectM/Renderer/CopyTexture.cpp | 15 +- src/libprojectM/Renderer/Framebuffer.cpp | 30 +++- src/libprojectM/Renderer/Framebuffer.hpp | 14 ++ src/libprojectM/Renderer/GLStateGuard.hpp | 131 ++++++++++++++++++ src/libprojectM/Renderer/PresetTransition.cpp | 2 +- src/libprojectM/Renderer/VertexBuffer.hpp | 3 + 9 files changed, 204 insertions(+), 11 deletions(-) create mode 100644 src/libprojectM/Renderer/GLStateGuard.hpp diff --git a/src/libprojectM/MilkdropPreset/MilkdropPreset.cpp b/src/libprojectM/MilkdropPreset/MilkdropPreset.cpp index ef1716115b..abc9df1762 100755 --- a/src/libprojectM/MilkdropPreset/MilkdropPreset.cpp +++ b/src/libprojectM/MilkdropPreset/MilkdropPreset.cpp @@ -237,12 +237,17 @@ void MilkdropPreset::Load(std::istream& stream) void MilkdropPreset::InitializePreset(PresetFileParser& parsedFile) { + // Save the currently bound framebuffer so we can restore it after creating attachments. + // This is important when the host application uses a non-default framebuffer. + GLint previousFramebuffer{}; + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &previousFramebuffer); + // Create the offscreen rendering surfaces. m_motionVectorUVMap = std::make_shared(GL_RG16F, GL_RG, GL_FLOAT, 0, 0); m_framebuffer.CreateColorAttachment(0, 0); // Main image 1 m_framebuffer.CreateColorAttachment(1, 0); // Main image 2 - Renderer::Framebuffer::Unbind(); + glBindFramebuffer(GL_FRAMEBUFFER, previousFramebuffer); // Load global init variables into the state m_state.Initialize(parsedFile); diff --git a/src/libprojectM/ProjectM.cpp b/src/libprojectM/ProjectM.cpp index 9ec73afac7..91ea260898 100644 --- a/src/libprojectM/ProjectM.cpp +++ b/src/libprojectM/ProjectM.cpp @@ -29,6 +29,7 @@ #include