mesa: Treat glBindFramebuffer and glBindFramebufferEXT more correctly
authorIan Romanick <ian.d.romanick@intel.com>
Fri, 19 Jul 2013 00:39:22 +0000 (17:39 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 6 Aug 2013 17:46:05 +0000 (10:46 -0700)
Allow user-generated names for glBindFramebufferEXT on desktop GL.
Disallow its use altogether for core profiles.

Names bound with glBindFramebuffer in desktop OpenGL are still
(incorrectly) shared across the share group instead of being
per-context.  This gets us a bit closer to being strictly conformant.

v2: Disallow glBindFramebufferEXT in 3.1 by not installing it in the
dispatch table.  Suggested by Jordan.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> [v1]
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> [v1]
Cc: mesa-stable@lists.freedesktop.org
src/mapi/glapi/gen/EXT_framebuffer_object.xml
src/mesa/main/fbobject.c
src/mesa/main/tests/dispatch_sanity.cpp

index 5fea61610b52d8e24bfc1a8e3c18d49a37a196bc..2cf75bc67837645e7e157c17a54ada2d1f2a8aa8 100644 (file)
        <return type="GLboolean"/>
     </function>
 
-    <function name="BindFramebufferEXT" offset="assign">
+    <function name="BindFramebufferEXT" offset="assign" deprecated="3.1">
         <param name="target" type="GLenum"/>
         <param name="framebuffer" type="GLuint"/>
         <glx rop="4319"/>
index c0f617d6971a3d6e46673159a06f054beb046e26..8fdeff5827d1ee6aa93692afa7275ddf84478529 100644 (file)
@@ -1918,8 +1918,8 @@ check_end_texture_render(struct gl_context *ctx, struct gl_framebuffer *fb)
 }
 
 
-void GLAPIENTRY
-_mesa_BindFramebuffer(GLenum target, GLuint framebuffer)
+static void
+bind_framebuffer(GLenum target, GLuint framebuffer, bool allow_user_names)
 {
    struct gl_framebuffer *newDrawFb, *newReadFb;
    struct gl_framebuffer *oldDrawFb, *oldReadFb;
@@ -1965,9 +1965,7 @@ _mesa_BindFramebuffer(GLenum target, GLuint framebuffer)
          /* ID was reserved, but no real framebuffer object made yet */
          newDrawFb = NULL;
       }
-      else if (!newDrawFb
-               && _mesa_is_desktop_gl(ctx)
-               && ctx->Extensions.ARB_framebuffer_object) {
+      else if (!newDrawFb && !allow_user_names) {
          /* All FBO IDs must be Gen'd */
          _mesa_error(ctx, GL_INVALID_OPERATION, "glBindFramebuffer(buffer)");
          return;
@@ -2045,12 +2043,25 @@ _mesa_BindFramebuffer(GLenum target, GLuint framebuffer)
 }
 
 void GLAPIENTRY
-_mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
+_mesa_BindFramebuffer(GLenum target, GLuint framebuffer)
 {
-    _mesa_BindFramebuffer(target, framebuffer);
-}
+   GET_CURRENT_CONTEXT(ctx);
 
+   /* OpenGL ES glBindFramebuffer and glBindFramebufferOES use this same entry
+    * point, but they allow the use of user-generated names.
+    */
+   bind_framebuffer(target, framebuffer, _mesa_is_gles(ctx));
+}
 
+void GLAPIENTRY
+_mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
+{
+   /* This function should not be in the dispatch table for core profile /
+    * OpenGL 3.1, so execution should never get here in those cases -- no
+    * need for an explicit test.
+    */
+   bind_framebuffer(target, framebuffer, true);
+}
 
 void GLAPIENTRY
 _mesa_DeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
index 45642562842b768d1d7f3f4eed921b3144375df6..8d3774775fcab092e08621ef22ff5b30918b3b99 100644 (file)
@@ -527,9 +527,6 @@ const struct function gl_core_functions_possible[] = {
    { "glEGLImageTargetRenderbufferStorageOES", 31, -1 },
    { "glEGLImageTargetTexture2DOES", 31, -1 },
 
-   /* GL_EXT_framebuffer_object */
-   { "glBindFramebufferEXT", 31, -1 },
-
    /* GL 3.2 */
    { "glGetInteger64i_v", 32, -1 },
    { "glGetBufferParameteri64v", 32, -1 },