]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/opengl/framebuffer_backend.cpp
Refactor low-level state management
[libs/gl.git] / source / backends / opengl / framebuffer_backend.cpp
index 1adcb7f93515c2eef68b4419957704fb81640520..18566ac3c2553fd82ea1dd71ab735dc0f3cd3168 100644 (file)
@@ -19,7 +19,6 @@ namespace Msp {
 namespace GL {
 
 OpenGLFramebuffer::OpenGLFramebuffer(bool is_system):
-       id(0),
        status(is_system ? GL_FRAMEBUFFER_COMPLETE : GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
 {
        if(!is_system)
@@ -33,43 +32,22 @@ OpenGLFramebuffer::OpenGLFramebuffer(bool 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)
@@ -96,18 +74,26 @@ void OpenGLFramebuffer::require_layered()
        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)