[Mesa-dev] [RFC 01/10] mesa/formats: define the 2D ASTC formats

Nanley Chery nanleychery at gmail.com
Tue May 19 17:48:09 PDT 2015


From: Nanley Chery <nanley.g.chery at intel.com>

Includes definition of the formats, updates to functions likely to be used, as
well as changes necessary for compilation.

Signed-off-by: Nanley Chery <nanley.g.chery at intel.com>
---
 src/mesa/main/format_info.py |   3 +
 src/mesa/main/formats.c      | 130 +++++++++++++++++++++++++++++++++++++++++++
 src/mesa/main/formats.csv    |  31 +++++++++++
 src/mesa/main/formats.h      |  30 ++++++++++
 src/mesa/swrast/s_texfetch.c |  32 ++++++++++-
 5 files changed, 225 insertions(+), 1 deletion(-)

diff --git a/src/mesa/main/format_info.py b/src/mesa/main/format_info.py
index 3bae57e..40104a2 100644
--- a/src/mesa/main/format_info.py
+++ b/src/mesa/main/format_info.py
@@ -130,6 +130,9 @@ def get_channel_bits(fmat, chan_name):
       elif fmat.layout == 'bptc':
          bits = 16 if fmat.name.endswith('_FLOAT') else 8
          return bits if fmat.has_channel(chan_name) else 0
+      elif fmat.layout == 'astc':
+         bits = 16 if fmat.name.endswith('_RGBA') else 8
+         return bits if fmat.has_channel(chan_name) else 0
       else:
          assert False
    else:
diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
index 8af44e9..25606f9 100644
--- a/src/mesa/main/formats.c
+++ b/src/mesa/main/formats.c
@@ -656,6 +656,48 @@ _mesa_get_srgb_format_linear(mesa_format format)
    case MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM:
       format = MESA_FORMAT_BPTC_RGBA_UNORM;
       break;
+   case MESA_FORMAT_ASTC_4x4_SRGB8_ALPHA8:
+      format = MESA_FORMAT_ASTC_4x4_RGBA;
+      break;
+   case MESA_FORMAT_ASTC_5x4_SRGB8_ALPHA8:
+      format = MESA_FORMAT_ASTC_5x4_RGBA;
+      break;
+   case MESA_FORMAT_ASTC_5x5_SRGB8_ALPHA8:
+      format = MESA_FORMAT_ASTC_5x5_RGBA;
+      break;
+   case MESA_FORMAT_ASTC_6x5_SRGB8_ALPHA8:
+      format = MESA_FORMAT_ASTC_6x5_RGBA;
+      break;
+   case MESA_FORMAT_ASTC_6x6_SRGB8_ALPHA8:
+      format = MESA_FORMAT_ASTC_6x6_RGBA;
+      break;
+   case MESA_FORMAT_ASTC_8x5_SRGB8_ALPHA8:
+      format = MESA_FORMAT_ASTC_8x5_RGBA;
+      break;
+   case MESA_FORMAT_ASTC_8x6_SRGB8_ALPHA8:
+      format = MESA_FORMAT_ASTC_8x6_RGBA;
+      break;
+   case MESA_FORMAT_ASTC_8x8_SRGB8_ALPHA8:
+      format = MESA_FORMAT_ASTC_8x8_RGBA;
+      break;
+   case MESA_FORMAT_ASTC_10x5_SRGB8_ALPHA8:
+      format = MESA_FORMAT_ASTC_10x5_RGBA;
+      break;
+   case MESA_FORMAT_ASTC_10x6_SRGB8_ALPHA8:
+      format = MESA_FORMAT_ASTC_10x6_RGBA;
+      break;
+   case MESA_FORMAT_ASTC_10x8_SRGB8_ALPHA8:
+      format = MESA_FORMAT_ASTC_10x8_RGBA;
+      break;
+   case MESA_FORMAT_ASTC_10x10_SRGB8_ALPHA8:
+      format = MESA_FORMAT_ASTC_10x10_RGBA;
+      break;
+   case MESA_FORMAT_ASTC_12x10_SRGB8_ALPHA8:
+      format = MESA_FORMAT_ASTC_12x10_RGBA;
+      break;
+   case MESA_FORMAT_ASTC_12x12_SRGB8_ALPHA8:
+      format = MESA_FORMAT_ASTC_12x12_RGBA;
+      break;
    case MESA_FORMAT_B8G8R8X8_SRGB:
       format = MESA_FORMAT_B8G8R8X8_UNORM;
       break;
