From 966f20d305345b3042dc1d37a1dd8833f3a4783b Mon Sep 17 00:00:00 2001 From: UjinT34 <41110182+UjinT34@users.noreply.github.com> Date: Sat, 7 Mar 2026 16:13:34 +0300 Subject: renderer: refactor resources and flags (#13471) --- src/render/OpenGL.hpp | 209 +++++++++++++++++++------------------------------- 1 file changed, 80 insertions(+), 129 deletions(-) (limited to 'src/render/OpenGL.hpp') diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index c9008447..aa8354dd 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -113,31 +113,15 @@ struct SPreparedShaders { std::array>, Render::SH_FRAG_LAST> fragVariants; }; -struct SMonitorRenderData { - SP offloadFB; - SP mirrorFB; // these are used for some effects, - SP mirrorSwapFB; // etc - SP offMainFB; - SP monitorMirrorFB; // used for mirroring outputs, does not contain artifacts like offloadFB - SP blurFB; - - SP stencilTex = makeShared(); - - bool blurFBDirty = true; - bool blurFBShouldRender = false; -}; - struct SCurrentRenderData { - PHLMONITORREF pMonitor; - Mat3x3 projection; - Mat3x3 savedProjection; - Mat3x3 monitorProjection; + PHLMONITORREF pMonitor; + Mat3x3 projection; + Mat3x3 savedProjection; + Mat3x3 monitorProjection; - // FIXME: raw pointer galore! - SMonitorRenderData* pCurrentMonData = nullptr; - SP currentFB = nullptr; // current rendering to - SP mainFB = nullptr; // main to render to - SP outFB = nullptr; // out to render to (if offloaded, etc) + SP currentFB = nullptr; // current rendering to + SP mainFB = nullptr; // main to render to + SP outFB = nullptr; // out to render to (if offloaded, etc) CRegion damage; CRegion finalDamage; // damage used for funal off -> main @@ -230,96 +214,78 @@ class CHyprOpenGLImpl { int outerRound = -1; /* use round */ }; - void begin(PHLMONITOR, const CRegion& damage, SP fb = nullptr, std::optional finalDamage = {}); - void beginSimple(PHLMONITOR, const CRegion& damage, SP rb = nullptr, SP fb = nullptr); - void end(); - - void renderRect(const CBox&, const CHyprColor&, SRectRenderData data); - void renderTexture(SP, const CBox&, STextureRenderData data); - void renderRoundedShadow(const CBox&, int round, float roundingPower, int range, const CHyprColor& color, float a = 1.0); - void renderBorder(const CBox&, const CGradientValueData&, SBorderRenderData data); - void renderBorder(const CBox&, const CGradientValueData&, const CGradientValueData&, float lerp, SBorderRenderData data); - void renderTextureMatte(SP tex, const CBox& pBox, SP matte); - void renderTexturePrimitive(SP tex, const CBox& box); - - void pushMonitorTransformEnabled(bool enabled); - void popMonitorTransformEnabled(); - - void setRenderModifEnabled(bool enabled); - void setViewport(GLint x, GLint y, GLsizei width, GLsizei height); - void setCapStatus(int cap, bool status); - - void saveMatrix(); - void setMatrixScaleTranslate(const Vector2D& translate, const float& scale); - void restoreMatrix(); - - void blend(bool enabled); + void makeEGLCurrent(); + void begin(PHLMONITOR, const CRegion& damage, SP fb = nullptr, std::optional finalDamage = {}); + void beginSimple(PHLMONITOR, const CRegion& damage, SP rb = nullptr, SP fb = nullptr); + void end(); - bool shouldUseNewBlurOptimizations(PHLLS pLayer, PHLWINDOW pWindow); + void renderRect(const CBox&, const CHyprColor&, SRectRenderData data); + void renderTexture(SP, const CBox&, STextureRenderData data); + void renderRoundedShadow(const CBox&, int round, float roundingPower, int range, const CHyprColor& color, float a = 1.0); + void renderBorder(const CBox&, const CGradientValueData&, SBorderRenderData data); + void renderBorder(const CBox&, const CGradientValueData&, const CGradientValueData&, float lerp, SBorderRenderData data); + void renderTextureMatte(SP tex, const CBox& pBox, SP matte); + void renderTexturePrimitive(SP tex, const CBox& box); - 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 setRenderModifEnabled(bool enabled); + void setViewport(GLint x, GLint y, GLsizei width, GLsizei height); + void setCapStatus(int cap, bool status); - void destroyMonitorResources(PHLMONITORREF); + void saveMatrix(); + void setMatrixScaleTranslate(const Vector2D& translate, const float& scale); + void restoreMatrix(); - void markBlurDirtyForMonitor(PHLMONITOR); + void blend(bool enabled); - void preWindowPass(); - bool preBlurQueued(); - void preRender(PHLMONITOR); + 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 saveBufferForMirror(const CBox&); - void renderMirrored(); + void destroyMonitorResources(PHLMONITORREF); - void applyScreenShader(const std::string& path); + void preWindowPass(); + bool preBlurQueued(); + void preRender(PHLMONITOR); - void bindOffMain(); - void renderOffToMain(CGLFramebuffer* off); - void bindBackOnMain(); + void saveBufferForMirror(const CBox&); + void renderMirrored(); - bool needsACopyFB(PHLMONITOR mon); + void applyScreenShader(const std::string& path); - std::string resolveAssetPath(const std::string& file); - SP loadAsset(const std::string& file); - SP texFromCairo(cairo_surface_t* cairo); - SP renderText(const std::string& text, CHyprColor col, int pt, bool italic = false, const std::string& fontFamily = "", int maxWidth = 0, int weight = 400); + void bindOffMain(); + void renderOffToMain(CGLFramebuffer* off); + void bindBackOnMain(); - void setDamage(const CRegion& damage, std::optional finalDamage = {}); + SP texFromCairo(cairo_surface_t* cairo); - DRMFormat getPreferredReadFormat(PHLMONITOR pMonitor); - std::vector getDRMFormats(); - std::vector getDRMFormatModifiers(DRMFormat format); - EGLImageKHR createEGLImage(const Aquamarine::SDMABUFAttrs& attrs); + bool needsACopyFB(PHLMONITOR mon); + void setDamage(const CRegion& damage, std::optional finalDamage = {}); - bool initShaders(const std::string& path = ""); + std::vector getDRMFormats(); + std::vector getDRMFormatModifiers(DRMFormat format); + EGLImageKHR createEGLImage(const Aquamarine::SDMABUFAttrs& attrs); - WP useShader(WP prog); + bool initShaders(const std::string& path = ""); - bool explicitSyncSupported(); - WP getShaderVariant(Render::ePreparedFragmentShader frag, Render::ShaderFeatureFlags features = 0); + WP useShader(WP prog); - bool m_shadersInitialized = false; - SP m_shaders; + bool explicitSyncSupported(); + WP getShaderVariant(Render::ePreparedFragmentShader frag, Render::ShaderFeatureFlags features = 0); - SCurrentRenderData m_renderData; + bool m_shadersInitialized = false; + SP m_shaders; - Hyprutils::OS::CFileDescriptor m_gbmFD; - gbm_device* m_gbmDevice = nullptr; - EGLContext m_eglContext = nullptr; - EGLDisplay m_eglDisplay = nullptr; - EGLDeviceEXT m_eglDevice = nullptr; - uint m_failedAssetsNo = 0; + SCurrentRenderData m_renderData; - bool m_reloadScreenShader = true; // at launch it can be set + Hyprutils::OS::CFileDescriptor m_gbmFD; + gbm_device* m_gbmDevice = nullptr; + EGLContext m_eglContext = nullptr; + EGLDisplay m_eglDisplay = nullptr; + EGLDeviceEXT m_eglDevice = nullptr; - std::map> m_windowFramebuffers; - std::map> m_layerFramebuffers; - std::map, SP> m_popupFramebuffers; - std::map m_monitorRenderResources; - std::map> m_monitorBGFBs; + std::map> m_monitorBGFBs; struct { PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glEGLImageTargetRenderbufferStorageOES = nullptr; @@ -350,8 +316,6 @@ class CHyprOpenGLImpl { bool EGL_ANDROID_native_fence_sync_ext = false; } m_exts; - SP m_screencopyDeniedTexture; - enum eEGLContextVersion : uint8_t { EGL_CONTEXT_GLES_2_0 = 0, EGL_CONTEXT_GLES_3_0, @@ -375,40 +339,27 @@ class CHyprOpenGLImpl { GLsizei height = 0; } m_lastViewport; - std::array m_capStatus = {}; - - std::vector m_drmFormats; - bool m_hasModifiers = false; - - int m_drmFD = -1; - std::string m_extensions; - - bool m_fakeFrame = false; - bool m_applyFinalShader = false; - bool m_blend = false; - bool m_offloadedFramebuffer = false; - bool m_cmSupported = true; - - bool m_monitorTransformEnabled = false; // do not modify directly - std::stack m_monitorTransformStack; - SP m_missingAssetTexture; - SP m_lockDeadTexture; - SP m_lockDead2Texture; - SP m_lockTtyTextTexture; - SP m_finalScreenShader; - CTimer m_globalTimer; - GLuint m_currentProgram; - ASP m_backgroundResource; - bool m_backgroundResourceFailed = false; - - void createBGTextureForMonitor(PHLMONITOR); - void initDRMFormats(); - void initEGL(bool gbm); - EGLDeviceEXT eglDeviceFromDRMFD(int drmFD); - void initAssets(); - void ensureLockTexturesRendered(bool load); - void initMissingAssetTexture(); - void requestBackgroundResource(); + std::array m_capStatus = {}; + + std::vector m_drmFormats; + bool m_hasModifiers = false; + + int m_drmFD = -1; + std::string m_extensions; + + bool m_fakeFrame = false; + bool m_applyFinalShader = false; + bool m_blend = false; + bool m_offloadedFramebuffer = false; + bool m_cmSupported = true; + + SP m_finalScreenShader; + GLuint m_currentProgram; + + void createBGTextureForMonitor(PHLMONITOR); + void initDRMFormats(); + void initEGL(bool gbm); + EGLDeviceEXT eglDeviceFromDRMFD(int drmFD); // for the final shader std::array m_pressedHistoryTimers = {}; -- cgit v1.2.3