diff --git a/src/protocols/Screencopy.cpp b/src/protocols/Screencopy.cpp index 53c27c81d..052710ced 100644 --- a/src/protocols/Screencopy.cpp +++ b/src/protocols/Screencopy.cpp @@ -196,11 +196,11 @@ void CScreencopyFrame::renderMon() { CBox monbox = CBox{0, 0, m_monitor->m_pixelSize.x, m_monitor->m_pixelSize.y} .translate({-m_box.x, -m_box.y}) // vvvv kinda ass-backwards but that's how I designed the renderer... sigh. .transform(wlTransformToHyprutils(invertTransform(m_monitor->m_transform)), m_monitor->m_pixelSize.x, m_monitor->m_pixelSize.y); - g_pHyprOpenGL->setMonitorTransformEnabled(true); + g_pHyprOpenGL->pushMonitorTransformEnabled(true); g_pHyprOpenGL->setRenderModifEnabled(false); g_pHyprOpenGL->renderTexture(TEXTURE, monbox, 1); g_pHyprOpenGL->setRenderModifEnabled(true); - g_pHyprOpenGL->setMonitorTransformEnabled(false); + g_pHyprOpenGL->popMonitorTransformEnabled(); for (auto const& w : g_pCompositor->m_windows) { if (!w->m_windowData.noScreenShare.valueOrDefault()) diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 817944ef2..7ba4b6b9d 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -361,6 +361,8 @@ CHyprOpenGLImpl::CHyprOpenGLImpl() : m_drmFD(g_pCompositor->m_drmFD) { RASSERT(eglMakeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT), "Couldn't unset current EGL!"); m_globalTimer.reset(); + + pushMonitorTransformEnabled(false); } CHyprOpenGLImpl::~CHyprOpenGLImpl() { @@ -700,6 +702,8 @@ void CHyprOpenGLImpl::beginSimple(PHLMONITOR pMonitor, const CRegion& damage, SP m_renderData.outFB = FBO; m_renderData.simplePass = true; + + pushMonitorTransformEnabled(false); } void CHyprOpenGLImpl::begin(PHLMONITOR pMonitor, const CRegion& damage_, CFramebuffer* fb, std::optional finalDamage) { @@ -769,6 +773,8 @@ void CHyprOpenGLImpl::begin(PHLMONITOR pMonitor, const CRegion& damage_, CFrameb m_renderData.mainFB = m_renderData.currentFB; m_renderData.outFB = fb ? fb : g_pHyprRenderer->getCurrentRBO()->getFB(); + + pushMonitorTransformEnabled(false); } void CHyprOpenGLImpl::end() { @@ -779,7 +785,7 @@ void CHyprOpenGLImpl::end() { // end the render, copy the data to the main framebuffer if (m_offloadedFramebuffer) { m_renderData.damage = m_renderData.finalDamage; - m_endFrame = true; + pushMonitorTransformEnabled(true); CBox monbox = {0, 0, m_renderData.pMonitor->m_transformedSize.x, m_renderData.pMonitor->m_transformedSize.y}; @@ -821,7 +827,7 @@ void CHyprOpenGLImpl::end() { m_renderData.useNearestNeighbor = false; m_applyFinalShader = false; - m_endFrame = false; + popMonitorTransformEnabled(); } // reset our data @@ -832,6 +838,7 @@ void CHyprOpenGLImpl::end() { m_renderData.currentFB = nullptr; m_renderData.mainFB = nullptr; m_renderData.outFB = nullptr; + popMonitorTransformEnabled(); // if we dropped to offMain, release it now. // if there is a plugin constantly using it, this might be a bit slow, @@ -1334,12 +1341,12 @@ void CHyprOpenGLImpl::renderRectWithBlur(const CBox& box, const CHyprColor& col, glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); scissor(box); - CBox MONITORBOX = {0, 0, m_renderData.pMonitor->m_transformedSize.x, m_renderData.pMonitor->m_transformedSize.y}; - m_endFrame = true; // fix transformed + CBox MONITORBOX = {0, 0, m_renderData.pMonitor->m_transformedSize.x, m_renderData.pMonitor->m_transformedSize.y}; + pushMonitorTransformEnabled(true); const auto SAVEDRENDERMODIF = m_renderData.renderModif; m_renderData.renderModif = {}; // fix shit renderTextureInternalWithDamage(POUTFB->getTexture(), MONITORBOX, blurA, damage, 0, 2.0f, false, false, false); - m_endFrame = false; + popMonitorTransformEnabled(); m_renderData.renderModif = SAVEDRENDERMODIF; glClearStencil(0); @@ -1362,7 +1369,7 @@ void CHyprOpenGLImpl::renderRectWithDamage(const CBox& box, const CHyprColor& co m_renderData.renderModif.applyToBox(newBox); Mat3x3 matrix = m_renderData.monitorProjection.projectBox( - newBox, wlTransformToHyprutils(invertTransform(!m_endFrame ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)), newBox.rot); + newBox, wlTransformToHyprutils(invertTransform(!m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)), newBox.rot); Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); useProgram(m_shaders->m_shQUAD.program); @@ -1498,7 +1505,7 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(SP tex, const CB // get the needed transform for this texture const bool TRANSFORMS_MATCH = wlTransformToHyprutils(m_renderData.pMonitor->m_transform) == tex->m_transform; // FIXME: combine them properly!!! eTransform TRANSFORM = HYPRUTILS_TRANSFORM_NORMAL; - if (m_endFrame || TRANSFORMS_MATCH) + if (m_monitorTransformEnabled || TRANSFORMS_MATCH) TRANSFORM = wlTransformToHyprutils(invertTransform(m_renderData.pMonitor->m_transform)); Mat3x3 matrix = m_renderData.monitorProjection.projectBox(newBox, TRANSFORM, newBox.rot); @@ -1689,7 +1696,7 @@ void CHyprOpenGLImpl::renderTexturePrimitive(SP tex, const CBox& box) m_renderData.renderModif.applyToBox(newBox); // get transform - const auto TRANSFORM = wlTransformToHyprutils(invertTransform(!m_endFrame ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)); + const auto TRANSFORM = wlTransformToHyprutils(invertTransform(!m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)); Mat3x3 matrix = m_renderData.monitorProjection.projectBox(newBox, TRANSFORM, newBox.rot); Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); @@ -1727,7 +1734,7 @@ void CHyprOpenGLImpl::renderTextureMatte(SP tex, const CBox& box, CFra m_renderData.renderModif.applyToBox(newBox); // get transform - const auto TRANSFORM = wlTransformToHyprutils(invertTransform(!m_endFrame ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)); + const auto TRANSFORM = wlTransformToHyprutils(invertTransform(!m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)); Mat3x3 matrix = m_renderData.monitorProjection.projectBox(newBox, TRANSFORM, newBox.rot); Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); @@ -2074,10 +2081,10 @@ void CHyprOpenGLImpl::preBlurForCurrentMonitor() { clear(CHyprColor(0, 0, 0, 0)); - m_endFrame = true; // fix transformed + pushMonitorTransformEnabled(true); renderTextureInternalWithDamage(POUTFB->getTexture(), CBox{0, 0, m_renderData.pMonitor->m_transformedSize.x, m_renderData.pMonitor->m_transformedSize.y}, 1, fakeDamage, 0, 2.0f, false, true, false); - m_endFrame = false; + popMonitorTransformEnabled(); m_renderData.currentFB->bind(); @@ -2212,13 +2219,13 @@ void CHyprOpenGLImpl::renderTextureWithBlur(SP tex, const CBox& box, f m_renderData.primarySurfaceUVBottomRight = (monitorSpaceBox.pos() + monitorSpaceBox.size()) / m_renderData.pMonitor->m_transformedSize; static auto PBLURIGNOREOPACITY = CConfigValue("decoration:blur:ignore_opacity"); - setMonitorTransformEnabled(true); + pushMonitorTransformEnabled(true); if (!USENEWOPTIMIZE) setRenderModifEnabled(false); renderTextureInternalWithDamage(POUTFB->getTexture(), box, (*PBLURIGNOREOPACITY ? blurA : a * blurA) * overallA, texDamage, round, roundingPower, false, false, true); if (!USENEWOPTIMIZE) setRenderModifEnabled(true); - setMonitorTransformEnabled(false); + popMonitorTransformEnabled(); m_renderData.primarySurfaceUVTopLeft = LASTTL; m_renderData.primarySurfaceUVBottomRight = LASTBR; @@ -2263,7 +2270,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr round += round == 0 ? 0 : scaledBorderSize; Mat3x3 matrix = m_renderData.monitorProjection.projectBox( - newBox, wlTransformToHyprutils(invertTransform(!m_endFrame ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)), newBox.rot); + newBox, wlTransformToHyprutils(invertTransform(!m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)), newBox.rot); Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); const auto BLEND = m_blend; @@ -2350,7 +2357,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr round += round == 0 ? 0 : scaledBorderSize; Mat3x3 matrix = m_renderData.monitorProjection.projectBox( - newBox, wlTransformToHyprutils(invertTransform(!m_endFrame ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)), newBox.rot); + newBox, wlTransformToHyprutils(invertTransform(!m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)), newBox.rot); Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); const auto BLEND = m_blend; @@ -2426,7 +2433,7 @@ void CHyprOpenGLImpl::renderRoundedShadow(const CBox& box, int round, float roun const auto col = color; Mat3x3 matrix = m_renderData.monitorProjection.projectBox( - newBox, wlTransformToHyprutils(invertTransform(!m_endFrame ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)), newBox.rot); + newBox, wlTransformToHyprutils(invertTransform(!m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)), newBox.rot); Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); blend(true); @@ -2960,8 +2967,14 @@ void CHyprOpenGLImpl::bindBackOnMain() { m_renderData.currentFB = m_renderData.mainFB; } -void CHyprOpenGLImpl::setMonitorTransformEnabled(bool enabled) { - m_endFrame = enabled; +void CHyprOpenGLImpl::pushMonitorTransformEnabled(bool enabled) { + m_monitorTransformStack.push(enabled); + m_monitorTransformEnabled = enabled; +} + +void CHyprOpenGLImpl::popMonitorTransformEnabled() { + m_monitorTransformStack.pop(); + m_monitorTransformEnabled = m_monitorTransformStack.top(); } void CHyprOpenGLImpl::setRenderModifEnabled(bool enabled) { diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index fade4a9d5..341ee575d 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -195,7 +196,9 @@ class CHyprOpenGLImpl { int outerRound = -1 /* use round */); void renderTextureMatte(SP tex, const CBox& pBox, CFramebuffer& matte); - void setMonitorTransformEnabled(bool enabled); + void pushMonitorTransformEnabled(bool enabled); + void popMonitorTransformEnabled(); + void setRenderModifEnabled(bool enabled); void saveMatrix(); @@ -310,12 +313,14 @@ class CHyprOpenGLImpl { std::string m_extensions; bool m_fakeFrame = false; - bool m_endFrame = false; bool m_applyFinalShader = false; bool m_blend = false; bool m_offloadedFramebuffer = false; bool m_cmSupported = true; + bool m_monitorTransformEnabled = false; // do not modify directly + std::stack m_monitorTransformStack; + SShader m_finalScreenShader; CTimer m_globalTimer; GLuint m_currentProgram; diff --git a/src/render/decorations/CHyprDropShadowDecoration.cpp b/src/render/decorations/CHyprDropShadowDecoration.cpp index 7721f84bb..ee52b4f42 100644 --- a/src/render/decorations/CHyprDropShadowDecoration.cpp +++ b/src/render/decorations/CHyprDropShadowDecoration.cpp @@ -206,11 +206,11 @@ void CHyprDropShadowDecoration::render(PHLMONITOR pMonitor, float const& a) { CBox monbox = {0, 0, pMonitor->m_transformedSize.x, pMonitor->m_transformedSize.y}; - g_pHyprOpenGL->setMonitorTransformEnabled(true); + g_pHyprOpenGL->pushMonitorTransformEnabled(true); g_pHyprOpenGL->setRenderModifEnabled(false); g_pHyprOpenGL->renderTextureMatte(alphaSwapFB.getTexture(), monbox, alphaFB); g_pHyprOpenGL->setRenderModifEnabled(true); - g_pHyprOpenGL->setMonitorTransformEnabled(false); + g_pHyprOpenGL->popMonitorTransformEnabled(); g_pHyprOpenGL->m_renderData.damage = saveDamage; } else diff --git a/src/render/pass/SurfacePassElement.cpp b/src/render/pass/SurfacePassElement.cpp index 2163566a7..87c7016d8 100644 --- a/src/render/pass/SurfacePassElement.cpp +++ b/src/render/pass/SurfacePassElement.cpp @@ -24,7 +24,7 @@ void CSurfacePassElement::draw(const CRegion& damage) { g_pHyprOpenGL->m_renderData.discardMode = m_data.discardMode; g_pHyprOpenGL->m_renderData.discardOpacity = m_data.discardOpacity; g_pHyprOpenGL->m_renderData.useNearestNeighbor = m_data.useNearestNeighbor; - g_pHyprOpenGL->m_endFrame = m_data.flipEndFrame; + g_pHyprOpenGL->pushMonitorTransformEnabled(m_data.flipEndFrame); CScopeGuard x = {[]() { g_pHyprOpenGL->m_renderData.primarySurfaceUVTopLeft = Vector2D(-1, -1); @@ -35,7 +35,7 @@ void CSurfacePassElement::draw(const CRegion& damage) { g_pHyprOpenGL->m_renderData.discardMode = 0; g_pHyprOpenGL->m_renderData.discardOpacity = 0; g_pHyprOpenGL->m_renderData.useNearestNeighbor = false; - g_pHyprOpenGL->m_endFrame = false; + g_pHyprOpenGL->popMonitorTransformEnabled(); g_pHyprOpenGL->m_renderData.currentWindow.reset(); g_pHyprOpenGL->m_renderData.surface.reset(); g_pHyprOpenGL->m_renderData.currentLS.reset(); diff --git a/src/render/pass/TexPassElement.cpp b/src/render/pass/TexPassElement.cpp index e6f4d052b..c4b002207 100644 --- a/src/render/pass/TexPassElement.cpp +++ b/src/render/pass/TexPassElement.cpp @@ -9,11 +9,11 @@ CTexPassElement::CTexPassElement(const CTexPassElement::SRenderData& data_) : m_ } void CTexPassElement::draw(const CRegion& damage) { - g_pHyprOpenGL->m_endFrame = m_data.flipEndFrame; + g_pHyprOpenGL->pushMonitorTransformEnabled(m_data.flipEndFrame); CScopeGuard x = {[this]() { // - g_pHyprOpenGL->m_endFrame = false; + g_pHyprOpenGL->popMonitorTransformEnabled(); g_pHyprOpenGL->m_renderData.clipBox = {}; if (m_data.replaceProjection) g_pHyprOpenGL->m_renderData.monitorProjection = g_pHyprOpenGL->m_renderData.pMonitor->m_projMatrix; diff --git a/src/render/pass/TextureMatteElement.cpp b/src/render/pass/TextureMatteElement.cpp index 2b5d4fab8..aeeeabc60 100644 --- a/src/render/pass/TextureMatteElement.cpp +++ b/src/render/pass/TextureMatteElement.cpp @@ -7,11 +7,11 @@ CTextureMatteElement::CTextureMatteElement(const CTextureMatteElement::STextureM void CTextureMatteElement::draw(const CRegion& damage) { if (m_data.disableTransformAndModify) { - g_pHyprOpenGL->setMonitorTransformEnabled(true); + g_pHyprOpenGL->pushMonitorTransformEnabled(true); g_pHyprOpenGL->setRenderModifEnabled(false); g_pHyprOpenGL->renderTextureMatte(m_data.tex, m_data.box, *m_data.fb); g_pHyprOpenGL->setRenderModifEnabled(true); - g_pHyprOpenGL->setMonitorTransformEnabled(false); + g_pHyprOpenGL->popMonitorTransformEnabled(); } else g_pHyprOpenGL->renderTextureMatte(m_data.tex, m_data.box, *m_data.fb); }