mirror of
https://github.com/vale981/Hyprland
synced 2025-03-05 17:41:39 -05:00
Rendering now to a HyprFramebuffer
This commit is contained in:
parent
eea92231fa
commit
b7094200f6
3 changed files with 25 additions and 1 deletions
|
@ -20,7 +20,7 @@ bool CFramebuffer::alloc(int w, int h) {
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (firstAlloc)
|
if (firstAlloc || m_Size != Vector2D(w, h))
|
||||||
{
|
{
|
||||||
glBindTexture(GL_TEXTURE_2D, m_cTex.m_iTexID);
|
glBindTexture(GL_TEXTURE_2D, m_cTex.m_iTexID);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
||||||
|
|
|
@ -108,10 +108,32 @@ void CHyprOpenGLImpl::begin(SMonitor* pMonitor) {
|
||||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &m_iCurrentOutputFb);
|
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &m_iCurrentOutputFb);
|
||||||
|
m_iWLROutputFb = m_iCurrentOutputFb;
|
||||||
|
|
||||||
|
// ensure a framebuffer for the monitor exists
|
||||||
|
if (m_mMonitorFramebuffers.find(pMonitor) == m_mMonitorFramebuffers.end() || m_mMonitorFramebuffers[pMonitor].m_Size != pMonitor->vecSize)
|
||||||
|
m_mMonitorFramebuffers[pMonitor].alloc(pMonitor->vecSize.x, pMonitor->vecSize.y);
|
||||||
|
|
||||||
|
// bind the Hypr Framebuffer
|
||||||
|
m_mMonitorFramebuffers[pMonitor].bind();
|
||||||
|
clear(CColor(11, 11, 11, 255));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHyprOpenGLImpl::end() {
|
void CHyprOpenGLImpl::end() {
|
||||||
|
// end the render, copy the data to the WLR framebuffer
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, m_iWLROutputFb);
|
||||||
|
const auto TRANSFORM = wlr_output_transform_invert(WL_OUTPUT_TRANSFORM_NORMAL);
|
||||||
|
float matrix[9];
|
||||||
|
wlr_box windowBox = {0, 0, m_RenderData.pMonitor->vecSize.x, m_RenderData.pMonitor->vecSize.y};
|
||||||
|
wlr_matrix_project_box(matrix, &windowBox, TRANSFORM, 0, m_RenderData.pMonitor->output->transform_matrix);
|
||||||
|
|
||||||
|
clear(CColor(11, 11, 11, 255));
|
||||||
|
|
||||||
|
renderTexture(m_mMonitorFramebuffers[m_RenderData.pMonitor].m_cTex, matrix, 255.f, 0);
|
||||||
|
|
||||||
|
// reset our data
|
||||||
m_RenderData.pMonitor = nullptr;
|
m_RenderData.pMonitor = nullptr;
|
||||||
|
m_iWLROutputFb = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHyprOpenGLImpl::clear(const CColor& color) {
|
void CHyprOpenGLImpl::clear(const CColor& color) {
|
||||||
|
|
|
@ -51,8 +51,10 @@ public:
|
||||||
SCurrentRenderData m_RenderData;
|
SCurrentRenderData m_RenderData;
|
||||||
|
|
||||||
GLint m_iCurrentOutputFb = 0;
|
GLint m_iCurrentOutputFb = 0;
|
||||||
|
GLint m_iWLROutputFb = 0;
|
||||||
|
|
||||||
std::unordered_map<CWindow*, CFramebuffer> m_mWindowFramebuffers;
|
std::unordered_map<CWindow*, CFramebuffer> m_mWindowFramebuffers;
|
||||||
|
std::unordered_map<SMonitor*, CFramebuffer> m_mMonitorFramebuffers;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::list<GLuint> m_lBuffers;
|
std::list<GLuint> m_lBuffers;
|
||||||
|
|
Loading…
Add table
Reference in a new issue