2022-04-04 19:44:25 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "../defines.hpp"
|
|
|
|
#include "../helpers/Monitor.hpp"
|
|
|
|
#include "../helpers/Color.hpp"
|
|
|
|
#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
|
|
|
|
2022-11-06 18:58:56 +01:00
|
|
|
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
|
|
|
|
};
|
2022-05-02 16:54:40 +02:00
|
|
|
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
|
|
|
|
2022-06-29 12:54:53 +02:00
|
|
|
struct SMonitorRenderData {
|
|
|
|
CFramebuffer primaryFB;
|
2022-09-13 15:25:42 +02:00
|
|
|
CFramebuffer mirrorFB; // these are used for some effects,
|
|
|
|
CFramebuffer mirrorSwapFB; // etc
|
|
|
|
|
|
|
|
CFramebuffer monitorMirrorFB; // used for mirroring outputs
|
2022-06-29 12:54:53 +02:00
|
|
|
|
|
|
|
CTexture stencilTex;
|
2022-07-31 23:44:04 +02:00
|
|
|
|
2022-08-01 12:16:33 +02:00
|
|
|
CFramebuffer blurFB;
|
|
|
|
bool blurFBDirty = true;
|
|
|
|
|
2022-07-31 23:44:04 +02:00
|
|
|
wlr_box backgroundTexBox;
|
2022-08-11 20:29:21 +02:00
|
|
|
|
|
|
|
// Shaders
|
|
|
|
bool m_bShadersInitialized = false;
|
|
|
|
CShader m_shQUAD;
|
|
|
|
CShader m_shRGBA;
|
|
|
|
CShader m_shRGBX;
|
|
|
|
CShader m_shEXT;
|
|
|
|
CShader m_shBLUR1;
|
|
|
|
CShader m_shBLUR2;
|
|
|
|
CShader m_shSHADOW;
|
|
|
|
CShader m_shBORDER1;
|
|
|
|
//
|
2022-06-29 12:54:53 +02:00
|
|
|
};
|
|
|
|
|
2022-04-04 19:44:25 +02:00
|
|
|
struct SCurrentRenderData {
|
2022-07-27 12:32:00 +02:00
|
|
|
CMonitor* pMonitor = nullptr;
|
2022-04-04 19:44:25 +02:00
|
|
|
float projection[9];
|
2022-04-14 16:43:29 +02:00
|
|
|
|
2022-06-29 12:54:53 +02:00
|
|
|
SMonitorRenderData* pCurrentMonData = nullptr;
|
|
|
|
|
2022-04-14 16:43:29 +02:00
|
|
|
pixman_region32_t* pDamage = nullptr;
|
2022-06-22 15:45:56 +02:00
|
|
|
|
|
|
|
Vector2D primarySurfaceUVTopLeft = Vector2D(-1, -1);
|
|
|
|
Vector2D primarySurfaceUVBottomRight = Vector2D(-1, -1);
|
2022-10-07 11:35:17 +02:00
|
|
|
|
|
|
|
wlr_box clipBox = {};
|
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:
|
|
|
|
|
|
|
|
CHyprOpenGLImpl();
|
|
|
|
|
2022-07-27 12:32:00 +02:00
|
|
|
void begin(CMonitor*, pixman_region32_t*, bool fake = false);
|
2022-04-04 19:44:25 +02:00
|
|
|
void end();
|
|
|
|
|
2022-05-17 13:16:37 +02:00
|
|
|
void renderRect(wlr_box*, const CColor&, int round = 0);
|
2022-06-21 23:09:20 +02:00
|
|
|
void renderRectWithDamage(wlr_box*, const CColor&, pixman_region32_t* damage, int round = 0);
|
2022-07-04 15:58:12 +02:00
|
|
|
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 discardOpaque = false, bool allowCustomUV = false);
|
2022-06-26 19:39:56 +02:00
|
|
|
void renderTextureWithBlur(const CTexture&, wlr_box*, float a, wlr_surface* pSurface, int round = 0);
|
2022-06-25 20:31:54 +02:00
|
|
|
void renderRoundedShadow(wlr_box*, int round, int range, float a = 1.0);
|
2022-11-26 18:56:43 +01:00
|
|
|
void renderBorder(wlr_box*, const CGradientValueData&, int round, float a = 1.0);
|
2022-04-04 21:45:35 +02:00
|
|
|
|
2022-04-05 20:49:15 +02:00
|
|
|
void makeWindowSnapshot(CWindow*);
|
2022-11-06 18:52:09 +01:00
|
|
|
void makeRawWindowSnapshot(CWindow*, CFramebuffer*);
|
2022-05-14 17:23:46 +02:00
|
|
|
void makeLayerSnapshot(SLayerSurface*);
|
2022-04-05 20:49:15 +02:00
|
|
|
void renderSnapshot(CWindow**);
|
2022-05-14 17:23:46 +02:00
|
|
|
void renderSnapshot(SLayerSurface**);
|
2022-04-05 20:49:15 +02:00
|
|
|
|
2022-04-04 19:44:25 +02:00
|
|
|
void clear(const CColor&);
|
2022-04-10 14:32:18 +02:00
|
|
|
void clearWithTex();
|
2022-09-04 19:27:38 +02:00
|
|
|
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
|
|
|
|
2022-07-27 12:32:00 +02:00
|
|
|
void destroyMonitorResources(CMonitor*);
|
2022-04-19 19:01:23 +02:00
|
|
|
|
2022-08-01 12:16:33 +02:00
|
|
|
void markBlurDirtyForMonitor(CMonitor*);
|
|
|
|
|
2022-08-01 12:23:09 +02:00
|
|
|
void preWindowPass();
|
2022-08-01 20:18:26 +02:00
|
|
|
void preRender(CMonitor*);
|
2022-08-01 12:23:09 +02:00
|
|
|
|
2022-09-13 15:25:42 +02:00
|
|
|
void saveBufferForMirror();
|
|
|
|
void renderMirrored();
|
|
|
|
|
2022-11-06 18:52:09 +01:00
|
|
|
void onWindowResizeStart(CWindow*);
|
|
|
|
void onWindowResizeEnd(CWindow*);
|
|
|
|
|
2022-04-04 19:44:25 +02:00
|
|
|
SCurrentRenderData m_RenderData;
|
|
|
|
|
2022-04-05 20:49:15 +02:00
|
|
|
GLint m_iCurrentOutputFb = 0;
|
2022-04-09 15:01:28 +02:00
|
|
|
GLint m_iWLROutputFb = 0;
|
2022-04-05 20:49:15 +02:00
|
|
|
|
2022-05-17 13:16:37 +02:00
|
|
|
CWindow* m_pCurrentWindow = nullptr; // hack to get the current rendered window
|
|
|
|
|
2022-05-06 16:06:21 +02:00
|
|
|
pixman_region32_t m_rOriginalDamageRegion; // used for storing the pre-expanded region
|
|
|
|
|
2022-04-05 20:49:15 +02:00
|
|
|
std::unordered_map<CWindow*, CFramebuffer> m_mWindowFramebuffers;
|
2022-05-14 17:23:46 +02:00
|
|
|
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
|
|
|
|
2022-04-04 19:44:25 +02:00
|
|
|
private:
|
|
|
|
std::list<GLuint> m_lBuffers;
|
|
|
|
std::list<GLuint> m_lTextures;
|
|
|
|
|
|
|
|
int m_iDRMFD;
|
|
|
|
std::string m_szExtensions;
|
|
|
|
|
2022-05-18 20:33:54 +02:00
|
|
|
bool m_bFakeFrame = false;
|
2022-05-29 12:27:45 +02:00
|
|
|
bool m_bEndFrame = false;
|
2022-05-18 20:33:54 +02:00
|
|
|
|
2022-04-04 19:44:25 +02:00
|
|
|
GLuint createProgram(const std::string&, const std::string&);
|
|
|
|
GLuint compileShader(const GLuint&, std::string);
|
2022-07-27 12:32:00 +02:00
|
|
|
void createBGTextureForMonitor(CMonitor*);
|
2022-08-11 20:29:21 +02:00
|
|
|
void initShaders();
|
2022-04-14 16:43:29 +02:00
|
|
|
|
2022-05-02 16:54:40 +02:00
|
|
|
// returns the out FB, can be either Mirror or MirrorSwap
|
2022-05-09 21:37:41 +02:00
|
|
|
CFramebuffer* blurMainFramebufferWithDamage(float a, wlr_box* pBox, pixman_region32_t* damage);
|
2022-05-02 16:54:40 +02:00
|
|
|
|
2022-08-30 12:46:17 +02:00
|
|
|
void renderTextureInternalWithDamage(const CTexture&, wlr_box* pBox, float a, pixman_region32_t* damage, int round = 0, bool discardOpaque = false, bool noAA = false, bool allowCustomUV = false, bool allowDim = false);
|
2022-09-29 04:01:26 +02:00
|
|
|
void renderSplash(cairo_t *const, cairo_surface_t *const, double);
|
2022-08-01 12:16:33 +02:00
|
|
|
|
|
|
|
void preBlurForCurrentMonitor();
|
2022-11-06 18:58:56 +01:00
|
|
|
|
|
|
|
friend class CHyprRenderer;
|
2022-04-04 19:44:25 +02:00
|
|
|
};
|
|
|
|
|
2022-09-29 04:01:26 +02:00
|
|
|
inline std::unique_ptr<CHyprOpenGLImpl> g_pHyprOpenGL;
|