• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  * 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.
23  *
24  **************************************************************************/
25 
26 #include "util/format/u_format.h"
27 #include "util/format/u_format_bptc.h"
28 #include "u_format_pack.h"
29 #include "util/format_srgb.h"
30 #include "util/u_math.h"
31 
32 #define BPTC_BLOCK_DECODE
33 #include "../../mesa/main/texcompress_bptc_tmp.h"
34 
35 void
util_format_bptc_rgba_unorm_unpack_rgba_8unorm(uint8_t * restrict dst_row,unsigned dst_stride,const uint8_t * restrict src_row,unsigned src_stride,unsigned width,unsigned height)36 util_format_bptc_rgba_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
37                                                const uint8_t *restrict src_row, unsigned src_stride,
38                                                unsigned width, unsigned height)
39 {
40   decompress_rgba_unorm(width, height,
41                         src_row, src_stride,
42                         dst_row, dst_stride);
43 }
44 
45 void
util_format_bptc_rgba_unorm_pack_rgba_8unorm(uint8_t * restrict dst_row,unsigned dst_stride,const uint8_t * restrict src_row,unsigned src_stride,unsigned width,unsigned height)46 util_format_bptc_rgba_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
47                                              const uint8_t *restrict src_row, unsigned src_stride,
48                                              unsigned width, unsigned height)
49 {
50    compress_rgba_unorm(width, height,
51                        src_row, src_stride,
52                        dst_row, dst_stride);
53 }
54 
55 void
util_format_bptc_rgba_unorm_unpack_rgba_float(void * restrict dst_row,unsigned dst_stride,const uint8_t * restrict src_row,unsigned src_stride,unsigned width,unsigned height)56 util_format_bptc_rgba_unorm_unpack_rgba_float(void *restrict dst_row, unsigned dst_stride,
57                                               const uint8_t *restrict src_row, unsigned src_stride,
58                                               unsigned width, unsigned height)
59 {
60    uint8_t *temp_block;
61    temp_block = malloc(width * height * 4 * sizeof(uint8_t));
62    decompress_rgba_unorm(width, height,
63                          src_row, src_stride,
64                          temp_block, width * 4 * sizeof(uint8_t));
65    /* Direct call to row unpack instead of util_format_rgba_unpack_rect()
66     * to avoid table lookup that would pull in all unpack symbols.
67     */
68    for (int y = 0; y < height; y++) {
69       util_format_r8g8b8a8_unorm_unpack_rgba_float((char *)dst_row + dst_stride * y,
70                                                     temp_block + 4 * width * y,
71                                                     width);
72    }
73    free((void *) temp_block);
74 }
75 
76 void
util_format_bptc_rgba_unorm_pack_rgba_float(uint8_t * restrict dst_row,unsigned dst_stride,const float * restrict src_row,unsigned src_stride,unsigned width,unsigned height)77 util_format_bptc_rgba_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride,
78                                             const float *restrict src_row, unsigned src_stride,
79                                             unsigned width, unsigned height)
80 {
81    uint8_t *temp_block;
82    temp_block = malloc(width * height * 4 * sizeof(uint8_t));
83    /* Direct call to row unpack instead of util_format_rgba_unpack_rect()
84     * to avoid table lookup that would pull in all unpack symbols.
85     */
86    for (int y = 0; y < height; y++) {
87       util_format_r32g32b32a32_float_unpack_rgba_8unorm(
88                         temp_block + 4 * width * y,
89                         (uint8_t *)src_row + src_stride * y,
90                         width);
91    }
92    compress_rgba_unorm(width, height,
93                        temp_block, width * 4 * sizeof(uint8_t),
94                        dst_row, dst_stride);
95    free((void *) temp_block);
96 }
97 
98 void
util_format_bptc_rgba_unorm_fetch_rgba(void * restrict dst,const uint8_t * restrict src,unsigned width,unsigned height)99 util_format_bptc_rgba_unorm_fetch_rgba(void *restrict dst, const uint8_t *restrict src,
100                                              unsigned width, unsigned height)
101 {
102    uint8_t temp_block[4];
103 
104    fetch_rgba_unorm_from_block(src + ((width * sizeof(uint8_t)) * (height / 4) + (width / 4)) * 16,
105                                temp_block, (width % 4) + (height % 4) * 4);
106 
107    util_format_read_4(PIPE_FORMAT_R8G8B8A8_UNORM,
108                       dst, 4 * sizeof(float),
109                       temp_block, 4 * sizeof(uint8_t),
110                       0, 0, 1, 1);
111 }
112 
113 void
util_format_bptc_srgba_unpack_rgba_8unorm(uint8_t * restrict dst_row,unsigned dst_stride,const uint8_t * restrict src_row,unsigned src_stride,unsigned width,unsigned height)114 util_format_bptc_srgba_unpack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
115                                           const uint8_t *restrict src_row, unsigned src_stride,
116                                           unsigned width, unsigned height)
117 {
118    decompress_rgba_unorm(width, height,
119                          src_row, src_stride,
120                          dst_row, dst_stride);
121 }
122 
123 void
util_format_bptc_srgba_pack_rgba_8unorm(uint8_t * restrict dst_row,unsigned dst_stride,const uint8_t * restrict src_row,unsigned src_stride,unsigned width,unsigned height)124 util_format_bptc_srgba_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
125                                         const uint8_t *restrict src_row, unsigned src_stride,
126                                         unsigned width, unsigned height)
127 {
128    compress_rgba_unorm(width, height,
129                        src_row, src_stride,
130                        dst_row, dst_stride);
131 }
132 
133 void
util_format_bptc_srgba_unpack_rgba_float(void * restrict dst_row,unsigned dst_stride,const uint8_t * restrict src_row,unsigned src_stride,unsigned width,unsigned height)134 util_format_bptc_srgba_unpack_rgba_float(void *restrict dst_row, unsigned dst_stride,
135                                          const uint8_t *restrict src_row, unsigned src_stride,
136                                          unsigned width, unsigned height)
137 {
138    uint8_t *temp_block;
139    temp_block = malloc(width * height * 4 * sizeof(uint8_t));
140    decompress_rgba_unorm(width, height,
141                          src_row, src_stride,
142                          temp_block, width * 4 * sizeof(uint8_t));
143 
144    /* Direct call to row unpack instead of util_format_rgba_unpack_rect()
145     * to avoid table lookup that would pull in all unpack symbols.
146     */
147    for (int y = 0; y < height; y++) {
148       util_format_r8g8b8a8_srgb_unpack_rgba_float((char *)dst_row + dst_stride * y,
149                                                   temp_block + width * 4 * y,
150                                                   width);
151    }
152 
153    free((void *) temp_block);
154 }
155 
156 void
util_format_bptc_srgba_pack_rgba_float(uint8_t * restrict dst_row,unsigned dst_stride,const float * restrict src_row,unsigned src_stride,unsigned width,unsigned height)157 util_format_bptc_srgba_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride,
158                                        const float *restrict src_row, unsigned src_stride,
159                                        unsigned width, unsigned height)
160 {
161    compress_rgb_float(width, height,
162                       src_row, src_stride,
163                       dst_row, dst_stride,
164                       true);
165 }
166 
167 void
util_format_bptc_srgba_fetch_rgba(void * restrict dst,const uint8_t * restrict src,unsigned width,unsigned height)168 util_format_bptc_srgba_fetch_rgba(void *restrict dst, const uint8_t *restrict src,
169                                         unsigned width, unsigned height)
170 {
171    uint8_t temp_block[4];
172 
173    fetch_rgba_unorm_from_block(src + ((width * sizeof(uint8_t)) * (height / 4) + (width / 4)) * 16,
174                                temp_block, (width % 4) + (height % 4) * 4);
175    util_format_r8g8b8a8_srgb_fetch_rgba(dst, temp_block, 0, 0);
176 }
177 
178 void
util_format_bptc_rgb_float_unpack_rgba_8unorm(uint8_t * restrict dst_row,unsigned dst_stride,const uint8_t * restrict src_row,unsigned src_stride,unsigned width,unsigned height)179 util_format_bptc_rgb_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
180                                               const uint8_t *restrict src_row, unsigned src_stride,
181                                               unsigned width, unsigned height)
182 {
183    float *temp_block;
184    temp_block = malloc(width * height * 4 * sizeof(float));
185    decompress_rgb_float(width, height,
186                         src_row, src_stride,
187                         temp_block, width * 4 * sizeof(float),
188                         true);
189    /* Direct call to row unpack instead of util_format_rgba_unpack_rect()
190     * to avoid table lookup that would pull in all unpack symbols.
191     */
192    for (int y = 0; y < height; y++) {
193       util_format_r32g32b32a32_float_unpack_rgba_8unorm(
194           dst_row + dst_stride * y,
195           (const uint8_t *)temp_block + width * 4 * sizeof(float) * y,
196           width);
197    }
198    free((void *) temp_block);
199 }
200 
201 void
util_format_bptc_rgb_float_pack_rgba_8unorm(uint8_t * restrict dst_row,unsigned dst_stride,const uint8_t * restrict src_row,unsigned src_stride,unsigned width,unsigned height)202 util_format_bptc_rgb_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
203                                             const uint8_t *restrict src_row, unsigned src_stride,
204                                             unsigned width, unsigned height)
205 {
206    compress_rgba_unorm(width, height,
207                        src_row, src_stride,
208                        dst_row, dst_stride);
209 }
210 
211 void
util_format_bptc_rgb_float_unpack_rgba_float(void * restrict dst_row,unsigned dst_stride,const uint8_t * restrict src_row,unsigned src_stride,unsigned width,unsigned height)212 util_format_bptc_rgb_float_unpack_rgba_float(void *restrict dst_row, unsigned dst_stride,
213                                              const uint8_t *restrict src_row, unsigned src_stride,
214                                              unsigned width, unsigned height)
215 {
216    decompress_rgb_float(width, height,
217                         src_row, src_stride,
218                         dst_row, dst_stride,
219                         true);
220 }
221 
222 void
util_format_bptc_rgb_float_pack_rgba_float(uint8_t * restrict dst_row,unsigned dst_stride,const float * restrict src_row,unsigned src_stride,unsigned width,unsigned height)223 util_format_bptc_rgb_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride,
224                                            const float *restrict src_row, unsigned src_stride,
225                                            unsigned width, unsigned height)
226 {
227    compress_rgb_float(width, height,
228                       src_row, src_stride,
229                       dst_row, dst_stride,
230                       true);
231 }
232 
233 void
util_format_bptc_rgb_float_fetch_rgba(void * restrict dst,const uint8_t * restrict src,unsigned width,unsigned height)234 util_format_bptc_rgb_float_fetch_rgba(void *restrict dst, const uint8_t *restrict src,
235                                             unsigned width, unsigned height)
236 {
237    fetch_rgb_float_from_block(src + ((width * sizeof(uint8_t)) * (height / 4) + (width / 4)) * 16,
238                               dst, (width % 4) + (height % 4) * 4, true);
239 }
240 
241 void
util_format_bptc_rgb_ufloat_unpack_rgba_8unorm(uint8_t * restrict dst_row,unsigned dst_stride,const uint8_t * restrict src_row,unsigned src_stride,unsigned width,unsigned height)242 util_format_bptc_rgb_ufloat_unpack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
243                                                const uint8_t *restrict src_row, unsigned src_stride,
244                                                unsigned width, unsigned height)
245 {
246    float *temp_block;
247    temp_block = malloc(width * height * 4 * sizeof(float));
248    decompress_rgb_float(width, height,
249                         src_row, src_stride,
250                         temp_block, width * 4 * sizeof(float),
251                         false);
252    /* Direct call to row unpack instead of util_format_rgba_unpack_8unorm()
253     * to avoid table lookup that would pull in all unpack symbols.
254     */
255    for (int y = 0; y < height; y++) {
256       util_format_r32g32b32a32_float_unpack_rgba_8unorm(dst_row + dst_stride * y,
257                                                         (void *)(temp_block + 4 * width * y),
258                                                         width);
259    }
260    free((void *) temp_block);
261 }
262 
263 void
util_format_bptc_rgb_ufloat_pack_rgba_8unorm(uint8_t * restrict dst_row,unsigned dst_stride,const uint8_t * restrict src_row,unsigned src_stride,unsigned width,unsigned height)264 util_format_bptc_rgb_ufloat_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
265                                              const uint8_t *restrict src_row, unsigned src_stride,
266                                              unsigned width, unsigned height)
267 {
268    compress_rgba_unorm(width, height,
269                        src_row, src_stride,
270                        dst_row, dst_stride);
271 }
272 
273 void
util_format_bptc_rgb_ufloat_unpack_rgba_float(void * restrict dst_row,unsigned dst_stride,const uint8_t * restrict src_row,unsigned src_stride,unsigned width,unsigned height)274 util_format_bptc_rgb_ufloat_unpack_rgba_float(void *restrict dst_row, unsigned dst_stride,
275                                               const uint8_t *restrict src_row, unsigned src_stride,
276                                               unsigned width, unsigned height)
277 {
278    decompress_rgb_float(width, height,
279                         src_row, src_stride,
280                         dst_row, dst_stride,
281                         false);
282 }
283 
284 void
util_format_bptc_rgb_ufloat_pack_rgba_float(uint8_t * restrict dst_row,unsigned dst_stride,const float * restrict src_row,unsigned src_stride,unsigned width,unsigned height)285 util_format_bptc_rgb_ufloat_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride,
286                                             const float *restrict src_row, unsigned src_stride,
287                                             unsigned width, unsigned height)
288 {
289    compress_rgb_float(width, height,
290                       src_row, src_stride,
291                       dst_row, dst_stride,
292                       false);
293 }
294 
295 void
util_format_bptc_rgb_ufloat_fetch_rgba(void * restrict dst,const uint8_t * restrict src,unsigned width,unsigned height)296 util_format_bptc_rgb_ufloat_fetch_rgba(void *restrict dst, const uint8_t *restrict src,
297                                              unsigned width, unsigned height)
298 {
299    fetch_rgb_float_from_block(src + ((width * sizeof(uint8_t)) * (height / 4) + (width / 4)) * 16,
300                               dst, (width % 4) + (height % 4) * 4, false);
301 }
302