gallium: Add block depth to the format utils.
authorEric Anholt <eric@anholt.net>
Wed, 14 Aug 2019 19:16:46 +0000 (12:16 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 26 Aug 2019 19:44:00 +0000 (19:44 +0000)
I decided not to update nblocks() with a depth arg as the callers
wouldn't be doing ASTC 3D.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/auxiliary/util/u_format.h
src/gallium/auxiliary/util/u_format_table.py

index eb8c2f6..6922424 100644 (file)
@@ -102,6 +102,9 @@ struct util_format_block
    /** Block height in pixels */
    unsigned height;
 
+   /** Block depth in pixels */
+   unsigned depth;
+
    /** Block size in bits */
    unsigned bits;
 };
@@ -842,6 +845,19 @@ util_format_get_blockheight(enum pipe_format format)
    return desc->block.height;
 }
 
+static inline uint
+util_format_get_blockdepth(enum pipe_format format)
+{
+   const struct util_format_description *desc = util_format_description(format);
+
+   assert(desc);
+   if (!desc) {
+      return 1;
+   }
+
+   return desc->block.depth;
+}
+
 static inline unsigned
 util_format_get_nblocksx(enum pipe_format format,
                          unsigned x)
@@ -859,10 +875,19 @@ util_format_get_nblocksy(enum pipe_format format,
 }
 
 static inline unsigned
+util_format_get_nblocksz(enum pipe_format format,
+                         unsigned z)
+{
+   unsigned blockdepth = util_format_get_blockdepth(format);
+   return (z + blockdepth - 1) / blockdepth;
+}
+
+static inline unsigned
 util_format_get_nblocks(enum pipe_format format,
                         unsigned width,
                         unsigned height)
 {
+   assert(util_format_get_blockdepth(format) == 1);
    return util_format_get_nblocksx(format, width) * util_format_get_nblocksy(format, height);
 }
 
index 731e2fb..991b3c4 100644 (file)
@@ -130,7 +130,7 @@ def write_format_table(formats):
         print("   %s," % (format.name,))
         print("   \"%s\"," % (format.name,))
         print("   \"%s\"," % (format.short_name(),))
-        print("   {%u, %u, %u},\t/* block */" % (format.block_width, format.block_height, format.block_size()))
+        print("   {%u, %u, %u, %u},\t/* block */" % (format.block_width, format.block_height, format.block_depth, format.block_size()))
         print("   %s," % (layout_map(format.layout),))
         print("   %u,\t/* nr_channels */" % (format.nr_channels(),))
         print("   %s,\t/* is_array */" % (bool_map(format.is_array()),))