@@ -730,6 +772,36 @@ _mesa_get_uncompressed_format(mesa_format format)
    case MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT:
    case MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT:
       return MESA_FORMAT_RGB_FLOAT32;
+   case MESA_FORMAT_ASTC_4x4_RGBA:
+   case MESA_FORMAT_ASTC_5x4_RGBA:
+   case MESA_FORMAT_ASTC_5x5_RGBA:
+   case MESA_FORMAT_ASTC_6x5_RGBA:
+   case MESA_FORMAT_ASTC_6x6_RGBA:
+   case MESA_FORMAT_ASTC_8x5_RGBA:
+   case MESA_FORMAT_ASTC_8x6_RGBA:
+   case MESA_FORMAT_ASTC_8x8_RGBA:
+   case MESA_FORMAT_ASTC_10x5_RGBA:
+   case MESA_FORMAT_ASTC_10x6_RGBA:
+   case MESA_FORMAT_ASTC_10x8_RGBA:
+   case MESA_FORMAT_ASTC_10x10_RGBA:
+   case MESA_FORMAT_ASTC_12x10_RGBA:
+   case MESA_FORMAT_ASTC_12x12_RGBA:
+	return MESA_FORMAT_RGBA_FLOAT16;
+   case MESA_FORMAT_ASTC_4x4_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_5x4_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_5x5_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_6x5_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_6x6_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_8x5_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_8x6_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_8x8_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_10x5_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_10x6_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_10x8_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_10x10_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_12x10_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_12x12_SRGB8_ALPHA8:
+	return MESA_FORMAT_A8B8G8R8_SRGB;
    default:
 #ifdef DEBUG
       assert(!_mesa_is_format_compressed(format));
