]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/framebuffer.cpp
Completely hide OpenGL from the public headers
[libs/gl.git] / source / core / framebuffer.cpp
index 1dd2f61f9bab10139772b8619075370df41b2849..53234cc74696478a630acc11b7fcdcfbfe4e11c9 100644 (file)
@@ -1,5 +1,6 @@
 #include <msp/gl/extensions/arb_draw_buffers.h>
 #include <msp/gl/extensions/arb_direct_state_access.h>
+#include <msp/gl/extensions/arb_geometry_shader4.h>
 #include <msp/gl/extensions/arb_internalformat_query.h>
 #include <msp/gl/extensions/arb_internalformat_query2.h>
 #include <msp/gl/extensions/ext_framebuffer_object.h>
@@ -10,7 +11,6 @@
 #include <msp/strings/format.h>
 #include "error.h"
 #include "framebuffer.h"
-#include "misc.h"
 #include "texture2d.h"
 #include "texture2dmultisample.h"
 #include "texture3d.h"
@@ -34,6 +34,24 @@ Framebuffer::Framebuffer(unsigned i):
        if(id)
                throw invalid_argument("System framebuffer must have id 0");
 
+       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);
+       }
+
        int view[4];
        glGetIntegerv(GL_VIEWPORT, view);
        width = view[2];
@@ -80,7 +98,7 @@ Framebuffer::~Framebuffer()
 
 void Framebuffer::set_format(const FrameFormat &fmt)
 {
-       if(!format.empty())
+       if(!format.empty() || !id)
                throw invalid_operation("Framebuffer::set_format");
        if(fmt.empty())
                throw invalid_argument("Framebuffer::set_format");