main/fboject: default_framebuffer allowed for GetFramebufferParameter
authorAlejandro Piñeiro <apinheiro@igalia.com>
Fri, 13 Jan 2017 17:53:13 +0000 (15:53 -0200)
committerAlejandro Piñeiro <apinheiro@igalia.com>
Mon, 6 Feb 2017 07:50:21 +0000 (08:50 +0100)
Before 4.5, the default framebuffer was not allowed for
GetFramebufferParameter, so it should return INVALID_OPERATION for any
call using the default framebuffer.

4.5 included new pnames, and some of them are allowed for the default
framebuffer. For the rest, INVALID_OPERATION. From OpenGL 4.5 spec,
section 9.2.3 "Framebuffer Object Queries:

   "An INVALID_OPERATION error is generated by GetFramebufferParameteriv
    if the default framebuffer is bound to target and pname is not one
    of the accepted values from table 23.73, other than
    SAMPLE_POSITION."

Fixes:
GL45-CTS.direct_state_access.framebuffers_get_parameter_errors

Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
src/mesa/main/fbobject.c

index bed5b2573e4d6048d0a5595d143e2d1875b78a6f..c8ec8e68a19648be9d491a2bb0a7fdb5255ae50c 100644 (file)
@@ -1477,10 +1477,47 @@ _mesa_FramebufferParameteri(GLenum target, GLenum pname, GLint param)
    framebuffer_parameteri(ctx, fb, pname, param, "glFramebufferParameteri");
 }
 
+static bool
+_pname_valid_for_default_framebuffer(struct gl_context *ctx,
+                                     GLenum pname)
+{
+   if (!_mesa_is_desktop_gl(ctx))
+      return false;
+
+   switch (pname) {
+   case GL_DOUBLEBUFFER:
+   case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
+   case GL_IMPLEMENTATION_COLOR_READ_TYPE:
+   case GL_SAMPLES:
+   case GL_SAMPLE_BUFFERS:
+   case GL_STEREO:
+      return true;
+   default:
+      return false;
+   }
+}
+
 static void
 get_framebuffer_parameteriv(struct gl_context *ctx, struct gl_framebuffer *fb,
                             GLenum pname, GLint *params, const char *func)
 {
+   /* From OpenGL 4.5 spec, section 9.2.3 "Framebuffer Object Queries:
+    *
+    *    "An INVALID_OPERATION error is generated by GetFramebufferParameteriv
+    *     if the default framebuffer is bound to target and pname is not one
+    *     of the accepted values from table 23.73, other than
+    *     SAMPLE_POSITION."
+    *
+    * For OpenGL ES, using default framebuffer still raises INVALID_OPERATION
+    * for any pname.
+    */
+   if (_mesa_is_winsys_fbo(fb) &&
+       !_pname_valid_for_default_framebuffer(ctx, pname)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "%s(invalid pname=0x%x for default framebuffer)", func, pname);
+      return;
+   }
+
    switch (pname) {
    case GL_FRAMEBUFFER_DEFAULT_WIDTH:
       *params = fb->DefaultGeometry.Width;
@@ -1549,13 +1586,6 @@ _mesa_GetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params)
       return;
    }
 
-   /* check framebuffer binding */
-   if (_mesa_is_winsys_fbo(fb)) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glGetFramebufferParameteriv");
-      return;
-   }
-
    get_framebuffer_parameteriv(ctx, fb, pname, params,
                                "glGetFramebufferParameteriv");
 }