mesa/formatquery: Added a func to check <internalformat> supported

From the ARB_internalformat_query2 specification:

  "The INTERNALFORMAT_SUPPORTED <pname> can be used to determine if
   the internal format is supported, and the  other <pnames> are defined
   in terms of whether or not the format is supported."

v2: Consider also FBO base formats when checking if the internalformat is
    supported.

Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Antia Puentes 2015-12-22 15:07:57 +01:00 committed by Eduardo Lima Mitev
parent 5f6e3a0370
commit 4722abc630
1 changed files with 38 additions and 0 deletions

View File

@ -523,6 +523,43 @@ _is_resource_supported(struct gl_context *ctx, GLenum target,
return true;
}
static bool
_is_internalformat_supported(struct gl_context *ctx, GLenum target,
GLenum internalformat)
{
/* From the ARB_internalformat_query2 specification:
*
* "- INTERNALFORMAT_SUPPORTED: If <internalformat> is an internal format
* that is supported by the implementation in at least some subset of
* possible operations, TRUE is written to <params>. If <internalformat>
* if not a valid token for any internal format usage, FALSE is returned.
*
* <internalformats> that must be supported (in GL 4.2 or later) include
* the following:
* - "sized internal formats" from Table 3.12, 3.13, and 3.15,
* - any specific "compressed internal format" from Table 3.14,
* - any "image unit format" from Table 3.21.
* - any generic "compressed internal format" from Table 3.14, if the
* implementation accepts it for any texture specification commands, and
* - unsized or base internal format, if the implementation accepts
* it for texture or image specification.
*/
GLint buffer[1];
/* At this point a 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;
/* Let the driver have the final word */
ctx->Driver.QueryInternalFormat(ctx, target, internalformat,
GL_INTERNALFORMAT_SUPPORTED, buffer);
return (buffer[0] == GL_TRUE);
}
/* default implementation of QueryInternalFormat driverfunc, for
* drivers not implementing ARB_internalformat_query2.
*/
@ -576,6 +613,7 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
_set_default_response(pname, buffer);
if (!_is_target_supported(ctx, target) ||
!_is_internalformat_supported(ctx, target, internalformat) ||
!_is_resource_supported(ctx, target, internalformat, pname))
goto end;