Program Listing for File renderbuffer.cpp¶
↰ Return to documentation for file (/home/runner/work/Legion-Engine/Legion-Engine/legion/engine/rendering/data/renderbuffer.cpp
)
#include <rendering/data/renderbuffer.hpp>
namespace legion::rendering
{
renderbuffer::renderbuffer(GLenum internalformat, math::ivec2 resolution, uint samples)
: m_id([](app::gl_id& value) { // Assign logic for renderbuffer deletion to managed resource.
#if defined(LEGION_DEBUG)
if (!app::ContextHelper::getCurrentContext())
{
if (app::ContextHelper::initialized())
log::error("No current context to delete renderbuffer with.");
return;
}
#endif
if (value)
glDeleteRenderbuffers(1, &value);
}, invalid_id),
m_samples(samples),
m_internalformat(internalformat)
{
#if defined(LEGION_DEBUG)
if (!app::ContextHelper::getCurrentContext())
{
log::error("No current context to create renderbuffer with.");
return;
}
#endif
glGenRenderbuffers(1, &m_id); // Generate framebuffer
glBindRenderbuffer(GL_RENDERBUFFER, m_id);
if (samples > 0)
glNamedRenderbufferStorageMultisample(m_id, samples, internalformat, resolution.x, resolution.y); // Allocate multi-sampling capable VRAM storage
else
glNamedRenderbufferStorage(m_id, internalformat, resolution.x, resolution.y); // Allocate VRAM
glBindRenderbuffer(GL_RENDERBUFFER, 0);
}
renderbuffer::renderbuffer(GLenum internalformat, int width, int height, uint samples)
: m_id([](app::gl_id& value) { // Assign logic for renderbuffer deletion to managed resource.
#if defined(LEGION_DEBUG)
if (!app::ContextHelper::getCurrentContext())
{
if (app::ContextHelper::initialized())
log::error("No current context to delete renderbuffer with.");
return;
}
#endif
if (value)
glDeleteRenderbuffers(1, &value);
}, invalid_id),
m_samples(samples),
m_internalformat(internalformat)
{
#if defined(LEGION_DEBUG)
if (!app::ContextHelper::getCurrentContext())
{
log::error("No current context to create renderbuffer with.");
return;
}
#endif
glGenRenderbuffers(1, &m_id); // Generate framebuffer
glBindRenderbuffer(GL_RENDERBUFFER, m_id);
if (samples > 0)
glNamedRenderbufferStorageMultisample(m_id, samples, internalformat, width, height); // Allocate multi-sampling capable VRAM storage
else
glNamedRenderbufferStorage(m_id, internalformat, width, height); // Allocate VRAM
glBindRenderbuffer(GL_RENDERBUFFER, 0);
}
renderbuffer::renderbuffer(GLenum internalformat, uint samples)
: m_id([](app::gl_id& value) { // Assign logic for renderbuffer deletion to managed resource.
#if defined(LEGION_DEBUG)
if (!app::ContextHelper::getCurrentContext())
{
if (app::ContextHelper::initialized())
log::error("No current context to delete renderbuffer with.");
return;
}
#endif
if (value)
glDeleteRenderbuffers(1, &value);
}, invalid_id),
m_samples(samples),
m_internalformat(internalformat)
{
#if defined(LEGION_DEBUG)
if (!app::ContextHelper::getCurrentContext())
{
log::error("No current context to create renderbuffer with.");
return;
}
#endif
glGenRenderbuffers(1, &m_id); // Generate framebuffer
}
void renderbuffer::bind() const
{
#if defined(LEGION_DEBUG)
if (!app::ContextHelper::getCurrentContext())
{
log::error("No current context to work with.");
return;
}
#endif
glBindRenderbuffer(GL_RENDERBUFFER, m_id);
}
void renderbuffer::release()
{
#if defined(LEGION_DEBUG)
if (!app::ContextHelper::getCurrentContext())
{
log::error("No current context to work with.");
return;
}
#endif
glBindRenderbuffer(GL_RENDERBUFFER, 0);
}
L_NODISCARD app::gl_id renderbuffer::id() const
{
return m_id;
}
L_NODISCARD size_type renderbuffer::samples() const
{
return m_samples;
}
L_NODISCARD GLenum renderbuffer::format() const
{
return m_internalformat;
}
L_NODISCARD math::ivec2 renderbuffer::size() const
{
#if defined(LEGION_DEBUG)
if (!app::ContextHelper::getCurrentContext())
{
log::error("No current context to read from.");
return math::ivec2(0, 0);
}
#endif
math::ivec2 size;
glBindRenderbuffer(GL_RENDERBUFFER, m_id);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &size.x); // Fetch width.
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &size.y); // Fetch height.
glBindRenderbuffer(GL_RENDERBUFFER, 0);
return size;
}
void renderbuffer::resize(math::ivec2 newSize) const
{
#if defined(LEGION_DEBUG)
if (!app::ContextHelper::getCurrentContext())
{
log::error("No current context to work with.");
return;
}
#endif
glBindRenderbuffer(GL_RENDERBUFFER, m_id);
if (m_samples > 0)
glNamedRenderbufferStorageMultisample(m_id, m_samples, m_internalformat, newSize.x, newSize.y); // Allocate multi-sampling capable VRAM storage
else
glNamedRenderbufferStorage(m_id, m_internalformat, newSize.x, newSize.y); // Allocate VRAM
glBindRenderbuffer(GL_RENDERBUFFER, 0);
}
}