From 02f30ea15b349d1ed98b608ed06ec88c834592dd Mon Sep 17 00:00:00 2001 From: UjinT34 <41110182+UjinT34@users.noreply.github.com> Date: Sat, 7 Mar 2026 21:21:23 +0300 Subject: renderer: refactor gl renderer (#13488) --- src/render/Renderer.hpp | 249 +++++++++++++++++++++++++++--------------------- 1 file changed, 140 insertions(+), 109 deletions(-) (limited to 'src/render/Renderer.hpp') diff --git a/src/render/Renderer.hpp b/src/render/Renderer.hpp index 441a603c..1d099ee3 100644 --- a/src/render/Renderer.hpp +++ b/src/render/Renderer.hpp @@ -109,12 +109,6 @@ struct SRenderData { // TODO remove and pass directly CBox clipBox = {}; // scaled coordinates - CRegion clipRegion; - - uint32_t discardMode = DISCARD_OPAQUE; - float discardOpacity = 0.f; - - PHLLSREF currentLS; PHLWINDOWREF currentWindow; WP surface; @@ -145,10 +139,10 @@ struct SCMSettings { float sdrBrightnessMultiplier = 1.0; }; -class CHyprRenderer { +class IHyprRenderer { public: - CHyprRenderer(); - ~CHyprRenderer(); + IHyprRenderer(); + virtual ~IHyprRenderer(); WP glBackend(); @@ -168,49 +162,45 @@ class CHyprRenderer { void setCursorHidden(bool hide); void calculateUVForSurface(PHLWINDOW, SP, PHLMONITOR pMonitor, bool main = false, const Vector2D& projSize = {}, const Vector2D& projSizeUnscaled = {}, bool fixMisalignedFSV1 = false); - std::tuple getRenderTimes(PHLMONITOR pMonitor); // avg max min - void ensureLockTexturesRendered(bool load); - void renderLockscreen(PHLMONITOR pMonitor, const Time::steady_tp& now, const CBox& geometry); - void setCursorSurface(SP surf, int hotspotX, int hotspotY, bool force = false); - void setCursorFromName(const std::string& name, bool force = false); - void onRenderbufferDestroy(IRenderbuffer* rb); - SP getCurrentRBO(); - bool isNvidia(); - bool isIntel(); - bool isSoftware(); - bool isMgpu(); - void addWindowToRenderUnfocused(PHLWINDOW window); - void makeSnapshot(PHLWINDOW); - void makeSnapshot(PHLLS); - void makeSnapshot(WP); - void renderSnapshot(PHLWINDOW); - void renderSnapshot(PHLLS); - void renderSnapshot(WP); - - // - NColorManagement::PImageDescription workBufferImageDescription(); - - // if RENDER_MODE_NORMAL, provided damage will be written to. - // otherwise, it will be the one used. - bool beginRender(PHLMONITOR pMonitor, CRegion& damage, eRenderMode mode = RENDER_MODE_NORMAL, SP buffer = {}, SP fb = nullptr, bool simple = false); - void endRender(const std::function& renderingDoneCallback = {}); + std::tuple getRenderTimes(PHLMONITOR pMonitor); // avg max min + void ensureLockTexturesRendered(bool load); + void renderLockscreen(PHLMONITOR pMonitor, const Time::steady_tp& now, const CBox& geometry); + void setCursorSurface(SP surf, int hotspotX, int hotspotY, bool force = false); + void setCursorFromName(const std::string& name, bool force = false); + void onRenderbufferDestroy(IRenderbuffer* rb); + bool isNvidia(); + bool isIntel(); + bool isSoftware(); + bool isMgpu(); + void addWindowToRenderUnfocused(PHLWINDOW window); + void makeSnapshot(PHLWINDOW); + void makeSnapshot(PHLLS); + void makeSnapshot(WP); + void renderSnapshot(PHLWINDOW); + void renderSnapshot(PHLLS); + void renderSnapshot(WP); + bool beginFullFakeRender(PHLMONITOR pMonitor, CRegion& damage, SP fb); + bool beginRenderToBuffer(PHLMONITOR pMonitor, CRegion& damage, SP buffer, bool simple = false); + virtual void startRenderPass() {}; + virtual void endRender(const std::function& renderingDoneCallback = {}) = 0; - bool m_bBlockSurfaceFeedback = false; - bool m_bRenderingSnapshot = false; - PHLMONITORREF m_mostHzMonitor; - bool m_directScanoutBlocked = false; + NColorManagement::PImageDescription workBufferImageDescription(); + bool m_bBlockSurfaceFeedback = false; + bool m_bRenderingSnapshot = false; + PHLMONITORREF m_mostHzMonitor; + bool m_directScanoutBlocked = false; - void setSurfaceScanoutMode(SP surface, PHLMONITOR monitor); // nullptr monitor resets + void setSurfaceScanoutMode(SP surface, PHLMONITOR monitor); // nullptr monitor resets - void initiateManualCrash(); - const SRenderData& renderData(); + void initiateManualCrash(); + const SRenderData& renderData(); - bool m_crashingInProgress = false; - float m_crashingDistort = 0.5f; - wl_event_source* m_crashingLoop = nullptr; - wl_event_source* m_cursorTicker = nullptr; + bool m_crashingInProgress = false; + float m_crashingDistort = 0.5f; + wl_event_source* m_crashingLoop = nullptr; + wl_event_source* m_cursorTicker = nullptr; - std::vector m_usedAsyncBuffers; + std::vector m_usedAsyncBuffers; struct { int hotspotX = 0; @@ -222,62 +212,97 @@ class CHyprRenderer { std::string name; } m_lastCursorData; - CRenderPass m_renderPass = {}; - - SP getOrCreateRenderbuffer(SP buffer, uint32_t fmt); // TODO? move to protected and fix CPointerManager::renderHWCursorBuffer - SRenderData m_renderData; // TODO? move to protected and fix CRenderPass - SP m_screencopyDeniedTexture; // TODO? make readonly - uint m_failedAssetsNo = 0; // TODO? make readonly - bool m_reloadScreenShader = true; // at launch it can be set - CTimer m_globalTimer; - - SP createStencilTexture(const int width, const int height); - SP createTexture(bool opaque = false); - SP createTexture(uint32_t drmFormat, uint8_t* pixels, uint32_t stride, const Vector2D& size, bool keepDataCopy = false, bool opaque = false); - SP createTexture(const Aquamarine::SDMABUFAttrs&, bool opaque = false); - SP createTexture(const int width, const int height, unsigned char* const); - SP createTexture(cairo_surface_t* cairo); - SP createTexture(const SP buffer, bool keepDataCopy = false); - SP createTexture(std::span lut3D, size_t N); - SP renderText(const std::string& text, CHyprColor col, int pt, bool italic = false, const std::string& fontFamily = "", int maxWidth = 0, int weight = 400); - SP loadAsset(const std::string& filename); - bool shouldUseNewBlurOptimizations(PHLLS pLayer, PHLWINDOW pWindow); - bool explicitSyncSupported(); - std::vector getDRMFormats(); - std::vector getDRMFormatModifiers(DRMFormat format); - SP createFB(const std::string& name = ""); - void pushMonitorTransformEnabled(bool enabled); - void popMonitorTransformEnabled(); - bool monitorTransformEnabled(); - - void setProjectionType(const Vector2D& fbSize); - void setProjectionType(eRenderProjectionType projectionType); - Mat3x3 getBoxProjection(const CBox& box, std::optional transform = std::nullopt); - Mat3x3 projectBoxToTarget(const CBox& box, std::optional transform = std::nullopt); - - SCMSettings getCMSettings(const NColorManagement::PImageDescription imageDescription, const NColorManagement::PImageDescription targetImageDescription, - SP surface = nullptr, bool modifySDR = false, float sdrMinLuminance = -1.0f, int sdrMaxLuminance = -1); - bool reloadShaders(const std::string& path = ""); - - void draw(CBorderPassElement* element, const CRegion& damage); - void draw(CClearPassElement* element, const CRegion& damage); - void draw(CFramebufferElement* element, const CRegion& damage); - void draw(CPreBlurElement* element, const CRegion& damage); - void draw(CRectPassElement* element, const CRegion& damage); - void draw(CRendererHintsPassElement* element, const CRegion& damage); - void draw(CShadowPassElement* element, const CRegion& damage); - void draw(CSurfacePassElement* element, const CRegion& damage); - void draw(CTexPassElement* element, const CRegion& damage); - void draw(CTextureMatteElement* element, const CRegion& damage); - void draw(WP element, const CRegion& damage); - - SP m_lockDeadTexture; - SP m_lockDead2Texture; - SP m_lockTtyTextTexture; - bool m_monitorTransformEnabled = false; // do not modify directly - std::stack m_monitorTransformStack; + CRenderPass m_renderPass; + + SP renderSplash(const std::function(const int, const int, unsigned char* const)>& handleData, const int fontSize, const int maxWidth = 1024, + const int maxHeight = 1024); + + virtual SP getOrCreateRenderbuffer(SP buffer, uint32_t fmt); // TODO? move to protected and fix CPointerManager::renderHWCursorBuffer + bool commitPendingAndDoExplicitSync(PHLMONITOR pMonitor); // TODO? move to protected and fix CMonitorFrameScheduler::onPresented + SRenderData m_renderData; // TODO? move to protected and fix CRenderPass + SP m_screencopyDeniedTexture; // TODO? make readonly + uint m_failedAssetsNo = 0; // TODO? make readonly + bool m_reloadScreenShader = true; // at launch it can be set + CTimer m_globalTimer; + + void draw(WP element, const CRegion& damage); + virtual SP createStencilTexture(const int width, const int height) = 0; + virtual SP createTexture(bool opaque = false) = 0; + virtual SP createTexture(uint32_t drmFormat, uint8_t* pixels, uint32_t stride, const Vector2D& size, bool keepDataCopy = false, bool opaque = false) = 0; + virtual SP createTexture(const Aquamarine::SDMABUFAttrs&, bool opaque = false) = 0; + virtual SP createTexture(const int width, const int height, unsigned char* const) = 0; + virtual SP createTexture(cairo_surface_t* cairo) = 0; + virtual SP createTexture(std::span lut3D, size_t N) = 0; + virtual SP createTexture(const SP buffer, bool keepDataCopy = false); + virtual SP renderText(const std::string& text, CHyprColor col, int pt, bool italic = false, const std::string& fontFamily = "", int maxWidth = 0, int weight = 400); + SP loadAsset(const std::string& filename); + virtual bool shouldUseNewBlurOptimizations(PHLLS pLayer, PHLWINDOW pWindow); + virtual bool explicitSyncSupported() = 0; + virtual std::vector getDRMFormats() = 0; + virtual std::vector getDRMFormatModifiers(DRMFormat format) = 0; + virtual SP createFB(const std::string& name = "") = 0; + virtual void disableScissor() = 0; + virtual void blend(bool enabled) = 0; + virtual void drawShadow(const CBox& box, int round, float roundingPower, int range, CHyprColor color, float a) = 0; + virtual void setViewport(int x, int y, int width, int height) = 0; + + bool preBlurQueued(PHLMONITORREF pMonitor); + void pushMonitorTransformEnabled(bool enabled); + void popMonitorTransformEnabled(); + bool monitorTransformEnabled(); + + void setProjectionType(const Vector2D& fbSize); + void setProjectionType(eRenderProjectionType projectionType); + Mat3x3 getBoxProjection(const CBox& box, std::optional transform = std::nullopt); + Mat3x3 projectBoxToTarget(const CBox& box, std::optional transform = std::nullopt); + + SP blurMainFramebuffer(float a, CRegion* originalDamage); + virtual SP blurFramebuffer(SP source, float a, CRegion* originalDamage) = 0; + void preBlurForCurrentMonitor(CRegion* fakeDamage); + + SCMSettings getCMSettings(const NColorManagement::PImageDescription imageDescription, const NColorManagement::PImageDescription targetImageDescription, + SP surface = nullptr, bool modifySDR = false, float sdrMinLuminance = -1.0f, int sdrMaxLuminance = -1); + virtual bool reloadShaders(const std::string& path = "") = 0; + + bool needsACopyFB(PHLMONITOR mon); + + protected: + virtual void renderOffToMain(IFramebuffer* off) = 0; + virtual SP getOrCreateRenderbufferInternal(SP buffer, uint32_t fmt) = 0; + void renderMirrored(); + void setDamage(const CRegion& damage_, std::optional finalDamage); + // if RENDER_MODE_NORMAL, provided damage will be written to. + // otherwise, it will be the one used. + bool beginRender(PHLMONITOR pMonitor, CRegion& damage, eRenderMode mode = RENDER_MODE_NORMAL, SP buffer = {}, SP fb = nullptr, bool simple = false); - private: + virtual bool beginRenderInternal(PHLMONITOR pMonitor, CRegion& damage, bool simple = false) { + return false; + }; + virtual bool beginFullFakeRenderInternal(PHLMONITOR pMonitor, CRegion& damage, SP fb, bool simple = false) { + return false; + }; + virtual void initRender() {}; + virtual bool initRenderBuffer(SP buffer, uint32_t fmt) { + return false; + }; + + SP getBackground(PHLMONITOR pMonitor); + virtual void draw(CBorderPassElement* element, const CRegion& damage) = 0; + virtual void draw(CClearPassElement* element, const CRegion& damage) = 0; + virtual void draw(CFramebufferElement* element, const CRegion& damage) = 0; + virtual void draw(CPreBlurElement* element, const CRegion& damage) = 0; + virtual void draw(CRectPassElement* element, const CRegion& damage) = 0; + virtual void draw(CShadowPassElement* element, const CRegion& damage) = 0; + virtual void draw(CTexPassElement* element, const CRegion& damage) = 0; + virtual void draw(CTextureMatteElement* element, const CRegion& damage) = 0; + virtual SP getBlurTexture(PHLMONITORREF pMonitor); + SP m_lockDeadTexture; + SP m_lockDead2Texture; + SP m_lockTtyTextTexture; + bool m_monitorTransformEnabled = false; // do not modify directly + std::stack m_monitorTransformStack; + + // old private: void arrangeLayerArray(PHLMONITOR, const std::vector&, bool, CBox*); void renderWorkspace(PHLMONITOR pMonitor, PHLWORKSPACE pWorkspace, const Time::steady_tp& now, const CBox& geometry); void renderWorkspaceWindowsFullscreen(PHLMONITOR, PHLWORKSPACE, const Time::steady_tp&); // renders workspace windows (fullscreen) (tiled, floating, pinned, but no special) @@ -292,12 +317,7 @@ class CHyprRenderer { void renderSessionLockPrimer(PHLMONITOR pMonitor); void renderSessionLockMissing(PHLMONITOR pMonitor); void renderBackground(PHLMONITOR pMonitor); - - bool commitPendingAndDoExplicitSync(PHLMONITOR pMonitor); - void requestBackgroundResource(); - // - SP getOrCreateRenderbufferInternal(SP buffer, uint32_t fmt); std::string resolveAssetPath(const std::string& file); void initMissingAssetTexture(); void initAssets(); @@ -312,7 +332,6 @@ class CHyprRenderer { bool m_cursorHidden = false; bool m_cursorHiddenByCondition = false; bool m_cursorHasSurface = false; - SP m_currentRenderbuffer = nullptr; SP m_currentBuffer = nullptr; eRenderMode m_renderMode = RENDER_MODE_NORMAL; bool m_nvidia = false; @@ -339,6 +358,18 @@ class CHyprRenderer { friend class CPointerManager; friend class CMonitor; friend class CMonitorFrameScheduler; + + private: + void bindOffMain(); + void bindBackOnMain(); + + void drawRect(CRectPassElement* element, const CRegion& damage); + void drawHints(CRendererHintsPassElement* element, const CRegion& damage); + void drawPreBlur(CPreBlurElement* element, const CRegion& damage); + void drawSurface(CSurfacePassElement* element, const CRegion& damage); + void preDrawSurface(CSurfacePassElement* element, const CRegion& damage); + void drawTex(CTexPassElement* element, const CRegion& damage); + void drawTexMatte(CTextureMatteElement* element, const CRegion& damage); }; -inline UP g_pHyprRenderer; +inline UP g_pHyprRenderer; -- cgit v1.2.3