On 27/01/18 01:59, srol...@vmware.com wrote:
> From: Roland Scheidegger <srol...@vmware.com>
>
> The code just considered all formats as being supported if they were either
> a valid fbo or texture format.
> This was quite awkward since then the query would return "supported" for
> e.g. GL_RGB9E5 or compressed formats and target RENDERBUFFER (albeit the 
> driver
> could still refuse it in theory). However, when then querying for instance the
> internalformat sizes, it would just return 0 (due to the checks being more
> strict there).
> It was also a problem for texture buffer targets, which have a more restricted
> list of formats which are allowed (and again, it would return supported but
> then querying sizes would return 0).
> So only take validation of formats into account which make sense for a given
> target.
> Can also toss out some special checks for rgb9e5 later, since we'd never get
> there if it wasn't supported in the first place.

The texture buffer/renderbuffer thing was raised some months ago. Good
catch with the additional spec paragraph, that clarifies several cases.

The patch:
Reviewed-by: Alejandro Piñeiro <apinhe...@igalia.com>

> ---
>  src/mesa/main/formatquery.c | 31 +++++++++++++++++++++----------
>  1 file changed, 21 insertions(+), 10 deletions(-)
>
> diff --git a/src/mesa/main/formatquery.c b/src/mesa/main/formatquery.c
> index e0062a64d2..2214f97e67 100644
> --- a/src/mesa/main/formatquery.c
> +++ b/src/mesa/main/formatquery.c
> @@ -558,15 +558,29 @@ _is_internalformat_supported(struct gl_context *ctx, 
> GLenum target,
>      *         implementation accepts it for any texture specification 
> commands, and
>      *         - unsized or base internal format, if the implementation 
> accepts
>      *         it for texture or image specification.
> +    *
> +    * But also:
> +    * "If the particualar <target> and <internalformat> combination do not 
> make
> +    * sense, or if a particular type of <target> is not supported by the
> +    * implementation the "unsupported" answer should be given. This is not an
> +    * error.
>      */
>     GLint buffer[1];
>  
> -   /* At this point an internalformat is valid if it is valid as a texture or
> -    * as a renderbuffer format. The checks are different because those 
> methods
> -    * return different values when passing non supported internalformats */
> -   if (_mesa_base_tex_format(ctx, internalformat) < 0 &&
> -       _mesa_base_fbo_format(ctx, internalformat) == 0)
> -      return false;
> +   if (target == GL_RENDERBUFFER) {
> +      if (_mesa_base_fbo_format(ctx, internalformat) == 0) {
> +         return false;
> +      }
> +   } else if (target == GL_TEXTURE_BUFFER) {
> +      if (_mesa_validate_texbuffer_format(ctx, internalformat) ==
> +          MESA_FORMAT_NONE) {
> +         return false;
> +      }
> +   } else {
> +      if (_mesa_base_tex_format(ctx, internalformat) < 0) {
> +         return false;
> +      }
> +   }
>  
>     /* Let the driver have the final word */
>     ctx->Driver.QueryInternalFormat(ctx, target, internalformat,
> @@ -969,10 +983,7 @@ _mesa_GetInternalformativ(GLenum target, GLenum 
> internalformat, GLenum pname,
>         * and glGetRenderbufferParameteriv functions.
>         */
>        if (pname == GL_INTERNALFORMAT_SHARED_SIZE) {
> -         if (_mesa_has_EXT_texture_shared_exponent(ctx) &&
> -             target != GL_TEXTURE_BUFFER &&
> -             target != GL_RENDERBUFFER &&
> -             texformat == MESA_FORMAT_R9G9B9E5_FLOAT) {
> +         if (texformat == MESA_FORMAT_R9G9B9E5_FLOAT) {
>              buffer[0] = 5;
>           }
>           goto end;

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to