summaryrefslogtreecommitdiff
path: root/src/render/pass/SurfacePassElement.cpp
diff options
context:
space:
mode:
authorUjinT34 <41110182+UjinT34@users.noreply.github.com>2026-03-07 13:27:47 +0300
committerGitHub <noreply@github.com>2026-03-07 10:27:47 +0000
commit32e75e3e320fb66ab517a378df645f3d29b3a209 (patch)
tree4212f4cf197fc961161de7a9e57b85735257184a /src/render/pass/SurfacePassElement.cpp
parent36b19075f3a644a4095352d778e6d03e103bb334 (diff)
renderer: refactor render elements (#13438)
Part 2 of renderer refactors
Diffstat (limited to 'src/render/pass/SurfacePassElement.cpp')
-rw-r--r--src/render/pass/SurfacePassElement.cpp144
1 files changed, 0 insertions, 144 deletions
diff --git a/src/render/pass/SurfacePassElement.cpp b/src/render/pass/SurfacePassElement.cpp
index c5feb8f7..89cd9d73 100644
--- a/src/render/pass/SurfacePassElement.cpp
+++ b/src/render/pass/SurfacePassElement.cpp
@@ -17,150 +17,6 @@ CSurfacePassElement::CSurfacePassElement(const CSurfacePassElement::SRenderData&
;
}
-void CSurfacePassElement::draw(const CRegion& damage) {
- g_pHyprOpenGL->m_renderData.currentWindow = m_data.pWindow;
- g_pHyprOpenGL->m_renderData.surface = m_data.surface;
- g_pHyprOpenGL->m_renderData.currentLS = m_data.pLS;
- g_pHyprOpenGL->m_renderData.clipBox = m_data.clipBox;
- 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->pushMonitorTransformEnabled(m_data.flipEndFrame);
-
- CScopeGuard x = {[]() {
- g_pHyprOpenGL->m_renderData.primarySurfaceUVTopLeft = Vector2D(-1, -1);
- g_pHyprOpenGL->m_renderData.primarySurfaceUVBottomRight = Vector2D(-1, -1);
- g_pHyprOpenGL->m_renderData.useNearestNeighbor = false;
- g_pHyprOpenGL->m_renderData.clipBox = {};
- g_pHyprOpenGL->m_renderData.clipRegion = {};
- g_pHyprOpenGL->m_renderData.discardMode = 0;
- g_pHyprOpenGL->m_renderData.discardOpacity = 0;
- g_pHyprOpenGL->m_renderData.useNearestNeighbor = false;
- g_pHyprOpenGL->popMonitorTransformEnabled();
- g_pHyprOpenGL->m_renderData.currentWindow.reset();
- g_pHyprOpenGL->m_renderData.surface.reset();
- g_pHyprOpenGL->m_renderData.currentLS.reset();
- }};
-
- if (!m_data.texture)
- return;
-
- const auto& TEXTURE = m_data.texture;
-
- // this is bad, probably has been logged elsewhere. Means the texture failed
- // uploading to the GPU.
- if (!TEXTURE->m_texID)
- return;
-
- const auto INTERACTIVERESIZEINPROGRESS = m_data.pWindow && g_layoutManager->dragController()->target() && g_layoutManager->dragController()->mode() == MBIND_RESIZE;
- TRACY_GPU_ZONE("RenderSurface");
-
- auto PSURFACE = Desktop::View::CWLSurface::fromResource(m_data.surface);
-
- const float ALPHA = m_data.alpha * m_data.fadeAlpha * (PSURFACE ? PSURFACE->m_alphaModifier : 1.F);
- const float OVERALL_ALPHA = PSURFACE ? PSURFACE->m_overallOpacity : 1.F;
- const bool BLUR = m_data.blur && (!TEXTURE->m_opaque || ALPHA < 1.F || OVERALL_ALPHA < 1.F);
-
- auto windowBox = getTexBox();
-
- const auto PROJSIZEUNSCALED = windowBox.size();
-
- windowBox.scale(m_data.pMonitor->m_scale);
- windowBox.round();
-
- if (windowBox.width <= 1 || windowBox.height <= 1) {
- discard();
- return;
- }
-
- const bool MISALIGNEDFSV1 = std::floor(m_data.pMonitor->m_scale) != m_data.pMonitor->m_scale /* Fractional */ && m_data.surface->m_current.scale == 1 /* fs protocol */ &&
- windowBox.size() != m_data.surface->m_current.bufferSize /* misaligned */ && DELTALESSTHAN(windowBox.width, m_data.surface->m_current.bufferSize.x, 3) &&
- DELTALESSTHAN(windowBox.height, m_data.surface->m_current.bufferSize.y, 3) /* off by one-or-two */ &&
- (!m_data.pWindow || (!m_data.pWindow->m_realSize->isBeingAnimated() && !INTERACTIVERESIZEINPROGRESS)) /* not window or not animated/resizing */ &&
- (!m_data.pLS || (!m_data.pLS->m_realSize->isBeingAnimated())); /* not LS or not animated */
-
- g_pHyprRenderer->calculateUVForSurface(m_data.pWindow, m_data.surface, m_data.pMonitor->m_self.lock(), m_data.mainSurface, windowBox.size(), PROJSIZEUNSCALED, MISALIGNEDFSV1);
-
- auto cancelRender = false;
- g_pHyprOpenGL->m_renderData.clipRegion = visibleRegion(cancelRender);
- if (cancelRender)
- return;
-
- // check for fractional scale surfaces misaligning the buffer size
- // in those cases it's better to just force nearest neighbor
- // as long as the window is not animated. During those it'd look weird.
- // UV will fixup it as well
- if (MISALIGNEDFSV1)
- g_pHyprOpenGL->m_renderData.useNearestNeighbor = true;
-
- float rounding = m_data.rounding;
- float roundingPower = m_data.roundingPower;
-
- rounding -= 1; // to fix a border issue
-
- if (m_data.dontRound) {
- rounding = 0;
- roundingPower = 2.0f;
- }
-
- const bool WINDOWOPAQUE = m_data.pWindow && m_data.pWindow->wlSurface()->resource() == m_data.surface ? m_data.pWindow->opaque() : false;
- const bool CANDISABLEBLEND = ALPHA >= 1.f && OVERALL_ALPHA >= 1.f && rounding <= 0 && WINDOWOPAQUE;
-
- if (CANDISABLEBLEND)
- g_pHyprOpenGL->blend(false);
- else
- g_pHyprOpenGL->blend(true);
-
- // FIXME: This is wrong and will bug the blur out as shit if the first surface
- // is a subsurface that does NOT cover the entire frame. In such cases, we probably should fall back
- // to what we do for misaligned surfaces (blur the entire thing and then render shit without blur)
- if (m_data.surfaceCounter == 0 && !m_data.popup) {
- if (BLUR)
- g_pHyprOpenGL->renderTexture(TEXTURE, windowBox,
- {
- .surface = m_data.surface,
- .a = ALPHA,
- .blur = true,
- .blurA = m_data.fadeAlpha,
- .overallA = OVERALL_ALPHA,
- .round = rounding,
- .roundingPower = roundingPower,
- .allowCustomUV = true,
- .blockBlurOptimization = m_data.blockBlurOptimization,
- });
- else
- g_pHyprOpenGL->renderTexture(TEXTURE, windowBox,
- {.a = ALPHA * OVERALL_ALPHA, .round = rounding, .roundingPower = roundingPower, .discardActive = false, .allowCustomUV = true});
- } else {
- if (BLUR && m_data.popup)
- g_pHyprOpenGL->renderTexture(TEXTURE, windowBox,
- {
- .surface = m_data.surface,
- .a = ALPHA,
- .blur = true,
- .blurA = m_data.fadeAlpha,
- .overallA = OVERALL_ALPHA,
- .round = rounding,
- .roundingPower = roundingPower,
- .allowCustomUV = true,
- .blockBlurOptimization = true,
- });
- else
- g_pHyprOpenGL->renderTexture(TEXTURE, windowBox,
- {.a = ALPHA * OVERALL_ALPHA, .round = rounding, .roundingPower = roundingPower, .discardActive = false, .allowCustomUV = true});
- }
-
- if (!g_pHyprRenderer->m_bBlockSurfaceFeedback)
- m_data.surface->presentFeedback(m_data.when, m_data.pMonitor->m_self.lock());
-
- // add async (dmabuf) buffers to usedBuffers so we can handle release later
- // sync (shm) buffers will be released in commitState, so no need to track them here
- if (m_data.surface->m_current.buffer && !m_data.surface->m_current.buffer->isSynchronous())
- g_pHyprRenderer->m_usedAsyncBuffers.emplace_back(m_data.surface->m_current.buffer);
-
- g_pHyprOpenGL->blend(true);
-}
-
CBox CSurfacePassElement::getTexBox() {
const double outputX = -m_data.pMonitor->m_position.x, outputY = -m_data.pMonitor->m_position.y;