u_format_s3tc.c revision 860c51d82711936d343b55aafb46befc8c032fe6
1/**************************************************************************
2 *
3 * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
4 * Copyright (c) 2008 VMware, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 *
23 **************************************************************************/
24
25#include "u_dl.h"
26#include "u_math.h"
27#include "u_format.h"
28#include "u_format_s3tc.h"
29
30
31#if defined(_WIN32) || defined(WIN32)
32#define DXTN_LIBNAME "dxtn.dll"
33#elif defined(__APPLE__)
34#define DXTN_LIBNAME "libtxc_dxtn.dylib"
35#else
36#define DXTN_LIBNAME "libtxc_dxtn.so"
37#endif
38
39
40static void
41util_format_dxt1_rgb_fetch_stub(int src_stride,
42                                const uint8_t *src,
43                                int col, int row,
44                                uint8_t *dst)
45{
46   assert(0);
47}
48
49
50static void
51util_format_dxt1_rgba_fetch_stub(int src_stride,
52                                 const uint8_t *src,
53                                 int col, int row,
54                                 uint8_t *dst )
55{
56   assert(0);
57}
58
59
60static void
61util_format_dxt3_rgba_fetch_stub(int src_stride,
62                                 const uint8_t *src,
63                                 int col, int row,
64                                 uint8_t *dst )
65{
66   assert(0);
67}
68
69
70static void
71util_format_dxt5_rgba_fetch_stub(int src_stride,
72                                 const uint8_t *src,
73                                 int col, int row,
74                                 uint8_t *dst )
75{
76   assert(0);
77}
78
79
80static void
81util_format_dxtn_pack_stub(int src_comps,
82                           int width, int height,
83                           const uint8_t *src,
84                           enum util_format_dxtn dst_format,
85                           uint8_t *dst,
86                           int dst_stride)
87{
88   assert(0);
89}
90
91
92boolean util_format_s3tc_enabled = FALSE;
93
94util_format_dxtn_fetch_t util_format_dxt1_rgb_fetch = util_format_dxt1_rgb_fetch_stub;
95util_format_dxtn_fetch_t util_format_dxt1_rgba_fetch = util_format_dxt1_rgba_fetch_stub;
96util_format_dxtn_fetch_t util_format_dxt3_rgba_fetch = util_format_dxt3_rgba_fetch_stub;
97util_format_dxtn_fetch_t util_format_dxt5_rgba_fetch = util_format_dxt5_rgba_fetch_stub;
98
99util_format_dxtn_pack_t util_format_dxtn_pack = util_format_dxtn_pack_stub;
100
101
102void
103util_format_s3tc_init(void)
104{
105   static boolean first_time = TRUE;
106   struct util_dl_library *library = NULL;
107   util_dl_proc fetch_2d_texel_rgb_dxt1;
108   util_dl_proc fetch_2d_texel_rgba_dxt1;
109   util_dl_proc fetch_2d_texel_rgba_dxt3;
110   util_dl_proc fetch_2d_texel_rgba_dxt5;
111   util_dl_proc tx_compress_dxtn;
112
113   if (!first_time)
114      return;
115   first_time = FALSE;
116
117   if (util_format_s3tc_enabled)
118      return;
119
120   library = util_dl_open(DXTN_LIBNAME);
121   if (!library) {
122      if (getenv("force_s3tc_enable") &&
123          !strcmp(getenv("force_s3tc_enable"), "true")) {
124         debug_printf("couldn't open " DXTN_LIBNAME ", enabling DXTn due to "
125            "force_s3tc_enable=true environment variable\n");
126         util_format_s3tc_enabled = TRUE;
127      } else {
128         debug_printf("couldn't open " DXTN_LIBNAME ", software DXTn "
129            "compression/decompression unavailable\n");
130      }
131      return;
132   }
133
134   fetch_2d_texel_rgb_dxt1 =
135         util_dl_get_proc_address(library, "fetch_2d_texel_rgb_dxt1");
136   fetch_2d_texel_rgba_dxt1 =
137         util_dl_get_proc_address(library, "fetch_2d_texel_rgba_dxt1");
138   fetch_2d_texel_rgba_dxt3 =
139         util_dl_get_proc_address(library, "fetch_2d_texel_rgba_dxt3");
140   fetch_2d_texel_rgba_dxt5 =
141         util_dl_get_proc_address(library, "fetch_2d_texel_rgba_dxt5");
142   tx_compress_dxtn =
143         util_dl_get_proc_address(library, "tx_compress_dxtn");
144
145   if (!util_format_dxt1_rgb_fetch ||
146       !util_format_dxt1_rgba_fetch ||
147       !util_format_dxt3_rgba_fetch ||
148       !util_format_dxt5_rgba_fetch ||
149       !util_format_dxtn_pack) {
150      debug_printf("couldn't reference all symbols in " DXTN_LIBNAME
151                   ", software DXTn compression/decompression "
152                   "unavailable\n");
153      util_dl_close(library);
154      return;
155   }
156
157   util_format_dxt1_rgb_fetch = (util_format_dxtn_fetch_t)fetch_2d_texel_rgb_dxt1;
158   util_format_dxt1_rgba_fetch = (util_format_dxtn_fetch_t)fetch_2d_texel_rgba_dxt1;
159   util_format_dxt3_rgba_fetch = (util_format_dxtn_fetch_t)fetch_2d_texel_rgba_dxt3;
160   util_format_dxt5_rgba_fetch = (util_format_dxtn_fetch_t)fetch_2d_texel_rgba_dxt5;
161   util_format_dxtn_pack = (util_format_dxtn_pack_t)tx_compress_dxtn;
162   util_format_s3tc_enabled = TRUE;
163}
164
165
166/*
167 * Pixel fetch.
168 */
169
170void
171util_format_dxt1_rgb_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
172{
173   util_format_dxt1_rgb_fetch(0, src, i, j, dst);
174}
175
176void
177util_format_dxt1_rgba_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
178{
179   util_format_dxt1_rgba_fetch(0, src, i, j, dst);
180}
181
182void
183util_format_dxt3_rgba_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
184{
185   util_format_dxt3_rgba_fetch(0, src, i, j, dst);
186}
187
188void
189util_format_dxt5_rgba_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
190{
191   util_format_dxt5_rgba_fetch(0, src, i, j, dst);
192}
193
194void
195util_format_dxt1_rgb_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
196{
197   uint8_t tmp[4];
198   util_format_dxt1_rgb_fetch(0, src, i, j, tmp);
199   dst[0] = ubyte_to_float(tmp[0]);
200   dst[1] = ubyte_to_float(tmp[1]);
201   dst[2] = ubyte_to_float(tmp[2]);
202   dst[3] = 1.0;
203}
204
205void
206util_format_dxt1_rgba_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
207{
208   uint8_t tmp[4];
209   util_format_dxt1_rgba_fetch(0, src, i, j, tmp);
210   dst[0] = ubyte_to_float(tmp[0]);
211   dst[1] = ubyte_to_float(tmp[1]);
212   dst[2] = ubyte_to_float(tmp[2]);
213   dst[3] = ubyte_to_float(tmp[3]);
214}
215
216void
217util_format_dxt3_rgba_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
218{
219   uint8_t tmp[4];
220   util_format_dxt3_rgba_fetch(0, src, i, j, tmp);
221   dst[0] = ubyte_to_float(tmp[0]);
222   dst[1] = ubyte_to_float(tmp[1]);
223   dst[2] = ubyte_to_float(tmp[2]);
224   dst[3] = ubyte_to_float(tmp[3]);
225}
226
227void
228util_format_dxt5_rgba_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
229{
230   uint8_t tmp[4];
231   util_format_dxt5_rgba_fetch(0, src, i, j, tmp);
232   dst[0] = ubyte_to_float(tmp[0]);
233   dst[1] = ubyte_to_float(tmp[1]);
234   dst[2] = ubyte_to_float(tmp[2]);
235   dst[3] = ubyte_to_float(tmp[3]);
236}
237
238
239/*
240 * Block decompression.
241 */
242
243static INLINE void
244util_format_dxtn_rgb_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
245                                        const uint8_t *src_row, unsigned src_stride,
246                                        unsigned width, unsigned height,
247                                        util_format_dxtn_fetch_t fetch,
248                                        unsigned block_size)
249{
250   const unsigned bw = 4, bh = 4, comps = 4;
251   unsigned x, y, i, j;
252   for(y = 0; y < height; y += bh) {
253      const uint8_t *src = src_row;
254      for(x = 0; x < width; x += bw) {
255         for(j = 0; j < bh; ++j) {
256            for(i = 0; i < bw; ++i) {
257               uint8_t *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*comps;
258               fetch(0, src, i, j, dst);
259            }
260         }
261         src += block_size;
262      }
263      src_row += src_stride;
264   }
265}
266
267void
268util_format_dxt1_rgb_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
269                                        const uint8_t *src_row, unsigned src_stride,
270                                        unsigned width, unsigned height)
271{
272   util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row, dst_stride,
273                                           src_row, src_stride,
274                                           width, height,
275                                           util_format_dxt1_rgb_fetch, 8);
276}
277
278void
279util_format_dxt1_rgba_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
280                                         const uint8_t *src_row, unsigned src_stride,
281                                         unsigned width, unsigned height)
282{
283   util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row, dst_stride,
284                                           src_row, src_stride,
285                                           width, height,
286                                           util_format_dxt1_rgba_fetch, 8);
287}
288
289void
290util_format_dxt3_rgba_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
291                                         const uint8_t *src_row, unsigned src_stride,
292                                         unsigned width, unsigned height)
293{
294   util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row, dst_stride,
295                                           src_row, src_stride,
296                                           width, height,
297                                           util_format_dxt3_rgba_fetch, 16);
298}
299
300void
301util_format_dxt5_rgba_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
302                                         const uint8_t *src_row, unsigned src_stride,
303                                         unsigned width, unsigned height)
304{
305   util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row, dst_stride,
306                                           src_row, src_stride,
307                                           width, height,
308                                           util_format_dxt5_rgba_fetch, 16);
309}
310
311static INLINE void
312util_format_dxtn_rgb_unpack_rgba_float(float *dst_row, unsigned dst_stride,
313                                       const uint8_t *src_row, unsigned src_stride,
314                                       unsigned width, unsigned height,
315                                       util_format_dxtn_fetch_t fetch,
316                                       unsigned block_size)
317{
318   unsigned x, y, i, j;
319   for(y = 0; y < height; y += 4) {
320      const uint8_t *src = src_row;
321      for(x = 0; x < width; x += 4) {
322         for(j = 0; j < 4; ++j) {
323            for(i = 0; i < 4; ++i) {
324               float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
325               uint8_t tmp[4];
326               fetch(0, src, i, j, tmp);
327               dst[0] = ubyte_to_float(tmp[0]);
328               dst[1] = ubyte_to_float(tmp[1]);
329               dst[2] = ubyte_to_float(tmp[2]);
330               dst[3] = ubyte_to_float(tmp[3]);
331            }
332         }
333         src += block_size;
334      }
335      src_row += src_stride;
336   }
337}
338
339void
340util_format_dxt1_rgb_unpack_rgba_float(float *dst_row, unsigned dst_stride,
341                                       const uint8_t *src_row, unsigned src_stride,
342                                       unsigned width, unsigned height)
343{
344   util_format_dxtn_rgb_unpack_rgba_float(dst_row, dst_stride,
345                                          src_row, src_stride,
346                                          width, height,
347                                          util_format_dxt1_rgb_fetch, 8);
348}
349
350void
351util_format_dxt1_rgba_unpack_rgba_float(float *dst_row, unsigned dst_stride,
352                                        const uint8_t *src_row, unsigned src_stride,
353                                        unsigned width, unsigned height)
354{
355   util_format_dxtn_rgb_unpack_rgba_float(dst_row, dst_stride,
356                                          src_row, src_stride,
357                                          width, height,
358                                          util_format_dxt1_rgba_fetch, 8);
359}
360
361void
362util_format_dxt3_rgba_unpack_rgba_float(float *dst_row, unsigned dst_stride,
363                                        const uint8_t *src_row, unsigned src_stride,
364                                        unsigned width, unsigned height)
365{
366   util_format_dxtn_rgb_unpack_rgba_float(dst_row, dst_stride,
367                                          src_row, src_stride,
368                                          width, height,
369                                          util_format_dxt3_rgba_fetch, 16);
370}
371
372void
373util_format_dxt5_rgba_unpack_rgba_float(float *dst_row, unsigned dst_stride,
374                                        const uint8_t *src_row, unsigned src_stride,
375                                        unsigned width, unsigned height)
376{
377   util_format_dxtn_rgb_unpack_rgba_float(dst_row, dst_stride,
378                                          src_row, src_stride,
379                                          width, height,
380                                          util_format_dxt5_rgba_fetch, 16);
381}
382
383
384/*
385 * Block compression.
386 */
387
388void
389util_format_dxt1_rgb_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
390                                      const uint8_t *src, unsigned src_stride,
391                                      unsigned width, unsigned height)
392{
393   const unsigned bw = 4, bh = 4, bytes_per_block = 8;
394   unsigned x, y, i, j, k;
395   for(y = 0; y < height; y += bh) {
396      uint8_t *dst = dst_row;
397      for(x = 0; x < width; x += bw) {
398         uint8_t tmp[4][4][3];  /* [bh][bw][comps] */
399         for(j = 0; j < bh; ++j) {
400            for(i = 0; i < bw; ++i) {
401               for(k = 0; k < 3; ++k) {
402                  tmp[j][i][k] = src[(y + j)*src_stride/sizeof(*src) + (x + i)*4 + k];
403               }
404            }
405         }
406         util_format_dxtn_pack(3, 4, 4, &tmp[0][0][0], UTIL_FORMAT_DXT1_RGB, dst, 0);
407         dst += bytes_per_block;
408      }
409      dst_row += dst_stride / sizeof(*dst_row);
410   }
411}
412
413void
414util_format_dxt1_rgba_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
415                                       const uint8_t *src, unsigned src_stride,
416                                       unsigned width, unsigned height)
417{
418   const unsigned bw = 4, bh = 4, comps = 4, bytes_per_block = 8;
419   unsigned x, y, i, j, k;
420   for(y = 0; y < height; y += bh) {
421      uint8_t *dst = dst_row;
422      for(x = 0; x < width; x += bw) {
423         uint8_t tmp[4][4][4];  /* [bh][bw][comps] */
424         for(j = 0; j < bh; ++j) {
425            for(i = 0; i < bw; ++i) {
426               for(k = 0; k < comps; ++k) {
427                  tmp[j][i][k] = src[(y + j)*src_stride/sizeof(*src) + (x + i)*comps + k];
428               }
429            }
430         }
431         util_format_dxtn_pack(4, 4, 4, &tmp[0][0][0], UTIL_FORMAT_DXT1_RGBA, dst, 0);
432         dst += bytes_per_block;
433      }
434      dst_row += dst_stride / sizeof(*dst_row);
435   }
436}
437
438void
439util_format_dxt3_rgba_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
440                                       const uint8_t *src, unsigned src_stride,
441                                       unsigned width, unsigned height)
442{
443   const unsigned bw = 4, bh = 4, comps = 4, bytes_per_block = 16;
444   unsigned x, y, i, j, k;
445   for(y = 0; y < height; y += bh) {
446      uint8_t *dst = dst_row;
447      for(x = 0; x < width; x += bw) {
448         uint8_t tmp[4][4][4];  /* [bh][bw][comps] */
449         for(j = 0; j < bh; ++j) {
450            for(i = 0; i < bw; ++i) {
451               for(k = 0; k < comps; ++k) {
452                  tmp[j][i][k] = src[(y + j)*src_stride/sizeof(*src) + (x + i)*comps + k];
453               }
454            }
455         }
456         util_format_dxtn_pack(4, 4, 4, &tmp[0][0][0], UTIL_FORMAT_DXT3_RGBA, dst, 0);
457         dst += bytes_per_block;
458      }
459      dst_row += dst_stride / sizeof(*dst_row);
460   }
461}
462
463void
464util_format_dxt5_rgba_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
465                                       const uint8_t *src, unsigned src_stride,
466                                       unsigned width, unsigned height)
467{
468   const unsigned bw = 4, bh = 4, comps = 4, bytes_per_block = 16;
469   unsigned x, y, i, j, k;
470
471   for(y = 0; y < height; y += bh) {
472      uint8_t *dst = dst_row;
473      for(x = 0; x < width; x += bw) {
474         uint8_t tmp[4][4][4];  /* [bh][bw][comps] */
475         for(j = 0; j < bh; ++j) {
476            for(i = 0; i < bw; ++i) {
477               for(k = 0; k < comps; ++k) {
478                  tmp[j][i][k] = src[(y + j)*src_stride/sizeof(*src) + (x + i)*comps + k];
479               }
480            }
481         }
482         util_format_dxtn_pack(4, 4, 4, &tmp[0][0][0], UTIL_FORMAT_DXT5_RGBA, dst, 0);
483         dst += bytes_per_block;
484      }
485      dst_row += dst_stride / sizeof(*dst_row);
486   }
487}
488
489void
490util_format_dxt1_rgb_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride,
491                                     const float *src, unsigned src_stride,
492                                     unsigned width, unsigned height)
493{
494   unsigned x, y, i, j, k;
495   for(y = 0; y < height; y += 4) {
496      uint8_t *dst = dst_row;
497      for(x = 0; x < width; x += 4) {
498         uint8_t tmp[4][4][3];
499         for(j = 0; j < 4; ++j) {
500            for(i = 0; i < 4; ++i) {
501               for(k = 0; k < 3; ++k) {
502                  tmp[j][i][k] = float_to_ubyte(src[(y + j)*src_stride/sizeof(*src) + (x+i)*4 + k]);
503               }
504            }
505         }
506         util_format_dxtn_pack(3, 4, 4, &tmp[0][0][0], UTIL_FORMAT_DXT1_RGB, dst, 0);
507         dst += 8;
508      }
509      dst_row += 4*dst_stride/sizeof(*dst_row);
510   }
511}
512
513void
514util_format_dxt1_rgba_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride,
515                                      const float *src, unsigned src_stride,
516                                      unsigned width, unsigned height)
517{
518   unsigned x, y, i, j, k;
519   for(y = 0; y < height; y += 4) {
520      uint8_t *dst = dst_row;
521      for(x = 0; x < width; x += 4) {
522         uint8_t tmp[4][4][4];
523         for(j = 0; j < 4; ++j) {
524            for(i = 0; i < 4; ++i) {
525               for(k = 0; k < 4; ++k) {
526                  tmp[j][i][k] = float_to_ubyte(src[(y + j)*src_stride/sizeof(*src) + (x+i)*4 + k]);
527               }
528            }
529         }
530         util_format_dxtn_pack(4, 4, 4, &tmp[0][0][0], UTIL_FORMAT_DXT1_RGBA, dst, 0);
531         dst += 8;
532      }
533      dst_row += 4*dst_stride/sizeof(*dst_row);
534   }
535}
536
537void
538util_format_dxt3_rgba_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride,
539                                      const float *src, unsigned src_stride,
540                                      unsigned width, unsigned height)
541{
542   unsigned x, y, i, j, k;
543   for(y = 0; y < height; y += 4) {
544      uint8_t *dst = dst_row;
545      for(x = 0; x < width; x += 4) {
546         uint8_t tmp[4][4][4];
547         for(j = 0; j < 4; ++j) {
548            for(i = 0; i < 4; ++i) {
549               for(k = 0; k < 4; ++k) {
550                  tmp[j][i][k] = float_to_ubyte(src[(y + j)*src_stride/sizeof(*src) + (x+i)*4 + k]);
551               }
552            }
553         }
554         util_format_dxtn_pack(4, 4, 4, &tmp[0][0][0], UTIL_FORMAT_DXT3_RGBA, dst, 0);
555         dst += 16;
556      }
557      dst_row += 4*dst_stride/sizeof(*dst_row);
558   }
559}
560
561void
562util_format_dxt5_rgba_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride,
563                                      const float *src, unsigned src_stride,
564                                      unsigned width, unsigned height)
565{
566   unsigned x, y, i, j, k;
567   for(y = 0; y < height; y += 4) {
568      uint8_t *dst = dst_row;
569      for(x = 0; x < width; x += 4) {
570         uint8_t tmp[4][4][4];
571         for(j = 0; j < 4; ++j) {
572            for(i = 0; i < 4; ++i) {
573               for(k = 0; k < 4; ++k) {
574                  tmp[j][i][k] = float_to_ubyte(src[(y + j)*src_stride/sizeof(*src) + (x+i)*4 + k]);
575               }
576            }
577         }
578         util_format_dxtn_pack(4, 4, 4, &tmp[0][0][0], UTIL_FORMAT_DXT5_RGBA, dst, 0);
579         dst += 16;
580      }
581      dst_row += 4*dst_stride/sizeof(*dst_row);
582   }
583}
584
585
586/*
587 * SRGB variants.
588 *
589 * FIXME: shunts to RGB for now
590 */
591
592void
593util_format_dxt1_srgb_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
594{
595   util_format_dxt1_rgb_unpack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
596}
597
598void
599util_format_dxt1_srgb_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
600{
601   util_format_dxt1_rgb_pack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
602}
603
604void
605util_format_dxt1_srgb_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
606{
607   util_format_dxt1_rgb_fetch_rgba_8unorm(dst, src, i, j);
608}
609
610void
611util_format_dxt1_srgba_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
612{
613   util_format_dxt1_rgba_unpack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
614}
615
616void
617util_format_dxt1_srgba_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
618{
619   util_format_dxt1_rgba_pack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
620}
621
622void
623util_format_dxt1_srgba_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
624{
625   util_format_dxt1_rgba_fetch_rgba_8unorm(dst, src, i, j);
626}
627
628void
629util_format_dxt3_srgba_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
630{
631   util_format_dxt3_rgba_unpack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
632}
633
634void
635util_format_dxt3_srgba_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
636{
637   util_format_dxt3_rgba_pack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
638}
639
640void
641util_format_dxt3_srgba_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
642{
643   util_format_dxt3_rgba_fetch_rgba_8unorm(dst, src, i, j);
644}
645
646void
647util_format_dxt5_srgba_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
648{
649   util_format_dxt5_rgba_unpack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
650}
651
652void
653util_format_dxt5_srgba_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
654{
655   util_format_dxt5_rgba_pack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
656}
657
658void
659util_format_dxt5_srgba_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
660{
661   util_format_dxt5_rgba_fetch_rgba_8unorm(dst, src, i, j);
662}
663
664void
665util_format_dxt1_srgb_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
666{
667   util_format_dxt1_rgb_unpack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height);
668}
669
670void
671util_format_dxt1_srgb_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
672{
673   util_format_dxt1_rgb_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height);
674}
675
676void
677util_format_dxt1_srgb_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
678{
679   util_format_dxt1_rgb_fetch_rgba_float(dst, src, i, j);
680}
681
682void
683util_format_dxt1_srgba_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
684{
685   util_format_dxt1_rgba_unpack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height);
686}
687
688void
689util_format_dxt1_srgba_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
690{
691   util_format_dxt1_rgba_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height);
692}
693
694void
695util_format_dxt1_srgba_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
696{
697   util_format_dxt1_rgba_fetch_rgba_float(dst, src, i, j);
698}
699
700void
701util_format_dxt3_srgba_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
702{
703   util_format_dxt3_rgba_unpack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height);
704}
705
706void
707util_format_dxt3_srgba_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
708{
709   util_format_dxt3_rgba_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height);
710}
711
712void
713util_format_dxt3_srgba_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
714{
715   util_format_dxt3_rgba_fetch_rgba_float(dst, src, i, j);
716}
717
718void
719util_format_dxt5_srgba_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
720{
721   util_format_dxt5_rgba_unpack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height);
722}
723
724void
725util_format_dxt5_srgba_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
726{
727   util_format_dxt5_rgba_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height);
728}
729
730void
731util_format_dxt5_srgba_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
732{
733   util_format_dxt5_rgba_fetch_rgba_float(dst, src, i, j);
734}
735
736