mesa/formatquery: Added framebuffer renderability related queries
authorAntia Puentes <apuentes@igalia.com>
Mon, 21 Dec 2015 17:55:56 +0000 (18:55 +0100)
committerEduardo Lima Mitev <elima@igalia.com>
Thu, 3 Mar 2016 14:14:07 +0000 (15:14 +0100)
From the ARB_internalformat_query2 specification:

   "- FRAMEBUFFER_RENDERABLE: The support for rendering to the resource via
      framebuffer attachment is returned in <params>.

    - FRAMEBUFFER_RENDERABLE_LAYERED: The support for layered rendering to
      the resource via framebuffer attachment is returned in <params>.

    - FRAMEBUFFER_BLEND: The support for rendering to the resource
      via framebuffer attachment when blending is enabled is returned in
      <params>."

For all of them,
    "Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
     If the resource is unsupported, NONE is returned."

Reviewed-by: Dave Airlie <airlied@redhat.com>
src/mesa/main/formatquery.c

index e4ddb94978cf47daf8a56170e219b0633b2b7efc..e7645b161ee7921d7e7ef1748d0ccccda0141871 100644 (file)
@@ -573,6 +573,23 @@ _is_internalformat_supported(struct gl_context *ctx, GLenum target,
    return (buffer[0] == GL_TRUE);
 }
 
+static bool
+_legal_target_for_framebuffer_texture_layer(struct gl_context *ctx,
+                                            GLenum target)
+{
+   switch (target) {
+   case GL_TEXTURE_3D:
+   case GL_TEXTURE_1D_ARRAY:
+   case GL_TEXTURE_2D_ARRAY:
+   case GL_TEXTURE_CUBE_MAP_ARRAY:
+   case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
+   case GL_TEXTURE_CUBE_MAP:
+      return true;
+   default:
+      return false;
+   }
+}
+
 /* default implementation of QueryInternalFormat driverfunc, for
  * drivers not implementing ARB_internalformat_query2.
  */
@@ -622,6 +639,9 @@ _mesa_query_internal_format_default(struct gl_context *ctx, GLenum target,
    case GL_TEXTURE_SHADOW:
    case GL_TEXTURE_GATHER:
    case GL_TEXTURE_GATHER_SHADOW:
+   case GL_FRAMEBUFFER_RENDERABLE:
+   case GL_FRAMEBUFFER_RENDERABLE_LAYERED:
+   case GL_FRAMEBUFFER_BLEND:
       params[0] = GL_FULL_SUPPORT;
       break;
 
@@ -1050,16 +1070,22 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
       buffer[0] = GL_TRUE;
       break;
 
+   case GL_FRAMEBUFFER_RENDERABLE_LAYERED:
+      if (!_mesa_has_EXT_texture_array(ctx) ||
+          _legal_target_for_framebuffer_texture_layer(ctx, target))
+         goto end;
+      /* fallthrough */
    case GL_FRAMEBUFFER_RENDERABLE:
-      /* @TODO */
-      break;
+   case GL_FRAMEBUFFER_BLEND:
+      if (!_mesa_has_ARB_framebuffer_object(ctx))
+         goto end;
 
-   case GL_FRAMEBUFFER_RENDERABLE_LAYERED:
-      /* @TODO */
-      break;
+      if (target == GL_TEXTURE_BUFFER ||
+          !_is_renderable(ctx, internalformat))
+         goto end;
 
-   case GL_FRAMEBUFFER_BLEND:
-      /* @TODO */
+      ctx->Driver.QueryInternalFormat(ctx, target, internalformat, pname,
+                                      buffer);
       break;
 
    case GL_READ_PIXELS: