namespace GL {
OpenGLFramebuffer::OpenGLFramebuffer(bool is_system):
- id(0),
status(is_system ? GL_FRAMEBUFFER_COMPLETE : GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
{
if(!is_system)
}
}
-OpenGLFramebuffer::~OpenGLFramebuffer()
+OpenGLFramebuffer::OpenGLFramebuffer(OpenGLFramebuffer &&other):
+ id(other.id),
+ status(other.status)
{
- if(id)
- glDeleteFramebuffers(1, &id);
+ other.id = 0;
}
-FrameFormat OpenGLFramebuffer::get_system_format()
+OpenGLFramebuffer::~OpenGLFramebuffer()
{
- FrameFormat format;
-
- if(EXT_framebuffer_object)
- {
- int value;
- glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_BACK, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &value);
- if(value==GL_NONE)
- glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_FRONT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &value);
- if(value!=GL_NONE)
- format = (format,COLOR_ATTACHMENT);
-
- glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &value);
- if(value!=GL_NONE)
- format = (format,DEPTH_ATTACHMENT);
-
- glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_STENCIL, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &value);
- if(value!=GL_NONE)
- format = (format,STENCIL_ATTACHMENT);
- }
-
- return format;
+ if(id)
+ glDeleteFramebuffers(1, &id);
}
-void OpenGLFramebuffer::get_system_size(unsigned &width, unsigned &height)
+void OpenGLFramebuffer::set_system_format(const FrameFormat &fmt)
{
- int view[4];
- glGetIntegerv(GL_VIEWPORT, view);
- width = view[2];
- height = view[3];
+ static_cast<Framebuffer *>(this)->format = fmt;
}
bool OpenGLFramebuffer::is_format_supported(const FrameFormat &fmt)
static Require _req(ARB_geometry_shader4);
}
+void OpenGLFramebuffer::resize_system(unsigned w, unsigned h)
+{
+ Framebuffer &self = *static_cast<Framebuffer *>(this);
+ self.width = w;
+ self.height = h;
+}
+
void OpenGLFramebuffer::update(unsigned mask) const
{
- const FrameFormat &format = static_cast<const Framebuffer *>(this)->format;
+ const Framebuffer &self = *static_cast<const Framebuffer *>(this);
+
vector<GLenum> color_bufs;
- color_bufs.reserve(format.size());
+ color_bufs.reserve(self.format.size());
unsigned i = 0;
- for(FrameAttachment a: format)
+ for(FrameAttachment a: self.format)
{
GLenum gl_attach_point = get_gl_attachment(a);
if(mask&(1<<i))
{
- const Framebuffer::Attachment &attch = static_cast<const Framebuffer *>(this)->attachments[i];
+ const Framebuffer::Attachment &attch = self.attachments[i];
if(attch.tex)
{
if(ARB_direct_state_access)