mesa: make _mesa_lookup_list() non-static
[mesa.git] / src / mesa / main / texcompress_etc.c
index 7c8287bfba7076b1ab8179e881c0fdf7aa4abbe7..a06d29f19aa04d3eeaf54d6acc6668a2385c46a4 100644 (file)
  * GL_COMPRESSED_SIGNED_R11_EAC
  * GL_COMPRESSED_SIGNED_RG11_EAC
  * MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1
+ * MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1
  */
 
 #include <stdbool.h>
-#include "mfeatures.h"
 #include "texcompress.h"
 #include "texcompress_etc.h"
 #include "texstore.h"
 #include "macros.h"
-#include "swrast/s_context.h"
 #include "format_unpack.h"
 
+
 struct etc2_block {
    int distance;
    uint64_t pixel_indices[2];
@@ -112,25 +112,6 @@ _mesa_texstore_etc1_rgb8(TEXSTORE_PARAMS)
    return GL_FALSE;
 }
 
-void
-_mesa_fetch_texel_2d_f_etc1_rgb8(const struct swrast_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   struct etc1_block block;
-   GLubyte dst[3];
-   const GLubyte *src;
-
-   src = (const GLubyte *) texImage->Map +
-      (((texImage->RowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
-
-   etc1_parse_block(&block, src);
-   etc1_fetch_texel(&block, i % 4, j % 4, dst);
-
-   texel[RCOMP] = UBYTE_TO_FLOAT(dst[0]);
-   texel[GCOMP] = UBYTE_TO_FLOAT(dst[1]);
-   texel[BCOMP] = UBYTE_TO_FLOAT(dst[2]);
-   texel[ACOMP] = 1.0f;
-}
 
 /**
  * Decode texture data in format `MESA_FORMAT_ETC1_RGB8` to
@@ -230,7 +211,7 @@ etc2_base_color1_h_mode(const uint8_t *in, GLuint index)
       break;
    }
    return ((x << 4) | (x & 0xf));
- }
+}
 
 static uint8_t
 etc2_base_color2_h_mode(const uint8_t *in, GLuint index)
@@ -252,7 +233,7 @@ etc2_base_color2_h_mode(const uint8_t *in, GLuint index)
       break;
    }
    return ((x << 4) | (x & 0xf));
- }
+}
 
 static uint8_t
 etc2_base_color_o_planar(const uint8_t *in, GLuint index)
@@ -410,9 +391,10 @@ etc2_rgb8_parse_block(struct etc2_block *block,
       }
    }
    else if (G_plus_dG < 0 || G_plus_dG > 31){
+      int base_color_1_value, base_color_2_value;
+
       /* H mode */
       block->is_h_mode = true;
-      int base_color_1_value, base_color_2_value;
 
       for(i = 0; i < 3; i++) {
          block->base_colors[0][i] = etc2_base_color1_h_mode(src, i);
@@ -466,7 +448,7 @@ etc2_rgb8_parse_block(struct etc2_block *block,
           */
          block->base_colors[0][i] = etc1_base_color_diff_hi(src[i]);
          block->base_colors[1][i] = etc1_base_color_diff_lo(src[i]);
-     }
+      }
    }
 
    if (block->is_ind_mode || block->is_diff_mode) {
@@ -754,10 +736,10 @@ etc2_unpack_srgb8(uint8_t *dst_row,
             }
          }
          src += bs;
-       }
+      }
 
       src_row += src_stride;
-    }
+   }
 }
 
 static void
@@ -790,10 +772,10 @@ etc2_unpack_rgba8(uint8_t *dst_row,
             }
          }
          src += bs;
-       }
+      }
 
       src_row += src_stride;
-    }
+   }
 }
 
 static void
@@ -834,10 +816,10 @@ etc2_unpack_srgb8_alpha8(uint8_t *dst_row,
             }
          }
          src += bs;
-       }
+      }
 
       src_row += src_stride;
-    }
+   }
 }
 
 static void
@@ -869,10 +851,10 @@ etc2_unpack_r11(uint8_t *dst_row,
             }
          }
          src += bs;
