diff --git a/src/helpers/Color.cpp b/src/helpers/Color.cpp index 7952ef55..8dfefbbd 100644 --- a/src/helpers/Color.cpp +++ b/src/helpers/Color.cpp @@ -43,3 +43,7 @@ Hyprgraphics::CColor::SHSL CHyprColor::asHSL() const { CHyprColor CHyprColor::stripA() const { return {r, g, b, 1.F}; } + +CHyprColor CHyprColor::modifyA(float newa) const { + return {r, g, b, newa}; +} diff --git a/src/helpers/Color.hpp b/src/helpers/Color.hpp index cf7f7943..0ea816f3 100644 --- a/src/helpers/Color.hpp +++ b/src/helpers/Color.hpp @@ -18,6 +18,7 @@ class CHyprColor { Hyprgraphics::CColor::SOkLab asOkLab() const; Hyprgraphics::CColor::SHSL asHSL() const; CHyprColor stripA() const; + CHyprColor modifyA(float newa) const; // bool operator==(const CHyprColor& c2) const { @@ -45,3 +46,18 @@ class CHyprColor { private: Hyprgraphics::CColor::SOkLab okLab; // cache for the OkLab representation }; + +//NOLINTNEXTLINE +namespace Colors { + static const CHyprColor WHITE = CHyprColor(1.F, 1.F, 1.F, 1.F); + static const CHyprColor GREEN = CHyprColor(0.F, 1.F, 0.F, 1.F); + static const CHyprColor BLUE = CHyprColor(0.F, 0.F, 1.F, 1.F); + static const CHyprColor RED = CHyprColor(1.F, 0.F, 0.F, 1.F); + static const CHyprColor ORANGE = CHyprColor(1.F, 0.5F, 0.F, 1.F); + static const CHyprColor YELLOW = CHyprColor(1.F, 1.F, 0.F, 1.F); + static const CHyprColor MAGENTA = CHyprColor(1.F, 0.F, 1.F, 1.F); + static const CHyprColor PURPLE = CHyprColor(0.5F, 0.F, 0.5F, 1.F); + static const CHyprColor LIME = CHyprColor(0.5F, 1.F, 0.1F, 1.F); + static const CHyprColor LIGHT_BLUE = CHyprColor(0.1F, 1.F, 1.F, 1.F); + static const CHyprColor BLACK = CHyprColor(0.F, 0.F, 0.F, 1.F); +}; diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index e73a3119..4fceabc5 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -166,59 +166,62 @@ class CHyprOpenGLImpl { CHyprOpenGLImpl(); ~CHyprOpenGLImpl(); - void begin(PHLMONITOR, const CRegion& damage, CFramebuffer* fb = nullptr, std::optional finalDamage = {}); - void beginSimple(PHLMONITOR, const CRegion& damage, SP rb = nullptr, CFramebuffer* fb = nullptr); - void end(); + void begin(PHLMONITOR, const CRegion& damage, CFramebuffer* fb = nullptr, std::optional finalDamage = {}); + void beginSimple(PHLMONITOR, const CRegion& damage, SP rb = nullptr, CFramebuffer* fb = nullptr); + void end(); - void renderRect(CBox*, const CHyprColor&, int round = 0); - void renderRectWithBlur(CBox*, const CHyprColor&, int round = 0, float blurA = 1.f, bool xray = false); - void renderRectWithDamage(CBox*, const CHyprColor&, const CRegion& damage, int round = 0); - void renderTexture(SP, CBox*, float a, int round = 0, bool discardActive = false, bool allowCustomUV = false); - void renderTextureWithDamage(SP, CBox*, const CRegion& damage, float a, int round = 0, bool discardActive = false, bool allowCustomUV = false, - SP waitTimeline = nullptr, uint64_t waitPoint = 0); - void renderTextureWithBlur(SP, CBox*, float a, SP pSurface, int round = 0, bool blockBlurOptimization = false, float blurA = 1.f); - void renderRoundedShadow(CBox*, int round, int range, const CHyprColor& color, float a = 1.0); - void renderBorder(CBox*, const CGradientValueData&, int round, int borderSize, float a = 1.0, int outerRound = -1 /* use round */); - void renderBorder(CBox*, const CGradientValueData&, const CGradientValueData&, float lerp, int round, int borderSize, float a = 1.0, int outerRound = -1 /* use round */); - void renderTextureMatte(SP tex, CBox* pBox, CFramebuffer& matte); + void renderRect(CBox*, const CHyprColor&, int round = 0); + void renderRectWithBlur(CBox*, const CHyprColor&, int round = 0, float blurA = 1.f, bool xray = false); + void renderRectWithDamage(CBox*, const CHyprColor&, const CRegion& damage, int round = 0); + void renderTexture(SP, CBox*, float a, int round = 0, bool discardActive = false, bool allowCustomUV = false); + void renderTextureWithDamage(SP, CBox*, const CRegion& damage, float a, int round = 0, bool discardActive = false, bool allowCustomUV = false, + SP waitTimeline = nullptr, uint64_t waitPoint = 0); + void renderTextureWithBlur(SP, CBox*, float a, SP pSurface, int round = 0, bool blockBlurOptimization = false, float blurA = 1.f); + void renderRoundedShadow(CBox*, int round, int range, const CHyprColor& color, float a = 1.0); + void renderBorder(CBox*, const CGradientValueData&, int round, int borderSize, float a = 1.0, int outerRound = -1 /* use round */); + void renderBorder(CBox*, const CGradientValueData&, const CGradientValueData&, float lerp, int round, int borderSize, float a = 1.0, int outerRound = -1 /* use round */); + void renderTextureMatte(SP tex, CBox* pBox, CFramebuffer& matte); - void setMonitorTransformEnabled(bool enabled); - void setRenderModifEnabled(bool enabled); + void setMonitorTransformEnabled(bool enabled); + void setRenderModifEnabled(bool enabled); - void saveMatrix(); - void setMatrixScaleTranslate(const Vector2D& translate, const float& scale); - void restoreMatrix(); + void saveMatrix(); + void setMatrixScaleTranslate(const Vector2D& translate, const float& scale); + void restoreMatrix(); - void blend(bool enabled); + void blend(bool enabled); - bool shouldUseNewBlurOptimizations(PHLLS pLayer, PHLWINDOW pWindow); + bool shouldUseNewBlurOptimizations(PHLLS pLayer, PHLWINDOW pWindow); - void clear(const CHyprColor&); - void clearWithTex(); - void scissor(const CBox*, bool transform = true); - void scissor(const pixman_box32*, bool transform = true); - void scissor(const int x, const int y, const int w, const int h, bool transform = true); + void clear(const CHyprColor&); + void clearWithTex(); + void scissor(const CBox*, bool transform = true); + void scissor(const pixman_box32*, bool transform = true); + void scissor(const int x, const int y, const int w, const int h, bool transform = true); - void destroyMonitorResources(PHLMONITOR); + void destroyMonitorResources(PHLMONITOR); - void markBlurDirtyForMonitor(PHLMONITOR); + void markBlurDirtyForMonitor(PHLMONITOR); - void preWindowPass(); - bool preBlurQueued(); - void preRender(PHLMONITOR); + void preWindowPass(); + bool preBlurQueued(); + void preRender(PHLMONITOR); - void saveBufferForMirror(CBox*); - void renderMirrored(); + void saveBufferForMirror(CBox*); + void renderMirrored(); - void applyScreenShader(const std::string& path); + void applyScreenShader(const std::string& path); - void bindOffMain(); - void renderOffToMain(CFramebuffer* off); - void bindBackOnMain(); + void bindOffMain(); + void renderOffToMain(CFramebuffer* off); + void bindBackOnMain(); - void setDamage(const CRegion& damage, std::optional finalDamage = {}); + SP loadAsset(const std::string& file); + SP renderText(const std::string& text, CHyprColor col, int pt, bool italic = false); - uint32_t getPreferredReadFormat(PHLMONITOR pMonitor); + void setDamage(const CRegion& damage, std::optional finalDamage = {}); + + uint32_t getPreferredReadFormat(PHLMONITOR pMonitor); std::vector getDRMFormats(); EGLImageKHR createEGLImage(const Aquamarine::SDMABUFAttrs& attrs); SP createEGLSync(int fenceFD); @@ -298,8 +301,6 @@ class CHyprOpenGLImpl { void initDRMFormats(); void initEGL(bool gbm); EGLDeviceEXT eglDeviceFromDRMFD(int drmFD); - SP loadAsset(const std::string& file); - SP renderText(const std::string& text, CHyprColor col, int pt, bool italic = false); void initAssets(); void initMissingAssetTexture(); diff --git a/src/render/pass/Pass.cpp b/src/render/pass/Pass.cpp index f71bd562..a2ecddaa 100644 --- a/src/render/pass/Pass.cpp +++ b/src/render/pass/Pass.cpp @@ -3,6 +3,10 @@ #include #include #include "../../config/ConfigValue.hpp" +#include "../../desktop/WLSurface.hpp" +#include "../../managers/SeatManager.hpp" +#include "../../managers/eventLoop/EventLoopManager.hpp" +#include "../../Compositor.hpp" bool CRenderPass::empty() const { return false; @@ -120,6 +124,15 @@ CRegion CRenderPass::render(const CRegion& damage_) { return damage; } + if (!*PDEBUGPASS && debugData.present) + debugData = {false}; + else if (*PDEBUGPASS && !debugData.present) { + debugData.present = true; + debugData.keyboardFocusText = g_pHyprOpenGL->renderText("keyboard", Colors::WHITE, 12); + debugData.pointerFocusText = g_pHyprOpenGL->renderText("pointer", Colors::WHITE, 12); + debugData.lastWindowText = g_pHyprOpenGL->renderText("lastWindow", Colors::WHITE, 12); + } + if (WILLBLUR && !*PDEBUGPASS) { // combine blur regions into one that will be expanded CRegion blurRegion; @@ -171,15 +184,63 @@ CRegion CRenderPass::render(const CRegion& damage_) { } if (*PDEBUGPASS) { - CBox monbox = {{}, g_pHyprOpenGL->m_RenderData.pMonitor->vecTransformedSize}; - g_pHyprOpenGL->renderRectWithDamage(&monbox, CHyprColor{1.F, 0.1F, 0.1F, 0.5F}, occludedRegion); - g_pHyprOpenGL->renderRectWithDamage(&monbox, CHyprColor{0.1F, 1.F, 0.1F, 0.5F}, totalLiveBlurRegion); + renderDebugData(); + g_pEventLoopManager->doLater([] { + for (auto& m : g_pCompositor->m_vMonitors) { + g_pHyprRenderer->damageMonitor(m); + } + }); } g_pHyprOpenGL->m_RenderData.damage = damage; return damage; } +void CRenderPass::renderDebugData() { + CBox box = {{}, g_pHyprOpenGL->m_RenderData.pMonitor->vecTransformedSize}; + g_pHyprOpenGL->renderRectWithDamage(&box, Colors::RED.modifyA(0.1F), occludedRegion); + g_pHyprOpenGL->renderRectWithDamage(&box, Colors::GREEN.modifyA(0.1F), totalLiveBlurRegion); + + std::unordered_map offsets; + + // render focus stuff + auto renderHLSurface = [&offsets](SP texture, SP surface, const CHyprColor& color) { + if (!surface || !texture) + return; + + auto hlSurface = CWLSurface::fromResource(surface); + if (!hlSurface) + return; + + auto bb = hlSurface->getSurfaceBoxGlobal(); + + if (!bb.has_value()) + return; + + CBox box = bb->copy().translate(-g_pHyprOpenGL->m_RenderData.pMonitor->vecPosition).scale(g_pHyprOpenGL->m_RenderData.pMonitor->scale); + + if (box.intersection(CBox{{}, g_pHyprOpenGL->m_RenderData.pMonitor->vecSize}).empty()) + return; + + if (offsets.contains(surface.get())) + box.translate(Vector2D{0.F, offsets[surface.get()]}); + else + offsets[surface.get()] = 0; + + g_pHyprOpenGL->renderRectWithDamage(&box, Colors::PURPLE.modifyA(0.1F), CRegion{0, 0, INT32_MAX, INT32_MAX}); + box = {box.pos(), texture->m_vSize}; + g_pHyprOpenGL->renderRectWithDamage(&box, CHyprColor{0.F, 0.F, 0.F, 0.2F}, CRegion{0, 0, INT32_MAX, INT32_MAX}, std::min(5.0, box.size().y)); + g_pHyprOpenGL->renderTexture(texture, &box, 1.F); + + offsets[surface.get()] += texture->m_vSize.y; + }; + + renderHLSurface(debugData.keyboardFocusText, g_pSeatManager->state.keyboardFocus.lock(), Colors::PURPLE.modifyA(0.1F)); + renderHLSurface(debugData.pointerFocusText, g_pSeatManager->state.pointerFocus.lock(), Colors::ORANGE.modifyA(0.1F)); + if (g_pCompositor->m_pLastWindow) + renderHLSurface(debugData.lastWindowText, g_pCompositor->m_pLastWindow->m_pWLSurface->resource(), Colors::LIGHT_BLUE.modifyA(0.1F)); +} + float CRenderPass::oneBlurRadius() { // TODO: is this exact range correct? static auto PBLURSIZE = CConfigValue("decoration:blur:size"); diff --git a/src/render/pass/Pass.hpp b/src/render/pass/Pass.hpp index 6fe6938f..5d7d3bb3 100644 --- a/src/render/pass/Pass.hpp +++ b/src/render/pass/Pass.hpp @@ -4,6 +4,7 @@ #include "PassElement.hpp" class CGradientValueData; +class CTexture; class CRenderPass { public: @@ -33,6 +34,12 @@ class CRenderPass { void simplify(); float oneBlurRadius(); + void renderDebugData(); + + struct { + bool present = false; + SP keyboardFocusText, pointerFocusText, lastWindowText; + } debugData; friend class CHyprOpenGLImpl; };