summaryrefslogtreecommitdiff
path: root/src/render/OpenGL.hpp
diff options
context:
space:
mode:
authorUjinT34 <41110182+UjinT34@users.noreply.github.com>2026-03-07 16:13:34 +0300
committerGitHub <noreply@github.com>2026-03-07 13:13:34 +0000
commit966f20d305345b3042dc1d37a1dd8833f3a4783b (patch)
tree3e8515b7a0f6fde7bf3137aac7124ae90e5951ec /src/render/OpenGL.hpp
parent32e75e3e320fb66ab517a378df645f3d29b3a209 (diff)
renderer: refactor resources and flags (#13471)
Diffstat (limited to 'src/render/OpenGL.hpp')
-rw-r--r--src/render/OpenGL.hpp209
1 files changed, 80 insertions, 129 deletions
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<std::map<Render::ShaderFeatureFlags, SP<CShader>>, Render::SH_FRAG_LAST> fragVariants;
};
-struct SMonitorRenderData {
- SP<IFramebuffer> offloadFB;
- SP<IFramebuffer> mirrorFB; // these are used for some effects,
- SP<IFramebuffer> mirrorSwapFB; // etc
- SP<IFramebuffer> offMainFB;
- SP<IFramebuffer> monitorMirrorFB; // used for mirroring outputs, does not contain artifacts like offloadFB
- SP<IFramebuffer> blurFB;
-
- SP<ITexture> stencilTex = makeShared<CGLTexture>();
-
- 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<IFramebuffer> currentFB = nullptr; // current rendering to
- SP<IFramebuffer> mainFB = nullptr; // main to render to
- SP<IFramebuffer> outFB = nullptr; // out to render to (if offloaded, etc)
+ SP<IFramebuffer> currentFB = nullptr; // current rendering to
+ SP<IFramebuffer> mainFB = nullptr; // main to render to
+ SP<IFramebuffer> 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<IFramebuffer> fb = nullptr, std::optional<CRegion> finalDamage = {});
- void beginSimple(PHLMONITOR, const CRegion& damage, SP<IRenderbuffer> rb = nullptr, SP<IFramebuffer> fb = nullptr);
- void end();
-
- void renderRect(const CBox&, const CHyprColor&, SRectRenderData data);
- void renderTexture(SP<ITexture>, 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<ITexture> tex, const CBox& pBox, SP<IFramebuffer> matte);
- void renderTexturePrimitive(SP<ITexture> 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<IFramebuffer> fb = nullptr, std::optional<CRegion> finalDamage = {});
+ void beginSimple(PHLMONITOR, const CRegion& damage, SP<IRenderbuffer> rb = nullptr, SP<IFramebuffer> fb = nullptr);
+ void end();
- bool shouldUseNewBlurOptimizations(PHLLS pLayer, PHLWINDOW pWindow);
+ void renderRect(const CBox&, const CHyprColor&, SRectRenderData data);
+ void renderTexture(SP<ITexture>, 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<ITexture> tex, const CBox& pBox, SP<IFramebuffer> matte);
+ void renderTexturePrimitive(SP<ITexture> 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<ITexture> loadAsset(const std::string& file);
- SP<ITexture> texFromCairo(cairo_surface_t* cairo);
- SP<ITexture> 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<CRegion> finalDamage = {});
+ SP<ITexture> texFromCairo(cairo_surface_t* cairo);
- DRMFormat getPreferredReadFormat(PHLMONITOR pMonitor);
- std::vector<SDRMFormat> getDRMFormats();
- std::vector<uint64_t> getDRMFormatModifiers(DRMFormat format);
- EGLImageKHR createEGLImage(const Aquamarine::SDMABUFAttrs& attrs);
+ bool needsACopyFB(PHLMONITOR mon);
+ void setDamage(const CRegion& damage, std::optional<CRegion> finalDamage = {});
- bool initShaders(const std::string& path = "");
+ std::vector<SDRMFormat> getDRMFormats();
+ std::vector<uint64_t> getDRMFormatModifiers(DRMFormat format);
+ EGLImageKHR createEGLImage(const Aquamarine::SDMABUFAttrs& attrs);
- WP<CShader> useShader(WP<CShader> prog);
+ bool initShaders(const std::string& path = "");
- bool explicitSyncSupported();
- WP<CShader> getShaderVariant(Render::ePreparedFragmentShader frag, Render::ShaderFeatureFlags features = 0);
+ WP<CShader> useShader(WP<CShader> prog);
- bool m_shadersInitialized = false;
- SP<SPreparedShaders> m_shaders;
+ bool explicitSyncSupported();
+ WP<CShader> getShaderVariant(Render::ePreparedFragmentShader frag, Render::ShaderFeatureFlags features = 0);
- SCurrentRenderData m_renderData;
+ bool m_shadersInitialized = false;
+ SP<SPreparedShaders> 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<PHLWINDOWREF, SP<IFramebuffer>> m_windowFramebuffers;
- std::map<PHLLSREF, SP<IFramebuffer>> m_layerFramebuffers;
- std::map<WP<Desktop::View::CPopup>, SP<IFramebuffer>> m_popupFramebuffers;
- std::map<PHLMONITORREF, SMonitorRenderData> m_monitorRenderResources;
- std::map<PHLMONITORREF, SP<IFramebuffer>> m_monitorBGFBs;
+ std::map<PHLMONITORREF, SP<IFramebuffer>> m_monitorBGFBs;
struct {
PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glEGLImageTargetRenderbufferStorageOES = nullptr;
@@ -350,8 +316,6 @@ class CHyprOpenGLImpl {
bool EGL_ANDROID_native_fence_sync_ext = false;
} m_exts;
- SP<ITexture> 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<bool, CAP_STATUS_END> m_capStatus = {};
-
- std::vector<SDRMFormat> 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<bool> m_monitorTransformStack;
- SP<ITexture> m_missingAssetTexture;
- SP<ITexture> m_lockDeadTexture;
- SP<ITexture> m_lockDead2Texture;
- SP<ITexture> m_lockTtyTextTexture;
- SP<CShader> m_finalScreenShader;
- CTimer m_globalTimer;
- GLuint m_currentProgram;
- ASP<Hyprgraphics::CImageResource> 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<bool, CAP_STATUS_END> m_capStatus = {};
+
+ std::vector<SDRMFormat> 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<CShader> m_finalScreenShader;
+ GLuint m_currentProgram;
+
+ void createBGTextureForMonitor(PHLMONITOR);
+ void initDRMFormats();
+ void initEGL(bool gbm);
+ EGLDeviceEXT eglDeviceFromDRMFD(int drmFD);
// for the final shader
std::array<CTimer, POINTER_PRESSED_HISTORY_LENGTH> m_pressedHistoryTimers = {};