From a49bbf450881581e27696405ebaefef63f7bde7a Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Tue, 5 Apr 2022 20:49:15 +0200 Subject: =?UTF-8?q?fadeout=20done=20=F0=9F=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/render/Framebuffer.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/render/Framebuffer.cpp (limited to 'src/render/Framebuffer.cpp') diff --git a/src/render/Framebuffer.cpp b/src/render/Framebuffer.cpp new file mode 100644 index 00000000..8ab03776 --- /dev/null +++ b/src/render/Framebuffer.cpp @@ -0,0 +1,62 @@ +#include "Framebuffer.hpp" +#include "OpenGL.hpp" + +bool CFramebuffer::alloc(int w, int h) { + bool firstAlloc = false; + if (m_iFb == (uint32_t)-1) + { + firstAlloc = true; + glGenFramebuffers(1, &m_iFb); + } + + if (m_cTex.m_iTexID == 0) + { + firstAlloc = true; + glGenTextures(1, &m_cTex.m_iTexID); + glBindTexture(GL_TEXTURE_2D, m_cTex.m_iTexID); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + + if (firstAlloc) + { + glBindTexture(GL_TEXTURE_2D, m_cTex.m_iTexID); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + + glBindFramebuffer(GL_FRAMEBUFFER, m_iFb); + glBindTexture(GL_TEXTURE_2D, m_cTex.m_iTexID); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_cTex.m_iTexID, 0); + + auto status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + RASSERT((status == GL_FRAMEBUFFER_COMPLETE), "Framebuffer incomplete, couldn't create! (FB status: %i)", status); + + Debug::log(LOG, "Framebuffer created, status %i", status); + } + + glBindTexture(GL_TEXTURE_2D, 0); + glBindFramebuffer(GL_FRAMEBUFFER, g_pHyprOpenGL->m_iCurrentOutputFb); + + m_Size = Vector2D(w, h); + + return true; +} + +void CFramebuffer::bind() { + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_iFb); + glViewport(0, 0, g_pHyprOpenGL->m_RenderData.pMonitor->vecSize.x, g_pHyprOpenGL->m_RenderData.pMonitor->vecSize.y); +} + +void CFramebuffer::release() { + if (m_iFb != (uint32_t)-1 && m_iFb) { + glDeleteFramebuffers(1, &m_iFb); + } + + if (m_cTex.m_iTexID) { + glDeleteTextures(1, &m_cTex.m_iTexID); + } + + m_cTex.m_iTexID = 0; + m_iFb = -1; +} -- cgit v1.2.3