summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
authorvaxerski <vaxry@vaxry.net>2023-11-24 12:37:10 +0000
committervaxerski <vaxry@vaxry.net>2023-11-24 12:37:10 +0000
commitaedcade68dd0615fd919a7249633a554d0accd81 (patch)
treea389f145a5f0f1df5092257986865890cefcf7f0 /src/render
parent802ab58f8a129b42d61ec13898fd978e0920f7d8 (diff)
opengl: better checking for required introspection
performance woo
Diffstat (limited to 'src/render')
-rw-r--r--src/render/OpenGL.cpp46
-rw-r--r--src/render/OpenGL.hpp7
2 files changed, 47 insertions, 6 deletions
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp
index 622a211d..638b562f 100644
--- a/src/render/OpenGL.cpp
+++ b/src/render/OpenGL.cpp
@@ -115,10 +115,50 @@ GLuint CHyprOpenGLImpl::compileShader(const GLuint& type, std::string src, bool
return shader;
}
-void CHyprOpenGLImpl::begin(CMonitor* pMonitor, CRegion* pDamage, bool fake) {
- m_RenderData.pMonitor = pMonitor;
+bool CHyprOpenGLImpl::passRequiresIntrospection(CMonitor* pMonitor) {
+ // passes requiring introspection are the ones that need to render blur.
static auto* const PBLUR = &g_pConfigManager->getConfigValuePtr("decoration:blur:enabled")->intValue;
+ static auto* const PXRAY = &g_pConfigManager->getConfigValuePtr("decoration:blur:xray")->intValue;
+
+ if (*PBLUR == 0)
+ return false;
+
+ if (m_RenderData.pCurrentMonData->blurFBShouldRender)
+ return true;
+
+ if (pMonitor->solitaryClient)
+ return false;
+
+ for (auto& ls : pMonitor->m_aLayerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]) {
+ if (ls->forceBlur && !ls->xray)
+ return true;
+ }
+
+ if (*PXRAY)
+ return false;
+
+ for (auto& w : g_pCompositor->m_vWindows) {
+ if (!w->m_bIsMapped || w->isHidden() || (!w->m_bIsFloating && !g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID)))
+ continue;
+
+ if (!g_pHyprRenderer->shouldRenderWindow(w.get()))
+ continue;
+
+ if (w->m_sAdditionalConfigData.forceNoBlur.toUnderlying() == true || w->m_sAdditionalConfigData.xray.toUnderlying() == true)
+ continue;
+
+ if (w->opaque())
+ continue;
+
+ return true;
+ }
+
+ return false;
+}
+
+void CHyprOpenGLImpl::begin(CMonitor* pMonitor, CRegion* pDamage, bool fake) {
+ m_RenderData.pMonitor = pMonitor;
TRACY_GPU_ZONE("RenderBegin");
@@ -163,7 +203,7 @@ void CHyprOpenGLImpl::begin(CMonitor* pMonitor, CRegion* pDamage, bool fake) {
const auto PRBO = g_pHyprRenderer->getCurrentRBO();
if (m_sFinalScreenShader.program > 0 || m_bFakeFrame || m_RenderData.mouseZoomFactor != 1.0 || pMonitor->vecPixelSize != PRBO->getFB()->m_vSize ||
- (*PBLUR != 0 && !pMonitor->solitaryClient /* TODO: revisit when possible */)) {
+ passRequiresIntrospection(pMonitor)) {
// we have to offload
// bind the primary Hypr Framebuffer
m_RenderData.pCurrentMonData->offloadFB.bind();
diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp
index 4311e16c..9ff571f2 100644
--- a/src/render/OpenGL.hpp
+++ b/src/render/OpenGL.hpp
@@ -30,8 +30,7 @@ inline const float fullVerts[] = {
};
inline const float fanVertsFull[] = {-1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f};
-enum eDiscardMode
-{
+enum eDiscardMode {
DISCARD_OPAQUE = 1,
DISCARD_ALPHA = 1 << 1
};
@@ -173,7 +172,7 @@ class CHyprOpenGLImpl {
struct {
PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glEGLImageTargetRenderbufferStorageOES = nullptr;
- PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR = nullptr;
+ PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR = nullptr;
} m_sProc;
private:
@@ -209,6 +208,8 @@ class CHyprOpenGLImpl {
bool shouldUseNewBlurOptimizations(SLayerSurface* pLayer, CWindow* pWindow);
+ bool passRequiresIntrospection(CMonitor* pMonitor);
+
friend class CHyprRenderer;
};