mesa/formatquery: Added compressed texture related queries
authorAntia Puentes <apuentes@igalia.com>
Sat, 19 Dec 2015 19:23:29 +0000 (20:23 +0100)
committerEduardo Lima Mitev <elima@igalia.com>
Thu, 3 Mar 2016 14:14:07 +0000 (15:14 +0100)
From the ARB_internalformat_query2 specification:

   "- TEXTURE_COMPRESSED: If <internalformat> is a compressed format
      that is supported for this type of resource, TRUE is returned in
      <params>. If the internal format is not compressed, or the type of
      resource is not supported, FALSE is returned.

    - TEXTURE_COMPRESSED_BLOCK_WIDTH: If the resource contains a compressed
      format, the width of a compressed block (in bytes) is returned in
      <params>. If the internal format is not compressed, or the resource
      is not supported, 0 is returned.

    - TEXTURE_COMPRESSED_BLOCK_HEIGHT: If the resource contains a compressed
      format, the height of a compressed block (in bytes) is returned in
      <params>. If the internal format is not compressed, or the resource
      is not supported, 0 is returned.

    - TEXTURE_COMPRESSED_BLOCK_SIZE: If the resource contains a compressed
      format the number of bytes per block is returned in <params>.  If the
      internal format is not compressed, or the resource is not supported,
      0 is returned.
      (combined with the above, allows the bitrate to be computed, and may be
      useful in conjunction with ARB_compressed_texture_pixel_storage)."

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

index c2b896c730490be56ce8951a096673723d9110dc..a921566760e464f0a79035d903751f6889b82fcb 100644 (file)
@@ -34,6 +34,7 @@
 #include "get.h"
 #include "genmipmap.h"
 #include "shaderimage.h"
+#include "texcompress.h"
 
 static bool
 _is_renderable(struct gl_context *ctx, GLenum internalformat)
@@ -1332,20 +1333,38 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
       break;
 
    case GL_TEXTURE_COMPRESSED:
-      /* @TODO */
+      buffer[0] = _mesa_is_compressed_format(ctx, internalformat);
       break;
 
    case GL_TEXTURE_COMPRESSED_BLOCK_WIDTH:
-      /* @TODO */
-      break;
-
    case GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT:
-      /* @TODO */
-      break;
+   case GL_TEXTURE_COMPRESSED_BLOCK_SIZE: {
+      mesa_format mesaformat;
+      GLint block_size;
 
-   case GL_TEXTURE_COMPRESSED_BLOCK_SIZE:
-      /* @TODO */
+      mesaformat = _mesa_glenum_to_compressed_format(internalformat);
+      if (mesaformat == MESA_FORMAT_NONE)
+         goto end;
+
+      block_size = _mesa_get_format_bytes(mesaformat);
+      assert(block_size > 0);
+
+      if (pname == GL_TEXTURE_COMPRESSED_BLOCK_SIZE) {
+         buffer[0] = block_size;
+      } else {
+         GLuint bwidth, bheight;
+
+         /* Returns the width and height in pixels. We return bytes */
+         _mesa_get_format_block_size(mesaformat, &bwidth, &bheight);
+         assert(bwidth > 0 && bheight > 0);
+
+         if (pname == GL_TEXTURE_COMPRESSED_BLOCK_WIDTH)
+            buffer[0] = block_size / bheight;
+         else
+            buffer[0] = block_size / bwidth;
+      }
       break;
+   }
 
    case GL_CLEAR_BUFFER:
       /* @TODO */