diff options
author | Alejandro Piñeiro <apinheiro@igalia.com> | 2017-01-13 15:53:13 -0200 |
---|---|---|
committer | Alejandro Piñeiro <apinheiro@igalia.com> | 2017-02-06 08:50:21 +0100 |
commit | dfb1b543f36410fb01ba202076550e1259c89ed1 (patch) | |
tree | 48e0c942f2e69bf8504fe3c178427bda0da8506d | |
parent | 0fb0c57b15aa6b5f48ab3f8596241248e02d55e5 (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 <anuj.phogat@gmail.com>
-rw-r--r-- | src/mesa/main/fbobject.c | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index bed5b2573e..c8ec8e68a1 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"); } |