2022-04-04 19:44:25 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "../defines.hpp"
|
|
|
|
#include "../helpers/Monitor.hpp"
|
|
|
|
#include "../helpers/Color.hpp"
|
|
|
|
#include <wlr/render/egl.h>
|
|
|
|
#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
|
|
|
|
};
|
|
|
|
|
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-04-04 19:44:25 +02:00
|
|
|
};
|
|
|
|
|
2022-04-11 16:39:48 +02:00
|
|
|
struct SMonitorRenderData {
|
|
|
|
CFramebuffer primaryFB;
|
|
|
|
CFramebuffer mirrorFB;
|
|
|
|
|
|
|
|
CTexture stencilTex;
|
|
|
|
};
|
|
|
|
|
2022-04-04 19:44:25 +02:00
|
|
|
class CHyprOpenGLImpl {
|
|
|
|
public:
|
|
|
|
|
|
|
|
CHyprOpenGLImpl();
|
|
|
|
|
2022-04-14 16:43:29 +02:00
|
|
|
void begin(SMonitor*, pixman_region32_t*);
|
2022-04-04 19:44:25 +02:00
|
|
|
void end();
|
|
|
|
|
2022-04-04 21:45:35 +02:00
|
|
|
void renderRect(wlr_box*, const CColor&);
|
2022-04-14 16:43:29 +02:00
|
|
|
void renderTexture(wlr_texture*, wlr_box*, float a, int round = 0);
|
|
|
|
void renderTexture(const CTexture&, wlr_box*, float a, int round = 0);
|
|
|
|
void renderTextureWithBlur(const CTexture&, wlr_box*, float a, int round = 0);
|
2022-04-05 16:47:03 +02:00
|
|
|
void renderBorder(wlr_box*, const CColor&, int thick = 1, int round = 0);
|
2022-04-04 21:45:35 +02:00
|
|
|
|
2022-04-05 20:49:15 +02:00
|
|
|
void makeWindowSnapshot(CWindow*);
|
|
|
|
void renderSnapshot(CWindow**);
|
|
|
|
|
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*);
|
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
|
|
|
|
|
|
|
std::unordered_map<CWindow*, CFramebuffer> m_mWindowFramebuffers;
|
2022-04-11 16:39:48 +02:00
|
|
|
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;
|
|
|
|
|
|
|
|
// 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-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
|
|
|
|
|
|
|
void renderTextureInternal(const CTexture&, wlr_box* pBox, float a, int round = 0);
|
2022-04-14 17:00:35 +02:00
|
|
|
void renderTextureWithBlurInternal(const CTexture&, wlr_box*, float a, int round = 0);
|
2022-04-14 16:43:29 +02:00
|
|
|
|
2022-04-04 19:44:25 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
inline std::unique_ptr<CHyprOpenGLImpl> g_pHyprOpenGL;
|