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 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 19 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 * 22 **************************************************************************/ 23 24 #include <stdio.h> 25 #include "u_math.h" 26 #include "u_format.h" 27 #include "u_format_rgtc.h" 28 #include "u_format_latc.h" 29 30 static void u_format_unsigned_encode_rgtc_ubyte(uint8_t *blkaddr, uint8_t srccolors[4][4], 31 int numxpixels, int numypixels); 32 33 static void u_format_unsigned_fetch_texel_rgtc(unsigned srcRowStride, const uint8_t *pixdata, 34 unsigned i, unsigned j, uint8_t *value, unsigned comps); 35 36 static void u_format_signed_encode_rgtc_ubyte(int8_t *blkaddr, int8_t srccolors[4][4], 37 int numxpixels, int numypixels); 38 39 static void u_format_signed_fetch_texel_rgtc(unsigned srcRowStride, const int8_t *pixdata, 40 unsigned i, unsigned j, int8_t *value, unsigned comps); 41 42 void 43 util_format_latc1_unorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j) 44 { 45 /* Fix warnings here: */ 46 (void) u_format_unsigned_encode_rgtc_ubyte; 47 (void) u_format_signed_encode_rgtc_ubyte; 48 49 u_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 1); 50 dst[1] = dst[0]; 51 dst[2] = dst[0]; 52 dst[3] = 255; 53 } 54 55 void 56 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) 57 { 58 util_format_rgtc1_unorm_unpack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height); 59 } 60 61 void 62 util_format_latc1_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, 63 unsigned src_stride, unsigned width, unsigned height) 64 { 65 util_format_rgtc1_unorm_pack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height); 66 } 67 68 void 69 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) 70 { 71 unsigned x, y, i, j; 72 int block_size = 8; 73 74 for(y = 0; y < height; y += 4) { 75 const uint8_t *src = src_row; 76 for(x = 0; x < width; x += 4) { 77 for(j = 0; j < 4; ++j) { 78 for(i = 0; i < 4; ++i) { 79 float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4; 80 uint8_t tmp_r; 81 u_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1); 82 dst[0] = 83 dst[1] = 84 dst[2] = ubyte_to_float(tmp_r); 85 dst[3] = 1.0; 86 } 87 } 88 src += block_size; 89 } 90 src_row += src_stride; 91 } 92 } 93 94 void 95 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) 96 { 97 util_format_rgtc1_unorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height); 98 } 99 100 void 101 util_format_latc1_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) 102 { 103 uint8_t tmp_r; 104 105 u_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1); 106 dst[0] = 107 dst[1] = 108 dst[2] = ubyte_to_float(tmp_r); 109 dst[3] = 1.0; 110 } 111 112 void 113 util_format_latc1_snorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j) 114 { 115 fprintf(stderr,"%s\n", __func__); 116 } 117 118 void 119 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) 120 { 121 fprintf(stderr,"%s\n", __func__); 122 } 123 124 void 125 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) 126 { 127 fprintf(stderr,"%s\n", __func__); 128 } 129 130 void 131 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) 132 { 133 util_format_rgtc1_snorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height); 134 } 135 136 void 137 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) 138 { 139 unsigned x, y, i, j; 140 int block_size = 8; 141 142 for(y = 0; y < height; y += 4) { 143 const int8_t *src = (int8_t *)src_row; 144 for(x = 0; x < width; x += 4) { 145 for(j = 0; j < 4; ++j) { 146 for(i = 0; i < 4; ++i) { 147 float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4; 148 int8_t tmp_r; 149 u_format_signed_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1); 150 dst[0] = 151 dst[1] = 152 dst[2] = byte_to_float_tex(tmp_r); 153 dst[3] = 1.0; 154 } 155 } 156 src += block_size; 157 } 158 src_row += src_stride; 159 } 160 } 161 162 void 163 util_format_latc1_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) 164 { 165 int8_t tmp_r; 166 167 u_format_signed_fetch_texel_rgtc(0, (int8_t *)src, i, j, &tmp_r, 1); 168 dst[0] = 169 dst[1] = 170 dst[2] = byte_to_float_tex(tmp_r); 171 dst[3] = 1.0; 172 } 173 174 175 void 176 util_format_latc2_unorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j) 177 { 178 u_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 2); 179 dst[1] = dst[0]; 180 dst[2] = dst[0]; 181 u_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, dst + 3, 2); 182 } 183 184 void 185 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) 186 { 187 util_format_rgtc2_unorm_unpack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height); 188 } 189 190 void 191 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) 192 { 193 util_format_rgtc2_unorm_pack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height); 194 } 195 196 void 197 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) 198 { 199 util_format_rxtc2_unorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height, 3); 200 } 201 202 void 203 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) 204 { 205 unsigned x, y, i, j; 206 int block_size = 16; 207 208 for(y = 0; y < height; y += 4) { 209 const uint8_t *src = src_row; 210 for(x = 0; x < width; x += 4) { 211 for(j = 0; j < 4; ++j) { 212 for(i = 0; i < 4; ++i) { 213 float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4; 214 uint8_t tmp_r, tmp_g; 215 u_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2); 216 u_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2); 217 dst[0] = 218 dst[1] = 219 dst[2] = ubyte_to_float(tmp_r); 220 dst[3] = ubyte_to_float(tmp_g); 221 } 222 } 223 src += block_size; 224 } 225 src_row += src_stride; 226 } 227 } 228 229 void 230 util_format_latc2_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) 231 { 232 uint8_t tmp_r, tmp_g; 233 234 u_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2); 235 u_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2); 236 dst[0] = 237 dst[1] = 238 dst[2] = ubyte_to_float(tmp_r); 239 dst[3] = ubyte_to_float(tmp_g); 240 } 241 242 243 void 244 util_format_latc2_snorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j) 245 { 246 fprintf(stderr,"%s\n", __func__); 247 } 248 249 void 250 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) 251 { 252 fprintf(stderr,"%s\n", __func__); 253 } 254 255 void 256 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) 257 { 258 fprintf(stderr,"%s\n", __func__); 259 } 260 261 void 262 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) 263 { 264 unsigned x, y, i, j; 265 int block_size = 16; 266 267 for(y = 0; y < height; y += 4) { 268 const int8_t *src = (int8_t *)src_row; 269 for(x = 0; x < width; x += 4) { 270 for(j = 0; j < 4; ++j) { 271 for(i = 0; i < 4; ++i) { 272 float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4; 273 int8_t tmp_r, tmp_g; 274 u_format_signed_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2); 275 u_format_signed_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2); 276 dst[0] = 277 dst[1] = 278 dst[2] = byte_to_float_tex(tmp_r); 279 dst[3] = byte_to_float_tex(tmp_g); 280 } 281 } 282 src += block_size; 283 } 284 src_row += src_stride; 285 } 286 } 287 288 void 289 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) 290 { 291 util_format_rxtc2_snorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height, 3); 292 } 293 294 void 295 util_format_latc2_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j) 296 { 297 int8_t tmp_r, tmp_g; 298 299 u_format_signed_fetch_texel_rgtc(0, (int8_t *)src, i, j, &tmp_r, 2); 300 u_format_signed_fetch_texel_rgtc(0, (int8_t *)src + 8, i, j, &tmp_g, 2); 301 dst[0] = 302 dst[1] = 303 dst[2] = byte_to_float_tex(tmp_r); 304 dst[3] = byte_to_float_tex(tmp_g); 305 } 306 307 308 #define TAG(x) u_format_unsigned_##x 309 #define TYPE uint8_t 310 #define T_MIN 0 311 #define T_MAX 255 312 313 #include "../../../mesa/main/texcompress_rgtc_tmp.h" 314 315 #undef TYPE 316 #undef TAG 317 #undef T_MIN 318 #undef T_MAX 319 320 321 #define TAG(x) u_format_signed_##x 322 #define TYPE int8_t 323 #define T_MIN (int8_t)-128 324 #define T_MAX (int8_t)127 325 326 #include "../../../mesa/main/texcompress_rgtc_tmp.h" 327 328 #undef TYPE 329 #undef TAG 330 #undef T_MIN 331 #undef T_MAX 332