@@ -1242,6 +1314,34 @@ _mesa_format_to_type_and_comps(mesa_format format,
    case MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM:
    case MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT:
    case MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT:
+   case MESA_FORMAT_ASTC_4x4_RGBA:
+   case MESA_FORMAT_ASTC_5x4_RGBA:
+   case MESA_FORMAT_ASTC_5x5_RGBA:
+   case MESA_FORMAT_ASTC_6x5_RGBA:
+   case MESA_FORMAT_ASTC_6x6_RGBA:
+   case MESA_FORMAT_ASTC_8x5_RGBA:
+   case MESA_FORMAT_ASTC_8x6_RGBA:
+   case MESA_FORMAT_ASTC_8x8_RGBA:
+   case MESA_FORMAT_ASTC_10x5_RGBA:
+   case MESA_FORMAT_ASTC_10x6_RGBA:
+   case MESA_FORMAT_ASTC_10x8_RGBA:
+   case MESA_FORMAT_ASTC_10x10_RGBA:
+   case MESA_FORMAT_ASTC_12x10_RGBA:
+   case MESA_FORMAT_ASTC_12x12_RGBA:
+   case MESA_FORMAT_ASTC_4x4_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_5x4_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_5x5_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_6x5_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_6x6_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_8x5_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_8x6_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_8x8_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_10x5_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_10x6_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_10x8_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_10x10_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_12x10_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_12x12_SRGB8_ALPHA8:
       /* XXX generate error instead? */
       *datatype = GL_UNSIGNED_BYTE;
       *comps = 0;
@@ -1858,6 +1958,36 @@ _mesa_format_matches_format_and_type(mesa_format mesa_format,
    case MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT:
       return GL_FALSE;
 
+   case MESA_FORMAT_ASTC_4x4_RGBA:
+   case MESA_FORMAT_ASTC_5x4_RGBA:
+   case MESA_FORMAT_ASTC_5x5_RGBA:
+   case MESA_FORMAT_ASTC_6x5_RGBA:
+   case MESA_FORMAT_ASTC_6x6_RGBA:
+   case MESA_FORMAT_ASTC_8x5_RGBA:
+   case MESA_FORMAT_ASTC_8x6_RGBA:
+   case MESA_FORMAT_ASTC_8x8_RGBA:
+   case MESA_FORMAT_ASTC_10x5_RGBA:
+   case MESA_FORMAT_ASTC_10x6_RGBA:
+   case MESA_FORMAT_ASTC_10x8_RGBA:
+   case MESA_FORMAT_ASTC_10x10_RGBA:
+   case MESA_FORMAT_ASTC_12x10_RGBA:
+   case MESA_FORMAT_ASTC_12x12_RGBA:
+   case MESA_FORMAT_ASTC_4x4_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_5x4_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_5x5_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_6x5_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_6x6_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_8x5_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_8x6_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_8x8_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_10x5_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_10x6_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_10x8_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_10x10_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_12x10_SRGB8_ALPHA8:
+   case MESA_FORMAT_ASTC_12x12_SRGB8_ALPHA8:
+      return GL_FALSE;
+
    case MESA_FORMAT_RGBA_FLOAT32:
       return format == GL_RGBA && type == GL_FLOAT && !swapBytes;
    case MESA_FORMAT_RGBA_FLOAT16:
diff --git a/src/mesa/main/formats.csv b/src/mesa/main/formats.csv
index e159e7d..215dae2 100644
--- a/src/mesa/main/formats.csv
+++ b/src/mesa/main/formats.csv
@@ -301,3 +301,34 @@ MESA_FORMAT_BPTC_RGBA_UNORM               , bptc  , 4, 4, x128,     ,     ,
 MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM         , bptc  , 4, 4, x128,     ,     ,     , xyzw, srgb
 MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT         , bptc  , 4, 4, x128,     ,     ,     , xyz1, rgb
 MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT       , bptc  , 4, 4, x128,     ,     ,     , xyz1, rgb
+
+# ASTC compressed formats
+MESA_FORMAT_ASTC_4x4_RGBA                 , astc  , 4, 4, x128,     ,     ,     , xyzw, rgb
+MESA_FORMAT_ASTC_5x4_RGBA                 , astc  , 5, 4, x128,     ,     ,     , xyzw, rgb
+MESA_FORMAT_ASTC_5x5_RGBA                 , astc  , 5, 5, x128,     ,     ,     , xyzw, rgb
+MESA_FORMAT_ASTC_6x5_RGBA                 , astc  , 6, 5, x128,     ,     ,     , xyzw, rgb
+MESA_FORMAT_ASTC_6x6_RGBA                 , astc  , 6, 6, x128,     ,     ,     , xyzw, rgb
+MESA_FORMAT_ASTC_8x5_RGBA                 , astc  , 8, 5, x128,     ,     ,     , xyzw, rgb
+MESA_FORMAT_ASTC_8x6_RGBA                 , astc  , 8, 6, x128,     ,     ,     , xyzw, rgb
+MESA_FORMAT_ASTC_8x8_RGBA                 , astc  , 8, 8, x128,     ,     ,     , xyzw, rgb
+MESA_FORMAT_ASTC_10x5_RGBA                , astc  ,10, 5, x128,     ,     ,     , xyzw, rgb
+MESA_FORMAT_ASTC_10x6_RGBA                , astc  ,10, 6, x128,     ,     ,     , xyzw, rgb
+MESA_FORMAT_ASTC_10x8_RGBA                , astc  ,10, 8, x128,     ,     ,     , xyzw, rgb
+MESA_FORMAT_ASTC_10x10_RGBA               , astc  ,10,10, x128,     ,     ,     , xyzw, rgb
+MESA_FORMAT_ASTC_12x10_RGBA               , astc  ,12,10, x128,     ,     ,     , xyzw, rgb
+MESA_FORMAT_ASTC_12x12_RGBA               , astc  ,12,12, x128,     ,     ,     , xyzw, rgb
+
+MESA_FORMAT_ASTC_4x4_SRGB8_ALPHA8         , astc  , 4, 4, x128,     ,     ,     , xyzw, srgb
+MESA_FORMAT_ASTC_5x4_SRGB8_ALPHA8         , astc  , 5, 4, x128,     ,     ,     , xyzw, srgb
+MESA_FORMAT_ASTC_5x5_SRGB8_ALPHA8         , astc  , 5, 5, x128,     ,     ,     , xyzw, srgb
+MESA_FORMAT_ASTC_6x5_SRGB8_ALPHA8         , astc  , 6, 5, x128,     ,     ,     , xyzw, srgb
+MESA_FORMAT_ASTC_6x6_SRGB8_ALPHA8         , astc  , 6, 6, x128,     ,     ,     , xyzw, srgb
+MESA_FORMAT_ASTC_8x5_SRGB8_ALPHA8         , astc  , 8, 5, x128,     ,     ,     , xyzw, srgb
+MESA_FORMAT_ASTC_8x6_SRGB8_ALPHA8         , astc  , 8, 6, x128,     ,     ,     , xyzw, srgb
+MESA_FORMAT_ASTC_8x8_SRGB8_ALPHA8         , astc  , 8, 8, x128,     ,     ,     , xyzw, srgb
+MESA_FORMAT_ASTC_10x5_SRGB8_ALPHA8        , astc  ,10, 5, x128,     ,     ,     , xyzw, srgb
+MESA_FORMAT_ASTC_10x6_SRGB8_ALPHA8        , astc  ,10, 6, x128,     ,     ,     , xyzw, srgb
+MESA_FORMAT_ASTC_10x8_SRGB8_ALPHA8        , astc  ,10, 8, x128,     ,     ,     , xyzw, srgb
+MESA_FORMAT_ASTC_10x10_SRGB8_ALPHA8       , astc  ,10,10, x128,     ,     ,     , xyzw, srgb
+MESA_FORMAT_ASTC_12x10_SRGB8_ALPHA8       , astc  ,12,10, x128,     ,     ,     , xyzw, srgb
+MESA_FORMAT_ASTC_12x12_SRGB8_ALPHA8       , astc  ,12,12, x128,     ,     ,     , xyzw, srgb
diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h
index 7e451ca..ff95fe6 100644
--- a/src/mesa/main/formats.h
+++ b/src/mesa/main/formats.h
@@ -575,6 +575,36 @@ typedef enum
    MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT,
    MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT,
 
+   /* ASTC compressed formats */
+   MESA_FORMAT_ASTC_4x4_RGBA,
+   MESA_FORMAT_ASTC_5x4_RGBA,
+   MESA_FORMAT_ASTC_5x5_RGBA,
+   MESA_FORMAT_ASTC_6x5_RGBA,
+   MESA_FORMAT_ASTC_6x6_RGBA,
+   MESA_FORMAT_ASTC_8x5_RGBA,
+   MESA_FORMAT_ASTC_8x6_RGBA,
+   MESA_FORMAT_ASTC_8x8_RGBA,
+   MESA_FORMAT_ASTC_10x5_RGBA,
+   MESA_FORMAT_ASTC_10x6_RGBA,
+   MESA_FORMAT_ASTC_10x8_RGBA,
+   MESA_FORMAT_ASTC_10x10_RGBA,
+   MESA_FORMAT_ASTC_12x10_RGBA,
+   MESA_FORMAT_ASTC_12x12_RGBA,
+
+   MESA_FORMAT_ASTC_4x4_SRGB8_ALPHA8,
+   MESA_FORMAT_ASTC_5x4_SRGB8_ALPHA8,
+   MESA_FORMAT_ASTC_5x5_SRGB8_ALPHA8,
+   MESA_FORMAT_ASTC_6x5_SRGB8_ALPHA8,
+   MESA_FORMAT_ASTC_6x6_SRGB8_ALPHA8,
+   MESA_FORMAT_ASTC_8x5_SRGB8_ALPHA8,
+   MESA_FORMAT_ASTC_8x6_SRGB8_ALPHA8,
+   MESA_FORMAT_ASTC_8x8_SRGB8_ALPHA8,
+   MESA_FORMAT_ASTC_10x5_SRGB8_ALPHA8,
+   MESA_FORMAT_ASTC_10x6_SRGB8_ALPHA8,
+   MESA_FORMAT_ASTC_10x8_SRGB8_ALPHA8,
+   MESA_FORMAT_ASTC_10x10_SRGB8_ALPHA8,
+   MESA_FORMAT_ASTC_12x10_SRGB8_ALPHA8,
+   MESA_FORMAT_ASTC_12x12_SRGB8_ALPHA8,
    MESA_FORMAT_COUNT
 } mesa_format;
 
diff --git a/src/mesa/swrast/s_texfetch.c b/src/mesa/swrast/s_texfetch.c
index 1fe21c0..14e5293 100644
--- a/src/mesa/swrast/s_texfetch.c
+++ b/src/mesa/swrast/s_texfetch.c
@@ -551,7 +551,37 @@ texfetch_funcs[] =
       fetch_compressed,
       fetch_compressed,
       fetch_compressed
-   }
+   },
+
+   /* ASTC compressed formats */
+   FETCH_NULL(ASTC_4x4_RGBA),
+   FETCH_NULL(ASTC_5x4_RGBA),
+   FETCH_NULL(ASTC_5x5_RGBA),
+   FETCH_NULL(ASTC_6x5_RGBA),
+   FETCH_NULL(ASTC_6x6_RGBA),
+   FETCH_NULL(ASTC_8x5_RGBA),
+   FETCH_NULL(ASTC_8x6_RGBA),
+   FETCH_NULL(ASTC_8x8_RGBA),
+   FETCH_NULL(ASTC_10x5_RGBA),
+   FETCH_NULL(ASTC_10x6_RGBA),
+   FETCH_NULL(ASTC_10x8_RGBA),
+   FETCH_NULL(ASTC_10x10_RGBA),
+   FETCH_NULL(ASTC_12x10_RGBA),
+   FETCH_NULL(ASTC_12x12_RGBA),
+   FETCH_NULL(ASTC_4x4_SRGB8_ALPHA8),
+   FETCH_NULL(ASTC_5x4_SRGB8_ALPHA8),
+   FETCH_NULL(ASTC_5x5_SRGB8_ALPHA8),
+   FETCH_NULL(ASTC_6x5_SRGB8_ALPHA8),
+   FETCH_NULL(ASTC_6x6_SRGB8_ALPHA8),
+   FETCH_NULL(ASTC_8x5_SRGB8_ALPHA8),
+   FETCH_NULL(ASTC_8x6_SRGB8_ALPHA8),
+   FETCH_NULL(ASTC_8x8_SRGB8_ALPHA8),
+   FETCH_NULL(ASTC_10x5_SRGB8_ALPHA8),
+   FETCH_NULL(ASTC_10x6_SRGB8_ALPHA8),
+   FETCH_NULL(ASTC_10x8_SRGB8_ALPHA8),
+   FETCH_NULL(ASTC_10x10_SRGB8_ALPHA8),
+   FETCH_NULL(ASTC_12x10_SRGB8_ALPHA8),
+   FETCH_NULL(ASTC_12x12_SRGB8_ALPHA8)
 };
 
 
-- 
2.4.1



More information about the mesa-dev mailing list