2023-11-24 10:54:21 +00:00
|
|
|
#include "Renderbuffer.hpp"
|
2025-01-17 15:21:35 +00:00
|
|
|
#include "Renderer.hpp"
|
2023-11-24 10:54:21 +00:00
|
|
|
#include "OpenGL.hpp"
|
|
|
|
|
#include "../Compositor.hpp"
|
2024-06-08 10:07:59 +02:00
|
|
|
#include "../protocols/types/Buffer.hpp"
|
2024-07-21 13:09:54 +02:00
|
|
|
#include <hyprutils/signal/Listener.hpp>
|
|
|
|
|
#include <hyprutils/signal/Signal.hpp>
|
2023-11-24 10:54:21 +00:00
|
|
|
|
|
|
|
|
#include <dlfcn.h>
|
|
|
|
|
|
|
|
|
|
CRenderbuffer::~CRenderbuffer() {
|
2025-04-22 15:23:29 +02:00
|
|
|
if (!g_pCompositor || g_pCompositor->m_isShuttingDown || !g_pHyprRenderer)
|
2023-12-06 14:46:18 +00:00
|
|
|
return;
|
|
|
|
|
|
2024-05-05 22:18:10 +01:00
|
|
|
g_pHyprRenderer->makeEGLCurrent();
|
2023-11-24 10:54:21 +00:00
|
|
|
|
2024-05-05 22:18:10 +01:00
|
|
|
unbind();
|
2025-05-05 23:44:49 +02:00
|
|
|
m_framebuffer.release();
|
|
|
|
|
glDeleteRenderbuffers(1, &m_rbo);
|
2023-11-24 10:54:21 +00:00
|
|
|
|
2025-05-05 23:44:49 +02:00
|
|
|
g_pHyprOpenGL->m_proc.eglDestroyImageKHR(g_pHyprOpenGL->m_eglDisplay, m_image);
|
2023-11-24 10:54:21 +00:00
|
|
|
}
|
|
|
|
|
|
2025-05-05 23:44:49 +02:00
|
|
|
CRenderbuffer::CRenderbuffer(SP<Aquamarine::IBuffer> buffer, uint32_t format) : m_hlBuffer(buffer), m_drmFormat(format) {
|
2024-07-21 13:09:54 +02:00
|
|
|
auto dma = buffer->dmabuf();
|
2023-11-24 10:54:21 +00:00
|
|
|
|
2025-05-05 23:44:49 +02:00
|
|
|
m_image = g_pHyprOpenGL->createEGLImage(dma);
|
|
|
|
|
if (m_image == EGL_NO_IMAGE_KHR) {
|
2024-07-21 13:09:54 +02:00
|
|
|
Debug::log(ERR, "rb: createEGLImage failed");
|
|
|
|
|
return;
|
2023-11-24 10:54:21 +00:00
|
|
|
}
|
|
|
|
|
|
2025-05-05 23:44:49 +02:00
|
|
|
glGenRenderbuffers(1, &m_rbo);
|
|
|
|
|
glBindRenderbuffer(GL_RENDERBUFFER, m_rbo);
|
|
|
|
|
g_pHyprOpenGL->m_proc.glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, (GLeglImageOES)m_image);
|
2023-11-24 10:54:21 +00:00
|
|
|
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
|
|
|
|
|
2025-05-05 23:44:49 +02:00
|
|
|
glGenFramebuffers(1, &m_framebuffer.m_fb);
|
|
|
|
|
m_framebuffer.m_fbAllocated = true;
|
|
|
|
|
m_framebuffer.m_size = buffer->size;
|
|
|
|
|
m_framebuffer.bind();
|
|
|
|
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_rbo);
|
2023-11-24 10:54:21 +00:00
|
|
|
|
2024-07-21 13:09:54 +02:00
|
|
|
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
|
|
|
|
Debug::log(ERR, "rbo: glCheckFramebufferStatus failed");
|
|
|
|
|
return;
|
|
|
|
|
}
|
2023-11-24 10:54:21 +00:00
|
|
|
|
2025-05-05 23:44:49 +02:00
|
|
|
m_framebuffer.unbind();
|
2023-11-24 10:54:21 +00:00
|
|
|
|
2025-07-08 09:56:40 -07:00
|
|
|
m_listeners.destroyBuffer = buffer->events.destroy.listen([this] { g_pHyprRenderer->onRenderbufferDestroy(this); });
|
2024-06-08 10:07:59 +02:00
|
|
|
|
2025-05-05 23:44:49 +02:00
|
|
|
m_good = true;
|
2024-07-21 13:09:54 +02:00
|
|
|
}
|
2024-06-08 10:07:59 +02:00
|
|
|
|
2024-07-21 13:09:54 +02:00
|
|
|
bool CRenderbuffer::good() {
|
2025-05-05 23:44:49 +02:00
|
|
|
return m_good;
|
2024-06-08 10:07:59 +02:00
|
|
|
}
|
|
|
|
|
|
2023-11-24 10:54:21 +00:00
|
|
|
void CRenderbuffer::bind() {
|
2025-05-05 23:44:49 +02:00
|
|
|
glBindRenderbuffer(GL_RENDERBUFFER, m_rbo);
|
2023-11-24 10:54:21 +00:00
|
|
|
bindFB();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CRenderbuffer::bindFB() {
|
2025-05-05 23:44:49 +02:00
|
|
|
m_framebuffer.bind();
|
2023-11-24 10:54:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CRenderbuffer::unbind() {
|
|
|
|
|
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
2025-05-05 23:44:49 +02:00
|
|
|
m_framebuffer.unbind();
|
2023-11-24 10:54:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CFramebuffer* CRenderbuffer::getFB() {
|
2025-05-05 23:44:49 +02:00
|
|
|
return &m_framebuffer;
|
2025-01-17 15:21:35 +00:00
|
|
|
}
|