summaryrefslogtreecommitdiff
path: root/src/render/gl/GLRenderbuffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/gl/GLRenderbuffer.cpp')
-rw-r--r--src/render/gl/GLRenderbuffer.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/render/gl/GLRenderbuffer.cpp b/src/render/gl/GLRenderbuffer.cpp
new file mode 100644
index 00000000..8299d0e4
--- /dev/null
+++ b/src/render/gl/GLRenderbuffer.cpp
@@ -0,0 +1,71 @@
+#include "GLRenderbuffer.hpp"
+#include "../Renderer.hpp"
+#include "../OpenGL.hpp"
+#include "../../Compositor.hpp"
+#include "../Framebuffer.hpp"
+#include "GLFramebuffer.hpp"
+#include "render/Renderbuffer.hpp"
+#include <hyprutils/memory/SharedPtr.hpp>
+#include <hyprutils/signal/Listener.hpp>
+#include <hyprutils/signal/Signal.hpp>
+
+#include <dlfcn.h>
+
+CGLRenderbuffer::~CGLRenderbuffer() {
+ if (!g_pCompositor || g_pCompositor->m_isShuttingDown || !g_pHyprRenderer)
+ return;
+
+ g_pHyprRenderer->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<Aquamarine::IBuffer> 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<CGLFramebuffer>();
+ 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_pHyprRenderer->makeEGLCurrent();
+ m_framebuffer->bind();
+}
+
+void CGLRenderbuffer::unbind() {
+ GLFB(m_framebuffer)->unbind();
+}