cogl-framebuffer: Use the FBO extension for color sizes
authorEmmanuele Bassi <ebassi@linux.intel.com>
Wed, 26 May 2010 16:14:53 +0000 (17:14 +0100)
committerRobert Bragg <robert@linux.intel.com>
Thu, 10 Jun 2010 18:53:39 +0000 (19:53 +0100)
OpenGL 3.0 deprecated querying of the GL_{RED,GREEN,BLUE}_BITS
constants, and the FBO extension provides a mechanism to query for the
color buffer sizes which *should* work even with the default
framebuffer. Unfortunately, this doesn't seem to hold for Mesa - so we
just use this for the offscreen CoglFramebuffer type, and we fall back
to glGetIntegerv() for the onscreen one.

http://bugzilla.openedhand.com/show_bug.cgi?id=2094

clutter/cogl/cogl/cogl-debug.c
clutter/cogl/cogl/cogl-framebuffer.c
clutter/cogl/cogl/driver/gl/cogl-feature-functions.h
clutter/cogl/cogl/driver/gles/cogl-feature-functions.h

index 9304919..df985fa 100644 (file)
@@ -50,7 +50,8 @@ static const GDebugKey cogl_log_debug_keys[] = {
   { "draw", COGL_DEBUG_DRAW },
   { "opengl", COGL_DEBUG_OPENGL },
   { "pango", COGL_DEBUG_PANGO },
-  { "show-source", COGL_DEBUG_SHOW_SOURCE}
+  { "show-source", COGL_DEBUG_SHOW_SOURCE},
+  { "offscreen", COGL_DEBUG_OFFSCREEN }
 };
 static const int n_cogl_log_debug_keys =
   G_N_ELEMENTS (cogl_log_debug_keys);
