Hyprland/src/render/OpenGL.hpp

124 lines
4.1 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 <list>
2022-04-05 20:49:15 +02:00
#include <unordered_map>
2022-04-04 19:44:25 +02:00
#include "Shaders.hpp"
#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-04-04 21:45:35 +02:00
inline const float matrixFlip180[] = {
1.0f, 0.0f, 0.0f,
0.0f, -1.0f, 0.0f,
0.0f, 0.0f, 1.0f,
};
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
2022-04-04 19:44:25 +02:00
struct SCurrentRenderData {
SMonitor* pMonitor = nullptr;
float projection[9];
2022-04-14 16:43:29 +02:00
pixman_region32_t* pDamage = nullptr;
2022-06-22 15:45:56 +02:00
bool renderingPrimarySurface = false;
Vector2D primarySurfaceUVTopLeft = Vector2D(-1, -1);
Vector2D primarySurfaceUVBottomRight = Vector2D(-1, -1);
2022-04-04 19:44:25 +02:00
};
struct SMonitorRenderData {
CFramebuffer primaryFB;
CFramebuffer mirrorFB;
CFramebuffer mirrorSwapFB;
CTexture stencilTex;
};
2022-04-04 19:44:25 +02:00
class CHyprOpenGLImpl {
public:
CHyprOpenGLImpl();
void begin(SMonitor*, 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);
void renderRectWithDamage(wlr_box*, const CColor&, pixman_region32_t* damage, int round = 0);
2022-04-14 16:43:29 +02:00
void renderTexture(wlr_texture*, wlr_box*, float a, int round = 0);
2022-06-22 15:45:56 +02:00
void renderTexture(const CTexture&, wlr_box*, float a, int round = 0, bool discardOpaque = false, bool border = false, bool allowPrimary = false);
2022-05-17 13:16:37 +02:00
void renderTextureWithBlur(const CTexture&, wlr_box*, float a, wlr_surface* pSurface, int round = 0, bool border = false);
2022-06-25 20:31:54 +02:00
void renderRoundedShadow(wlr_box*, int round, int range, float a = 1.0);
2022-04-04 21:45:35 +02:00
2022-04-05 20:49:15 +02:00
void makeWindowSnapshot(CWindow*);
void makeLayerSnapshot(SLayerSurface*);
2022-04-05 20:49:15 +02:00
void renderSnapshot(CWindow**);
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-04-04 19:44:25 +02:00
void scissor(const wlr_box*);
2022-04-14 16:43:29 +02:00
void scissor(const pixman_box32*);
void scissor(const int x, const int y, const int w, const int h);
2022-04-04 19:44:25 +02:00
2022-04-19 19:01:23 +02:00
void destroyMonitorResources(SMonitor*);
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
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;
std::unordered_map<SLayerSurface*, CFramebuffer> m_mLayerFramebuffers;
std::unordered_map<SMonitor*, SMonitorRenderData> m_mMonitorRenderResources;
2022-04-10 14:32:18 +02:00
std::unordered_map<SMonitor*, 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;
bool m_bFakeFrame = false;
bool m_bEndFrame = false;
2022-04-04 19:44:25 +02:00
// Shaders
2022-04-04 21:45:35 +02:00
SQuad m_shQUAD;
2022-04-04 19:44:25 +02:00
CShader m_shRGBA;
CShader m_shRGBX;
CShader m_shEXT;
2022-04-09 16:51:08 +02:00
CShader m_shBLUR1;
CShader m_shBLUR2;
2022-06-25 20:28:40 +02:00
CShader m_shSHADOW;
2022-04-04 19:44:25 +02:00
//
GLuint createProgram(const std::string&, const std::string&);
GLuint compileShader(const GLuint&, std::string);
2022-04-10 14:32:18 +02:00
void createBGTextureForMonitor(SMonitor*);
2022-04-14 16:43:29 +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-06-22 15:45:56 +02:00
void renderTextureInternalWithDamage(const CTexture&, wlr_box* pBox, float a, pixman_region32_t* damage, int round = 0, bool discardOpaque = false, bool border = false, bool noAA = false, bool allowPrimary = false);
2022-05-17 13:16:37 +02:00
void renderBorder(wlr_box*, const CColor&, int thick = 1, int round = 0);
2022-04-04 19:44:25 +02:00
};
inline std::unique_ptr<CHyprOpenGLImpl> g_pHyprOpenGL;