summaryrefslogtreecommitdiff
path: root/src/render/Renderbuffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/Renderbuffer.cpp')
-rw-r--r--src/render/Renderbuffer.cpp67
1 files changed, 19 insertions, 48 deletions
diff --git a/src/render/Renderbuffer.cpp b/src/render/Renderbuffer.cpp
index 3f591d13..58ed88d6 100644
--- a/src/render/Renderbuffer.cpp
+++ b/src/render/Renderbuffer.cpp
@@ -2,6 +2,8 @@
#include "OpenGL.hpp"
#include "../Compositor.hpp"
#include "../protocols/types/Buffer.hpp"
+#include <hyprutils/signal/Listener.hpp>
+#include <hyprutils/signal/Signal.hpp>
#include <dlfcn.h>
@@ -15,33 +17,17 @@ CRenderbuffer::~CRenderbuffer() {
m_sFramebuffer.release();
glDeleteRenderbuffers(1, &m_iRBO);
- g_pHyprOpenGL->m_sProc.eglDestroyImageKHR(wlr_egl_get_display(g_pCompositor->m_sWLREGL), m_iImage);
+ g_pHyprOpenGL->m_sProc.eglDestroyImageKHR(g_pHyprOpenGL->m_pEglDisplay, m_iImage);
}
-CRenderbuffer::CRenderbuffer(wlr_buffer* buffer, uint32_t format) : m_pWlrBuffer(buffer), m_uDrmFormat(format) {
-
- // EVIL, but we can't include a hidden header because nixos is fucking special
- static EGLImageKHR (*PWLREGLCREATEIMAGEFROMDMABUF)(wlr_egl*, wlr_dmabuf_attributes*, bool*);
- static bool symbolFound = false;
- if (!symbolFound) {
- PWLREGLCREATEIMAGEFROMDMABUF = reinterpret_cast<EGLImageKHR (*)(wlr_egl*, wlr_dmabuf_attributes*, bool*)>(dlsym(RTLD_DEFAULT, "wlr_egl_create_image_from_dmabuf"));
-
- symbolFound = true;
-
- RASSERT(PWLREGLCREATEIMAGEFROMDMABUF, "wlr_egl_create_image_from_dmabuf was not found in wlroots!");
+CRenderbuffer::CRenderbuffer(SP<Aquamarine::IBuffer> buffer, uint32_t format) : m_pHLBuffer(buffer), m_uDrmFormat(format) {
+ auto dma = buffer->dmabuf();
- Debug::log(LOG, "CRenderbuffer: wlr_egl_create_image_from_dmabuf found at {:x}", (uintptr_t)PWLREGLCREATEIMAGEFROMDMABUF);
+ m_iImage = g_pHyprOpenGL->createEGLImage(dma);
+ if (m_iImage == EGL_NO_IMAGE_KHR) {
+ Debug::log(ERR, "rb: createEGLImage failed");
+ return;
}
- // end evil hack
-
- struct wlr_dmabuf_attributes dmabuf = {0};
- if (!wlr_buffer_get_dmabuf(buffer, &dmabuf))
- throw std::runtime_error("wlr_buffer_get_dmabuf failed");
-
- bool externalOnly;
- m_iImage = PWLREGLCREATEIMAGEFROMDMABUF(g_pCompositor->m_sWLREGL, &dmabuf, &externalOnly);
- if (m_iImage == EGL_NO_IMAGE_KHR)
- throw std::runtime_error("wlr_egl_create_image_from_dmabuf failed");
glGenRenderbuffers(1, &m_iRBO);
glBindRenderbuffer(GL_RENDERBUFFER, m_iRBO);
@@ -49,39 +35,24 @@ CRenderbuffer::CRenderbuffer(wlr_buffer* buffer, uint32_t format) : m_pWlrBuffer
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glGenFramebuffers(1, &m_sFramebuffer.m_iFb);
- m_sFramebuffer.m_vSize = {buffer->width, buffer->height};
+ m_sFramebuffer.m_vSize = buffer->size;
m_sFramebuffer.bind();
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_iRBO);
- if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
- throw std::runtime_error("rbo: glCheckFramebufferStatus failed");
+ if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
+ Debug::log(ERR, "rbo: glCheckFramebufferStatus failed");
+ return;
+ }
glBindFramebuffer(GL_FRAMEBUFFER, 0);
- hyprListener_destroyBuffer.initCallback(&buffer->events.destroy, [this](void* owner, void* data) { g_pHyprRenderer->onRenderbufferDestroy(this); }, this, "CRenderbuffer");
-}
-
-CRenderbuffer::CRenderbuffer(SP<IWLBuffer> buffer, uint32_t format) : m_pHLBuffer(buffer), m_uDrmFormat(format) {
- auto dma = buffer->dmabuf();
-
- m_iImage = g_pHyprOpenGL->createEGLImage(dma);
- if (m_iImage == EGL_NO_IMAGE_KHR)
- throw std::runtime_error("createEGLImage failed");
-
- glGenRenderbuffers(1, &m_iRBO);
- glBindRenderbuffer(GL_RENDERBUFFER, m_iRBO);
- g_pHyprOpenGL->m_sProc.glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, (GLeglImageOES)m_iImage);
- glBindRenderbuffer(GL_RENDERBUFFER, 0);
-
- glGenFramebuffers(1, &m_sFramebuffer.m_iFb);
- m_sFramebuffer.m_vSize = buffer->size;
- m_sFramebuffer.bind();
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_iRBO);
+ listeners.destroyBuffer = buffer->events.destroy.registerListener([this](std::any d) { g_pHyprRenderer->onRenderbufferDestroy(this); });
- if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
- throw std::runtime_error("rbo: glCheckFramebufferStatus failed");
+ m_bGood = true;
+}
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
+bool CRenderbuffer::good() {
+ return m_bGood;
}
void CRenderbuffer::bind() {