aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlejandro Piñeiro <[email protected]>2017-01-13 15:53:13 -0200
committerAlejandro Piñeiro <[email protected]>2017-02-06 08:50:21 +0100
commitdfb1b543f36410fb01ba202076550e1259c89ed1 (patch)
tree48e0c942f2e69bf8504fe3c178427bda0da8506d
parent0fb0c57b15aa6b5f48ab3f8596241248e02d55e5 (diff)
main/fboject: default_framebuffer allowed for GetFramebufferParameter
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 <[email protected]>
-rw-r--r--src/mesa/main/fbobject.c44
1 files changed, 37 insertions, 7 deletions
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index bed5b2573e4..c8ec8e68a19 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -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");
}