@@ -124,6 +125,7 @@ _cogl_parse_debug_string (const char *value,
       OPT ("disable-glsl:", "disable use of GLSL");
       OPT ("show-source:", "show generated ARBfp/GLSL");
       OPT ("opengl:", "traces some select OpenGL calls");
+      OPT ("offscreen:", "debug offscreen support");
       g_printerr ("\n%28s\n", "Special debug values:");
       OPT ("all:", "Enables all non-behavioural debug options");
       OPT ("verbose:", "Enables all non-behavioural debug options");
index 981b4a1..07b437c 100644 (file)
@@ -51,6 +51,8 @@
 #define glFramebufferRenderbuffer         ctx->drv.pf_glFramebufferRenderbuffer
 #define glCheckFramebufferStatus          ctx->drv.pf_glCheckFramebufferStatus
 #define glDeleteFramebuffers              ctx->drv.pf_glDeleteFramebuffers
+#define glGetFramebufferAttachmentParameteriv \
+                                          ctx->drv.pf_glGetFramebufferAttachmentParameteriv
 
 #endif
 
 #ifndef GL_DEPTH_COMPONENT16
 #define GL_DEPTH_COMPONENT16    0x81A5
 #endif
+#ifndef GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE      0x8212
+#endif
+#ifndef GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE    0x8213
+#endif
+#ifndef GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE     0x8214
+#endif
+#ifndef GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE    0x8215
+#endif
+#ifndef GL_FRAMEBUFFER_ATTCHMENT_DEPTH_SIZE
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE    0x8216
+#endif
+#ifndef GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE  0x8217
+#endif
 
 typedef enum {
   _TRY_DEPTH_STENCIL = 1L<<0,
@@ -253,13 +273,63 @@ _cogl_framebuffer_get_projection_stack (CoglHandle handle)
 static inline void
 _cogl_framebuffer_init_bits (CoglFramebuffer *framebuffer)
 {
+  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
+
   if (G_LIKELY (!framebuffer->dirty_bitmasks))
     return;
 
-  GE( glGetIntegerv (GL_RED_BITS,   &framebuffer->red_bits)   );
-  GE( glGetIntegerv (GL_GREEN_BITS, &framebuffer->green_bits) );
-  GE( glGetIntegerv (GL_BLUE_BITS,  &framebuffer->blue_bits)  );
-  GE( glGetIntegerv (GL_ALPHA_BITS, &framebuffer->alpha_bits) );
+#ifdef HAVE_COGL_GL
+  if (cogl_features_available (COGL_FEATURE_OFFSCREEN)
+      && framebuffer->type == COGL_FRAMEBUFFER_TYPE_OFFSCREEN)
+    {
+      GLenum attachment, pname;
+
+      attachment = GL_COLOR_ATTACHMENT0;
+
+      pname = GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE;
+      GE( glGetFramebufferAttachmentParameteriv (GL_FRAMEBUFFER,
+                                                 attachment,
+                                                 pname,
+                                                 &framebuffer->red_bits) );
+
+      pname = GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE;
+      GE( glGetFramebufferAttachmentParameteriv (GL_FRAMEBUFFER,
+                                                 attachment,
+                                                 pname,
+                                                 &framebuffer->green_bits) );
+
+      pname = GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE;
+      GE( glGetFramebufferAttachmentParameteriv (GL_FRAMEBUFFER,
+                                                 attachment,
+                                                 pname,
+                                                 &framebuffer->blue_bits) );
+
+      pname = GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE;
+      GE( glGetFramebufferAttachmentParameteriv (GL_FRAMEBUFFER,
+                                                 attachment,
+                                                 pname,
+                                                 &framebuffer->alpha_bits) );
+    }
+  else
+#endif /* HAVE_COGL_GL */
+    {
+      GE( glGetIntegerv (GL_RED_BITS,   &framebuffer->red_bits)   );
+      GE( glGetIntegerv (GL_GREEN_BITS, &framebuffer->green_bits) );
+      GE( glGetIntegerv (GL_BLUE_BITS,  &framebuffer->blue_bits)  );
+      GE( glGetIntegerv (GL_ALPHA_BITS, &framebuffer->alpha_bits) );
+    }
+
+
+  COGL_NOTE (OFFSCREEN,
+             "RGBA Bits for framebuffer[%p, %s]: %d, %d, %d, %d",
+             framebuffer,
+             framebuffer->type == COGL_FRAMEBUFFER_TYPE_OFFSCREEN
+               ? "offscreen"
+               : "onscreen",
+             framebuffer->red_bits,
+             framebuffer->blue_bits,
+             framebuffer->green_bits,
+             framebuffer->alpha_bits);
 
   framebuffer->dirty_bitmasks = FALSE;
 }
index d26c647..a6a82d3 100644 (file)
@@ -70,6 +70,11 @@ COGL_FEATURE_FUNCTION (void, glDeleteFramebuffers,
                         const                 GLuint *framebuffers))
 COGL_FEATURE_FUNCTION (void, glGenerateMipmap,
                        (GLenum                target))
+COGL_FEATURE_FUNCTION (void, glGetFramebufferAttachmentParameteriv,
+                       (GLenum                target,
+                        GLenum                attachment,
+                        GLenum                pname,
+                        GLint                *params))
 COGL_FEATURE_END ()
 
 COGL_FEATURE_BEGIN (offscreen_blit, 255, 255,
index de6a24c..8aba5af 100644 (file)
@@ -67,6 +67,11 @@ COGL_FEATURE_FUNCTION (void, glDeleteFramebuffers,
                         const                 GLuint *framebuffers))
 COGL_FEATURE_FUNCTION (void, glGenerateMipmap,
                        (GLenum                target))
+COGL_FEATURE_FUNCTION (void, glGetFramebufferAttachmentParameteriv,
+                       (GLenum                target,
+                        GLenum                attachment,
+                        GLenum                pname,
+                        GLint                *params))
 COGL_FEATURE_END ()
 
 COGL_FEATURE_BEGIN (element_index_uint, 255, 255,