Hyprland/src/render/OpenGL.hpp

196 lines
6.8 KiB
C++
Raw Normal View History

2022-04-04 19:44:25 +02:00
#pragma once
#include "../defines.hpp"
#include "../helpers/Monitor.hpp"
#include "../helpers/Color.hpp"
#include "../helpers/Timer.hpp"
2023-07-19 20:09:49 +02:00
#include "../helpers/Region.hpp"
2022-04-04 19:44:25 +02:00
#include <list>
2022-04-05 20:49:15 +02:00
#include <unordered_map>
2022-04-04 19:44:25 +02:00
2022-07-10 15:41:26 +02:00
#include <cairo/cairo.h>
2022-04-04 19:44:25 +02:00
#include "Shader.hpp"
2022-04-05 14:33:54 +02:00
#include "Texture.hpp"
2022-04-05 20:49:15 +02:00
#include "Framebuffer.hpp"
2022-04-04 19:44:25 +02:00
2023-07-20 17:47:49 +02:00
#include "../debug/TracyDefines.hpp"
class CHyprRenderer;
2022-04-04 21:45:35 +02:00
inline const float fullVerts[] = {
1, 0, // top right
0, 0, // top left
1, 1, // bottom right
0, 1, // bottom left
};
inline const float fanVertsFull[] = {-1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f};
2022-04-04 21:45:35 +02:00
enum eDiscardMode
{
DISCARD_OPAQUE = 1,
DISCARD_ALPHA = 1 << 1
2023-03-18 00:16:13 +01:00
};
struct SRenderModifData {
Vector2D translate = {};
float scale = 1.f;
};
2022-06-29 12:54:53 +02:00
struct SMonitorRenderData {
CFramebuffer primaryFB;
2023-07-19 20:09:49 +02:00
CFramebuffer mirrorFB; // these are used for some effects,
CFramebuffer mirrorSwapFB; // etc
2022-09-13 15:25:42 +02:00
CFramebuffer monitorMirrorFB; // used for mirroring outputs
2022-06-29 12:54:53 +02:00
CTexture stencilTex;
2022-07-31 23:44:04 +02:00
CFramebuffer blurFB;
bool blurFBDirty = true;
bool blurFBShouldRender = false;
2022-07-31 23:44:04 +02:00
wlr_box backgroundTexBox;
// Shaders
bool m_bShadersInitialized = false;
CShader m_shQUAD;
CShader m_shRGBA;
CShader m_shPASSTHRURGBA;
CShader m_shRGBX;
CShader m_shEXT;
CShader m_shBLUR1;
CShader m_shBLUR2;
CShader m_shBLURFINISH;
CShader m_shSHADOW;
CShader m_shBORDER1;
2023-04-04 15:49:58 +02:00
CShader m_shGLITCH;
//
2022-06-29 12:54:53 +02:00
};
2022-04-04 19:44:25 +02:00
struct SCurrentRenderData {
CMonitor* pMonitor = nullptr;
CWorkspace* pWorkspace = nullptr;
float projection[9];
float savedProjection[9];
2022-04-14 16:43:29 +02:00
2022-06-29 12:54:53 +02:00
SMonitorRenderData* pCurrentMonData = nullptr;
2023-07-19 20:09:49 +02:00
CRegion damage;
2022-06-22 15:45:56 +02:00
SRenderModifData renderModif;
2023-04-16 15:48:38 +02:00
float mouseZoomFactor = 1.f;
2023-05-01 03:49:41 +02:00
bool mouseZoomUseMouse = true; // true by default
2023-04-16 15:48:38 +02:00
bool useNearestNeighbor = false;
Vector2D primarySurfaceUVTopLeft = Vector2D(-1, -1);
Vector2D primarySurfaceUVBottomRight = Vector2D(-1, -1);
wlr_box clipBox = {};
2023-03-18 00:16:13 +01:00
uint32_t discardMode = DISCARD_OPAQUE;
float discardOpacity = 0.f;
2022-04-04 19:44:25 +02:00
};
2022-11-26 18:56:43 +01:00
class CGradientValueData;
2022-04-04 19:44:25 +02:00
class CHyprOpenGLImpl {
public:
2022-04-04 19:44:25 +02:00
CHyprOpenGLImpl();
void begin(CMonitor*, CRegion*, bool fake = false);
void end();
void bindWlrOutputFb();
2022-04-04 19:44:25 +02:00
void renderRect(wlr_box*, const CColor&, int round = 0);
void renderRectWithBlur(wlr_box*, const CColor&, int round = 0, float blurA = 1.f);
void renderRectWithDamage(wlr_box*, const CColor&, CRegion* damage, int round = 0);
void renderTexture(wlr_texture*, wlr_box*, float a, int round = 0, bool allowCustomUV = false);
void renderTexture(const CTexture&, wlr_box*, float a, int round = 0, bool discardActive = false, bool allowCustomUV = false);
void renderTextureWithBlur(const CTexture&, wlr_box*, float a, wlr_surface* pSurface, int round = 0, bool blockBlurOptimization = false, float blurA = 1.f);
void renderRoundedShadow(wlr_box*, int round, int range, float a = 1.0);
void renderBorder(wlr_box*, const CGradientValueData&, int round, int borderSize, float a = 1.0, int outerRound = -1 /* use round */);
2022-04-04 21:45:35 +02:00
void saveMatrix();
void setMatrixScaleTranslate(const Vector2D& translate, const float& scale);
void restoreMatrix();
void blend(bool enabled);
void makeWindowSnapshot(CWindow*);
void makeRawWindowSnapshot(CWindow*, CFramebuffer*);
void makeLayerSnapshot(SLayerSurface*);
void renderSnapshot(CWindow**);
void renderSnapshot(SLayerSurface**);
2022-04-05 20:49:15 +02:00
void clear(const CColor&);
void clearWithTex();
void scissor(const wlr_box*, 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);
2022-04-04 19:44:25 +02:00
void destroyMonitorResources(CMonitor*);
2022-04-19 19:01:23 +02:00
void markBlurDirtyForMonitor(CMonitor*);
void preWindowPass();
bool preBlurQueued();
void preRender(CMonitor*);
2022-08-01 12:23:09 +02:00
void saveBufferForMirror();
void renderMirrored();
2022-09-13 15:25:42 +02:00
void applyScreenShader(const std::string& path);
2022-12-01 14:36:07 +01:00
SCurrentRenderData m_RenderData;
2022-04-04 19:44:25 +02:00
GLint m_iCurrentOutputFb = 0;
GLint m_iWLROutputFb = 0;
2022-04-05 20:49:15 +02:00
bool m_bReloadScreenShader = true; // at launch it can be set
2022-12-01 14:36:07 +01:00
CWindow* m_pCurrentWindow = nullptr; // hack to get the current rendered window
SLayerSurface* m_pCurrentLayer = nullptr; // hack to get the current rendered layer
2022-05-17 13:16:37 +02:00
std::unordered_map<CWindow*, CFramebuffer> m_mWindowFramebuffers;
std::unordered_map<SLayerSurface*, CFramebuffer> m_mLayerFramebuffers;
2022-07-27 12:32:00 +02:00
std::unordered_map<CMonitor*, SMonitorRenderData> m_mMonitorRenderResources;
std::unordered_map<CMonitor*, CTexture> m_mMonitorBGTextures;
2022-04-05 20:49:15 +02:00
private:
std::list<GLuint> m_lBuffers;
std::list<GLuint> m_lTextures;
2022-04-04 19:44:25 +02:00
int m_iDRMFD;
std::string m_szExtensions;
2022-04-04 19:44:25 +02:00
bool m_bFakeFrame = false;
bool m_bEndFrame = false;
bool m_bApplyFinalShader = false;
bool m_bBlend = false;
2022-12-01 14:36:07 +01:00
CShader m_sFinalScreenShader;
CTimer m_tGlobalTimer;
GLuint createProgram(const std::string&, const std::string&, bool dynamic = false);
GLuint compileShader(const GLuint&, std::string, bool dynamic = false);
void createBGTextureForMonitor(CMonitor*);
void initShaders();
2022-04-14 16:43:29 +02:00
// returns the out FB, can be either Mirror or MirrorSwap
CFramebuffer* blurMainFramebufferWithDamage(float a, CRegion* damage);
2023-07-19 20:09:49 +02:00
void renderTextureInternalWithDamage(const CTexture&, wlr_box* pBox, float a, CRegion* damage, int round = 0, bool discardOpaque = false, bool noAA = false,
bool allowCustomUV = false, bool allowDim = false);
void renderTexturePrimitive(const CTexture& tex, wlr_box* pBox);
void renderSplash(cairo_t* const, cairo_surface_t* const, double);
void preBlurForCurrentMonitor();
2023-08-09 22:03:24 +02:00
bool shouldUseNewBlurOptimizations(SLayerSurface* pLayer, CWindow* pWindow);
friend class CHyprRenderer;
2022-04-04 19:44:25 +02:00
};
inline std::unique_ptr<CHyprOpenGLImpl> g_pHyprOpenGL;