mesa/formatquery: Added a func to check <internalformat> supported
authorAntia Puentes <apuentes@igalia.com>
Tue, 22 Dec 2015 14:07:57 +0000 (15:07 +0100)
committerEduardo Lima Mitev <elima@igalia.com>
Thu, 3 Mar 2016 14:14:06 +0000 (15:14 +0100)
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>
src/mesa/main/formatquery.c

index 03473ad460d4a42290d1b00f043f3c80a62e0e9a..60d8b71b0d29fb7328dc5ae6f6c43255f53144ee 100644 (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;