-       }
+      }
 
       src_row += src_stride;
-    }
+   }
 }
 
 static void
@@ -917,10 +899,10 @@ etc2_unpack_rg11(uint8_t *dst_row,
             }
          }
          src += bs;
-       }
+      }
 
       src_row += src_stride;
-    }
+   }
 }
 
 static void
@@ -953,10 +935,10 @@ etc2_unpack_signed_r11(uint8_t *dst_row,
             }
          }
          src += bs;
-       }
+      }
 
       src_row += src_stride;
-    }
+   }
 }
 
 static void
@@ -1001,10 +983,10 @@ etc2_unpack_signed_rg11(uint8_t *dst_row,
             }
          }
          src += bs;
-       }
+      }
 
       src_row += src_stride;
-    }
+   }
 }
 
 static void
@@ -1041,6 +1023,47 @@ etc2_unpack_rgb8_punchthrough_alpha1(uint8_t *dst_row,
    }
 }
 
+static void
+etc2_unpack_srgb8_punchthrough_alpha1(uint8_t *dst_row,
+                                     unsigned dst_stride,
+                                     const uint8_t *src_row,
+                                     unsigned src_stride,
+                                     unsigned width,
+                                     unsigned height)
+{
+   const unsigned bw = 4, bh = 4, bs = 8, comps = 4;
+   struct etc2_block block;
+   unsigned x, y, i, j;
+   uint8_t tmp;
+
+   for (y = 0; y < height; y += bh) {
+      const uint8_t *src = src_row;
+
+      for (x = 0; x < width; x+= bw) {
+         etc2_rgb8_parse_block(&block, src,
+                               true /* punchthrough_alpha */);
+         for (j = 0; j < bh; j++) {
+            uint8_t *dst = dst_row + (y + j) * dst_stride + x * comps;
+            for (i = 0; i < bw; i++) {
+               etc2_rgb8_fetch_texel(&block, i, j, dst,
+                                     true /* punchthrough_alpha */);
+               /* Convert to MESA_FORMAT_SARGB8 */
+               tmp = dst[0];
+               dst[0] = dst[2];
+               dst[2] = tmp;
+               dst[3] = dst[3];
+
+               dst += comps;
+            }
+         }
+
+         src += bs;
+      }
+
+      src_row += src_stride;
+   }
+}
+
 /* ETC2 texture formats are valid in glCompressedTexImage2D and
  * glCompressedTexSubImage2D functions */
 GLboolean
@@ -1115,16 +1138,119 @@ _mesa_texstore_etc2_rgb8_punchthrough_alpha1(TEXSTORE_PARAMS)
    return GL_FALSE;
 }
 
+GLboolean
+_mesa_texstore_etc2_srgb8_punchthrough_alpha1(TEXSTORE_PARAMS)
+{
+   ASSERT(0);
+
+   return GL_FALSE;
+}
+
+
+/**
+ * Decode texture data in any one of following formats:
+ * `MESA_FORMAT_ETC2_RGB8`
+ * `MESA_FORMAT_ETC2_SRGB8`
+ * `MESA_FORMAT_ETC2_RGBA8_EAC`
+ * `MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC`
+ * `MESA_FORMAT_ETC2_R11_EAC`
+ * `MESA_FORMAT_ETC2_RG11_EAC`
+ * `MESA_FORMAT_ETC2_SIGNED_R11_EAC`
+ * `MESA_FORMAT_ETC2_SIGNED_RG11_EAC`
+ * `MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1`
+ * `MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1`
+ *
+ * The size of the source data must be a multiple of the ETC2 block size
+ * even if the texture image's dimensions are not aligned to 4.
+ *
+ * \param src_width in pixels
+ * \param src_height in pixels
+ * \param dst_stride in bytes
+ */
+
 void
