• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************
2  *
3  * Copyright (C) 2011 Red Hat Inc.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included
13  * in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21  * OTHER DEALINGS IN THE SOFTWARE.
22  *
23  **************************************************************************/
24 
25 #include <stdio.h>
26 #include "u_math.h"
27 #include "u_format.h"
28 #include "u_format_rgtc.h"
29 #include "u_format_latc.h"
30 #include "util/rgtc.h"
31 
32 void
util_format_latc1_unorm_fetch_rgba_8unorm(uint8_t * dst,const uint8_t * src,unsigned i,unsigned j)33 util_format_latc1_unorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
34 {
35    /* Fix warnings here: */
36    (void) util_format_unsigned_encode_rgtc_ubyte;
37    (void) util_format_signed_encode_rgtc_ubyte;
38 
39    util_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 1);
40    dst[1] = dst[0];
41    dst[2] = dst[0];
42    dst[3] = 255;
43 }
44 
45 void
util_format_latc1_unorm_unpack_rgba_8unorm(uint8_t * dst_row,unsigned dst_stride,const uint8_t * src_row,unsigned src_stride,unsigned width,unsigned height)46 util_format_latc1_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
47 {
48    util_format_rgtc1_unorm_unpack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
49 }
50 
51 void
util_format_latc1_unorm_pack_rgba_8unorm(uint8_t * dst_row,unsigned dst_stride,const uint8_t * src_row,unsigned src_stride,unsigned width,unsigned height)52 util_format_latc1_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row,
53 					 unsigned src_stride, unsigned width, unsigned height)
54 {
55    util_format_rgtc1_unorm_pack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
56 }
57 
58 void
util_format_latc1_unorm_unpack_rgba_float(float * dst_row,unsigned dst_stride,const uint8_t * src_row,unsigned src_stride,unsigned width,unsigned height)59 util_format_latc1_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
60 {
61    unsigned x, y, i, j;
62    int block_size = 8;
63 
64    for(y = 0; y < height; y += 4) {
65       const uint8_t *src = src_row;
66       for(x = 0; x < width; x += 4) {
67          for(j = 0; j < 4; ++j) {
68             for(i = 0; i < 4; ++i) {
69                float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
70                uint8_t tmp_r;
71                util_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
72                dst[0] =
73                dst[1] =
74                dst[2] = ubyte_to_float(tmp_r);
75                dst[3] = 1.0;
76             }
77          }
78          src += block_size;
79       }
80       src_row += src_stride;
81    }
82 }
83 
84 void
util_format_latc1_unorm_pack_rgba_float(uint8_t * dst_row,unsigned dst_stride,const float * src_row,unsigned src_stride,unsigned width,unsigned height)85 util_format_latc1_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
86 {
87    util_format_rgtc1_unorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height);
88 }
89 
90 void
util_format_latc1_unorm_fetch_rgba_float(float * dst,const uint8_t * src,unsigned i,unsigned j)91 util_format_latc1_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
92 {
93    uint8_t tmp_r;
94 
95    util_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
96    dst[0] =
97    dst[1] =
98    dst[2] = ubyte_to_float(tmp_r);
99    dst[3] = 1.0;
100 }
101 
102 void
util_format_latc1_snorm_fetch_rgba_8unorm(uint8_t * dst,const uint8_t * src,unsigned i,unsigned j)103 util_format_latc1_snorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
104 {
105    fprintf(stderr,"%s\n", __func__);
106 }
107 
108 void
util_format_latc1_snorm_unpack_rgba_8unorm(uint8_t * dst_row,unsigned dst_stride,const uint8_t * src_row,unsigned src_stride,unsigned width,unsigned height)109 util_format_latc1_snorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
110 {
111    fprintf(stderr,"%s\n", __func__);
112 }
113 
114 void
util_format_latc1_snorm_pack_rgba_8unorm(uint8_t * dst_row,unsigned dst_stride,const uint8_t * src_row,unsigned src_stride,unsigned width,unsigned height)115 util_format_latc1_snorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
116 {
117    fprintf(stderr,"%s\n", __func__);
118 }
119 
120 void
util_format_latc1_snorm_pack_rgba_float(uint8_t * dst_row,unsigned dst_stride,const float * src_row,unsigned src_stride,unsigned width,unsigned height)121 util_format_latc1_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
122 {
123    util_format_rgtc1_snorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height);
124 }
125 
126 void
util_format_latc1_snorm_unpack_rgba_float(float * dst_row,unsigned dst_stride,const uint8_t * src_row,unsigned src_stride,unsigned width,unsigned height)127 util_format_latc1_snorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
128 {
129    unsigned x, y, i, j;
130    int block_size = 8;
131 
132    for(y = 0; y < height; y += 4) {
133       const int8_t *src = (int8_t *)src_row;
134       for(x = 0; x < width; x += 4) {
135          for(j = 0; j < 4; ++j) {
136             for(i = 0; i < 4; ++i) {
137                float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
138                int8_t tmp_r;
139                util_format_signed_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
140                dst[0] =
141                dst[1] =
142                dst[2] = byte_to_float_tex(tmp_r);
143                dst[3] = 1.0;
144             }
145          }
146          src += block_size;
147       }
148       src_row += src_stride;
149    }
150 }
151 
152 void
util_format_latc1_snorm_fetch_rgba_float(float * dst,const uint8_t * src,unsigned i,unsigned j)153 util_format_latc1_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
154 {
155    int8_t tmp_r;
156 
157    util_format_signed_fetch_texel_rgtc(0, (int8_t *)src, i, j, &tmp_r, 1);
158    dst[0] =
159    dst[1] =
160    dst[2] = byte_to_float_tex(tmp_r);
161    dst[3] = 1.0;
162 }
163 
164 
165 void
util_format_latc2_unorm_fetch_rgba_8unorm(uint8_t * dst,const uint8_t * src,unsigned i,unsigned j)166 util_format_latc2_unorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
167 {
168    util_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 2);
169    dst[1] = dst[0];
170    dst[2] = dst[0];
171    util_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, dst + 3, 2);
172 }
173 
174 void
util_format_latc2_unorm_unpack_rgba_8unorm(uint8_t * dst_row,unsigned dst_stride,const uint8_t * src_row,unsigned src_stride,unsigned width,unsigned height)175 util_format_latc2_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
176 {
177    util_format_rgtc2_unorm_unpack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
178 }
179 
180 void
util_format_latc2_unorm_pack_rgba_8unorm(uint8_t * dst_row,unsigned dst_stride,const uint8_t * src_row,unsigned src_stride,unsigned width,unsigned height)181 util_format_latc2_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
182 {
183    util_format_rgtc2_unorm_pack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
184 }
185 
186 void
util_format_latc2_unorm_pack_rgba_float(uint8_t * dst_row,unsigned dst_stride,const float * src_row,unsigned src_stride,unsigned width,unsigned height)187 util_format_latc2_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
188 {
189    util_format_rxtc2_unorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height, 3);
190 }
191 
192 void
util_format_latc2_unorm_unpack_rgba_float(float * dst_row,unsigned dst_stride,const uint8_t * src_row,unsigned src_stride,unsigned width,unsigned height)193 util_format_latc2_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
194 {
195    unsigned x, y, i, j;
196    int block_size = 16;
197 
198    for(y = 0; y < height; y += 4) {
199       const uint8_t *src = src_row;
200       for(x = 0; x < width; x += 4) {
201          for(j = 0; j < 4; ++j) {
202             for(i = 0; i < 4; ++i) {
203                float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
204                uint8_t tmp_r, tmp_g;
205                util_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
206                util_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
207                dst[0] =
208                dst[1] =
209                dst[2] = ubyte_to_float(tmp_r);
210                dst[3] = ubyte_to_float(tmp_g);
211             }
212          }
213          src += block_size;
214       }
215       src_row += src_stride;
216    }
217 }
218 
219 void
util_format_latc2_unorm_fetch_rgba_float(float * dst,const uint8_t * src,unsigned i,unsigned j)220 util_format_latc2_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
221 {
222    uint8_t tmp_r, tmp_g;
223 
224    util_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
225    util_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
226    dst[0] =
227    dst[1] =
228    dst[2] = ubyte_to_float(tmp_r);
229    dst[3] = ubyte_to_float(tmp_g);
230 }
231 
232 
233 void
util_format_latc2_snorm_fetch_rgba_8unorm(uint8_t * dst,const uint8_t * src,unsigned i,unsigned j)234 util_format_latc2_snorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
235 {
236    fprintf(stderr,"%s\n", __func__);
237 }
238 
239 void
util_format_latc2_snorm_unpack_rgba_8unorm(uint8_t * dst_row,unsigned dst_stride,const uint8_t * src_row,unsigned src_stride,unsigned width,unsigned height)240 util_format_latc2_snorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
241 {
242    fprintf(stderr,"%s\n", __func__);
243 }
244 
245 void
util_format_latc2_snorm_pack_rgba_8unorm(uint8_t * dst_row,unsigned dst_stride,const uint8_t * src_row,unsigned src_stride,unsigned width,unsigned height)246 util_format_latc2_snorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
247 {
248    fprintf(stderr,"%s\n", __func__);
249 }
250 
251 void
util_format_latc2_snorm_unpack_rgba_float(float * dst_row,unsigned dst_stride,const uint8_t * src_row,unsigned src_stride,unsigned width,unsigned height)252 util_format_latc2_snorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
253 {
254    unsigned x, y, i, j;
255    int block_size = 16;
256 
257    for(y = 0; y < height; y += 4) {
258       const int8_t *src = (int8_t *)src_row;
259       for(x = 0; x < width; x += 4) {
260          for(j = 0; j < 4; ++j) {
261             for(i = 0; i < 4; ++i) {
262                float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
263                int8_t tmp_r, tmp_g;
264                util_format_signed_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
265                util_format_signed_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
266                dst[0] =
267                dst[1] =
268                dst[2] = byte_to_float_tex(tmp_r);
269                dst[3] = byte_to_float_tex(tmp_g);
270             }
271          }
272          src += block_size;
273       }
274       src_row += src_stride;
275    }
276 }
277 
278 void
util_format_latc2_snorm_pack_rgba_float(uint8_t * dst_row,unsigned dst_stride,const float * src_row,unsigned src_stride,unsigned width,unsigned height)279 util_format_latc2_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
280 {
281    util_format_rxtc2_snorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height, 3);
282 }
283 
284 void
util_format_latc2_snorm_fetch_rgba_float(float * dst,const uint8_t * src,unsigned i,unsigned j)285 util_format_latc2_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
286 {
287    int8_t tmp_r, tmp_g;
288 
289    util_format_signed_fetch_texel_rgtc(0, (int8_t *)src, i, j, &tmp_r, 2);
290    util_format_signed_fetch_texel_rgtc(0, (int8_t *)src + 8, i, j, &tmp_g, 2);
291    dst[0] =
292    dst[1] =
293    dst[2] = byte_to_float_tex(tmp_r);
294    dst[3] = byte_to_float_tex(tmp_g);
295 }
296 
297