diff options
-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 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"); } |