-_mesa_fetch_texel_2d_f_etc2_rgb8(const struct swrast_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, GLfloat *texel)
+_mesa_unpack_etc2_format(uint8_t *dst_row,
+                         unsigned dst_stride,
+                         const uint8_t *src_row,
+                         unsigned src_stride,
+                         unsigned src_width,
+                         unsigned src_height,
+                         gl_format format)
+{
+   if (format == MESA_FORMAT_ETC2_RGB8)
+      etc2_unpack_rgb8(dst_row, dst_stride,
+                       src_row, src_stride,
+                       src_width, src_height);
+   else if (format == MESA_FORMAT_ETC2_SRGB8)
+      etc2_unpack_srgb8(dst_row, dst_stride,
+                        src_row, src_stride,
+                        src_width, src_height);
+   else if (format == MESA_FORMAT_ETC2_RGBA8_EAC)
+      etc2_unpack_rgba8(dst_row, dst_stride,
+                        src_row, src_stride,
+                        src_width, src_height);
+   else if (format == MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC)
+      etc2_unpack_srgb8_alpha8(dst_row, dst_stride,
+                               src_row, src_stride,
+                               src_width, src_height);
+   else if (format == MESA_FORMAT_ETC2_R11_EAC)
+      etc2_unpack_r11(dst_row, dst_stride,
+                      src_row, src_stride,
+                      src_width, src_height);
+   else if (format == MESA_FORMAT_ETC2_RG11_EAC)
+      etc2_unpack_rg11(dst_row, dst_stride,
+                       src_row, src_stride,
+                       src_width, src_height);
+   else if (format == MESA_FORMAT_ETC2_SIGNED_R11_EAC)
+      etc2_unpack_signed_r11(dst_row, dst_stride,
+                             src_row, src_stride,
+                             src_width, src_height);
+   else if (format == MESA_FORMAT_ETC2_SIGNED_RG11_EAC)
+      etc2_unpack_signed_rg11(dst_row, dst_stride,
+                              src_row, src_stride,
+                              src_width, src_height);
+   else if (format == MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1)
+      etc2_unpack_rgb8_punchthrough_alpha1(dst_row, dst_stride,
+                                           src_row, src_stride,
+                                           src_width, src_height);
+   else if (format == MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1)
+      etc2_unpack_srgb8_punchthrough_alpha1(dst_row, dst_stride,
+                                            src_row, src_stride,
+                                            src_width, src_height);
+}
+
+
+
+static void
+fetch_etc1_rgb8(const GLubyte *map,
+                GLint rowStride, GLint i, GLint j,
+                GLfloat *texel)
+{
+   struct etc1_block block;
+   GLubyte dst[3];
+   const GLubyte *src;
+
+   src = map + (((rowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
+
+   etc1_parse_block(&block, src);
+   etc1_fetch_texel(&block, i % 4, j % 4, dst);
+
+   texel[RCOMP] = UBYTE_TO_FLOAT(dst[0]);
+   texel[GCOMP] = UBYTE_TO_FLOAT(dst[1]);
+   texel[BCOMP] = UBYTE_TO_FLOAT(dst[2]);
+   texel[ACOMP] = 1.0f;
+}
+
+
+static void
+fetch_etc2_rgb8(const GLubyte *map,
+                GLint rowStride, GLint i, GLint j, GLfloat *texel)
 {
    struct etc2_block block;
    uint8_t dst[3];
    const uint8_t *src;
 
-   src = texImage->Map +
-      (((texImage->RowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
+   src = map + (((rowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
 
    etc2_rgb8_parse_block(&block, src,
                          false /* punchthrough_alpha */);
@@ -1137,16 +1263,15 @@ _mesa_fetch_texel_2d_f_etc2_rgb8(const struct swrast_texture_image *texImage,
    texel[ACOMP] = 1.0f;
 }
 
-void
-_mesa_fetch_texel_2d_f_etc2_srgb8(const struct swrast_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, GLfloat *texel)
+static void
+fetch_etc2_srgb8(const GLubyte *map,
+                 GLint rowStride, GLint i, GLint j, GLfloat *texel)
 {
    struct etc2_block block;
    uint8_t dst[3];
    const uint8_t *src;
 
-   src = texImage->Map +
-      (((texImage->RowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
+   src = map + (((rowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
 
    etc2_rgb8_parse_block(&block, src,
                          false /* punchthrough_alpha */);
@@ -1159,16 +1284,15 @@ _mesa_fetch_texel_2d_f_etc2_srgb8(const struct swrast_texture_image *texImage,
    texel[ACOMP] = 1.0f;
 }
 
-void
-_mesa_fetch_texel_2d_f_etc2_rgba8_eac(const struct swrast_texture_image *texImage,
-                                      GLint i, GLint j, GLint k, GLfloat *texel)
+static void
+fetch_etc2_rgba8_eac(const GLubyte *map,
+                     GLint rowStride, GLint i, GLint j, GLfloat *texel)
 {
    struct etc2_block block;
    uint8_t dst[4];
    const uint8_t *src;
 
-   src = texImage->Map +
-      (((texImage->RowStride + 3) / 4) * (j / 4) + (i / 4)) * 16;
+   src = map + (((rowStride + 3) / 4) * (j / 4) + (i / 4)) * 16;
 
    etc2_rgba8_parse_block(&block, src);
    etc2_rgba8_fetch_texel(&block, i % 4, j % 4, dst);
@@ -1179,18 +1303,15 @@ _mesa_fetch_texel_2d_f_etc2_rgba8_eac(const struct swrast_texture_image *texImag
    texel[ACOMP] = UBYTE_TO_FLOAT(dst[3]);
 }
 
-void
-_mesa_fetch_texel_2d_f_etc2_srgb8_alpha8_eac(const struct
-                                             swrast_texture_image *texImage,
-                                             GLint i, GLint j,
-                                             GLint k, GLfloat *texel)
+static void
+fetch_etc2_srgb8_alpha8_eac(const GLubyte *map,
+                            GLint rowStride, GLint i, GLint j, GLfloat *texel)
 {
    struct etc2_block block;
    uint8_t dst[4];
    const uint8_t *src;
 
-   src = texImage->Map +
-      (((texImage->RowStride + 3) / 4) * (j / 4) + (i / 4)) * 16;
+   src = map + (((rowStride + 3) / 4) * (j / 4) + (i / 4)) * 16;
 
    etc2_rgba8_parse_block(&block, src);
    etc2_rgba8_fetch_texel(&block, i % 4, j % 4, dst);
@@ -1201,16 +1322,15 @@ _mesa_fetch_texel_2d_f_etc2_srgb8_alpha8_eac(const struct
    texel[ACOMP] = UBYTE_TO_FLOAT(dst[3]);
 }
 
-void
-_mesa_fetch_texel_2d_f_etc2_r11_eac(const struct swrast_texture_image *texImage,
-                                    GLint i, GLint j, GLint k, GLfloat *texel)
+static void
+fetch_etc2_r11_eac(const GLubyte *map,
+                   GLint rowStride, GLint i, GLint j, GLfloat *texel)
 {
    struct etc2_block block;
    GLushort dst;
    const uint8_t *src;
 
-   src = texImage->Map +
-      (((texImage->RowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
+   src = map + (((rowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
 
    etc2_r11_parse_block(&block, src);
    etc2_r11_fetch_texel(&block, i % 4, j % 4, (uint8_t *)&dst);
@@ -1221,18 +1341,15 @@ _mesa_fetch_texel_2d_f_etc2_r11_eac(const struct swrast_texture_image *texImage,
    texel[ACOMP] = 1.0f;
 }
 
-void
-_mesa_fetch_texel_2d_f_etc2_rg11_eac(const struct
-                                     swrast_texture_image *texImage,
-                                     GLint i, GLint j,
-                                     GLint k, GLfloat *texel)
+static void
+fetch_etc2_rg11_eac(const GLubyte *map,
+                    GLint rowStride, GLint i, GLint j, GLfloat *texel)
 {
    struct etc2_block block;
    GLushort dst[2];
    const uint8_t *src;
 
-   src = texImage->Map +
-      (((texImage->RowStride + 3) / 4) * (j / 4) + (i / 4)) * 16;
+   src = map + (((rowStride + 3) / 4) * (j / 4) + (i / 4)) * 16;
 
    /* red component */
    etc2_r11_parse_block(&block, src);
@@ -1248,16 +1365,15 @@ _mesa_fetch_texel_2d_f_etc2_rg11_eac(const struct
    texel[ACOMP] = 1.0f;
 }
 
-void
-_mesa_fetch_texel_2d_f_etc2_signed_r11_eac(const struct swrast_texture_image *texImage,
-                                           GLint i, GLint j, GLint k, GLfloat *texel)
+static void
+fetch_etc2_signed_r11_eac(const GLubyte *map,
+                          GLint rowStride, GLint i, GLint j, GLfloat *texel)
 {
    struct etc2_block block;
    GLushort dst;
    const uint8_t *src;
 
-   src = texImage->Map +
-      (((texImage->RowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
+   src = map + (((rowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
 
    etc2_r11_parse_block(&block, src);
    etc2_signed_r11_fetch_texel(&block, i % 4, j % 4, (uint8_t *)&dst);
@@ -1268,16 +1384,15 @@ _mesa_fetch_texel_2d_f_etc2_signed_r11_eac(const struct swrast_texture_image *te
    texel[ACOMP] = 1.0f;
 }
 
-void
-_mesa_fetch_texel_2d_f_etc2_signed_rg11_eac(const struct swrast_texture_image *texImage,
-                                            GLint i, GLint j, GLint k, GLfloat *texel)
+static void
+fetch_etc2_signed_rg11_eac(const GLubyte *map,
+                           GLint rowStride, GLint i, GLint j, GLfloat *texel)
 {
    struct etc2_block block;
    GLushort dst[2];
    const uint8_t *src;
 
-   src = texImage->Map +
-      (((texImage->RowStride + 3) / 4) * (j / 4) + (i / 4)) * 16;
+   src = map + (((rowStride + 3) / 4) * (j / 4) + (i / 4)) * 16;
 
    /* red component */
    etc2_r11_parse_block(&block, src);
@@ -1293,18 +1408,16 @@ _mesa_fetch_texel_2d_f_etc2_signed_rg11_eac(const struct swrast_texture_image *t
    texel[ACOMP] = 1.0f;
 }
 
-void
-_mesa_fetch_texel_2d_f_etc2_rgb8_punchthrough_alpha1(
-   const struct swrast_texture_image *texImage,
-   GLint i, GLint j,
-   GLint k, GLfloat *texel)
+static void
+fetch_etc2_rgb8_punchthrough_alpha1(const GLubyte *map,
+                                    GLint rowStride, GLint i, GLint j,
+                                    GLfloat *texel)
 {
    struct etc2_block block;
    uint8_t dst[4];
    const uint8_t *src;
 
-   src = texImage->Map +
-      (((texImage->RowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
+   src = map + (((rowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
 
    etc2_rgb8_parse_block(&block, src,
                          true /* punchthrough alpha */);
@@ -1316,69 +1429,55 @@ _mesa_fetch_texel_2d_f_etc2_rgb8_punchthrough_alpha1(
    texel[ACOMP] = UBYTE_TO_FLOAT(dst[3]);
 }
 
-/**
- * Decode texture data in any one of following formats:
- * `MESA_FORMAT_ETC2_RGB8`
- * `MESA_FORMAT_ETC2_SRGB8`
- * `MESA_FORMAT_ETC2_RGBA8_EAC`
- * `MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC`
- * `MESA_FORMAT_ETC2_R11_EAC`
- * `MESA_FORMAT_ETC2_RG11_EAC`
- * `MESA_FORMAT_ETC2_SIGNED_R11_EAC`
- * `MESA_FORMAT_ETC2_SIGNED_RG11_EAC`
- * `MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1`
- *
- * The size of the source data must be a multiple of the ETC2 block size
- * even if the texture image's dimensions are not aligned to 4.
- *
- * \param src_width in pixels
- * \param src_height in pixels
- * \param dst_stride in bytes
- */
+static void
+fetch_etc2_srgb8_punchthrough_alpha1(const GLubyte *map,
+                                     GLint rowStride,
+                                     GLint i, GLint j, GLfloat *texel)
+{
+   struct etc2_block block;
+   uint8_t dst[4];
+   const uint8_t *src;
 
-void
-_mesa_unpack_etc2_format(uint8_t *dst_row,
-                         unsigned dst_stride,
-                         const uint8_t *src_row,
-                         unsigned src_stride,
-                         unsigned src_width,
-                         unsigned src_height,
-                         gl_format format)
+   src = map + (((rowStride + 3) / 4) * (j / 4) + (i / 4)) * 8;
+
+   etc2_rgb8_parse_block(&block, src,
+                         true /* punchthrough alpha */);
+   etc2_rgb8_fetch_texel(&block, i % 4, j % 4, dst,
+                         true /* punchthrough alpha */);
+   texel[RCOMP] = _mesa_nonlinear_to_linear(dst[0]);
+   texel[GCOMP] = _mesa_nonlinear_to_linear(dst[1]);
+   texel[BCOMP] = _mesa_nonlinear_to_linear(dst[2]);
+   texel[ACOMP] = UBYTE_TO_FLOAT(dst[3]);
+}
+
+
+compressed_fetch_func
+_mesa_get_etc_fetch_func(gl_format format)
 {
-   if (format == MESA_FORMAT_ETC2_RGB8)
-      etc2_unpack_rgb8(dst_row, dst_stride,
-                       src_row, src_stride,
-                       src_width, src_height);
-   else if (format == MESA_FORMAT_ETC2_SRGB8)
-      etc2_unpack_srgb8(dst_row, dst_stride,
-                        src_row, src_stride,
-                        src_width, src_height);
-   else if (format == MESA_FORMAT_ETC2_RGBA8_EAC)
-      etc2_unpack_rgba8(dst_row, dst_stride,
-                        src_row, src_stride,
-                        src_width, src_height);
-   else if (format == MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC)
-      etc2_unpack_srgb8_alpha8(dst_row, dst_stride,
-                               src_row, src_stride,
-                               src_width, src_height);
-   else if (format == MESA_FORMAT_ETC2_R11_EAC)
-      etc2_unpack_r11(dst_row, dst_stride,
-                      src_row, src_stride,
-                      src_width, src_height);
-   else if (format == MESA_FORMAT_ETC2_RG11_EAC)
-      etc2_unpack_rg11(dst_row, dst_stride,
-                       src_row, src_stride,
-                       src_width, src_height);
-   else if (format == MESA_FORMAT_ETC2_SIGNED_R11_EAC)
-      etc2_unpack_signed_r11(dst_row, dst_stride,
-                             src_row, src_stride,
-                             src_width, src_height);
-   else if (format == MESA_FORMAT_ETC2_SIGNED_RG11_EAC)
-      etc2_unpack_signed_rg11(dst_row, dst_stride,
-                              src_row, src_stride,
-                              src_width, src_height);
-   else if (format == MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1)
-      etc2_unpack_rgb8_punchthrough_alpha1(dst_row, dst_stride,
-                                           src_row, src_stride,
-                                           src_width, src_height);
+   switch (format) {
+   case MESA_FORMAT_ETC1_RGB8:
+      return fetch_etc1_rgb8;
+   case MESA_FORMAT_ETC2_RGB8:
+      return fetch_etc2_rgb8;
+   case MESA_FORMAT_ETC2_SRGB8:
+      return fetch_etc2_srgb8;
+   case MESA_FORMAT_ETC2_RGBA8_EAC:
+      return fetch_etc2_rgba8_eac;
+   case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
+      return fetch_etc2_srgb8_alpha8_eac;
+   case MESA_FORMAT_ETC2_R11_EAC:
+      return fetch_etc2_r11_eac;
+   case MESA_FORMAT_ETC2_RG11_EAC:
+      return fetch_etc2_rg11_eac;
+   case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
+      return fetch_etc2_signed_r11_eac;
+   case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
+      return fetch_etc2_signed_rg11_eac;
+   case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
+      return fetch_etc2_rgb8_punchthrough_alpha1;
+   case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
+      return fetch_etc2_srgb8_punchthrough_alpha1;
+   default:
+      return NULL;
+   }
 }