[Mesa-dev] [PATCH 3/3] main/fboject: default_framebuffer allowed for GetFramebufferParameter
Alejandro PiƱeiro
apinheiro at igalia.com
Thu Feb 2 18:51:50 UTC 2017
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
---
src/mesa/main/fbobject.c | 44 +++++++++++++++++++++++++++++++++++++-------
1 file changed, 37 insertions(+), 7 deletions(-)
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index bed5b25..c8ec8e6 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");
}
--
2.9.3
More information about the mesa-dev
mailing list