#include "GLRenderbuffer.hpp" #include "../Renderer.hpp" #include "../OpenGL.hpp" #include "../../Compositor.hpp" #include "../Framebuffer.hpp" #include "GLFramebuffer.hpp" #include "../Renderbuffer.hpp" #include #include #include #include CGLRenderbuffer::~CGLRenderbuffer() { if (!g_pCompositor || g_pCompositor->m_isShuttingDown || !g_pHyprRenderer) return; g_pHyprOpenGL->makeEGLCurrent(); unbind(); m_framebuffer->release(); if (m_rbo) glDeleteRenderbuffers(1, &m_rbo); if (m_image != EGL_NO_IMAGE_KHR) g_pHyprOpenGL->m_proc.eglDestroyImageKHR(g_pHyprOpenGL->m_eglDisplay, m_image); } CGLRenderbuffer::CGLRenderbuffer(SP buffer, uint32_t format) : IRenderbuffer(buffer, format) { auto dma = buffer->dmabuf(); m_image = g_pHyprOpenGL->createEGLImage(dma); if (m_image == EGL_NO_IMAGE_KHR) { Log::logger->log(Log::ERR, "rb: createEGLImage failed"); return; } glGenRenderbuffers(1, &m_rbo); glBindRenderbuffer(GL_RENDERBUFFER, m_rbo); g_pHyprOpenGL->m_proc.glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, m_image); glBindRenderbuffer(GL_RENDERBUFFER, 0); m_framebuffer = makeShared(); glGenFramebuffers(1, &GLFB(m_framebuffer)->m_fb); GLFB(m_framebuffer)->m_fbAllocated = true; m_framebuffer->m_size = buffer->size; m_framebuffer->m_drmFormat = dma.format; m_framebuffer->bind(); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_rbo); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { Log::logger->log(Log::ERR, "rbo: glCheckFramebufferStatus failed"); return; } GLFB(m_framebuffer)->unbind(); m_listeners.destroyBuffer = buffer->events.destroy.listen([this] { g_pHyprRenderer->onRenderbufferDestroy(this); }); m_good = true; } void CGLRenderbuffer::bind() { g_pHyprOpenGL->makeEGLCurrent(); m_framebuffer->bind(); } void CGLRenderbuffer::unbind() { GLFB(m_framebuffer)->unbind(); }