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:
parent
5f6e3a0370
commit
4722abc630
|
@ -523,6 +523,43 @@ _is_resource_supported(struct gl_context *ctx, GLenum target,
|
||||||
return true;
|
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
|
/* default implementation of QueryInternalFormat driverfunc, for
|
||||||
* drivers not implementing ARB_internalformat_query2.
|
* drivers not implementing ARB_internalformat_query2.
|
||||||
*/
|
*/
|
||||||
|
@ -576,6 +613,7 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
|
||||||
_set_default_response(pname, buffer);
|
_set_default_response(pname, buffer);
|
||||||
|
|
||||||
if (!_is_target_supported(ctx, target) ||
|
if (!_is_target_supported(ctx, target) ||
|
||||||
|
!_is_internalformat_supported(ctx, target, internalformat) ||
|
||||||
!_is_resource_supported(ctx, target, internalformat, pname))
|
!_is_resource_supported(ctx, target, internalformat, pname))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue