summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
authorvaxerski <vaxry@vaxry.net>2025-01-01 14:11:21 +0100
committervaxerski <vaxry@vaxry.net>2025-01-01 14:11:21 +0100
commit4e93b2def5f00f944abbd63a8258ee18bd99ff54 (patch)
tree827fc23fc614a597c6cc5818eb05dd6a32858c04 /src/render
parentaff34089c4d66b951d25a0dc1867f7fb93d61a7d (diff)
renderer: use a render pass for render modif in client render
fixes #8918
Diffstat (limited to 'src/render')
-rw-r--r--src/render/OpenGL.hpp1
-rw-r--r--src/render/Renderer.cpp38
-rw-r--r--src/render/pass/RendererHintsPassElement.cpp19
-rw-r--r--src/render/pass/RendererHintsPassElement.hpp25
4 files changed, 64 insertions, 19 deletions
diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp
index 0b72d438..e73a3119 100644
--- a/src/render/OpenGL.hpp
+++ b/src/render/OpenGL.hpp
@@ -110,7 +110,6 @@ struct SMonitorRenderData {
struct SCurrentRenderData {
PHLMONITORREF pMonitor;
- PHLWORKSPACE pWorkspace = nullptr;
Mat3x3 projection;
Mat3x3 savedProjection;
Mat3x3 monitorProjection;
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index 391492b0..9aa794b4 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -22,6 +22,7 @@
#include "pass/TexPassElement.hpp"
#include "pass/ClearPassElement.hpp"
#include "pass/RectPassElement.hpp"
+#include "pass/RendererHintsPassElement.hpp"
#include "pass/SurfacePassElement.hpp"
#include "debug/Log.hpp"
@@ -780,18 +781,12 @@ void CHyprRenderer::renderSessionLockSurface(SSessionLockSurface* pSurface, PHLM
}
void CHyprRenderer::renderAllClientsForWorkspace(PHLMONITOR pMonitor, PHLWORKSPACE pWorkspace, timespec* time, const Vector2D& translate, const float& scale) {
- static auto PDIMSPECIAL = CConfigValue<Hyprlang::FLOAT>("decoration:dim_special");
- static auto PBLURSPECIAL = CConfigValue<Hyprlang::INT>("decoration:blur:special");
- static auto PBLUR = CConfigValue<Hyprlang::INT>("decoration:blur:enabled");
- static auto PRENDERTEX = CConfigValue<Hyprlang::INT>("misc:disable_hyprland_logo");
- static auto PBACKGROUNDCOLOR = CConfigValue<Hyprlang::INT>("misc:background_color");
- static auto PXPMODE = CConfigValue<Hyprlang::INT>("render:xp_mode");
-
- SRenderModifData RENDERMODIFDATA;
- if (translate != Vector2D{0, 0})
- RENDERMODIFDATA.modifs.emplace_back(std::make_pair<>(SRenderModifData::eRenderModifType::RMOD_TYPE_TRANSLATE, translate));
- if (scale != 1.f)
- RENDERMODIFDATA.modifs.emplace_back(std::make_pair<>(SRenderModifData::eRenderModifType::RMOD_TYPE_SCALE, scale));
+ static auto PDIMSPECIAL = CConfigValue<Hyprlang::FLOAT>("decoration:dim_special");
+ static auto PBLURSPECIAL = CConfigValue<Hyprlang::INT>("decoration:blur:special");
+ static auto PBLUR = CConfigValue<Hyprlang::INT>("decoration:blur:enabled");
+ static auto PRENDERTEX = CConfigValue<Hyprlang::INT>("misc:disable_hyprland_logo");
+ static auto PBACKGROUNDCOLOR = CConfigValue<Hyprlang::INT>("misc:background_color");
+ static auto PXPMODE = CConfigValue<Hyprlang::INT>("render:xp_mode");
if (!pMonitor)
return;
@@ -805,7 +800,19 @@ void CHyprRenderer::renderAllClientsForWorkspace(PHLMONITOR pMonitor, PHLWORKSPA
// todo: matrices are buggy atm for some reason, but probably would be preferable in the long run
// g_pHyprOpenGL->saveMatrix();
// g_pHyprOpenGL->setMatrixScaleTranslate(translate, scale);
- g_pHyprOpenGL->m_RenderData.renderModif = RENDERMODIFDATA;
+
+ SRenderModifData RENDERMODIFDATA;
+ if (translate != Vector2D{0, 0})
+ RENDERMODIFDATA.modifs.emplace_back(std::make_pair<>(SRenderModifData::eRenderModifType::RMOD_TYPE_TRANSLATE, translate));
+ if (scale != 1.f)
+ RENDERMODIFDATA.modifs.emplace_back(std::make_pair<>(SRenderModifData::eRenderModifType::RMOD_TYPE_SCALE, scale));
+
+ CScopeGuard x([] {});
+
+ if (!RENDERMODIFDATA.modifs.empty()) {
+ g_pHyprRenderer->m_sRenderPass.add(makeShared<CRendererHintsPassElement>(CRendererHintsPassElement::SData{RENDERMODIFDATA}));
+ x = CScopeGuard([] { g_pHyprRenderer->m_sRenderPass.add(makeShared<CRendererHintsPassElement>(CRendererHintsPassElement::SData{SRenderModifData{}})); });
+ }
if (!pWorkspace) {
// allow rendering without a workspace. In this case, just render layers.
@@ -828,8 +835,6 @@ void CHyprRenderer::renderAllClientsForWorkspace(PHLMONITOR pMonitor, PHLWORKSPA
renderLayer(ls.lock(), pMonitor, time);
}
- g_pHyprOpenGL->m_RenderData.renderModif = {};
-
return;
}
@@ -933,7 +938,6 @@ void CHyprRenderer::renderAllClientsForWorkspace(PHLMONITOR pMonitor, PHLWORKSPA
renderDragIcon(pMonitor, time);
//g_pHyprOpenGL->restoreMatrix();
- g_pHyprOpenGL->m_RenderData.renderModif = {};
}
void CHyprRenderer::renderLockscreen(PHLMONITOR pMonitor, timespec* now, const CBox& geometry) {
@@ -1436,9 +1440,7 @@ void CHyprRenderer::renderWorkspace(PHLMONITOR pMonitor, PHLWORKSPACE pWorkspace
translate = Vector2D{};
}
- g_pHyprOpenGL->m_RenderData.pWorkspace = pWorkspace;
renderAllClientsForWorkspace(pMonitor, pWorkspace, now, translate, scale);
- g_pHyprOpenGL->m_RenderData.pWorkspace = nullptr;
}
void CHyprRenderer::sendFrameEventsToWorkspace(PHLMONITOR pMonitor, PHLWORKSPACE pWorkspace, timespec* now) {
diff --git a/src/render/pass/RendererHintsPassElement.cpp b/src/render/pass/RendererHintsPassElement.cpp
new file mode 100644
index 00000000..8ea79a27
--- /dev/null
+++ b/src/render/pass/RendererHintsPassElement.cpp
@@ -0,0 +1,19 @@
+#include "RendererHintsPassElement.hpp"
+#include "../OpenGL.hpp"
+
+CRendererHintsPassElement::CRendererHintsPassElement(const CRendererHintsPassElement::SData& data_) : data(data_) {
+ ;
+}
+
+void CRendererHintsPassElement::draw(const CRegion& damage) {
+ if (data.renderModif.has_value())
+ g_pHyprOpenGL->m_RenderData.renderModif = *data.renderModif;
+}
+
+bool CRendererHintsPassElement::needsLiveBlur() {
+ return false;
+}
+
+bool CRendererHintsPassElement::needsPrecomputeBlur() {
+ return false;
+}
diff --git a/src/render/pass/RendererHintsPassElement.hpp b/src/render/pass/RendererHintsPassElement.hpp
new file mode 100644
index 00000000..99ed0759
--- /dev/null
+++ b/src/render/pass/RendererHintsPassElement.hpp
@@ -0,0 +1,25 @@
+#pragma once
+#include "PassElement.hpp"
+#include <optional>
+#include "../OpenGL.hpp"
+
+class CRendererHintsPassElement : public IPassElement {
+ public:
+ struct SData {
+ std::optional<SRenderModifData> renderModif;
+ };
+
+ CRendererHintsPassElement(const SData& data);
+ virtual ~CRendererHintsPassElement() = default;
+
+ virtual void draw(const CRegion& damage);
+ virtual bool needsLiveBlur();
+ virtual bool needsPrecomputeBlur();
+
+ virtual const char* passName() {
+ return "CRendererHintsPassElement";
+ }
+
+ private:
+ SData data;
+}; \ No newline at end of file