[Mesa-dev] [PATCH] mesa: fix error handling in get_framebuffer_parameteriv

Tapani Pälli tapani.palli at intel.com
Mon May 7 08:05:48 UTC 2018


Hi;

On 05/05/2018 01:27 AM, Rhys Perry wrote:
> CC: <mesa-stable at lists.freedesktop.org>

These changes look correct to me and it looks cleaner with the common 
validate function. Do you know some app or test that got fixed by these 
changes?

> Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
> ---
>   src/mesa/main/fbobject.c | 72 +++++++++++++++++++++++++++---------------------
>   1 file changed, 41 insertions(+), 31 deletions(-)
> 
> diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
> index c72204e11a..0fc3319fe9 100644
> --- a/src/mesa/main/fbobject.c
> +++ b/src/mesa/main/fbobject.c
> @@ -1488,45 +1488,66 @@ _mesa_FramebufferParameteri(GLenum target, GLenum pname, GLint param)
>   }
>   
>   static bool
> -_pname_valid_for_default_framebuffer(struct gl_context *ctx,
> -                                     GLenum pname)
> +validate_get_framebuffer_parameteriv_pname(struct gl_context *ctx,
> +                                           struct gl_framebuffer *fb,
> +                                           GLuint pname, const char *func)
>   {
> -   if (!_mesa_is_desktop_gl(ctx))
> -      return false;
> +   bool cannotBeWinsysFbo = true;

This is more like 'shouldn't be' right? I'm not sure how to make the 
variable name better though ...

Reviewed-by: Tapani Pälli <tapani.palli at intel.com>

>   
>      switch (pname) {
> +   case GL_FRAMEBUFFER_DEFAULT_LAYERS:
> +      /*
> +       * According to the OpenGL ES 3.1 specification section 9.2.3, the
> +       * GL_FRAMEBUFFER_LAYERS parameter name is not supported.
> +       */
> +      if (_mesa_is_gles31(ctx) && !ctx->Extensions.OES_geometry_shader) {
> +         _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
> +         return false;
> +      }
> +      break;
> +   case GL_FRAMEBUFFER_DEFAULT_WIDTH:
> +   case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
> +   case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
> +   case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
> +      break;
>      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;
> +      /* 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 raises INVALID_OPERATION
> +       * for any pname.
> +       */
> +      cannotBeWinsysFbo = !_mesa_is_desktop_gl(ctx);
> +      break;
>      default:
> +      _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
>         return false;
>      }
> +
> +   if (cannotBeWinsysFbo && _mesa_is_winsys_fbo(fb)) {
> +      _mesa_error(ctx, GL_INVALID_OPERATION,
> +                  "%s(invalid pname=0x%x for default framebuffer)", func, pname);
> +      return false;
> +   }
> +
> +   return true;
>   }
>   
>   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);
> +   if (!validate_get_framebuffer_parameteriv_pname(ctx, fb, pname, func))
>         return;
> -   }
>   
>      switch (pname) {
>      case GL_FRAMEBUFFER_DEFAULT_WIDTH:
> @@ -1536,14 +1557,6 @@ get_framebuffer_parameteriv(struct gl_context *ctx, struct gl_framebuffer *fb,
>         *params = fb->DefaultGeometry.Height;
>         break;
>      case GL_FRAMEBUFFER_DEFAULT_LAYERS:
> -      /*
> -       * According to the OpenGL ES 3.1 specification section 9.2.3, the
> -       * GL_FRAMEBUFFER_LAYERS parameter name is not supported.
> -       */
> -      if (_mesa_is_gles31(ctx) && !ctx->Extensions.OES_geometry_shader) {
> -         _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
> -         break;
> -      }
>         *params = fb->DefaultGeometry.Layers;
>         break;
>      case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
> @@ -1570,9 +1583,6 @@ get_framebuffer_parameteriv(struct gl_context *ctx, struct gl_framebuffer *fb,
>      case GL_STEREO:
>         *params = fb->Visual.stereoMode;
>         break;
> -   default:
> -      _mesa_error(ctx, GL_INVALID_ENUM,
> -                  "%s(pname=0x%x)", func, pname);
>      }
>   }
>   
> 


More information about the mesa-dev mailing list