1 /**************************************************************************
3 * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
4 * Copyright (c) 2008 VMware, Inc.
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:
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
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 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
24 **************************************************************************/
29 #include "u_format_s3tc.h"
30 #include "util/format_srgb.h"
33 #if defined(_WIN32) || defined(WIN32)
34 #define DXTN_LIBNAME "dxtn.dll"
35 #elif defined(__CYGWIN__)
36 #define DXTN_LIBNAME "cygtxc_dxtn.dll"
37 #elif defined(__APPLE__)
38 #define DXTN_LIBNAME "libtxc_dxtn.dylib"
40 #define DXTN_LIBNAME "libtxc_dxtn.so"
45 util_format_dxt1_rgb_fetch_stub(int src_stride
,
55 util_format_dxt1_rgba_fetch_stub(int src_stride
,
65 util_format_dxt3_rgba_fetch_stub(int src_stride
,
75 util_format_dxt5_rgba_fetch_stub(int src_stride
,
85 util_format_dxtn_pack_stub(int src_comps
,
86 int width
, int height
,
88 enum util_format_dxtn dst_format
,
96 boolean util_format_s3tc_enabled
= FALSE
;
98 util_format_dxtn_fetch_t util_format_dxt1_rgb_fetch
= util_format_dxt1_rgb_fetch_stub
;
99 util_format_dxtn_fetch_t util_format_dxt1_rgba_fetch
= util_format_dxt1_rgba_fetch_stub
;
100 util_format_dxtn_fetch_t util_format_dxt3_rgba_fetch
= util_format_dxt3_rgba_fetch_stub
;
101 util_format_dxtn_fetch_t util_format_dxt5_rgba_fetch
= util_format_dxt5_rgba_fetch_stub
;
103 util_format_dxtn_pack_t util_format_dxtn_pack
= util_format_dxtn_pack_stub
;
107 util_format_s3tc_init(void)
109 static boolean first_time
= TRUE
;
110 struct util_dl_library
*library
= NULL
;
111 util_dl_proc fetch_2d_texel_rgb_dxt1
;
112 util_dl_proc fetch_2d_texel_rgba_dxt1
;
113 util_dl_proc fetch_2d_texel_rgba_dxt3
;
114 util_dl_proc fetch_2d_texel_rgba_dxt5
;
115 util_dl_proc tx_compress_dxtn
;
121 if (util_format_s3tc_enabled
)
124 library
= util_dl_open(DXTN_LIBNAME
);
126 debug_printf("couldn't open " DXTN_LIBNAME
", software DXTn "
127 "compression/decompression unavailable\n");
131 fetch_2d_texel_rgb_dxt1
=
132 util_dl_get_proc_address(library
, "fetch_2d_texel_rgb_dxt1");
133 fetch_2d_texel_rgba_dxt1
=
134 util_dl_get_proc_address(library
, "fetch_2d_texel_rgba_dxt1");
135 fetch_2d_texel_rgba_dxt3
=
136 util_dl_get_proc_address(library
, "fetch_2d_texel_rgba_dxt3");
137 fetch_2d_texel_rgba_dxt5
=
138 util_dl_get_proc_address(library
, "fetch_2d_texel_rgba_dxt5");
140 util_dl_get_proc_address(library
, "tx_compress_dxtn");
142 if (!util_format_dxt1_rgb_fetch
||
143 !util_format_dxt1_rgba_fetch
||
144 !util_format_dxt3_rgba_fetch
||
145 !util_format_dxt5_rgba_fetch
||
146 !util_format_dxtn_pack
) {
147 debug_printf("couldn't reference all symbols in " DXTN_LIBNAME
148 ", software DXTn compression/decompression "
150 util_dl_close(library
);
154 util_format_dxt1_rgb_fetch
= (util_format_dxtn_fetch_t
)fetch_2d_texel_rgb_dxt1
;
155 util_format_dxt1_rgba_fetch
= (util_format_dxtn_fetch_t
)fetch_2d_texel_rgba_dxt1
;
156 util_format_dxt3_rgba_fetch
= (util_format_dxtn_fetch_t
)fetch_2d_texel_rgba_dxt3
;
157 util_format_dxt5_rgba_fetch
= (util_format_dxtn_fetch_t
)fetch_2d_texel_rgba_dxt5
;
158 util_format_dxtn_pack
= (util_format_dxtn_pack_t
)tx_compress_dxtn
;
159 util_format_s3tc_enabled
= TRUE
;
168 util_format_dxt1_rgb_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
170 util_format_dxt1_rgb_fetch(0, src
, i
, j
, dst
);
174 util_format_dxt1_rgba_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
176 util_format_dxt1_rgba_fetch(0, src
, i
, j
, dst
);
180 util_format_dxt3_rgba_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
182 util_format_dxt3_rgba_fetch(0, src
, i
, j
, dst
);
186 util_format_dxt5_rgba_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
188 util_format_dxt5_rgba_fetch(0, src
, i
, j
, dst
);
192 util_format_dxt1_rgb_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
195 util_format_dxt1_rgb_fetch(0, src
, i
, j
, tmp
);
196 dst
[0] = ubyte_to_float(tmp
[0]);
197 dst
[1] = ubyte_to_float(tmp
[1]);
198 dst
[2] = ubyte_to_float(tmp
[2]);
203 util_format_dxt1_rgba_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
206 util_format_dxt1_rgba_fetch(0, src
, i
, j
, tmp
);
207 dst
[0] = ubyte_to_float(tmp
[0]);
208 dst
[1] = ubyte_to_float(tmp
[1]);
209 dst
[2] = ubyte_to_float(tmp
[2]);
210 dst
[3] = ubyte_to_float(tmp
[3]);
214 util_format_dxt3_rgba_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
217 util_format_dxt3_rgba_fetch(0, src
, i
, j
, tmp
);
218 dst
[0] = ubyte_to_float(tmp
[0]);
219 dst
[1] = ubyte_to_float(tmp
[1]);
220 dst
[2] = ubyte_to_float(tmp
[2]);
221 dst
[3] = ubyte_to_float(tmp
[3]);
225 util_format_dxt5_rgba_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
228 util_format_dxt5_rgba_fetch(0, src
, i
, j
, tmp
);
229 dst
[0] = ubyte_to_float(tmp
[0]);
230 dst
[1] = ubyte_to_float(tmp
[1]);
231 dst
[2] = ubyte_to_float(tmp
[2]);
232 dst
[3] = ubyte_to_float(tmp
[3]);
237 * Block decompression.
241 util_format_dxtn_rgb_unpack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
242 const uint8_t *src_row
, unsigned src_stride
,
243 unsigned width
, unsigned height
,
244 util_format_dxtn_fetch_t fetch
,
245 unsigned block_size
, boolean srgb
)
247 const unsigned bw
= 4, bh
= 4, comps
= 4;
249 for(y
= 0; y
< height
; y
+= bh
) {
250 const uint8_t *src
= src_row
;
251 for(x
= 0; x
< width
; x
+= bw
) {
252 for(j
= 0; j
< bh
; ++j
) {
253 for(i
= 0; i
< bw
; ++i
) {
254 uint8_t *dst
= dst_row
+ (y
+ j
)*dst_stride
/sizeof(*dst_row
) + (x
+ i
)*comps
;
255 fetch(0, src
, i
, j
, dst
);
257 dst
[0] = util_format_srgb_to_linear_8unorm(dst
[0]);
258 dst
[1] = util_format_srgb_to_linear_8unorm(dst
[1]);
259 dst
[2] = util_format_srgb_to_linear_8unorm(dst
[2]);
265 src_row
+= src_stride
;
270 util_format_dxt1_rgb_unpack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
271 const uint8_t *src_row
, unsigned src_stride
,
272 unsigned width
, unsigned height
)
274 util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row
, dst_stride
,
277 util_format_dxt1_rgb_fetch
,
282 util_format_dxt1_rgba_unpack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
283 const uint8_t *src_row
, unsigned src_stride
,
284 unsigned width
, unsigned height
)
286 util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row
, dst_stride
,
289 util_format_dxt1_rgba_fetch
,
294 util_format_dxt3_rgba_unpack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
295 const uint8_t *src_row
, unsigned src_stride
,
296 unsigned width
, unsigned height
)
298 util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row
, dst_stride
,
301 util_format_dxt3_rgba_fetch
,
306 util_format_dxt5_rgba_unpack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
307 const uint8_t *src_row
, unsigned src_stride
,
308 unsigned width
, unsigned height
)
310 util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row
, dst_stride
,
313 util_format_dxt5_rgba_fetch
,
318 util_format_dxtn_rgb_unpack_rgba_float(float *dst_row
, unsigned dst_stride
,
319 const uint8_t *src_row
, unsigned src_stride
,
320 unsigned width
, unsigned height
,
321 util_format_dxtn_fetch_t fetch
,
322 unsigned block_size
, boolean srgb
)
325 for(y
= 0; y
< height
; y
+= 4) {
326 const uint8_t *src
= src_row
;
327 for(x
= 0; x
< width
; x
+= 4) {
328 for(j
= 0; j
< 4; ++j
) {
329 for(i
= 0; i
< 4; ++i
) {
330 float *dst
= dst_row
+ (y
+ j
)*dst_stride
/sizeof(*dst_row
) + (x
+ i
)*4;
332 fetch(0, src
, i
, j
, tmp
);
334 dst
[0] = util_format_srgb_8unorm_to_linear_float(tmp
[0]);
335 dst
[1] = util_format_srgb_8unorm_to_linear_float(tmp
[1]);
336 dst
[2] = util_format_srgb_8unorm_to_linear_float(tmp
[2]);
339 dst
[0] = ubyte_to_float(tmp
[0]);
340 dst
[1] = ubyte_to_float(tmp
[1]);
341 dst
[2] = ubyte_to_float(tmp
[2]);
343 dst
[3] = ubyte_to_float(tmp
[3]);
348 src_row
+= src_stride
;
353 util_format_dxt1_rgb_unpack_rgba_float(float *dst_row
, unsigned dst_stride
,
354 const uint8_t *src_row
, unsigned src_stride
,
355 unsigned width
, unsigned height
)
357 util_format_dxtn_rgb_unpack_rgba_float(dst_row
, dst_stride
,
360 util_format_dxt1_rgb_fetch
,
365 util_format_dxt1_rgba_unpack_rgba_float(float *dst_row
, unsigned dst_stride
,
366 const uint8_t *src_row
, unsigned src_stride
,
367 unsigned width
, unsigned height
)
369 util_format_dxtn_rgb_unpack_rgba_float(dst_row
, dst_stride
,
372 util_format_dxt1_rgba_fetch
,
377 util_format_dxt3_rgba_unpack_rgba_float(float *dst_row
, unsigned dst_stride
,
378 const uint8_t *src_row
, unsigned src_stride
,
379 unsigned width
, unsigned height
)
381 util_format_dxtn_rgb_unpack_rgba_float(dst_row
, dst_stride
,
384 util_format_dxt3_rgba_fetch
,
389 util_format_dxt5_rgba_unpack_rgba_float(float *dst_row
, unsigned dst_stride
,
390 const uint8_t *src_row
, unsigned src_stride
,
391 unsigned width
, unsigned height
)
393 util_format_dxtn_rgb_unpack_rgba_float(dst_row
, dst_stride
,
396 util_format_dxt5_rgba_fetch
,
406 util_format_dxtn_pack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
407 const uint8_t *src
, unsigned src_stride
,
408 unsigned width
, unsigned height
,
409 enum util_format_dxtn format
,
410 unsigned block_size
, boolean srgb
)
412 const unsigned bw
= 4, bh
= 4, comps
= 4;
413 unsigned x
, y
, i
, j
, k
;
414 for(y
= 0; y
< height
; y
+= bh
) {
415 uint8_t *dst
= dst_row
;
416 for(x
= 0; x
< width
; x
+= bw
) {
417 uint8_t tmp
[4][4][4]; /* [bh][bw][comps] */
418 for(j
= 0; j
< bh
; ++j
) {
419 for(i
= 0; i
< bw
; ++i
) {
421 for(k
= 0; k
< 3; ++k
) {
422 src_tmp
= src
[(y
+ j
)*src_stride
/sizeof(*src
) + (x
+i
)*comps
+ k
];
424 tmp
[j
][i
][k
] = util_format_linear_to_srgb_8unorm(src_tmp
);
427 tmp
[j
][i
][k
] = src_tmp
;
430 /* for sake of simplicity there's an unneeded 4th component for dxt1_rgb */
431 tmp
[j
][i
][3] = src
[(y
+ j
)*src_stride
/sizeof(*src
) + (x
+i
)*comps
+ 3];
434 /* even for dxt1_rgb have 4 src comps */
435 util_format_dxtn_pack(4, 4, 4, &tmp
[0][0][0], format
, dst
, 0);
438 dst_row
+= dst_stride
/ sizeof(*dst_row
);
444 util_format_dxt1_rgb_pack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
445 const uint8_t *src
, unsigned src_stride
,
446 unsigned width
, unsigned height
)
448 util_format_dxtn_pack_rgba_8unorm(dst_row
, dst_stride
, src
, src_stride
,
449 width
, height
, UTIL_FORMAT_DXT1_RGB
,
454 util_format_dxt1_rgba_pack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
455 const uint8_t *src
, unsigned src_stride
,
456 unsigned width
, unsigned height
)
458 util_format_dxtn_pack_rgba_8unorm(dst_row
, dst_stride
, src
, src_stride
,
459 width
, height
, UTIL_FORMAT_DXT1_RGBA
,
464 util_format_dxt3_rgba_pack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
465 const uint8_t *src
, unsigned src_stride
,
466 unsigned width
, unsigned height
)
468 util_format_dxtn_pack_rgba_8unorm(dst_row
, dst_stride
, src
, src_stride
,
469 width
, height
, UTIL_FORMAT_DXT3_RGBA
,
474 util_format_dxt5_rgba_pack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
475 const uint8_t *src
, unsigned src_stride
,
476 unsigned width
, unsigned height
)
478 util_format_dxtn_pack_rgba_8unorm(dst_row
, dst_stride
, src
, src_stride
,
479 width
, height
, UTIL_FORMAT_DXT5_RGBA
,
484 util_format_dxtn_pack_rgba_float(uint8_t *dst_row
, unsigned dst_stride
,
485 const float *src
, unsigned src_stride
,
486 unsigned width
, unsigned height
,
487 enum util_format_dxtn format
,
488 unsigned block_size
, boolean srgb
)
490 unsigned x
, y
, i
, j
, k
;
491 for(y
= 0; y
< height
; y
+= 4) {
492 uint8_t *dst
= dst_row
;
493 for(x
= 0; x
< width
; x
+= 4) {
494 uint8_t tmp
[4][4][4];
495 for(j
= 0; j
< 4; ++j
) {
496 for(i
= 0; i
< 4; ++i
) {
498 for(k
= 0; k
< 3; ++k
) {
499 src_tmp
= src
[(y
+ j
)*src_stride
/sizeof(*src
) + (x
+i
)*4 + k
];
501 tmp
[j
][i
][k
] = util_format_linear_float_to_srgb_8unorm(src_tmp
);
504 tmp
[j
][i
][k
] = float_to_ubyte(src_tmp
);
507 /* for sake of simplicity there's an unneeded 4th component for dxt1_rgb */
508 src_tmp
= src
[(y
+ j
)*src_stride
/sizeof(*src
) + (x
+i
)*4 + 3];
509 tmp
[j
][i
][3] = float_to_ubyte(src_tmp
);
512 util_format_dxtn_pack(4, 4, 4, &tmp
[0][0][0], format
, dst
, 0);
515 dst_row
+= 4*dst_stride
/sizeof(*dst_row
);
520 util_format_dxt1_rgb_pack_rgba_float(uint8_t *dst_row
, unsigned dst_stride
,
521 const float *src
, unsigned src_stride
,
522 unsigned width
, unsigned height
)
524 util_format_dxtn_pack_rgba_float(dst_row
, dst_stride
, src
, src_stride
,
525 width
, height
, UTIL_FORMAT_DXT1_RGB
,
530 util_format_dxt1_rgba_pack_rgba_float(uint8_t *dst_row
, unsigned dst_stride
,
531 const float *src
, unsigned src_stride
,
532 unsigned width
, unsigned height
)
534 util_format_dxtn_pack_rgba_float(dst_row
, dst_stride
, src
, src_stride
,
535 width
, height
, UTIL_FORMAT_DXT1_RGBA
,
540 util_format_dxt3_rgba_pack_rgba_float(uint8_t *dst_row
, unsigned dst_stride
,
541 const float *src
, unsigned src_stride
,
542 unsigned width
, unsigned height
)
544 util_format_dxtn_pack_rgba_float(dst_row
, dst_stride
, src
, src_stride
,
545 width
, height
, UTIL_FORMAT_DXT3_RGBA
,
550 util_format_dxt5_rgba_pack_rgba_float(uint8_t *dst_row
, unsigned dst_stride
,
551 const float *src
, unsigned src_stride
,
552 unsigned width
, unsigned height
)
554 util_format_dxtn_pack_rgba_float(dst_row
, dst_stride
, src
, src_stride
,
555 width
, height
, UTIL_FORMAT_DXT5_RGBA
,
565 util_format_dxt1_srgb_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
568 util_format_dxt1_rgb_fetch(0, src
, i
, j
, tmp
);
569 dst
[0] = util_format_srgb_to_linear_8unorm(tmp
[0]);
570 dst
[1] = util_format_srgb_to_linear_8unorm(tmp
[1]);
571 dst
[2] = util_format_srgb_to_linear_8unorm(tmp
[2]);
576 util_format_dxt1_srgba_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
579 util_format_dxt1_rgba_fetch(0, src
, i
, j
, tmp
);
580 dst
[0] = util_format_srgb_to_linear_8unorm(tmp
[0]);
581 dst
[1] = util_format_srgb_to_linear_8unorm(tmp
[1]);
582 dst
[2] = util_format_srgb_to_linear_8unorm(tmp
[2]);
587 util_format_dxt3_srgba_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
590 util_format_dxt3_rgba_fetch(0, src
, i
, j
, tmp
);
591 dst
[0] = util_format_srgb_to_linear_8unorm(tmp
[0]);
592 dst
[1] = util_format_srgb_to_linear_8unorm(tmp
[1]);
593 dst
[2] = util_format_srgb_to_linear_8unorm(tmp
[2]);
598 util_format_dxt5_srgba_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
601 util_format_dxt5_rgba_fetch(0, src
, i
, j
, tmp
);
602 dst
[0] = util_format_srgb_to_linear_8unorm(tmp
[0]);
603 dst
[1] = util_format_srgb_to_linear_8unorm(tmp
[1]);
604 dst
[2] = util_format_srgb_to_linear_8unorm(tmp
[2]);
609 util_format_dxt1_srgb_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
612 util_format_dxt1_rgb_fetch(0, src
, i
, j
, tmp
);
613 dst
[0] = util_format_srgb_8unorm_to_linear_float(tmp
[0]);
614 dst
[1] = util_format_srgb_8unorm_to_linear_float(tmp
[1]);
615 dst
[2] = util_format_srgb_8unorm_to_linear_float(tmp
[2]);
620 util_format_dxt1_srgba_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
623 util_format_dxt1_rgba_fetch(0, src
, i
, j
, tmp
);
624 dst
[0] = util_format_srgb_8unorm_to_linear_float(tmp
[0]);
625 dst
[1] = util_format_srgb_8unorm_to_linear_float(tmp
[1]);
626 dst
[2] = util_format_srgb_8unorm_to_linear_float(tmp
[2]);
627 dst
[3] = ubyte_to_float(tmp
[3]);
631 util_format_dxt3_srgba_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
634 util_format_dxt3_rgba_fetch(0, src
, i
, j
, tmp
);
635 dst
[0] = util_format_srgb_8unorm_to_linear_float(tmp
[0]);
636 dst
[1] = util_format_srgb_8unorm_to_linear_float(tmp
[1]);
637 dst
[2] = util_format_srgb_8unorm_to_linear_float(tmp
[2]);
638 dst
[3] = ubyte_to_float(tmp
[3]);
642 util_format_dxt5_srgba_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
645 util_format_dxt5_rgba_fetch(0, src
, i
, j
, tmp
);
646 dst
[0] = util_format_srgb_8unorm_to_linear_float(tmp
[0]);
647 dst
[1] = util_format_srgb_8unorm_to_linear_float(tmp
[1]);
648 dst
[2] = util_format_srgb_8unorm_to_linear_float(tmp
[2]);
649 dst
[3] = ubyte_to_float(tmp
[3]);
653 util_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
)
655 util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row
, dst_stride
,
658 util_format_dxt1_rgb_fetch
,
663 util_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
)
665 util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row
, dst_stride
,
668 util_format_dxt1_rgba_fetch
,
673 util_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
)
675 util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row
, dst_stride
,
678 util_format_dxt3_rgba_fetch
,
683 util_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
)
685 util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row
, dst_stride
,
688 util_format_dxt5_rgba_fetch
,
693 util_format_dxt1_srgb_unpack_rgba_float(float *dst_row
, unsigned dst_stride
, const uint8_t *src_row
, unsigned src_stride
, unsigned width
, unsigned height
)
695 util_format_dxtn_rgb_unpack_rgba_float(dst_row
, dst_stride
,
698 util_format_dxt1_rgb_fetch
,
703 util_format_dxt1_srgba_unpack_rgba_float(float *dst_row
, unsigned dst_stride
, const uint8_t *src_row
, unsigned src_stride
, unsigned width
, unsigned height
)
705 util_format_dxtn_rgb_unpack_rgba_float(dst_row
, dst_stride
,
708 util_format_dxt1_rgba_fetch
,
713 util_format_dxt3_srgba_unpack_rgba_float(float *dst_row
, unsigned dst_stride
, const uint8_t *src_row
, unsigned src_stride
, unsigned width
, unsigned height
)
715 util_format_dxtn_rgb_unpack_rgba_float(dst_row
, dst_stride
,
718 util_format_dxt3_rgba_fetch
,
723 util_format_dxt5_srgba_unpack_rgba_float(float *dst_row
, unsigned dst_stride
, const uint8_t *src_row
, unsigned src_stride
, unsigned width
, unsigned height
)
725 util_format_dxtn_rgb_unpack_rgba_float(dst_row
, dst_stride
,
728 util_format_dxt5_rgba_fetch
,
733 util_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
)
735 util_format_dxtn_pack_rgba_8unorm(dst_row
, dst_stride
, src_row
, src_stride
,
736 width
, height
, UTIL_FORMAT_DXT1_RGB
,
741 util_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
)
743 util_format_dxtn_pack_rgba_8unorm(dst_row
, dst_stride
, src_row
, src_stride
,
744 width
, height
, UTIL_FORMAT_DXT1_RGBA
,
749 util_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
)
751 util_format_dxtn_pack_rgba_8unorm(dst_row
, dst_stride
, src_row
, src_stride
,
752 width
, height
, UTIL_FORMAT_DXT3_RGBA
,
757 util_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
)
759 util_format_dxtn_pack_rgba_8unorm(dst_row
, dst_stride
, src_row
, src_stride
,
760 width
, height
, UTIL_FORMAT_DXT5_RGBA
,
765 util_format_dxt1_srgb_pack_rgba_float(uint8_t *dst_row
, unsigned dst_stride
, const float *src_row
, unsigned src_stride
, unsigned width
, unsigned height
)
767 util_format_dxtn_pack_rgba_float(dst_row
, dst_stride
, src_row
, src_stride
,
768 width
, height
, UTIL_FORMAT_DXT1_RGB
,
773 util_format_dxt1_srgba_pack_rgba_float(uint8_t *dst_row
, unsigned dst_stride
, const float *src_row
, unsigned src_stride
, unsigned width
, unsigned height
)
775 util_format_dxtn_pack_rgba_float(dst_row
, dst_stride
, src_row
, src_stride
,
776 width
, height
, UTIL_FORMAT_DXT1_RGBA
,
781 util_format_dxt3_srgba_pack_rgba_float(uint8_t *dst_row
, unsigned dst_stride
, const float *src_row
, unsigned src_stride
, unsigned width
, unsigned height
)
783 util_format_dxtn_pack_rgba_float(dst_row
, dst_stride
, src_row
, src_stride
,
784 width
, height
, UTIL_FORMAT_DXT3_RGBA
,
789 util_format_dxt5_srgba_pack_rgba_float(uint8_t *dst_row
, unsigned dst_stride
, const float *src_row
, unsigned src_stride
, unsigned width
, unsigned height
)
791 util_format_dxtn_pack_rgba_float(dst_row
, dst_stride
, src_row
, src_stride
,
792 width
, height
, UTIL_FORMAT_DXT5_RGBA
,