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 * 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.
23 **************************************************************************/
28 #include "u_format_s3tc.h"
31 #if defined(_WIN32) || defined(WIN32)
32 #define DXTN_LIBNAME "dxtn.dll"
33 #elif defined(__APPLE__)
34 #define DXTN_LIBNAME "libtxc_dxtn.dylib"
36 #define DXTN_LIBNAME "libtxc_dxtn.so"
41 util_format_dxt1_rgb_fetch_stub(int src_stride
,
51 util_format_dxt1_rgba_fetch_stub(int src_stride
,
61 util_format_dxt3_rgba_fetch_stub(int src_stride
,
71 util_format_dxt5_rgba_fetch_stub(int src_stride
,
81 util_format_dxtn_pack_stub(int src_comps
,
82 int width
, int height
,
84 enum util_format_dxtn dst_format
,
92 boolean util_format_s3tc_enabled
= FALSE
;
94 util_format_dxtn_fetch_t util_format_dxt1_rgb_fetch
= util_format_dxt1_rgb_fetch_stub
;
95 util_format_dxtn_fetch_t util_format_dxt1_rgba_fetch
= util_format_dxt1_rgba_fetch_stub
;
96 util_format_dxtn_fetch_t util_format_dxt3_rgba_fetch
= util_format_dxt3_rgba_fetch_stub
;
97 util_format_dxtn_fetch_t util_format_dxt5_rgba_fetch
= util_format_dxt5_rgba_fetch_stub
;
99 util_format_dxtn_pack_t util_format_dxtn_pack
= util_format_dxtn_pack_stub
;
103 util_format_s3tc_init(void)
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 char *force_s3tc_enable
;
118 if (util_format_s3tc_enabled
)
121 library
= util_dl_open(DXTN_LIBNAME
);
123 if ((force_s3tc_enable
= getenv("force_s3tc_enable")) &&
124 !strcmp(force_s3tc_enable
, "true")) {
125 debug_printf("couldn't open " DXTN_LIBNAME
", enabling DXTn due to "
126 "force_s3tc_enable=true environment variable\n");
127 util_format_s3tc_enabled
= TRUE
;
129 debug_printf("couldn't open " DXTN_LIBNAME
", software DXTn "
130 "compression/decompression unavailable\n");
135 fetch_2d_texel_rgb_dxt1
=
136 util_dl_get_proc_address(library
, "fetch_2d_texel_rgb_dxt1");
137 fetch_2d_texel_rgba_dxt1
=
138 util_dl_get_proc_address(library
, "fetch_2d_texel_rgba_dxt1");
139 fetch_2d_texel_rgba_dxt3
=
140 util_dl_get_proc_address(library
, "fetch_2d_texel_rgba_dxt3");
141 fetch_2d_texel_rgba_dxt5
=
142 util_dl_get_proc_address(library
, "fetch_2d_texel_rgba_dxt5");
144 util_dl_get_proc_address(library
, "tx_compress_dxtn");
146 if (!util_format_dxt1_rgb_fetch
||
147 !util_format_dxt1_rgba_fetch
||
148 !util_format_dxt3_rgba_fetch
||
149 !util_format_dxt5_rgba_fetch
||
150 !util_format_dxtn_pack
) {
151 debug_printf("couldn't reference all symbols in " DXTN_LIBNAME
152 ", software DXTn compression/decompression "
154 util_dl_close(library
);
158 util_format_dxt1_rgb_fetch
= (util_format_dxtn_fetch_t
)fetch_2d_texel_rgb_dxt1
;
159 util_format_dxt1_rgba_fetch
= (util_format_dxtn_fetch_t
)fetch_2d_texel_rgba_dxt1
;
160 util_format_dxt3_rgba_fetch
= (util_format_dxtn_fetch_t
)fetch_2d_texel_rgba_dxt3
;
161 util_format_dxt5_rgba_fetch
= (util_format_dxtn_fetch_t
)fetch_2d_texel_rgba_dxt5
;
162 util_format_dxtn_pack
= (util_format_dxtn_pack_t
)tx_compress_dxtn
;
163 util_format_s3tc_enabled
= TRUE
;
172 util_format_dxt1_rgb_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
174 util_format_dxt1_rgb_fetch(0, src
, i
, j
, dst
);
178 util_format_dxt1_rgba_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
180 util_format_dxt1_rgba_fetch(0, src
, i
, j
, dst
);
184 util_format_dxt3_rgba_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
186 util_format_dxt3_rgba_fetch(0, src
, i
, j
, dst
);
190 util_format_dxt5_rgba_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
192 util_format_dxt5_rgba_fetch(0, src
, i
, j
, dst
);
196 util_format_dxt1_rgb_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
199 util_format_dxt1_rgb_fetch(0, src
, i
, j
, tmp
);
200 dst
[0] = ubyte_to_float(tmp
[0]);
201 dst
[1] = ubyte_to_float(tmp
[1]);
202 dst
[2] = ubyte_to_float(tmp
[2]);
207 util_format_dxt1_rgba_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
210 util_format_dxt1_rgba_fetch(0, src
, i
, j
, tmp
);
211 dst
[0] = ubyte_to_float(tmp
[0]);
212 dst
[1] = ubyte_to_float(tmp
[1]);
213 dst
[2] = ubyte_to_float(tmp
[2]);
214 dst
[3] = ubyte_to_float(tmp
[3]);
218 util_format_dxt3_rgba_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
221 util_format_dxt3_rgba_fetch(0, src
, i
, j
, tmp
);
222 dst
[0] = ubyte_to_float(tmp
[0]);
223 dst
[1] = ubyte_to_float(tmp
[1]);
224 dst
[2] = ubyte_to_float(tmp
[2]);
225 dst
[3] = ubyte_to_float(tmp
[3]);
229 util_format_dxt5_rgba_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
232 util_format_dxt5_rgba_fetch(0, src
, i
, j
, tmp
);
233 dst
[0] = ubyte_to_float(tmp
[0]);
234 dst
[1] = ubyte_to_float(tmp
[1]);
235 dst
[2] = ubyte_to_float(tmp
[2]);
236 dst
[3] = ubyte_to_float(tmp
[3]);
241 * Block decompression.
245 util_format_dxtn_rgb_unpack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
246 const uint8_t *src_row
, unsigned src_stride
,
247 unsigned width
, unsigned height
,
248 util_format_dxtn_fetch_t fetch
,
251 const unsigned bw
= 4, bh
= 4, comps
= 4;
253 for(y
= 0; y
< height
; y
+= bh
) {
254 const uint8_t *src
= src_row
;
255 for(x
= 0; x
< width
; x
+= bw
) {
256 for(j
= 0; j
< bh
; ++j
) {
257 for(i
= 0; i
< bw
; ++i
) {
258 uint8_t *dst
= dst_row
+ (y
+ j
)*dst_stride
/sizeof(*dst_row
) + (x
+ i
)*comps
;
259 fetch(0, src
, i
, j
, dst
);
264 src_row
+= src_stride
;
269 util_format_dxt1_rgb_unpack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
270 const uint8_t *src_row
, unsigned src_stride
,
271 unsigned width
, unsigned height
)
273 util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row
, dst_stride
,
276 util_format_dxt1_rgb_fetch
, 8);
280 util_format_dxt1_rgba_unpack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
281 const uint8_t *src_row
, unsigned src_stride
,
282 unsigned width
, unsigned height
)
284 util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row
, dst_stride
,
287 util_format_dxt1_rgba_fetch
, 8);
291 util_format_dxt3_rgba_unpack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
292 const uint8_t *src_row
, unsigned src_stride
,
293 unsigned width
, unsigned height
)
295 util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row
, dst_stride
,
298 util_format_dxt3_rgba_fetch
, 16);
302 util_format_dxt5_rgba_unpack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
303 const uint8_t *src_row
, unsigned src_stride
,
304 unsigned width
, unsigned height
)
306 util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row
, dst_stride
,
309 util_format_dxt5_rgba_fetch
, 16);
313 util_format_dxtn_rgb_unpack_rgba_float(float *dst_row
, unsigned dst_stride
,
314 const uint8_t *src_row
, unsigned src_stride
,
315 unsigned width
, unsigned height
,
316 util_format_dxtn_fetch_t fetch
,
320 for(y
= 0; y
< height
; y
+= 4) {
321 const uint8_t *src
= src_row
;
322 for(x
= 0; x
< width
; x
+= 4) {
323 for(j
= 0; j
< 4; ++j
) {
324 for(i
= 0; i
< 4; ++i
) {
325 float *dst
= dst_row
+ (y
+ j
)*dst_stride
/sizeof(*dst_row
) + (x
+ i
)*4;
327 fetch(0, src
, i
, j
, tmp
);
328 dst
[0] = ubyte_to_float(tmp
[0]);
329 dst
[1] = ubyte_to_float(tmp
[1]);
330 dst
[2] = ubyte_to_float(tmp
[2]);
331 dst
[3] = ubyte_to_float(tmp
[3]);
336 src_row
+= src_stride
;
341 util_format_dxt1_rgb_unpack_rgba_float(float *dst_row
, unsigned dst_stride
,
342 const uint8_t *src_row
, unsigned src_stride
,
343 unsigned width
, unsigned height
)
345 util_format_dxtn_rgb_unpack_rgba_float(dst_row
, dst_stride
,
348 util_format_dxt1_rgb_fetch
, 8);
352 util_format_dxt1_rgba_unpack_rgba_float(float *dst_row
, unsigned dst_stride
,
353 const uint8_t *src_row
, unsigned src_stride
,
354 unsigned width
, unsigned height
)
356 util_format_dxtn_rgb_unpack_rgba_float(dst_row
, dst_stride
,
359 util_format_dxt1_rgba_fetch
, 8);
363 util_format_dxt3_rgba_unpack_rgba_float(float *dst_row
, unsigned dst_stride
,
364 const uint8_t *src_row
, unsigned src_stride
,
365 unsigned width
, unsigned height
)
367 util_format_dxtn_rgb_unpack_rgba_float(dst_row
, dst_stride
,
370 util_format_dxt3_rgba_fetch
, 16);
374 util_format_dxt5_rgba_unpack_rgba_float(float *dst_row
, unsigned dst_stride
,
375 const uint8_t *src_row
, unsigned src_stride
,
376 unsigned width
, unsigned height
)
378 util_format_dxtn_rgb_unpack_rgba_float(dst_row
, dst_stride
,
381 util_format_dxt5_rgba_fetch
, 16);
390 util_format_dxt1_rgb_pack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
391 const uint8_t *src
, unsigned src_stride
,
392 unsigned width
, unsigned height
)
394 const unsigned bw
= 4, bh
= 4, bytes_per_block
= 8;
395 unsigned x
, y
, i
, j
, k
;
396 for(y
= 0; y
< height
; y
+= bh
) {
397 uint8_t *dst
= dst_row
;
398 for(x
= 0; x
< width
; x
+= bw
) {
399 uint8_t tmp
[4][4][3]; /* [bh][bw][comps] */
400 for(j
= 0; j
< bh
; ++j
) {
401 for(i
= 0; i
< bw
; ++i
) {
402 for(k
= 0; k
< 3; ++k
) {
403 tmp
[j
][i
][k
] = src
[(y
+ j
)*src_stride
/sizeof(*src
) + (x
+ i
)*4 + k
];
407 util_format_dxtn_pack(3, 4, 4, &tmp
[0][0][0], UTIL_FORMAT_DXT1_RGB
, dst
, 0);
408 dst
+= bytes_per_block
;
410 dst_row
+= dst_stride
/ sizeof(*dst_row
);
415 util_format_dxt1_rgba_pack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
416 const uint8_t *src
, unsigned src_stride
,
417 unsigned width
, unsigned height
)
419 const unsigned bw
= 4, bh
= 4, comps
= 4, bytes_per_block
= 8;
420 unsigned x
, y
, i
, j
, k
;
421 for(y
= 0; y
< height
; y
+= bh
) {
422 uint8_t *dst
= dst_row
;
423 for(x
= 0; x
< width
; x
+= bw
) {
424 uint8_t tmp
[4][4][4]; /* [bh][bw][comps] */
425 for(j
= 0; j
< bh
; ++j
) {
426 for(i
= 0; i
< bw
; ++i
) {
427 for(k
= 0; k
< comps
; ++k
) {
428 tmp
[j
][i
][k
] = src
[(y
+ j
)*src_stride
/sizeof(*src
) + (x
+ i
)*comps
+ k
];
432 util_format_dxtn_pack(4, 4, 4, &tmp
[0][0][0], UTIL_FORMAT_DXT1_RGBA
, dst
, 0);
433 dst
+= bytes_per_block
;
435 dst_row
+= dst_stride
/ sizeof(*dst_row
);
440 util_format_dxt3_rgba_pack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
441 const uint8_t *src
, unsigned src_stride
,
442 unsigned width
, unsigned height
)
444 const unsigned bw
= 4, bh
= 4, comps
= 4, bytes_per_block
= 16;
445 unsigned x
, y
, i
, j
, k
;
446 for(y
= 0; y
< height
; y
+= bh
) {
447 uint8_t *dst
= dst_row
;
448 for(x
= 0; x
< width
; x
+= bw
) {
449 uint8_t tmp
[4][4][4]; /* [bh][bw][comps] */
450 for(j
= 0; j
< bh
; ++j
) {
451 for(i
= 0; i
< bw
; ++i
) {
452 for(k
= 0; k
< comps
; ++k
) {
453 tmp
[j
][i
][k
] = src
[(y
+ j
)*src_stride
/sizeof(*src
) + (x
+ i
)*comps
+ k
];
457 util_format_dxtn_pack(4, 4, 4, &tmp
[0][0][0], UTIL_FORMAT_DXT3_RGBA
, dst
, 0);
458 dst
+= bytes_per_block
;
460 dst_row
+= dst_stride
/ sizeof(*dst_row
);
465 util_format_dxt5_rgba_pack_rgba_8unorm(uint8_t *dst_row
, unsigned dst_stride
,
466 const uint8_t *src
, unsigned src_stride
,
467 unsigned width
, unsigned height
)
469 const unsigned bw
= 4, bh
= 4, comps
= 4, bytes_per_block
= 16;
470 unsigned x
, y
, i
, j
, k
;
472 for(y
= 0; y
< height
; y
+= bh
) {
473 uint8_t *dst
= dst_row
;
474 for(x
= 0; x
< width
; x
+= bw
) {
475 uint8_t tmp
[4][4][4]; /* [bh][bw][comps] */
476 for(j
= 0; j
< bh
; ++j
) {
477 for(i
= 0; i
< bw
; ++i
) {
478 for(k
= 0; k
< comps
; ++k
) {
479 tmp
[j
][i
][k
] = src
[(y
+ j
)*src_stride
/sizeof(*src
) + (x
+ i
)*comps
+ k
];
483 util_format_dxtn_pack(4, 4, 4, &tmp
[0][0][0], UTIL_FORMAT_DXT5_RGBA
, dst
, 0);
484 dst
+= bytes_per_block
;
486 dst_row
+= dst_stride
/ sizeof(*dst_row
);
491 util_format_dxt1_rgb_pack_rgba_float(uint8_t *dst_row
, unsigned dst_stride
,
492 const float *src
, unsigned src_stride
,
493 unsigned width
, unsigned height
)
495 unsigned x
, y
, i
, j
, k
;
496 for(y
= 0; y
< height
; y
+= 4) {
497 uint8_t *dst
= dst_row
;
498 for(x
= 0; x
< width
; x
+= 4) {
499 uint8_t tmp
[4][4][3];
500 for(j
= 0; j
< 4; ++j
) {
501 for(i
= 0; i
< 4; ++i
) {
502 for(k
= 0; k
< 3; ++k
) {
503 tmp
[j
][i
][k
] = float_to_ubyte(src
[(y
+ j
)*src_stride
/sizeof(*src
) + (x
+i
)*4 + k
]);
507 util_format_dxtn_pack(3, 4, 4, &tmp
[0][0][0], UTIL_FORMAT_DXT1_RGB
, dst
, 0);
510 dst_row
+= 4*dst_stride
/sizeof(*dst_row
);
515 util_format_dxt1_rgba_pack_rgba_float(uint8_t *dst_row
, unsigned dst_stride
,
516 const float *src
, unsigned src_stride
,
517 unsigned width
, unsigned height
)
519 unsigned x
, y
, i
, j
, k
;
520 for(y
= 0; y
< height
; y
+= 4) {
521 uint8_t *dst
= dst_row
;
522 for(x
= 0; x
< width
; x
+= 4) {
523 uint8_t tmp
[4][4][4];
524 for(j
= 0; j
< 4; ++j
) {
525 for(i
= 0; i
< 4; ++i
) {
526 for(k
= 0; k
< 4; ++k
) {
527 tmp
[j
][i
][k
] = float_to_ubyte(src
[(y
+ j
)*src_stride
/sizeof(*src
) + (x
+i
)*4 + k
]);
531 util_format_dxtn_pack(4, 4, 4, &tmp
[0][0][0], UTIL_FORMAT_DXT1_RGBA
, dst
, 0);
534 dst_row
+= 4*dst_stride
/sizeof(*dst_row
);
539 util_format_dxt3_rgba_pack_rgba_float(uint8_t *dst_row
, unsigned dst_stride
,
540 const float *src
, unsigned src_stride
,
541 unsigned width
, unsigned height
)
543 unsigned x
, y
, i
, j
, k
;
544 for(y
= 0; y
< height
; y
+= 4) {
545 uint8_t *dst
= dst_row
;
546 for(x
= 0; x
< width
; x
+= 4) {
547 uint8_t tmp
[4][4][4];
548 for(j
= 0; j
< 4; ++j
) {
549 for(i
= 0; i
< 4; ++i
) {
550 for(k
= 0; k
< 4; ++k
) {
551 tmp
[j
][i
][k
] = float_to_ubyte(src
[(y
+ j
)*src_stride
/sizeof(*src
) + (x
+i
)*4 + k
]);
555 util_format_dxtn_pack(4, 4, 4, &tmp
[0][0][0], UTIL_FORMAT_DXT3_RGBA
, dst
, 0);
558 dst_row
+= 4*dst_stride
/sizeof(*dst_row
);
563 util_format_dxt5_rgba_pack_rgba_float(uint8_t *dst_row
, unsigned dst_stride
,
564 const float *src
, unsigned src_stride
,
565 unsigned width
, unsigned height
)
567 unsigned x
, y
, i
, j
, k
;
568 for(y
= 0; y
< height
; y
+= 4) {
569 uint8_t *dst
= dst_row
;
570 for(x
= 0; x
< width
; x
+= 4) {
571 uint8_t tmp
[4][4][4];
572 for(j
= 0; j
< 4; ++j
) {
573 for(i
= 0; i
< 4; ++i
) {
574 for(k
= 0; k
< 4; ++k
) {
575 tmp
[j
][i
][k
] = float_to_ubyte(src
[(y
+ j
)*src_stride
/sizeof(*src
) + (x
+i
)*4 + k
]);
579 util_format_dxtn_pack(4, 4, 4, &tmp
[0][0][0], UTIL_FORMAT_DXT5_RGBA
, dst
, 0);
582 dst_row
+= 4*dst_stride
/sizeof(*dst_row
);
590 * FIXME: shunts to RGB for now
594 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
)
596 util_format_dxt1_rgb_unpack_rgba_8unorm(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
600 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
)
602 util_format_dxt1_rgb_pack_rgba_8unorm(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
606 util_format_dxt1_srgb_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
608 util_format_dxt1_rgb_fetch_rgba_8unorm(dst
, src
, i
, j
);
612 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
)
614 util_format_dxt1_rgba_unpack_rgba_8unorm(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
618 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
)
620 util_format_dxt1_rgba_pack_rgba_8unorm(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
624 util_format_dxt1_srgba_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
626 util_format_dxt1_rgba_fetch_rgba_8unorm(dst
, src
, i
, j
);
630 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
)
632 util_format_dxt3_rgba_unpack_rgba_8unorm(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
636 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
)
638 util_format_dxt3_rgba_pack_rgba_8unorm(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
642 util_format_dxt3_srgba_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
644 util_format_dxt3_rgba_fetch_rgba_8unorm(dst
, src
, i
, j
);
648 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
)
650 util_format_dxt5_rgba_unpack_rgba_8unorm(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
654 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
)
656 util_format_dxt5_rgba_pack_rgba_8unorm(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
660 util_format_dxt5_srgba_fetch_rgba_8unorm(uint8_t *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
662 util_format_dxt5_rgba_fetch_rgba_8unorm(dst
, src
, i
, j
);
666 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
)
668 util_format_dxt1_rgb_unpack_rgba_float(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
672 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
)
674 util_format_dxt1_rgb_pack_rgba_float(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
678 util_format_dxt1_srgb_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
680 util_format_dxt1_rgb_fetch_rgba_float(dst
, src
, i
, j
);
684 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
)
686 util_format_dxt1_rgba_unpack_rgba_float(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
690 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
)
692 util_format_dxt1_rgba_pack_rgba_float(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
696 util_format_dxt1_srgba_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
698 util_format_dxt1_rgba_fetch_rgba_float(dst
, src
, i
, j
);
702 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
)
704 util_format_dxt3_rgba_unpack_rgba_float(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
708 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
)
710 util_format_dxt3_rgba_pack_rgba_float(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
714 util_format_dxt3_srgba_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
716 util_format_dxt3_rgba_fetch_rgba_float(dst
, src
, i
, j
);
720 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
)
722 util_format_dxt5_rgba_unpack_rgba_float(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
726 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
)
728 util_format_dxt5_rgba_pack_rgba_float(dst_row
, dst_stride
, src_row
, src_stride
, width
, height
);
732 util_format_dxt5_srgba_fetch_rgba_float(float *dst
, const uint8_t *src
, unsigned i
, unsigned j
)
734 util_format_dxt5_rgba_fetch_rgba_float(dst
, src
, i
, j
);