1/* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (c) 2011 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 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. 22 */ 23 24 25#include "colormac.h" 26#include "format_unpack.h" 27#include "macros.h" 28#include "../../gallium/auxiliary/util/u_format_rgb9e5.h" 29#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h" 30 31 32/** Helper struct for MESA_FORMAT_Z32_FLOAT_X24S8 */ 33struct z32f_x24s8 34{ 35 float z; 36 uint32_t x24s8; 37}; 38 39 40/* Expand 1, 2, 3, 4, 5, 6-bit values to fill 8 bits */ 41 42#define EXPAND_1_8(X) ( (X) ? 0xff : 0x0 ) 43 44#define EXPAND_2_8(X) ( ((X) << 6) | ((X) << 4) | ((X) << 2) | (X) ) 45 46#define EXPAND_3_8(X) ( ((X) << 5) | ((X) << 2) | ((X) >> 1) ) 47 48#define EXPAND_4_8(X) ( ((X) << 4) | (X) ) 49 50#define EXPAND_5_8(X) ( ((X) << 3) | ((X) >> 2) ) 51 52#define EXPAND_6_8(X) ( ((X) << 2) | ((X) >> 4) ) 53 54 55/** 56 * Convert an 8-bit sRGB value from non-linear space to a 57 * linear RGB value in [0, 1]. 58 * Implemented with a 256-entry lookup table. 59 */ 60static inline GLfloat 61nonlinear_to_linear(GLubyte cs8) 62{ 63 static GLfloat table[256]; 64 static GLboolean tableReady = GL_FALSE; 65 if (!tableReady) { 66 /* compute lookup table now */ 67 GLuint i; 68 for (i = 0; i < 256; i++) { 69 const GLfloat cs = UBYTE_TO_FLOAT(i); 70 if (cs <= 0.04045) { 71 table[i] = cs / 12.92f; 72 } 73 else { 74 table[i] = (GLfloat) pow((cs + 0.055) / 1.055, 2.4); 75 } 76 } 77 tableReady = GL_TRUE; 78 } 79 return table[cs8]; 80} 81 82 83/**********************************************************************/ 84/* Unpack, returning GLfloat colors */ 85/**********************************************************************/ 86 87typedef void (*unpack_rgba_func)(const void *src, GLfloat dst[][4], GLuint n); 88 89 90static void 91unpack_RGBA8888(const void *src, GLfloat dst[][4], GLuint n) 92{ 93 const GLuint *s = ((const GLuint *) src); 94 GLuint i; 95 for (i = 0; i < n; i++) { 96 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) ); 97 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff ); 98 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff ); 99 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff ); 100 } 101} 102 103static void 104unpack_RGBA8888_REV(const void *src, GLfloat dst[][4], GLuint n) 105{ 106 const GLuint *s = ((const GLuint *) src); 107 GLuint i; 108 for (i = 0; i < n; i++) { 109 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff ); 110 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff ); 111 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff ); 112 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) ); 113 } 114} 115 116static void 117unpack_ARGB8888(const void *src, GLfloat dst[][4], GLuint n) 118{ 119 const GLuint *s = ((const GLuint *) src); 120 GLuint i; 121 for (i = 0; i < n; i++) { 122 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff ); 123 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff ); 124 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff ); 125 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) ); 126 } 127} 128 129static void 130unpack_ARGB8888_REV(const void *src, GLfloat dst[][4], GLuint n) 131{ 132 const GLuint *s = ((const GLuint *) src); 133 GLuint i; 134 for (i = 0; i < n; i++) { 135 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff ); 136 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff ); 137 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) ); 138 dst[i][ACOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff ); 139 } 140} 141 142static void 143unpack_RGBX8888(const void *src, GLfloat dst[][4], GLuint n) 144{ 145 const GLuint *s = ((const GLuint *) src); 146 GLuint i; 147 for (i = 0; i < n; i++) { 148 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) ); 149 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff ); 150 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff ); 151 dst[i][ACOMP] = 1.0f; 152 } 153} 154 155static void 156unpack_RGBX8888_REV(const void *src, GLfloat dst[][4], GLuint n) 157{ 158 const GLuint *s = ((const GLuint *) src); 159 GLuint i; 160 for (i = 0; i < n; i++) { 161 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff ); 162 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff ); 163 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff ); 164 dst[i][ACOMP] = 1.0f; 165 } 166} 167 168static void 169unpack_XRGB8888(const void *src, GLfloat dst[][4], GLuint n) 170{ 171 const GLuint *s = ((const GLuint *) src); 172 GLuint i; 173 for (i = 0; i < n; i++) { 174 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff ); 175 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff ); 176 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] ) & 0xff ); 177 dst[i][ACOMP] = 1.0f; 178 } 179} 180 181static void 182unpack_XRGB8888_REV(const void *src, GLfloat dst[][4], GLuint n) 183{ 184 const GLuint *s = ((const GLuint *) src); 185 GLuint i; 186 for (i = 0; i < n; i++) { 187 dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 8) & 0xff ); 188 dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff ); 189 dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24) ); 190 dst[i][ACOMP] = 1.0f; 191 } 192} 193 194static void 195unpack_RGB888(const void *src, GLfloat dst[][4], GLuint n) 196{ 197 const GLubyte *s = (const GLubyte *) src; 198 GLuint i; 199 for (i = 0; i < n; i++) { 200 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i*3+2] ); 201 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i*3+1] ); 202 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i*3+0] ); 203 dst[i][ACOMP] = 1.0F; 204 } 205} 206 207static void 208unpack_BGR888(const void *src, GLfloat dst[][4], GLuint n) 209{ 210 const GLubyte *s = (const GLubyte *) src; 211 GLuint i; 212 for (i = 0; i < n; i++) { 213 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i*3+0] ); 214 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i*3+1] ); 215 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i*3+2] ); 216 dst[i][ACOMP] = 1.0F; 217 } 218} 219 220static void 221unpack_RGB565(const void *src, GLfloat dst[][4], GLuint n) 222{ 223 const GLushort *s = ((const GLushort *) src); 224 GLuint i; 225 for (i = 0; i < n; i++) { 226 dst[i][RCOMP] = ((s[i] >> 11) & 0x1f) * (1.0F / 31.0F); 227 dst[i][GCOMP] = ((s[i] >> 5 ) & 0x3f) * (1.0F / 63.0F); 228 dst[i][BCOMP] = ((s[i] ) & 0x1f) * (1.0F / 31.0F); 229 dst[i][ACOMP] = 1.0F; 230 } 231} 232 233static void 234unpack_RGB565_REV(const void *src, GLfloat dst[][4], GLuint n) 235{ 236 const GLushort *s = ((const GLushort *) src); 237 GLuint i; 238 for (i = 0; i < n; i++) { 239 GLuint t = (s[i] >> 8) | (s[i] << 8); /* byte swap */ 240 dst[i][RCOMP] = UBYTE_TO_FLOAT( ((t >> 8) & 0xf8) | ((t >> 13) & 0x7) ); 241 dst[i][GCOMP] = UBYTE_TO_FLOAT( ((t >> 3) & 0xfc) | ((t >> 9) & 0x3) ); 242 dst[i][BCOMP] = UBYTE_TO_FLOAT( ((t << 3) & 0xf8) | ((t >> 2) & 0x7) ); 243 dst[i][ACOMP] = 1.0F; 244 } 245} 246 247static void 248unpack_ARGB4444(const void *src, GLfloat dst[][4], GLuint n) 249{ 250 const GLushort *s = ((const GLushort *) src); 251 GLuint i; 252 for (i = 0; i < n; i++) { 253 dst[i][RCOMP] = ((s[i] >> 8) & 0xf) * (1.0F / 15.0F); 254 dst[i][GCOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F); 255 dst[i][BCOMP] = ((s[i] ) & 0xf) * (1.0F / 15.0F); 256 dst[i][ACOMP] = ((s[i] >> 12) & 0xf) * (1.0F / 15.0F); 257 } 258} 259 260static void 261unpack_ARGB4444_REV(const void *src, GLfloat dst[][4], GLuint n) 262{ 263 const GLushort *s = ((const GLushort *) src); 264 GLuint i; 265 for (i = 0; i < n; i++) { 266 dst[i][RCOMP] = ((s[i] ) & 0xf) * (1.0F / 15.0F); 267 dst[i][GCOMP] = ((s[i] >> 12) & 0xf) * (1.0F / 15.0F); 268 dst[i][BCOMP] = ((s[i] >> 8) & 0xf) * (1.0F / 15.0F); 269 dst[i][ACOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F); 270 } 271} 272 273static void 274unpack_RGBA5551(const void *src, GLfloat dst[][4], GLuint n) 275{ 276 const GLushort *s = ((const GLushort *) src); 277 GLuint i; 278 for (i = 0; i < n; i++) { 279 dst[i][RCOMP] = ((s[i] >> 11) & 0x1f) * (1.0F / 31.0F); 280 dst[i][GCOMP] = ((s[i] >> 6) & 0x1f) * (1.0F / 31.0F); 281 dst[i][BCOMP] = ((s[i] >> 1) & 0x1f) * (1.0F / 31.0F); 282 dst[i][ACOMP] = ((s[i] ) & 0x01) * 1.0F; 283 } 284} 285 286static void 287unpack_ARGB1555(const void *src, GLfloat dst[][4], GLuint n) 288{ 289 const GLushort *s = ((const GLushort *) src); 290 GLuint i; 291 for (i = 0; i < n; i++) { 292 dst[i][RCOMP] = ((s[i] >> 10) & 0x1f) * (1.0F / 31.0F); 293 dst[i][GCOMP] = ((s[i] >> 5) & 0x1f) * (1.0F / 31.0F); 294 dst[i][BCOMP] = ((s[i] >> 0) & 0x1f) * (1.0F / 31.0F); 295 dst[i][ACOMP] = ((s[i] >> 15) & 0x01) * 1.0F; 296 } 297} 298 299static void 300unpack_ARGB1555_REV(const void *src, GLfloat dst[][4], GLuint n) 301{ 302 const GLushort *s = ((const GLushort *) src); 303 GLuint i; 304 for (i = 0; i < n; i++) { 305 GLushort tmp = (s[i] << 8) | (s[i] >> 8); /* byteswap */ 306 dst[i][RCOMP] = ((tmp >> 10) & 0x1f) * (1.0F / 31.0F); 307 dst[i][GCOMP] = ((tmp >> 5) & 0x1f) * (1.0F / 31.0F); 308 dst[i][BCOMP] = ((tmp >> 0) & 0x1f) * (1.0F / 31.0F); 309 dst[i][ACOMP] = ((tmp >> 15) & 0x01) * 1.0F; 310 } 311} 312 313static void 314unpack_AL44(const void *src, GLfloat dst[][4], GLuint n) 315{ 316 const GLubyte *s = ((const GLubyte *) src); 317 GLuint i; 318 for (i = 0; i < n; i++) { 319 dst[i][RCOMP] = 320 dst[i][GCOMP] = 321 dst[i][BCOMP] = (s[i] & 0xf) * (1.0F / 15.0F); 322 dst[i][ACOMP] = ((s[i] >> 4) & 0xf) * (1.0F / 15.0F); 323 } 324} 325 326static void 327unpack_AL88(const void *src, GLfloat dst[][4], GLuint n) 328{ 329 const GLushort *s = ((const GLushort *) src); 330 GLuint i; 331 for (i = 0; i < n; i++) { 332 dst[i][RCOMP] = 333 dst[i][GCOMP] = 334 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff ); 335 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 8 ); 336 } 337} 338 339static void 340unpack_AL88_REV(const void *src, GLfloat dst[][4], GLuint n) 341{ 342 const GLushort *s = ((const GLushort *) src); 343 GLuint i; 344 for (i = 0; i < n; i++) { 345 dst[i][RCOMP] = 346 dst[i][GCOMP] = 347 dst[i][BCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 ); 348 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] & 0xff ); 349 } 350} 351 352static void 353unpack_AL1616(const void *src, GLfloat dst[][4], GLuint n) 354{ 355 const GLuint *s = ((const GLuint *) src); 356 GLuint i; 357 for (i = 0; i < n; i++) { 358 dst[i][RCOMP] = 359 dst[i][GCOMP] = 360 dst[i][BCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff ); 361 dst[i][ACOMP] = USHORT_TO_FLOAT( s[i] >> 16 ); 362 } 363} 364 365static void 366unpack_AL1616_REV(const void *src, GLfloat dst[][4], GLuint n) 367{ 368 const GLuint *s = ((const GLuint *) src); 369 GLuint i; 370 for (i = 0; i < n; i++) { 371 dst[i][RCOMP] = 372 dst[i][GCOMP] = 373 dst[i][BCOMP] = USHORT_TO_FLOAT( s[i] >> 16 ); 374 dst[i][ACOMP] = USHORT_TO_FLOAT( s[i] & 0xffff ); 375 } 376} 377 378static void 379unpack_RGB332(const void *src, GLfloat dst[][4], GLuint n) 380{ 381 const GLubyte *s = ((const GLubyte *) src); 382 GLuint i; 383 for (i = 0; i < n; i++) { 384 dst[i][RCOMP] = ((s[i] >> 5) & 0x7) * (1.0F / 7.0F); 385 dst[i][GCOMP] = ((s[i] >> 2) & 0x7) * (1.0F / 7.0F); 386 dst[i][BCOMP] = ((s[i] ) & 0x3) * (1.0F / 3.0F); 387 dst[i][ACOMP] = 1.0F; 388 } 389} 390 391 392static void 393unpack_A8(const void *src, GLfloat dst[][4], GLuint n) 394{ 395 const GLubyte *s = ((const GLubyte *) src); 396 GLuint i; 397 for (i = 0; i < n; i++) { 398 dst[i][RCOMP] = 399 dst[i][GCOMP] = 400 dst[i][BCOMP] = 0.0F; 401 dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i]); 402 } 403} 404 405static void 406unpack_A16(const void *src, GLfloat dst[][4], GLuint n) 407{ 408 const GLushort *s = ((const GLushort *) src); 409 GLuint i; 410 for (i = 0; i < n; i++) { 411 dst[i][RCOMP] = 412 dst[i][GCOMP] = 413 dst[i][BCOMP] = 0.0F; 414 dst[i][ACOMP] = USHORT_TO_FLOAT(s[i]); 415 } 416} 417 418static void 419unpack_L8(const void *src, GLfloat dst[][4], GLuint n) 420{ 421 const GLubyte *s = ((const GLubyte *) src); 422 GLuint i; 423 for (i = 0; i < n; i++) { 424 dst[i][RCOMP] = 425 dst[i][GCOMP] = 426 dst[i][BCOMP] = UBYTE_TO_FLOAT(s[i]); 427 dst[i][ACOMP] = 1.0F; 428 } 429} 430 431static void 432unpack_L16(const void *src, GLfloat dst[][4], GLuint n) 433{ 434 const GLushort *s = ((const GLushort *) src); 435 GLuint i; 436 for (i = 0; i < n; i++) { 437 dst[i][RCOMP] = 438 dst[i][GCOMP] = 439 dst[i][BCOMP] = USHORT_TO_FLOAT(s[i]); 440 dst[i][ACOMP] = 1.0F; 441 } 442} 443 444static void 445unpack_I8(const void *src, GLfloat dst[][4], GLuint n) 446{ 447 const GLubyte *s = ((const GLubyte *) src); 448 GLuint i; 449 for (i = 0; i < n; i++) { 450 dst[i][RCOMP] = 451 dst[i][GCOMP] = 452 dst[i][BCOMP] = 453 dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i]); 454 } 455} 456 457static void 458unpack_I16(const void *src, GLfloat dst[][4], GLuint n) 459{ 460 const GLushort *s = ((const GLushort *) src); 461 GLuint i; 462 for (i = 0; i < n; i++) { 463 dst[i][RCOMP] = 464 dst[i][GCOMP] = 465 dst[i][BCOMP] = 466 dst[i][ACOMP] = USHORT_TO_FLOAT(s[i]); 467 } 468} 469 470static void 471unpack_YCBCR(const void *src, GLfloat dst[][4], GLuint n) 472{ 473 GLuint i; 474 for (i = 0; i < n; i++) { 475 const GLushort *src0 = ((const GLushort *) src) + i * 2; /* even */ 476 const GLushort *src1 = src0 + 1; /* odd */ 477 const GLubyte y0 = (*src0 >> 8) & 0xff; /* luminance */ 478 const GLubyte cb = *src0 & 0xff; /* chroma U */ 479 const GLubyte y1 = (*src1 >> 8) & 0xff; /* luminance */ 480 const GLubyte cr = *src1 & 0xff; /* chroma V */ 481 const GLubyte y = (i & 1) ? y1 : y0; /* choose even/odd luminance */ 482 GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128); 483 GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128); 484 GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128); 485 r *= (1.0F / 255.0F); 486 g *= (1.0F / 255.0F); 487 b *= (1.0F / 255.0F); 488 dst[i][RCOMP] = CLAMP(r, 0.0F, 1.0F); 489 dst[i][GCOMP] = CLAMP(g, 0.0F, 1.0F); 490 dst[i][BCOMP] = CLAMP(b, 0.0F, 1.0F); 491 dst[i][ACOMP] = 1.0F; 492 } 493} 494 495static void 496unpack_YCBCR_REV(const void *src, GLfloat dst[][4], GLuint n) 497{ 498 GLuint i; 499 for (i = 0; i < n; i++) { 500 const GLushort *src0 = ((const GLushort *) src) + i * 2; /* even */ 501 const GLushort *src1 = src0 + 1; /* odd */ 502 const GLubyte y0 = *src0 & 0xff; /* luminance */ 503 const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma V */ 504 const GLubyte y1 = *src1 & 0xff; /* luminance */ 505 const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma U */ 506 const GLubyte y = (i & 1) ? y1 : y0; /* choose even/odd luminance */ 507 GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128); 508 GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128); 509 GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128); 510 r *= (1.0F / 255.0F); 511 g *= (1.0F / 255.0F); 512 b *= (1.0F / 255.0F); 513 dst[i][RCOMP] = CLAMP(r, 0.0F, 1.0F); 514 dst[i][GCOMP] = CLAMP(g, 0.0F, 1.0F); 515 dst[i][BCOMP] = CLAMP(b, 0.0F, 1.0F); 516 dst[i][ACOMP] = 1.0F; 517 } 518} 519 520static void 521unpack_R8(const void *src, GLfloat dst[][4], GLuint n) 522{ 523 const GLubyte *s = ((const GLubyte *) src); 524 GLuint i; 525 for (i = 0; i < n; i++) { 526 dst[i][0] = UBYTE_TO_FLOAT(s[i]); 527 dst[i][1] = 528 dst[i][2] = 0.0F; 529 dst[i][3] = 1.0F; 530 } 531} 532 533static void 534unpack_GR88(const void *src, GLfloat dst[][4], GLuint n) 535{ 536 const GLushort *s = ((const GLushort *) src); 537 GLuint i; 538 for (i = 0; i < n; i++) { 539 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff ); 540 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 ); 541 dst[i][BCOMP] = 0.0; 542 dst[i][ACOMP] = 1.0; 543 } 544} 545 546static void 547unpack_RG88(const void *src, GLfloat dst[][4], GLuint n) 548{ 549 const GLushort *s = ((const GLushort *) src); 550 GLuint i; 551 for (i = 0; i < n; i++) { 552 dst[i][RCOMP] = UBYTE_TO_FLOAT( s[i] >> 8 ); 553 dst[i][GCOMP] = UBYTE_TO_FLOAT( s[i] & 0xff ); 554 dst[i][BCOMP] = 0.0; 555 dst[i][ACOMP] = 1.0; 556 } 557} 558 559static void 560unpack_R16(const void *src, GLfloat dst[][4], GLuint n) 561{ 562 const GLushort *s = ((const GLushort *) src); 563 GLuint i; 564 for (i = 0; i < n; i++) { 565 dst[i][RCOMP] = USHORT_TO_FLOAT(s[i]); 566 dst[i][GCOMP] = 0.0; 567 dst[i][BCOMP] = 0.0; 568 dst[i][ACOMP] = 1.0; 569 } 570} 571 572static void 573unpack_RG1616(const void *src, GLfloat dst[][4], GLuint n) 574{ 575 const GLuint *s = ((const GLuint *) src); 576 GLuint i; 577 for (i = 0; i < n; i++) { 578 dst[i][RCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff ); 579 dst[i][GCOMP] = USHORT_TO_FLOAT( s[i] >> 16 ); 580 dst[i][BCOMP] = 0.0; 581 dst[i][ACOMP] = 1.0; 582 } 583} 584 585static void 586unpack_RG1616_REV(const void *src, GLfloat dst[][4], GLuint n) 587{ 588 const GLuint *s = ((const GLuint *) src); 589 GLuint i; 590 for (i = 0; i < n; i++) { 591 dst[i][RCOMP] = USHORT_TO_FLOAT( s[i] >> 16 ); 592 dst[i][GCOMP] = USHORT_TO_FLOAT( s[i] & 0xffff ); 593 dst[i][BCOMP] = 0.0; 594 dst[i][ACOMP] = 1.0; 595 } 596} 597 598static void 599unpack_ARGB2101010(const void *src, GLfloat dst[][4], GLuint n) 600{ 601 const GLuint *s = ((const GLuint *) src); 602 GLuint i; 603 for (i = 0; i < n; i++) { 604 dst[i][RCOMP] = ((s[i] >> 20) & 0x3ff) * (1.0F / 1023.0F); 605 dst[i][GCOMP] = ((s[i] >> 10) & 0x3ff) * (1.0F / 1023.0F); 606 dst[i][BCOMP] = ((s[i] >> 0) & 0x3ff) * (1.0F / 1023.0F); 607 dst[i][ACOMP] = ((s[i] >> 30) & 0x03) * (1.0F / 3.0F); 608 } 609} 610 611 612static void 613unpack_ABGR2101010_UINT(const void *src, GLfloat dst[][4], GLuint n) 614{ 615 const GLuint *s = ((const GLuint *) src); 616 GLuint i; 617 for (i = 0; i < n; i++) { 618 dst[i][RCOMP] = (GLfloat)((s[i] >> 0) & 0x3ff); 619 dst[i][GCOMP] = (GLfloat)((s[i] >> 10) & 0x3ff); 620 dst[i][BCOMP] = (GLfloat)((s[i] >> 20) & 0x3ff); 621 dst[i][ACOMP] = (GLfloat)((s[i] >> 30) & 0x03); 622 } 623} 624 625 626static void 627unpack_Z24_S8(const void *src, GLfloat dst[][4], GLuint n) 628{ 629 /* only return Z, not stencil data */ 630 const GLuint *s = ((const GLuint *) src); 631 const GLdouble scale = 1.0 / (GLdouble) 0xffffff; 632 GLuint i; 633 for (i = 0; i < n; i++) { 634 dst[i][0] = 635 dst[i][1] = 636 dst[i][2] = (s[i] >> 8) * scale; 637 dst[i][3] = 1.0F; 638 ASSERT(dst[i][0] >= 0.0F); 639 ASSERT(dst[i][0] <= 1.0F); 640 } 641} 642 643static void 644unpack_S8_Z24(const void *src, GLfloat dst[][4], GLuint n) 645{ 646 /* only return Z, not stencil data */ 647 const GLuint *s = ((const GLuint *) src); 648 const GLdouble scale = 1.0 / (GLdouble) 0xffffff; 649 GLuint i; 650 for (i = 0; i < n; i++) { 651 dst[i][0] = 652 dst[i][1] = 653 dst[i][2] = (s[i] & 0x00ffffff) * scale; 654 dst[i][3] = 1.0F; 655 ASSERT(dst[i][0] >= 0.0F); 656 ASSERT(dst[i][0] <= 1.0F); 657 } 658} 659 660static void 661unpack_Z16(const void *src, GLfloat dst[][4], GLuint n) 662{ 663 const GLushort *s = ((const GLushort *) src); 664 GLuint i; 665 for (i = 0; i < n; i++) { 666 dst[i][0] = 667 dst[i][1] = 668 dst[i][2] = s[i] * (1.0F / 65535.0F); 669 dst[i][3] = 1.0F; 670 } 671} 672 673static void 674unpack_X8_Z24(const void *src, GLfloat dst[][4], GLuint n) 675{ 676 unpack_S8_Z24(src, dst, n); 677} 678 679static void 680unpack_Z24_X8(const void *src, GLfloat dst[][4], GLuint n) 681{ 682 unpack_Z24_S8(src, dst, n); 683} 684 685static void 686unpack_Z32(const void *src, GLfloat dst[][4], GLuint n) 687{ 688 const GLuint *s = ((const GLuint *) src); 689 GLuint i; 690 for (i = 0; i < n; i++) { 691 dst[i][0] = 692 dst[i][1] = 693 dst[i][2] = s[i] * (1.0F / 0xffffffff); 694 dst[i][3] = 1.0F; 695 } 696} 697 698static void 699unpack_Z32_FLOAT(const void *src, GLfloat dst[][4], GLuint n) 700{ 701 const GLfloat *s = ((const GLfloat *) src); 702 GLuint i; 703 for (i = 0; i < n; i++) { 704 dst[i][0] = 705 dst[i][1] = 706 dst[i][2] = s[i * 2]; 707 dst[i][3] = 1.0F; 708 } 709} 710 711static void 712unpack_Z32_FLOAT_X24S8(const void *src, GLfloat dst[][4], GLuint n) 713{ 714 const GLfloat *s = ((const GLfloat *) src); 715 GLuint i; 716 for (i = 0; i < n; i++) { 717 dst[i][0] = 718 dst[i][1] = 719 dst[i][2] = s[i]; 720 dst[i][3] = 1.0F; 721 } 722} 723 724 725static void 726unpack_S8(const void *src, GLfloat dst[][4], GLuint n) 727{ 728 /* should never be used */ 729 GLuint i; 730 for (i = 0; i < n; i++) { 731 dst[i][0] = 732 dst[i][1] = 733 dst[i][2] = 0.0F; 734 dst[i][3] = 1.0F; 735 } 736} 737 738 739static void 740unpack_SRGB8(const void *src, GLfloat dst[][4], GLuint n) 741{ 742 const GLubyte *s = (const GLubyte *) src; 743 GLuint i; 744 for (i = 0; i < n; i++) { 745 dst[i][RCOMP] = nonlinear_to_linear(s[i*3+2]); 746 dst[i][GCOMP] = nonlinear_to_linear(s[i*3+1]); 747 dst[i][BCOMP] = nonlinear_to_linear(s[i*3+0]); 748 dst[i][ACOMP] = 1.0F; 749 } 750} 751 752static void 753unpack_SRGBA8(const void *src, GLfloat dst[][4], GLuint n) 754{ 755 const GLuint *s = ((const GLuint *) src); 756 GLuint i; 757 for (i = 0; i < n; i++) { 758 dst[i][RCOMP] = nonlinear_to_linear( (s[i] >> 24) ); 759 dst[i][GCOMP] = nonlinear_to_linear( (s[i] >> 16) & 0xff ); 760 dst[i][BCOMP] = nonlinear_to_linear( (s[i] >> 8) & 0xff ); 761 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] & 0xff ); /* linear! */ 762 } 763} 764 765static void 766unpack_SARGB8(const void *src, GLfloat dst[][4], GLuint n) 767{ 768 const GLuint *s = ((const GLuint *) src); 769 GLuint i; 770 for (i = 0; i < n; i++) { 771 dst[i][RCOMP] = nonlinear_to_linear( (s[i] >> 16) & 0xff ); 772 dst[i][GCOMP] = nonlinear_to_linear( (s[i] >> 8) & 0xff ); 773 dst[i][BCOMP] = nonlinear_to_linear( (s[i] ) & 0xff ); 774 dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 24 ); /* linear! */ 775 } 776} 777 778static void 779unpack_SL8(const void *src, GLfloat dst[][4], GLuint n) 780{ 781 const GLubyte *s = ((const GLubyte *) src); 782 GLuint i; 783 for (i = 0; i < n; i++) { 784 dst[i][RCOMP] = 785 dst[i][GCOMP] = 786 dst[i][BCOMP] = nonlinear_to_linear(s[i]); 787 dst[i][ACOMP] = 1.0F; 788 } 789} 790 791static void 792unpack_SLA8(const void *src, GLfloat dst[][4], GLuint n) 793{ 794 const GLushort *s = (const GLushort *) src; 795 GLuint i; 796 for (i = 0; i < n; i++) { 797 dst[i][RCOMP] = 798 dst[i][GCOMP] = 799 dst[i][BCOMP] = nonlinear_to_linear(s[i] & 0xff); 800 dst[i][ACOMP] = UBYTE_TO_FLOAT(s[i] >> 8); /* linear! */ 801 } 802} 803 804static void 805unpack_SRGB_DXT1(const void *src, GLfloat dst[][4], GLuint n) 806{ 807} 808 809static void 810unpack_SRGBA_DXT1(const void *src, GLfloat dst[][4], GLuint n) 811{ 812} 813 814static void 815unpack_SRGBA_DXT3(const void *src, GLfloat dst[][4], GLuint n) 816{ 817} 818 819static void 820unpack_SRGBA_DXT5(const void *src, GLfloat dst[][4], GLuint n) 821{ 822} 823 824static void 825unpack_RGB_FXT1(const void *src, GLfloat dst[][4], GLuint n) 826{ 827} 828 829static void 830unpack_RGBA_FXT1(const void *src, GLfloat dst[][4], GLuint n) 831{ 832} 833 834static void 835unpack_RGB_DXT1(const void *src, GLfloat dst[][4], GLuint n) 836{ 837} 838 839static void 840unpack_RGBA_DXT1(const void *src, GLfloat dst[][4], GLuint n) 841{ 842} 843 844static void 845unpack_RGBA_DXT3(const void *src, GLfloat dst[][4], GLuint n) 846{ 847} 848 849static void 850unpack_RGBA_DXT5(const void *src, GLfloat dst[][4], GLuint n) 851{ 852} 853 854 855static void 856unpack_RGBA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n) 857{ 858 const GLfloat *s = (const GLfloat *) src; 859 GLuint i; 860 for (i = 0; i < n; i++) { 861 dst[i][RCOMP] = s[i*4+0]; 862 dst[i][GCOMP] = s[i*4+1]; 863 dst[i][BCOMP] = s[i*4+2]; 864 dst[i][ACOMP] = s[i*4+3]; 865 } 866} 867 868static void 869unpack_RGBA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n) 870{ 871 const GLhalfARB *s = (const GLhalfARB *) src; 872 GLuint i; 873 for (i = 0; i < n; i++) { 874 dst[i][RCOMP] = _mesa_half_to_float(s[i*4+0]); 875 dst[i][GCOMP] = _mesa_half_to_float(s[i*4+1]); 876 dst[i][BCOMP] = _mesa_half_to_float(s[i*4+2]); 877 dst[i][ACOMP] = _mesa_half_to_float(s[i*4+3]); 878 } 879} 880 881static void 882unpack_RGB_FLOAT32(const void *src, GLfloat dst[][4], GLuint n) 883{ 884 const GLfloat *s = (const GLfloat *) src; 885 GLuint i; 886 for (i = 0; i < n; i++) { 887 dst[i][RCOMP] = s[i*3+0]; 888 dst[i][GCOMP] = s[i*3+1]; 889 dst[i][BCOMP] = s[i*3+2]; 890 dst[i][ACOMP] = 1.0F; 891 } 892} 893 894static void 895unpack_RGB_FLOAT16(const void *src, GLfloat dst[][4], GLuint n) 896{ 897 const GLhalfARB *s = (const GLhalfARB *) src; 898 GLuint i; 899 for (i = 0; i < n; i++) { 900 dst[i][RCOMP] = _mesa_half_to_float(s[i*3+0]); 901 dst[i][GCOMP] = _mesa_half_to_float(s[i*3+1]); 902 dst[i][BCOMP] = _mesa_half_to_float(s[i*3+2]); 903 dst[i][ACOMP] = 1.0F; 904 } 905} 906 907static void 908unpack_ALPHA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n) 909{ 910 const GLfloat *s = (const GLfloat *) src; 911 GLuint i; 912 for (i = 0; i < n; i++) { 913 dst[i][RCOMP] = 914 dst[i][GCOMP] = 915 dst[i][BCOMP] = 0.0F; 916 dst[i][ACOMP] = s[i]; 917 } 918} 919 920static void 921unpack_ALPHA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n) 922{ 923 const GLhalfARB *s = (const GLhalfARB *) src; 924 GLuint i; 925 for (i = 0; i < n; i++) { 926 dst[i][RCOMP] = 927 dst[i][GCOMP] = 928 dst[i][BCOMP] = 0.0F; 929 dst[i][ACOMP] = _mesa_half_to_float(s[i]); 930 } 931} 932 933static void 934unpack_LUMINANCE_FLOAT32(const void *src, GLfloat dst[][4], GLuint n) 935{ 936 const GLfloat *s = (const GLfloat *) src; 937 GLuint i; 938 for (i = 0; i < n; i++) { 939 dst[i][RCOMP] = 940 dst[i][GCOMP] = 941 dst[i][BCOMP] = s[i]; 942 dst[i][ACOMP] = 1.0F; 943 } 944} 945 946static void 947unpack_LUMINANCE_FLOAT16(const void *src, GLfloat dst[][4], GLuint n) 948{ 949 const GLhalfARB *s = (const GLhalfARB *) src; 950 GLuint i; 951 for (i = 0; i < n; i++) { 952 dst[i][RCOMP] = 953 dst[i][GCOMP] = 954 dst[i][BCOMP] = _mesa_half_to_float(s[i]); 955 dst[i][ACOMP] = 1.0F; 956 } 957} 958 959static void 960unpack_LUMINANCE_ALPHA_FLOAT32(const void *src, GLfloat dst[][4], GLuint n) 961{ 962 const GLfloat *s = (const GLfloat *) src; 963 GLuint i; 964 for (i = 0; i < n; i++) { 965 dst[i][RCOMP] = 966 dst[i][GCOMP] = 967 dst[i][BCOMP] = s[i*2+0]; 968 dst[i][ACOMP] = s[i*2+1]; 969 } 970} 971 972static void 973unpack_LUMINANCE_ALPHA_FLOAT16(const void *src, GLfloat dst[][4], GLuint n) 974{ 975 const GLhalfARB *s = (const GLhalfARB *) src; 976 GLuint i; 977 for (i = 0; i < n; i++) { 978 dst[i][RCOMP] = 979 dst[i][GCOMP] = 980 dst[i][BCOMP] = _mesa_half_to_float(s[i*2+0]); 981 dst[i][ACOMP] = _mesa_half_to_float(s[i*2+1]); 982 } 983} 984 985static void 986unpack_INTENSITY_FLOAT32(const void *src, GLfloat dst[][4], GLuint n) 987{ 988 const GLfloat *s = (const GLfloat *) src; 989 GLuint i; 990 for (i = 0; i < n; i++) { 991 dst[i][RCOMP] = 992 dst[i][GCOMP] = 993 dst[i][BCOMP] = 994 dst[i][ACOMP] = s[i]; 995 } 996} 997 998static void 999unpack_INTENSITY_FLOAT16(const void *src, GLfloat dst[][4], GLuint n) 1000{ 1001 const GLhalfARB *s = (const GLhalfARB *) src; 1002 GLuint i; 1003 for (i = 0; i < n; i++) { 1004 dst[i][RCOMP] = 1005 dst[i][GCOMP] = 1006 dst[i][BCOMP] = 1007 dst[i][ACOMP] = _mesa_half_to_float(s[i]); 1008 } 1009} 1010 1011static void 1012unpack_R_FLOAT32(const void *src, GLfloat dst[][4], GLuint n) 1013{ 1014 const GLfloat *s = (const GLfloat *) src; 1015 GLuint i; 1016 for (i = 0; i < n; i++) { 1017 dst[i][RCOMP] = s[i]; 1018 dst[i][GCOMP] = 0.0F; 1019 dst[i][BCOMP] = 0.0F; 1020 dst[i][ACOMP] = 1.0F; 1021 } 1022} 1023 1024static void 1025unpack_R_FLOAT16(const void *src, GLfloat dst[][4], GLuint n) 1026{ 1027 const GLhalfARB *s = (const GLhalfARB *) src; 1028 GLuint i; 1029 for (i = 0; i < n; i++) { 1030 dst[i][RCOMP] = _mesa_half_to_float(s[i]); 1031 dst[i][GCOMP] = 0.0F; 1032 dst[i][BCOMP] = 0.0F; 1033 dst[i][ACOMP] = 1.0F; 1034 } 1035} 1036 1037static void 1038unpack_RG_FLOAT32(const void *src, GLfloat dst[][4], GLuint n) 1039{ 1040 const GLfloat *s = (const GLfloat *) src; 1041 GLuint i; 1042 for (i = 0; i < n; i++) { 1043 dst[i][RCOMP] = s[i*2+0]; 1044 dst[i][GCOMP] = s[i*2+1]; 1045 dst[i][BCOMP] = 0.0F; 1046 dst[i][ACOMP] = 1.0F; 1047 } 1048} 1049 1050static void 1051unpack_RG_FLOAT16(const void *src, GLfloat dst[][4], GLuint n) 1052{ 1053 const GLhalfARB *s = (const GLhalfARB *) src; 1054 GLuint i; 1055 for (i = 0; i < n; i++) { 1056 dst[i][RCOMP] = _mesa_half_to_float(s[i*2+0]); 1057 dst[i][GCOMP] = _mesa_half_to_float(s[i*2+1]); 1058 dst[i][BCOMP] = 0.0F; 1059 dst[i][ACOMP] = 1.0F; 1060 } 1061} 1062 1063 1064static void 1065unpack_RGBA_INT8(const void *src, GLfloat dst[][4], GLuint n) 1066{ 1067 const GLbyte *s = (const GLbyte *) src; 1068 GLuint i; 1069 for (i = 0; i < n; i++) { 1070 dst[i][RCOMP] = (GLfloat) s[i*4+0]; 1071 dst[i][GCOMP] = (GLfloat) s[i*4+1]; 1072 dst[i][BCOMP] = (GLfloat) s[i*4+2]; 1073 dst[i][ACOMP] = (GLfloat) s[i*4+3]; 1074 } 1075} 1076 1077static void 1078unpack_RGBA_INT16(const void *src, GLfloat dst[][4], GLuint n) 1079{ 1080 const GLshort *s = (const GLshort *) src; 1081 GLuint i; 1082 for (i = 0; i < n; i++) { 1083 dst[i][RCOMP] = (GLfloat) s[i*4+0]; 1084 dst[i][GCOMP] = (GLfloat) s[i*4+1]; 1085 dst[i][BCOMP] = (GLfloat) s[i*4+2]; 1086 dst[i][ACOMP] = (GLfloat) s[i*4+3]; 1087 } 1088} 1089 1090static void 1091unpack_RGBA_INT32(const void *src, GLfloat dst[][4], GLuint n) 1092{ 1093 const GLint *s = (const GLint *) src; 1094 GLuint i; 1095 for (i = 0; i < n; i++) { 1096 dst[i][RCOMP] = (GLfloat) s[i*4+0]; 1097 dst[i][GCOMP] = (GLfloat) s[i*4+1]; 1098 dst[i][BCOMP] = (GLfloat) s[i*4+2]; 1099 dst[i][ACOMP] = (GLfloat) s[i*4+3]; 1100 } 1101} 1102 1103static void 1104unpack_RGBA_UINT8(const void *src, GLfloat dst[][4], GLuint n) 1105{ 1106 const GLubyte *s = (const GLubyte *) src; 1107 GLuint i; 1108 for (i = 0; i < n; i++) { 1109 dst[i][RCOMP] = (GLfloat) s[i*4+0]; 1110 dst[i][GCOMP] = (GLfloat) s[i*4+1]; 1111 dst[i][BCOMP] = (GLfloat) s[i*4+2]; 1112 dst[i][ACOMP] = (GLfloat) s[i*4+3]; 1113 } 1114} 1115 1116static void 1117unpack_RGBA_UINT16(const void *src, GLfloat dst[][4], GLuint n) 1118{ 1119 const GLushort *s = (const GLushort *) src; 1120 GLuint i; 1121 for (i = 0; i < n; i++) { 1122 dst[i][RCOMP] = (GLfloat) s[i*4+0]; 1123 dst[i][GCOMP] = (GLfloat) s[i*4+1]; 1124 dst[i][BCOMP] = (GLfloat) s[i*4+2]; 1125 dst[i][ACOMP] = (GLfloat) s[i*4+3]; 1126 } 1127} 1128 1129static void 1130unpack_RGBA_UINT32(const void *src, GLfloat dst[][4], GLuint n) 1131{ 1132 const GLuint *s = (const GLuint *) src; 1133 GLuint i; 1134 for (i = 0; i < n; i++) { 1135 dst[i][RCOMP] = (GLfloat) s[i*4+0]; 1136 dst[i][GCOMP] = (GLfloat) s[i*4+1]; 1137 dst[i][BCOMP] = (GLfloat) s[i*4+2]; 1138 dst[i][ACOMP] = (GLfloat) s[i*4+3]; 1139 } 1140} 1141 1142static void 1143unpack_DUDV8(const void *src, GLfloat dst[][4], GLuint n) 1144{ 1145 const GLbyte *s = (const GLbyte *) src; 1146 GLuint i; 1147 for (i = 0; i < n; i++) { 1148 dst[i][RCOMP] = BYTE_TO_FLOAT(s[i*2+0]); 1149 dst[i][GCOMP] = BYTE_TO_FLOAT(s[i*2+1]); 1150 dst[i][BCOMP] = 0; 1151 dst[i][ACOMP] = 0; 1152 } 1153} 1154 1155static void 1156unpack_SIGNED_R8(const void *src, GLfloat dst[][4], GLuint n) 1157{ 1158 const GLbyte *s = ((const GLbyte *) src); 1159 GLuint i; 1160 for (i = 0; i < n; i++) { 1161 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( s[i] ); 1162 dst[i][GCOMP] = 0.0F; 1163 dst[i][BCOMP] = 0.0F; 1164 dst[i][ACOMP] = 1.0F; 1165 } 1166} 1167 1168static void 1169unpack_SIGNED_RG88_REV(const void *src, GLfloat dst[][4], GLuint n) 1170{ 1171 const GLushort *s = ((const GLushort *) src); 1172 GLuint i; 1173 for (i = 0; i < n; i++) { 1174 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] & 0xff) ); 1175 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) ); 1176 dst[i][BCOMP] = 0.0F; 1177 dst[i][ACOMP] = 1.0F; 1178 } 1179} 1180 1181static void 1182unpack_SIGNED_RGBX8888(const void *src, GLfloat dst[][4], GLuint n) 1183{ 1184 const GLuint *s = ((const GLuint *) src); 1185 GLuint i; 1186 for (i = 0; i < n; i++) { 1187 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) ); 1188 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) ); 1189 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) ); 1190 dst[i][ACOMP] = 1.0f; 1191 } 1192} 1193 1194static void 1195unpack_SIGNED_RGBA8888(const void *src, GLfloat dst[][4], GLuint n) 1196{ 1197 const GLuint *s = ((const GLuint *) src); 1198 GLuint i; 1199 for (i = 0; i < n; i++) { 1200 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) ); 1201 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) ); 1202 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) ); 1203 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] ) ); 1204 } 1205} 1206 1207static void 1208unpack_SIGNED_RGBA8888_REV(const void *src, GLfloat dst[][4], GLuint n) 1209{ 1210 const GLuint *s = ((const GLuint *) src); 1211 GLuint i; 1212 for (i = 0; i < n; i++) { 1213 dst[i][RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] ) ); 1214 dst[i][GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) ); 1215 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 16) ); 1216 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 24) ); 1217 } 1218} 1219 1220static void 1221unpack_SIGNED_R16(const void *src, GLfloat dst[][4], GLuint n) 1222{ 1223 const GLshort *s = ((const GLshort *) src); 1224 GLuint i; 1225 for (i = 0; i < n; i++) { 1226 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i] ); 1227 dst[i][GCOMP] = 0.0F; 1228 dst[i][BCOMP] = 0.0F; 1229 dst[i][ACOMP] = 1.0F; 1230 } 1231} 1232 1233static void 1234unpack_SIGNED_GR1616(const void *src, GLfloat dst[][4], GLuint n) 1235{ 1236 const GLuint *s = ((const GLuint *) src); 1237 GLuint i; 1238 for (i = 0; i < n; i++) { 1239 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( (GLshort) (s[i] & 0xffff) ); 1240 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( (GLshort) (s[i] >> 16) ); 1241 dst[i][BCOMP] = 0.0F; 1242 dst[i][ACOMP] = 1.0F; 1243 } 1244} 1245 1246static void 1247unpack_SIGNED_RGB_16(const void *src, GLfloat dst[][4], GLuint n) 1248{ 1249 const GLshort *s = (const GLshort *) src; 1250 GLuint i; 1251 for (i = 0; i < n; i++) { 1252 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+0] ); 1253 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+1] ); 1254 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*3+2] ); 1255 dst[i][ACOMP] = 1.0F; 1256 } 1257} 1258 1259static void 1260unpack_SIGNED_RGBA_16(const void *src, GLfloat dst[][4], GLuint n) 1261{ 1262 const GLshort *s = (const GLshort *) src; 1263 GLuint i; 1264 for (i = 0; i < n; i++) { 1265 dst[i][RCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+0] ); 1266 dst[i][GCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+1] ); 1267 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*4+2] ); 1268 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i*4+3] ); 1269 } 1270} 1271 1272static void 1273unpack_RGBA_16(const void *src, GLfloat dst[][4], GLuint n) 1274{ 1275 const GLushort *s = (const GLushort *) src; 1276 GLuint i; 1277 for (i = 0; i < n; i++) { 1278 dst[i][RCOMP] = USHORT_TO_FLOAT( s[i*4+0] ); 1279 dst[i][GCOMP] = USHORT_TO_FLOAT( s[i*4+1] ); 1280 dst[i][BCOMP] = USHORT_TO_FLOAT( s[i*4+2] ); 1281 dst[i][ACOMP] = USHORT_TO_FLOAT( s[i*4+3] ); 1282 } 1283} 1284 1285static void 1286unpack_RED_RGTC1(const void *src, GLfloat dst[][4], GLuint n) 1287{ 1288 /* XXX to do */ 1289} 1290 1291static void 1292unpack_SIGNED_RED_RGTC1(const void *src, GLfloat dst[][4], GLuint n) 1293{ 1294 /* XXX to do */ 1295} 1296 1297static void 1298unpack_RG_RGTC2(const void *src, GLfloat dst[][4], GLuint n) 1299{ 1300 /* XXX to do */ 1301} 1302 1303static void 1304unpack_SIGNED_RG_RGTC2(const void *src, GLfloat dst[][4], GLuint n) 1305{ 1306 /* XXX to do */ 1307} 1308 1309static void 1310unpack_L_LATC1(const void *src, GLfloat dst[][4], GLuint n) 1311{ 1312 /* XXX to do */ 1313} 1314 1315static void 1316unpack_SIGNED_L_LATC1(const void *src, GLfloat dst[][4], GLuint n) 1317{ 1318 /* XXX to do */ 1319} 1320 1321static void 1322unpack_LA_LATC2(const void *src, GLfloat dst[][4], GLuint n) 1323{ 1324 /* XXX to do */ 1325} 1326 1327static void 1328unpack_SIGNED_LA_LATC2(const void *src, GLfloat dst[][4], GLuint n) 1329{ 1330 /* XXX to do */ 1331} 1332 1333static void 1334unpack_ETC1_RGB8(const void *src, GLfloat dst[][4], GLuint n) 1335{ 1336 /* XXX to do */ 1337} 1338 1339static void 1340unpack_SIGNED_A8(const void *src, GLfloat dst[][4], GLuint n) 1341{ 1342 const GLbyte *s = ((const GLbyte *) src); 1343 GLuint i; 1344 for (i = 0; i < n; i++) { 1345 dst[i][RCOMP] = 0.0F; 1346 dst[i][GCOMP] = 0.0F; 1347 dst[i][BCOMP] = 0.0F; 1348 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( s[i] ); 1349 } 1350} 1351 1352static void 1353unpack_SIGNED_L8(const void *src, GLfloat dst[][4], GLuint n) 1354{ 1355 const GLbyte *s = ((const GLbyte *) src); 1356 GLuint i; 1357 for (i = 0; i < n; i++) { 1358 dst[i][RCOMP] = 1359 dst[i][GCOMP] = 1360 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( s[i] ); 1361 dst[i][ACOMP] = 1.0F; 1362 } 1363} 1364 1365static void 1366unpack_SIGNED_AL88(const void *src, GLfloat dst[][4], GLuint n) 1367{ 1368 const GLshort *s = ((const GLshort *) src); 1369 GLuint i; 1370 for (i = 0; i < n; i++) { 1371 dst[i][RCOMP] = 1372 dst[i][GCOMP] = 1373 dst[i][BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] & 0xff) ); 1374 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s[i] >> 8) ); 1375 } 1376} 1377 1378static void 1379unpack_SIGNED_I8(const void *src, GLfloat dst[][4], GLuint n) 1380{ 1381 const GLbyte *s = ((const GLbyte *) src); 1382 GLuint i; 1383 for (i = 0; i < n; i++) { 1384 dst[i][RCOMP] = 1385 dst[i][GCOMP] = 1386 dst[i][BCOMP] = 1387 dst[i][ACOMP] = BYTE_TO_FLOAT_TEX( s[i] ); 1388 } 1389} 1390 1391static void 1392unpack_SIGNED_A16(const void *src, GLfloat dst[][4], GLuint n) 1393{ 1394 const GLshort *s = ((const GLshort *) src); 1395 GLuint i; 1396 for (i = 0; i < n; i++) { 1397 dst[i][RCOMP] = 0.0F; 1398 dst[i][GCOMP] = 0.0F; 1399 dst[i][BCOMP] = 0.0F; 1400 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i] ); 1401 } 1402} 1403 1404static void 1405unpack_SIGNED_L16(const void *src, GLfloat dst[][4], GLuint n) 1406{ 1407 const GLshort *s = ((const GLshort *) src); 1408 GLuint i; 1409 for (i = 0; i < n; i++) { 1410 dst[i][RCOMP] = 1411 dst[i][GCOMP] = 1412 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i] ); 1413 dst[i][ACOMP] = 1.0F; 1414 } 1415} 1416 1417static void 1418unpack_SIGNED_AL1616(const void *src, GLfloat dst[][4], GLuint n) 1419{ 1420 const GLshort *s = (const GLshort *) src; 1421 GLuint i; 1422 for (i = 0; i < n; i++) { 1423 dst[i][RCOMP] = 1424 dst[i][GCOMP] = 1425 dst[i][BCOMP] = SHORT_TO_FLOAT_TEX( s[i*2+0] ); 1426 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i*2+1] ); 1427 } 1428} 1429 1430static void 1431unpack_SIGNED_I16(const void *src, GLfloat dst[][4], GLuint n) 1432{ 1433 const GLshort *s = ((const GLshort *) src); 1434 GLuint i; 1435 for (i = 0; i < n; i++) { 1436 dst[i][RCOMP] = 1437 dst[i][GCOMP] = 1438 dst[i][BCOMP] = 1439 dst[i][ACOMP] = SHORT_TO_FLOAT_TEX( s[i] ); 1440 } 1441} 1442 1443static void 1444unpack_RGB9_E5_FLOAT(const void *src, GLfloat dst[][4], GLuint n) 1445{ 1446 const GLuint *s = (const GLuint *) src; 1447 GLuint i; 1448 for (i = 0; i < n; i++) { 1449 rgb9e5_to_float3(s[i], dst[i]); 1450 dst[i][ACOMP] = 1.0F; 1451 } 1452} 1453 1454static void 1455unpack_R11_G11_B10_FLOAT(const void *src, GLfloat dst[][4], GLuint n) 1456{ 1457 const GLuint *s = (const GLuint *) src; 1458 GLuint i; 1459 for (i = 0; i < n; i++) { 1460 r11g11b10f_to_float3(s[i], dst[i]); 1461 dst[i][ACOMP] = 1.0F; 1462 } 1463} 1464 1465 1466/** 1467 * Return the unpacker function for the given format. 1468 */ 1469static unpack_rgba_func 1470get_unpack_rgba_function(gl_format format) 1471{ 1472 static unpack_rgba_func table[MESA_FORMAT_COUNT]; 1473 static GLboolean initialized = GL_FALSE; 1474 1475 if (!initialized) { 1476 table[MESA_FORMAT_NONE] = NULL; 1477 1478 table[MESA_FORMAT_RGBA8888] = unpack_RGBA8888; 1479 table[MESA_FORMAT_RGBA8888_REV] = unpack_RGBA8888_REV; 1480 table[MESA_FORMAT_ARGB8888] = unpack_ARGB8888; 1481 table[MESA_FORMAT_ARGB8888_REV] = unpack_ARGB8888_REV; 1482 table[MESA_FORMAT_RGBX8888] = unpack_RGBX8888; 1483 table[MESA_FORMAT_RGBX8888_REV] = unpack_RGBX8888_REV; 1484 table[MESA_FORMAT_XRGB8888] = unpack_XRGB8888; 1485 table[MESA_FORMAT_XRGB8888_REV] = unpack_XRGB8888_REV; 1486 table[MESA_FORMAT_RGB888] = unpack_RGB888; 1487 table[MESA_FORMAT_BGR888] = unpack_BGR888; 1488 table[MESA_FORMAT_RGB565] = unpack_RGB565; 1489 table[MESA_FORMAT_RGB565_REV] = unpack_RGB565_REV; 1490 table[MESA_FORMAT_ARGB4444] = unpack_ARGB4444; 1491 table[MESA_FORMAT_ARGB4444_REV] = unpack_ARGB4444_REV; 1492 table[MESA_FORMAT_RGBA5551] = unpack_RGBA5551; 1493 table[MESA_FORMAT_ARGB1555] = unpack_ARGB1555; 1494 table[MESA_FORMAT_ARGB1555_REV] = unpack_ARGB1555_REV; 1495 table[MESA_FORMAT_AL44] = unpack_AL44; 1496 table[MESA_FORMAT_AL88] = unpack_AL88; 1497 table[MESA_FORMAT_AL88_REV] = unpack_AL88_REV; 1498 table[MESA_FORMAT_AL1616] = unpack_AL1616; 1499 table[MESA_FORMAT_AL1616_REV] = unpack_AL1616_REV; 1500 table[MESA_FORMAT_RGB332] = unpack_RGB332; 1501 table[MESA_FORMAT_A8] = unpack_A8; 1502 table[MESA_FORMAT_A16] = unpack_A16; 1503 table[MESA_FORMAT_L8] = unpack_L8; 1504 table[MESA_FORMAT_L16] = unpack_L16; 1505 table[MESA_FORMAT_I8] = unpack_I8; 1506 table[MESA_FORMAT_I16] = unpack_I16; 1507 table[MESA_FORMAT_YCBCR] = unpack_YCBCR; 1508 table[MESA_FORMAT_YCBCR_REV] = unpack_YCBCR_REV; 1509 table[MESA_FORMAT_R8] = unpack_R8; 1510 table[MESA_FORMAT_GR88] = unpack_GR88; 1511 table[MESA_FORMAT_RG88] = unpack_RG88; 1512 table[MESA_FORMAT_R16] = unpack_R16; 1513 table[MESA_FORMAT_RG1616] = unpack_RG1616; 1514 table[MESA_FORMAT_RG1616_REV] = unpack_RG1616_REV; 1515 table[MESA_FORMAT_ARGB2101010] = unpack_ARGB2101010; 1516 table[MESA_FORMAT_ABGR2101010_UINT] = unpack_ABGR2101010_UINT; 1517 table[MESA_FORMAT_Z24_S8] = unpack_Z24_S8; 1518 table[MESA_FORMAT_S8_Z24] = unpack_S8_Z24; 1519 table[MESA_FORMAT_Z16] = unpack_Z16; 1520 table[MESA_FORMAT_X8_Z24] = unpack_X8_Z24; 1521 table[MESA_FORMAT_Z24_X8] = unpack_Z24_X8; 1522 table[MESA_FORMAT_Z32] = unpack_Z32; 1523 table[MESA_FORMAT_S8] = unpack_S8; 1524 table[MESA_FORMAT_SRGB8] = unpack_SRGB8; 1525 table[MESA_FORMAT_SRGBA8] = unpack_SRGBA8; 1526 table[MESA_FORMAT_SARGB8] = unpack_SARGB8; 1527 table[MESA_FORMAT_SL8] = unpack_SL8; 1528 table[MESA_FORMAT_SLA8] = unpack_SLA8; 1529 table[MESA_FORMAT_SRGB_DXT1] = unpack_SRGB_DXT1; 1530 table[MESA_FORMAT_SRGBA_DXT1] = unpack_SRGBA_DXT1; 1531 table[MESA_FORMAT_SRGBA_DXT3] = unpack_SRGBA_DXT3; 1532 table[MESA_FORMAT_SRGBA_DXT5] = unpack_SRGBA_DXT5; 1533 1534 table[MESA_FORMAT_RGB_FXT1] = unpack_RGB_FXT1; 1535 table[MESA_FORMAT_RGBA_FXT1] = unpack_RGBA_FXT1; 1536 table[MESA_FORMAT_RGB_DXT1] = unpack_RGB_DXT1; 1537 table[MESA_FORMAT_RGBA_DXT1] = unpack_RGBA_DXT1; 1538 table[MESA_FORMAT_RGBA_DXT3] = unpack_RGBA_DXT3; 1539 table[MESA_FORMAT_RGBA_DXT5] = unpack_RGBA_DXT5; 1540 1541 table[MESA_FORMAT_RGBA_FLOAT32] = unpack_RGBA_FLOAT32; 1542 table[MESA_FORMAT_RGBA_FLOAT16] = unpack_RGBA_FLOAT16; 1543 table[MESA_FORMAT_RGB_FLOAT32] = unpack_RGB_FLOAT32; 1544 table[MESA_FORMAT_RGB_FLOAT16] = unpack_RGB_FLOAT16; 1545 table[MESA_FORMAT_ALPHA_FLOAT32] = unpack_ALPHA_FLOAT32; 1546 table[MESA_FORMAT_ALPHA_FLOAT16] = unpack_ALPHA_FLOAT16; 1547 table[MESA_FORMAT_LUMINANCE_FLOAT32] = unpack_LUMINANCE_FLOAT32; 1548 table[MESA_FORMAT_LUMINANCE_FLOAT16] = unpack_LUMINANCE_FLOAT16; 1549 table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = unpack_LUMINANCE_ALPHA_FLOAT32; 1550 table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = unpack_LUMINANCE_ALPHA_FLOAT16; 1551 table[MESA_FORMAT_INTENSITY_FLOAT32] = unpack_INTENSITY_FLOAT32; 1552 table[MESA_FORMAT_INTENSITY_FLOAT16] = unpack_INTENSITY_FLOAT16; 1553 table[MESA_FORMAT_R_FLOAT32] = unpack_R_FLOAT32; 1554 table[MESA_FORMAT_R_FLOAT16] = unpack_R_FLOAT16; 1555 table[MESA_FORMAT_RG_FLOAT32] = unpack_RG_FLOAT32; 1556 table[MESA_FORMAT_RG_FLOAT16] = unpack_RG_FLOAT16; 1557 1558 table[MESA_FORMAT_RGBA_INT8] = unpack_RGBA_INT8; 1559 table[MESA_FORMAT_RGBA_INT16] = unpack_RGBA_INT16; 1560 table[MESA_FORMAT_RGBA_INT32] = unpack_RGBA_INT32; 1561 table[MESA_FORMAT_RGBA_UINT8] = unpack_RGBA_UINT8; 1562 table[MESA_FORMAT_RGBA_UINT16] = unpack_RGBA_UINT16; 1563 table[MESA_FORMAT_RGBA_UINT32] = unpack_RGBA_UINT32; 1564 1565 table[MESA_FORMAT_DUDV8] = unpack_DUDV8; 1566 table[MESA_FORMAT_SIGNED_R8] = unpack_SIGNED_R8; 1567 table[MESA_FORMAT_SIGNED_RG88_REV] = unpack_SIGNED_RG88_REV; 1568 table[MESA_FORMAT_SIGNED_RGBX8888] = unpack_SIGNED_RGBX8888; 1569 table[MESA_FORMAT_SIGNED_RGBA8888] = unpack_SIGNED_RGBA8888; 1570 table[MESA_FORMAT_SIGNED_RGBA8888_REV] = unpack_SIGNED_RGBA8888_REV; 1571 table[MESA_FORMAT_SIGNED_R16] = unpack_SIGNED_R16; 1572 table[MESA_FORMAT_SIGNED_GR1616] = unpack_SIGNED_GR1616; 1573 table[MESA_FORMAT_SIGNED_RGB_16] = unpack_SIGNED_RGB_16; 1574 table[MESA_FORMAT_SIGNED_RGBA_16] = unpack_SIGNED_RGBA_16; 1575 table[MESA_FORMAT_RGBA_16] = unpack_RGBA_16; 1576 1577 table[MESA_FORMAT_RED_RGTC1] = unpack_RED_RGTC1; 1578 table[MESA_FORMAT_SIGNED_RED_RGTC1] = unpack_SIGNED_RED_RGTC1; 1579 table[MESA_FORMAT_RG_RGTC2] = unpack_RG_RGTC2; 1580 table[MESA_FORMAT_SIGNED_RG_RGTC2] = unpack_SIGNED_RG_RGTC2; 1581 1582 table[MESA_FORMAT_L_LATC1] = unpack_L_LATC1; 1583 table[MESA_FORMAT_SIGNED_L_LATC1] = unpack_SIGNED_L_LATC1; 1584 table[MESA_FORMAT_LA_LATC2] = unpack_LA_LATC2; 1585 table[MESA_FORMAT_SIGNED_LA_LATC2] = unpack_SIGNED_LA_LATC2; 1586 1587 table[MESA_FORMAT_ETC1_RGB8] = unpack_ETC1_RGB8; 1588 1589 table[MESA_FORMAT_SIGNED_A8] = unpack_SIGNED_A8; 1590 table[MESA_FORMAT_SIGNED_L8] = unpack_SIGNED_L8; 1591 table[MESA_FORMAT_SIGNED_AL88] = unpack_SIGNED_AL88; 1592 table[MESA_FORMAT_SIGNED_I8] = unpack_SIGNED_I8; 1593 table[MESA_FORMAT_SIGNED_A16] = unpack_SIGNED_A16; 1594 table[MESA_FORMAT_SIGNED_L16] = unpack_SIGNED_L16; 1595 table[MESA_FORMAT_SIGNED_AL1616] = unpack_SIGNED_AL1616; 1596 table[MESA_FORMAT_SIGNED_I16] = unpack_SIGNED_I16; 1597 1598 table[MESA_FORMAT_RGB9_E5_FLOAT] = unpack_RGB9_E5_FLOAT; 1599 table[MESA_FORMAT_R11_G11_B10_FLOAT] = unpack_R11_G11_B10_FLOAT; 1600 1601 table[MESA_FORMAT_Z32_FLOAT] = unpack_Z32_FLOAT; 1602 table[MESA_FORMAT_Z32_FLOAT_X24S8] = unpack_Z32_FLOAT_X24S8; 1603 1604 initialized = GL_TRUE; 1605 } 1606 1607 if (table[format] == NULL) { 1608 _mesa_problem(NULL, "unsupported unpack for format %s", 1609 _mesa_get_format_name(format)); 1610 } 1611 1612 return table[format]; 1613} 1614 1615 1616/** 1617 * Unpack rgba colors, returning as GLfloat values. 1618 */ 1619void 1620_mesa_unpack_rgba_row(gl_format format, GLuint n, 1621 const void *src, GLfloat dst[][4]) 1622{ 1623 unpack_rgba_func unpack = get_unpack_rgba_function(format); 1624 unpack(src, dst, n); 1625} 1626 1627 1628/**********************************************************************/ 1629/* Unpack, returning GLubyte colors */ 1630/**********************************************************************/ 1631 1632 1633static void 1634unpack_ubyte_RGBA8888(const void *src, GLubyte dst[][4], GLuint n) 1635{ 1636 const GLuint *s = ((const GLuint *) src); 1637 GLuint i; 1638 for (i = 0; i < n; i++) { 1639 dst[i][RCOMP] = (s[i] >> 24); 1640 dst[i][GCOMP] = (s[i] >> 16) & 0xff; 1641 dst[i][BCOMP] = (s[i] >> 8) & 0xff; 1642 dst[i][ACOMP] = (s[i] ) & 0xff; 1643 } 1644} 1645 1646static void 1647unpack_ubyte_RGBA8888_REV(const void *src, GLubyte dst[][4], GLuint n) 1648{ 1649 const GLuint *s = ((const GLuint *) src); 1650 GLuint i; 1651 for (i = 0; i < n; i++) { 1652 dst[i][RCOMP] = (s[i] ) & 0xff; 1653 dst[i][GCOMP] = (s[i] >> 8) & 0xff; 1654 dst[i][BCOMP] = (s[i] >> 16) & 0xff; 1655 dst[i][ACOMP] = (s[i] >> 24); 1656 } 1657} 1658 1659static void 1660unpack_ubyte_ARGB8888(const void *src, GLubyte dst[][4], GLuint n) 1661{ 1662 const GLuint *s = ((const GLuint *) src); 1663 GLuint i; 1664 for (i = 0; i < n; i++) { 1665 dst[i][RCOMP] = (s[i] >> 16) & 0xff; 1666 dst[i][GCOMP] = (s[i] >> 8) & 0xff; 1667 dst[i][BCOMP] = (s[i] ) & 0xff; 1668 dst[i][ACOMP] = (s[i] >> 24); 1669 } 1670} 1671 1672static void 1673unpack_ubyte_ARGB8888_REV(const void *src, GLubyte dst[][4], GLuint n) 1674{ 1675 const GLuint *s = ((const GLuint *) src); 1676 GLuint i; 1677 for (i = 0; i < n; i++) { 1678 dst[i][RCOMP] = (s[i] >> 8) & 0xff; 1679 dst[i][GCOMP] = (s[i] >> 16) & 0xff; 1680 dst[i][BCOMP] = (s[i] >> 24); 1681 dst[i][ACOMP] = (s[i] ) & 0xff; 1682 } 1683} 1684 1685static void 1686unpack_ubyte_RGBX8888(const void *src, GLubyte dst[][4], GLuint n) 1687{ 1688 const GLuint *s = ((const GLuint *) src); 1689 GLuint i; 1690 for (i = 0; i < n; i++) { 1691 dst[i][RCOMP] = (s[i] >> 24); 1692 dst[i][GCOMP] = (s[i] >> 16) & 0xff; 1693 dst[i][BCOMP] = (s[i] >> 8) & 0xff; 1694 dst[i][ACOMP] = 0xff; 1695 } 1696} 1697 1698static void 1699unpack_ubyte_RGBX8888_REV(const void *src, GLubyte dst[][4], GLuint n) 1700{ 1701 const GLuint *s = ((const GLuint *) src); 1702 GLuint i; 1703 for (i = 0; i < n; i++) { 1704 dst[i][RCOMP] = (s[i] ) & 0xff; 1705 dst[i][GCOMP] = (s[i] >> 8) & 0xff; 1706 dst[i][BCOMP] = (s[i] >> 16) & 0xff; 1707 dst[i][ACOMP] = 0xff; 1708 } 1709} 1710 1711static void 1712unpack_ubyte_XRGB8888(const void *src, GLubyte dst[][4], GLuint n) 1713{ 1714 const GLuint *s = ((const GLuint *) src); 1715 GLuint i; 1716 for (i = 0; i < n; i++) { 1717 dst[i][RCOMP] = (s[i] >> 16) & 0xff; 1718 dst[i][GCOMP] = (s[i] >> 8) & 0xff; 1719 dst[i][BCOMP] = (s[i] ) & 0xff; 1720 dst[i][ACOMP] = 0xff; 1721 } 1722} 1723 1724static void 1725unpack_ubyte_XRGB8888_REV(const void *src, GLubyte dst[][4], GLuint n) 1726{ 1727 const GLuint *s = ((const GLuint *) src); 1728 GLuint i; 1729 for (i = 0; i < n; i++) { 1730 dst[i][RCOMP] = (s[i] >> 8) & 0xff; 1731 dst[i][GCOMP] = (s[i] >> 16) & 0xff; 1732 dst[i][BCOMP] = (s[i] >> 24); 1733 dst[i][ACOMP] = 0xff; 1734 } 1735} 1736 1737static void 1738unpack_ubyte_RGB888(const void *src, GLubyte dst[][4], GLuint n) 1739{ 1740 const GLubyte *s = (const GLubyte *) src; 1741 GLuint i; 1742 for (i = 0; i < n; i++) { 1743 dst[i][RCOMP] = s[i*3+2]; 1744 dst[i][GCOMP] = s[i*3+1]; 1745 dst[i][BCOMP] = s[i*3+0]; 1746 dst[i][ACOMP] = 0xff; 1747 } 1748} 1749 1750static void 1751unpack_ubyte_BGR888(const void *src, GLubyte dst[][4], GLuint n) 1752{ 1753 const GLubyte *s = (const GLubyte *) src; 1754 GLuint i; 1755 for (i = 0; i < n; i++) { 1756 dst[i][RCOMP] = s[i*3+0]; 1757 dst[i][GCOMP] = s[i*3+1]; 1758 dst[i][BCOMP] = s[i*3+2]; 1759 dst[i][ACOMP] = 0xff; 1760 } 1761} 1762 1763static void 1764unpack_ubyte_RGB565(const void *src, GLubyte dst[][4], GLuint n) 1765{ 1766 const GLushort *s = ((const GLushort *) src); 1767 GLuint i; 1768 for (i = 0; i < n; i++) { 1769 dst[i][RCOMP] = EXPAND_5_8((s[i] >> 11) & 0x1f); 1770 dst[i][GCOMP] = EXPAND_6_8((s[i] >> 5 ) & 0x3f); 1771 dst[i][BCOMP] = EXPAND_5_8( s[i] & 0x1f); 1772 dst[i][ACOMP] = 0xff; 1773 } 1774} 1775 1776static void 1777unpack_ubyte_RGB565_REV(const void *src, GLubyte dst[][4], GLuint n) 1778{ 1779 const GLushort *s = ((const GLushort *) src); 1780 GLuint i; 1781 for (i = 0; i < n; i++) { 1782 GLuint t = (s[i] >> 8) | (s[i] << 8); /* byte swap */ 1783 dst[i][RCOMP] = EXPAND_5_8((t >> 11) & 0x1f); 1784 dst[i][GCOMP] = EXPAND_6_8((t >> 5 ) & 0x3f); 1785 dst[i][BCOMP] = EXPAND_5_8( t & 0x1f); 1786 dst[i][ACOMP] = 0xff; 1787 } 1788} 1789 1790static void 1791unpack_ubyte_ARGB4444(const void *src, GLubyte dst[][4], GLuint n) 1792{ 1793 const GLushort *s = ((const GLushort *) src); 1794 GLuint i; 1795 for (i = 0; i < n; i++) { 1796 dst[i][RCOMP] = EXPAND_4_8((s[i] >> 8) & 0xf); 1797 dst[i][GCOMP] = EXPAND_4_8((s[i] >> 4) & 0xf); 1798 dst[i][BCOMP] = EXPAND_4_8((s[i] ) & 0xf); 1799 dst[i][ACOMP] = EXPAND_4_8((s[i] >> 12) & 0xf); 1800 } 1801} 1802 1803static void 1804unpack_ubyte_ARGB4444_REV(const void *src, GLubyte dst[][4], GLuint n) 1805{ 1806 const GLushort *s = ((const GLushort *) src); 1807 GLuint i; 1808 for (i = 0; i < n; i++) { 1809 dst[i][RCOMP] = EXPAND_4_8((s[i] ) & 0xf); 1810 dst[i][GCOMP] = EXPAND_4_8((s[i] >> 12) & 0xf); 1811 dst[i][BCOMP] = EXPAND_4_8((s[i] >> 8) & 0xf); 1812 dst[i][ACOMP] = EXPAND_4_8((s[i] >> 4) & 0xf); 1813 } 1814} 1815 1816static void 1817unpack_ubyte_RGBA5551(const void *src, GLubyte dst[][4], GLuint n) 1818{ 1819 const GLushort *s = ((const GLushort *) src); 1820 GLuint i; 1821 for (i = 0; i < n; i++) { 1822 dst[i][RCOMP] = EXPAND_5_8((s[i] >> 11) & 0x1f); 1823 dst[i][GCOMP] = EXPAND_5_8((s[i] >> 6) & 0x1f); 1824 dst[i][BCOMP] = EXPAND_5_8((s[i] >> 1) & 0x1f); 1825 dst[i][ACOMP] = EXPAND_1_8((s[i] ) & 0x01); 1826 } 1827} 1828 1829static void 1830unpack_ubyte_ARGB1555(const void *src, GLubyte dst[][4], GLuint n) 1831{ 1832 const GLushort *s = ((const GLushort *) src); 1833 GLuint i; 1834 for (i = 0; i < n; i++) { 1835 dst[i][RCOMP] = EXPAND_5_8((s[i] >> 10) & 0x1f); 1836 dst[i][GCOMP] = EXPAND_5_8((s[i] >> 5) & 0x1f); 1837 dst[i][BCOMP] = EXPAND_5_8((s[i] >> 0) & 0x1f); 1838 dst[i][ACOMP] = EXPAND_1_8((s[i] >> 15) & 0x01); 1839 } 1840} 1841 1842static void 1843unpack_ubyte_ARGB1555_REV(const void *src, GLubyte dst[][4], GLuint n) 1844{ 1845 const GLushort *s = ((const GLushort *) src); 1846 GLuint i; 1847 for (i = 0; i < n; i++) { 1848 GLushort tmp = (s[i] << 8) | (s[i] >> 8); /* byteswap */ 1849 dst[i][RCOMP] = EXPAND_5_8((tmp >> 10) & 0x1f); 1850 dst[i][GCOMP] = EXPAND_5_8((tmp >> 5) & 0x1f); 1851 dst[i][BCOMP] = EXPAND_5_8((tmp >> 0) & 0x1f); 1852 dst[i][ACOMP] = EXPAND_1_8((tmp >> 15) & 0x01); 1853 } 1854} 1855 1856static void 1857unpack_ubyte_AL44(const void *src, GLubyte dst[][4], GLuint n) 1858{ 1859 const GLubyte *s = ((const GLubyte *) src); 1860 GLuint i; 1861 for (i = 0; i < n; i++) { 1862 dst[i][RCOMP] = 1863 dst[i][GCOMP] = 1864 dst[i][BCOMP] = EXPAND_4_8(s[i] & 0xf); 1865 dst[i][ACOMP] = EXPAND_4_8(s[i] >> 4); 1866 } 1867} 1868 1869static void 1870unpack_ubyte_AL88(const void *src, GLubyte dst[][4], GLuint n) 1871{ 1872 const GLushort *s = ((const GLushort *) src); 1873 GLuint i; 1874 for (i = 0; i < n; i++) { 1875 dst[i][RCOMP] = 1876 dst[i][GCOMP] = 1877 dst[i][BCOMP] = EXPAND_4_8(s[i] & 0xff); 1878 dst[i][ACOMP] = EXPAND_4_8(s[i] >> 8); 1879 } 1880} 1881 1882static void 1883unpack_ubyte_AL88_REV(const void *src, GLubyte dst[][4], GLuint n) 1884{ 1885 const GLushort *s = ((const GLushort *) src); 1886 GLuint i; 1887 for (i = 0; i < n; i++) { 1888 dst[i][RCOMP] = 1889 dst[i][GCOMP] = 1890 dst[i][BCOMP] = EXPAND_4_8(s[i] >> 8); 1891 dst[i][ACOMP] = EXPAND_4_8(s[i] & 0xff); 1892 } 1893} 1894 1895static void 1896unpack_ubyte_RGB332(const void *src, GLubyte dst[][4], GLuint n) 1897{ 1898 const GLubyte *s = ((const GLubyte *) src); 1899 GLuint i; 1900 for (i = 0; i < n; i++) { 1901 dst[i][RCOMP] = EXPAND_3_8((s[i] >> 5) & 0x7); 1902 dst[i][GCOMP] = EXPAND_3_8((s[i] >> 2) & 0x7); 1903 dst[i][BCOMP] = EXPAND_2_8((s[i] ) & 0x3); 1904 dst[i][ACOMP] = 0xff; 1905 } 1906} 1907 1908static void 1909unpack_ubyte_A8(const void *src, GLubyte dst[][4], GLuint n) 1910{ 1911 const GLubyte *s = ((const GLubyte *) src); 1912 GLuint i; 1913 for (i = 0; i < n; i++) { 1914 dst[i][RCOMP] = 1915 dst[i][GCOMP] = 1916 dst[i][BCOMP] = 0; 1917 dst[i][ACOMP] = s[i]; 1918 } 1919} 1920 1921static void 1922unpack_ubyte_L8(const void *src, GLubyte dst[][4], GLuint n) 1923{ 1924 const GLubyte *s = ((const GLubyte *) src); 1925 GLuint i; 1926 for (i = 0; i < n; i++) { 1927 dst[i][RCOMP] = 1928 dst[i][GCOMP] = 1929 dst[i][BCOMP] = s[i]; 1930 dst[i][ACOMP] = 0xff; 1931 } 1932} 1933 1934 1935static void 1936unpack_ubyte_I8(const void *src, GLubyte dst[][4], GLuint n) 1937{ 1938 const GLubyte *s = ((const GLubyte *) src); 1939 GLuint i; 1940 for (i = 0; i < n; i++) { 1941 dst[i][RCOMP] = 1942 dst[i][GCOMP] = 1943 dst[i][BCOMP] = 1944 dst[i][ACOMP] = s[i]; 1945 } 1946} 1947 1948static void 1949unpack_ubyte_R8(const void *src, GLubyte dst[][4], GLuint n) 1950{ 1951 const GLubyte *s = ((const GLubyte *) src); 1952 GLuint i; 1953 for (i = 0; i < n; i++) { 1954 dst[i][0] = s[i]; 1955 dst[i][1] = 1956 dst[i][2] = 0; 1957 dst[i][3] = 0xff; 1958 } 1959} 1960 1961static void 1962unpack_ubyte_GR88(const void *src, GLubyte dst[][4], GLuint n) 1963{ 1964 const GLushort *s = ((const GLushort *) src); 1965 GLuint i; 1966 for (i = 0; i < n; i++) { 1967 dst[i][RCOMP] = s[i] & 0xff; 1968 dst[i][GCOMP] = s[i] >> 8; 1969 dst[i][BCOMP] = 0; 1970 dst[i][ACOMP] = 0xff; 1971 } 1972} 1973 1974static void 1975unpack_ubyte_RG88(const void *src, GLubyte dst[][4], GLuint n) 1976{ 1977 const GLushort *s = ((const GLushort *) src); 1978 GLuint i; 1979 for (i = 0; i < n; i++) { 1980 dst[i][RCOMP] = s[i] >> 8; 1981 dst[i][GCOMP] = s[i] & 0xff; 1982 dst[i][BCOMP] = 0; 1983 dst[i][ACOMP] = 0xff; 1984 } 1985} 1986 1987 1988/** 1989 * Unpack rgba colors, returning as GLubyte values. This should usually 1990 * only be used for unpacking formats that use 8 bits or less per channel. 1991 */ 1992void 1993_mesa_unpack_ubyte_rgba_row(gl_format format, GLuint n, 1994 const void *src, GLubyte dst[][4]) 1995{ 1996 switch (format) { 1997 case MESA_FORMAT_RGBA8888: 1998 unpack_ubyte_RGBA8888(src, dst, n); 1999 break; 2000 case MESA_FORMAT_RGBA8888_REV: 2001 unpack_ubyte_RGBA8888_REV(src, dst, n); 2002 break; 2003 case MESA_FORMAT_ARGB8888: 2004 unpack_ubyte_ARGB8888(src, dst, n); 2005 break; 2006 case MESA_FORMAT_ARGB8888_REV: 2007 unpack_ubyte_ARGB8888_REV(src, dst, n); 2008 break; 2009 case MESA_FORMAT_RGBX8888: 2010 unpack_ubyte_RGBX8888(src, dst, n); 2011 break; 2012 case MESA_FORMAT_RGBX8888_REV: 2013 unpack_ubyte_RGBX8888_REV(src, dst, n); 2014 break; 2015 case MESA_FORMAT_XRGB8888: 2016 unpack_ubyte_XRGB8888(src, dst, n); 2017 break; 2018 case MESA_FORMAT_XRGB8888_REV: 2019 unpack_ubyte_XRGB8888_REV(src, dst, n); 2020 break; 2021 case MESA_FORMAT_RGB888: 2022 unpack_ubyte_RGB888(src, dst, n); 2023 break; 2024 case MESA_FORMAT_BGR888: 2025 unpack_ubyte_BGR888(src, dst, n); 2026 break; 2027 case MESA_FORMAT_RGB565: 2028 unpack_ubyte_RGB565(src, dst, n); 2029 break; 2030 case MESA_FORMAT_RGB565_REV: 2031 unpack_ubyte_RGB565_REV(src, dst, n); 2032 break; 2033 case MESA_FORMAT_ARGB4444: 2034 unpack_ubyte_ARGB4444(src, dst, n); 2035 break; 2036 case MESA_FORMAT_ARGB4444_REV: 2037 unpack_ubyte_ARGB4444_REV(src, dst, n); 2038 break; 2039 case MESA_FORMAT_RGBA5551: 2040 unpack_ubyte_RGBA5551(src, dst, n); 2041 break; 2042 case MESA_FORMAT_ARGB1555: 2043 unpack_ubyte_ARGB1555(src, dst, n); 2044 break; 2045 case MESA_FORMAT_ARGB1555_REV: 2046 unpack_ubyte_ARGB1555_REV(src, dst, n); 2047 break; 2048 case MESA_FORMAT_AL44: 2049 unpack_ubyte_AL44(src, dst, n); 2050 break; 2051 case MESA_FORMAT_AL88: 2052 unpack_ubyte_AL88(src, dst, n); 2053 break; 2054 case MESA_FORMAT_AL88_REV: 2055 unpack_ubyte_AL88_REV(src, dst, n); 2056 break; 2057 case MESA_FORMAT_RGB332: 2058 unpack_ubyte_RGB332(src, dst, n); 2059 break; 2060 case MESA_FORMAT_A8: 2061 unpack_ubyte_A8(src, dst, n); 2062 break; 2063 case MESA_FORMAT_L8: 2064 unpack_ubyte_L8(src, dst, n); 2065 break; 2066 case MESA_FORMAT_I8: 2067 unpack_ubyte_I8(src, dst, n); 2068 break; 2069 case MESA_FORMAT_R8: 2070 unpack_ubyte_R8(src, dst, n); 2071 break; 2072 case MESA_FORMAT_GR88: 2073 unpack_ubyte_GR88(src, dst, n); 2074 break; 2075 case MESA_FORMAT_RG88: 2076 unpack_ubyte_RG88(src, dst, n); 2077 break; 2078 default: 2079 /* get float values, convert to ubyte */ 2080 { 2081 GLfloat *tmp = (GLfloat *) malloc(n * 4 * sizeof(GLfloat)); 2082 if (tmp) { 2083 GLuint i; 2084 _mesa_unpack_rgba_row(format, n, src, (GLfloat (*)[4]) tmp); 2085 for (i = 0; i < n; i++) { 2086 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][0], tmp[i*4+0]); 2087 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][1], tmp[i*4+1]); 2088 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][2], tmp[i*4+2]); 2089 UNCLAMPED_FLOAT_TO_UBYTE(dst[i][3], tmp[i*4+3]); 2090 } 2091 free(tmp); 2092 } 2093 } 2094 break; 2095 } 2096} 2097 2098 2099/**********************************************************************/ 2100/* Unpack, returning GLuint colors */ 2101/**********************************************************************/ 2102 2103static void 2104unpack_int_rgba_RGBA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n) 2105{ 2106 memcpy(dst, src, n * 4 * sizeof(GLuint)); 2107} 2108 2109static void 2110unpack_int_rgba_RGBA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n) 2111{ 2112 unsigned int i; 2113 2114 for (i = 0; i < n; i++) { 2115 dst[i][0] = src[i * 4 + 0]; 2116 dst[i][1] = src[i * 4 + 1]; 2117 dst[i][2] = src[i * 4 + 2]; 2118 dst[i][3] = src[i * 4 + 3]; 2119 } 2120} 2121 2122static void 2123unpack_int_rgba_RGBA_INT16(const GLshort *src, GLuint dst[][4], GLuint n) 2124{ 2125 unsigned int i; 2126 2127 for (i = 0; i < n; i++) { 2128 dst[i][0] = src[i * 4 + 0]; 2129 dst[i][1] = src[i * 4 + 1]; 2130 dst[i][2] = src[i * 4 + 2]; 2131 dst[i][3] = src[i * 4 + 3]; 2132 } 2133} 2134 2135static void 2136unpack_int_rgba_RGBA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n) 2137{ 2138 unsigned int i; 2139 2140 for (i = 0; i < n; i++) { 2141 dst[i][0] = src[i * 4 + 0]; 2142 dst[i][1] = src[i * 4 + 1]; 2143 dst[i][2] = src[i * 4 + 2]; 2144 dst[i][3] = src[i * 4 + 3]; 2145 } 2146} 2147 2148static void 2149unpack_int_rgba_RGBA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n) 2150{ 2151 unsigned int i; 2152 2153 for (i = 0; i < n; i++) { 2154 dst[i][0] = src[i * 4 + 0]; 2155 dst[i][1] = src[i * 4 + 1]; 2156 dst[i][2] = src[i * 4 + 2]; 2157 dst[i][3] = src[i * 4 + 3]; 2158 } 2159} 2160 2161static void 2162unpack_int_rgba_ARGB8888(const GLbyte *src, GLuint dst[][4], GLuint n) 2163{ 2164 unsigned int i; 2165 2166 for (i = 0; i < n; i++) { 2167 dst[i][RCOMP] = (GLubyte) src[i * 4 + 2]; 2168 dst[i][GCOMP] = (GLubyte) src[i * 4 + 1]; 2169 dst[i][BCOMP] = (GLubyte) src[i * 4 + 0]; 2170 dst[i][ACOMP] = (GLubyte) src[i * 4 + 3]; 2171 } 2172} 2173 2174static void 2175unpack_int_rgba_XRGB8888(const GLbyte *src, GLuint dst[][4], GLuint n) 2176{ 2177 unsigned int i; 2178 2179 for (i = 0; i < n; i++) { 2180 dst[i][RCOMP] = (GLubyte) src[i * 4 + 2]; 2181 dst[i][GCOMP] = (GLubyte) src[i * 4 + 1]; 2182 dst[i][BCOMP] = (GLubyte) src[i * 4 + 0]; 2183 dst[i][ACOMP] = (GLubyte) 0xff; 2184 } 2185} 2186 2187static void 2188unpack_int_rgba_RGB_UINT32(const GLuint *src, GLuint dst[][4], GLuint n) 2189{ 2190 unsigned int i; 2191 2192 for (i = 0; i < n; i++) { 2193 dst[i][0] = src[i * 3 + 0]; 2194 dst[i][1] = src[i * 3 + 1]; 2195 dst[i][2] = src[i * 3 + 2]; 2196 dst[i][3] = 1; 2197 } 2198} 2199 2200static void 2201unpack_int_rgba_RGB_UINT16(const GLushort *src, GLuint dst[][4], GLuint n) 2202{ 2203 unsigned int i; 2204 2205 for (i = 0; i < n; i++) { 2206 dst[i][0] = src[i * 3 + 0]; 2207 dst[i][1] = src[i * 3 + 1]; 2208 dst[i][2] = src[i * 3 + 2]; 2209 dst[i][3] = 1; 2210 } 2211} 2212 2213static void 2214unpack_int_rgba_RGB_INT16(const GLshort *src, GLuint dst[][4], GLuint n) 2215{ 2216 unsigned int i; 2217 2218 for (i = 0; i < n; i++) { 2219 dst[i][0] = src[i * 3 + 0]; 2220 dst[i][1] = src[i * 3 + 1]; 2221 dst[i][2] = src[i * 3 + 2]; 2222 dst[i][3] = 1; 2223 } 2224} 2225 2226static void 2227unpack_int_rgba_RGB_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n) 2228{ 2229 unsigned int i; 2230 2231 for (i = 0; i < n; i++) { 2232 dst[i][0] = src[i * 3 + 0]; 2233 dst[i][1] = src[i * 3 + 1]; 2234 dst[i][2] = src[i * 3 + 2]; 2235 dst[i][3] = 1; 2236 } 2237} 2238 2239static void 2240unpack_int_rgba_RGB_INT8(const GLbyte *src, GLuint dst[][4], GLuint n) 2241{ 2242 unsigned int i; 2243 2244 for (i = 0; i < n; i++) { 2245 dst[i][0] = src[i * 3 + 0]; 2246 dst[i][1] = src[i * 3 + 1]; 2247 dst[i][2] = src[i * 3 + 2]; 2248 dst[i][3] = 1; 2249 } 2250} 2251 2252static void 2253unpack_int_rgba_RG_UINT32(const GLuint *src, GLuint dst[][4], GLuint n) 2254{ 2255 unsigned int i; 2256 2257 for (i = 0; i < n; i++) { 2258 dst[i][0] = src[i * 2 + 0]; 2259 dst[i][1] = src[i * 2 + 1]; 2260 dst[i][2] = 0; 2261 dst[i][3] = 1; 2262 } 2263} 2264 2265static void 2266unpack_int_rgba_RG_UINT16(const GLushort *src, GLuint dst[][4], GLuint n) 2267{ 2268 unsigned int i; 2269 2270 for (i = 0; i < n; i++) { 2271 dst[i][0] = src[i * 2 + 0]; 2272 dst[i][1] = src[i * 2 + 1]; 2273 dst[i][2] = 0; 2274 dst[i][3] = 1; 2275 } 2276} 2277 2278static void 2279unpack_int_rgba_RG_INT16(const GLshort *src, GLuint dst[][4], GLuint n) 2280{ 2281 unsigned int i; 2282 2283 for (i = 0; i < n; i++) { 2284 dst[i][0] = src[i * 2 + 0]; 2285 dst[i][1] = src[i * 2 + 1]; 2286 dst[i][2] = 0; 2287 dst[i][3] = 1; 2288 } 2289} 2290 2291static void 2292unpack_int_rgba_RG_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n) 2293{ 2294 unsigned int i; 2295 2296 for (i = 0; i < n; i++) { 2297 dst[i][0] = src[i * 2 + 0]; 2298 dst[i][1] = src[i * 2 + 1]; 2299 dst[i][2] = 0; 2300 dst[i][3] = 1; 2301 } 2302} 2303 2304static void 2305unpack_int_rgba_RG_INT8(const GLbyte *src, GLuint dst[][4], GLuint n) 2306{ 2307 unsigned int i; 2308 2309 for (i = 0; i < n; i++) { 2310 dst[i][0] = src[i * 2 + 0]; 2311 dst[i][1] = src[i * 2 + 1]; 2312 dst[i][2] = 0; 2313 dst[i][3] = 1; 2314 } 2315} 2316 2317static void 2318unpack_int_rgba_R_UINT32(const GLuint *src, GLuint dst[][4], GLuint n) 2319{ 2320 unsigned int i; 2321 2322 for (i = 0; i < n; i++) { 2323 dst[i][0] = src[i]; 2324 dst[i][1] = 0; 2325 dst[i][2] = 0; 2326 dst[i][3] = 1; 2327 } 2328} 2329 2330static void 2331unpack_int_rgba_R_UINT16(const GLushort *src, GLuint dst[][4], GLuint n) 2332{ 2333 unsigned int i; 2334 2335 for (i = 0; i < n; i++) { 2336 dst[i][0] = src[i]; 2337 dst[i][1] = 0; 2338 dst[i][2] = 0; 2339 dst[i][3] = 1; 2340 } 2341} 2342 2343static void 2344unpack_int_rgba_R_INT16(const GLshort *src, GLuint dst[][4], GLuint n) 2345{ 2346 unsigned int i; 2347 2348 for (i = 0; i < n; i++) { 2349 dst[i][0] = src[i]; 2350 dst[i][1] = 0; 2351 dst[i][2] = 0; 2352 dst[i][3] = 1; 2353 } 2354} 2355 2356static void 2357unpack_int_rgba_R_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n) 2358{ 2359 unsigned int i; 2360 2361 for (i = 0; i < n; i++) { 2362 dst[i][0] = src[i]; 2363 dst[i][1] = 0; 2364 dst[i][2] = 0; 2365 dst[i][3] = 1; 2366 } 2367} 2368 2369static void 2370unpack_int_rgba_R_INT8(const GLbyte *src, GLuint dst[][4], GLuint n) 2371{ 2372 unsigned int i; 2373 2374 for (i = 0; i < n; i++) { 2375 dst[i][0] = src[i]; 2376 dst[i][1] = 0; 2377 dst[i][2] = 0; 2378 dst[i][3] = 1; 2379 } 2380} 2381 2382static void 2383unpack_int_rgba_ALPHA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n) 2384{ 2385 unsigned int i; 2386 2387 for (i = 0; i < n; i++) { 2388 dst[i][0] = dst[i][1] = dst[i][2] = 0; 2389 dst[i][3] = src[i]; 2390 } 2391} 2392 2393static void 2394unpack_int_rgba_ALPHA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n) 2395{ 2396 unsigned int i; 2397 2398 for (i = 0; i < n; i++) { 2399 dst[i][0] = dst[i][1] = dst[i][2] = 0; 2400 dst[i][3] = src[i]; 2401 } 2402} 2403 2404static void 2405unpack_int_rgba_ALPHA_INT16(const GLshort *src, GLuint dst[][4], GLuint n) 2406{ 2407 unsigned int i; 2408 2409 for (i = 0; i < n; i++) { 2410 dst[i][0] = dst[i][1] = dst[i][2] = 0; 2411 dst[i][3] = src[i]; 2412 } 2413} 2414 2415static void 2416unpack_int_rgba_ALPHA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n) 2417{ 2418 unsigned int i; 2419 2420 for (i = 0; i < n; i++) { 2421 dst[i][0] = dst[i][1] = dst[i][2] = 0; 2422 dst[i][3] = src[i]; 2423 } 2424} 2425 2426static void 2427unpack_int_rgba_ALPHA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n) 2428{ 2429 unsigned int i; 2430 2431 for (i = 0; i < n; i++) { 2432 dst[i][0] = dst[i][1] = dst[i][2] = 0; 2433 dst[i][3] = src[i]; 2434 } 2435} 2436 2437static void 2438unpack_int_rgba_LUMINANCE_UINT32(const GLuint *src, GLuint dst[][4], GLuint n) 2439{ 2440 unsigned int i; 2441 2442 for (i = 0; i < n; i++) { 2443 dst[i][0] = dst[i][1] = dst[i][2] = src[i]; 2444 dst[i][3] = 1; 2445 } 2446} 2447 2448static void 2449unpack_int_rgba_LUMINANCE_UINT16(const GLushort *src, GLuint dst[][4], GLuint n) 2450{ 2451 unsigned int i; 2452 2453 for (i = 0; i < n; i++) { 2454 dst[i][0] = dst[i][1] = dst[i][2] = src[i]; 2455 dst[i][3] = 1; 2456 } 2457} 2458 2459static void 2460unpack_int_rgba_LUMINANCE_INT16(const GLshort *src, GLuint dst[][4], GLuint n) 2461{ 2462 unsigned int i; 2463 2464 for (i = 0; i < n; i++) { 2465 dst[i][0] = dst[i][1] = dst[i][2] = src[i]; 2466 dst[i][3] = 1; 2467 } 2468} 2469 2470static void 2471unpack_int_rgba_LUMINANCE_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n) 2472{ 2473 unsigned int i; 2474 2475 for (i = 0; i < n; i++) { 2476 dst[i][0] = dst[i][1] = dst[i][2] = src[i]; 2477 dst[i][3] = 1; 2478 } 2479} 2480 2481static void 2482unpack_int_rgba_LUMINANCE_INT8(const GLbyte *src, GLuint dst[][4], GLuint n) 2483{ 2484 unsigned int i; 2485 2486 for (i = 0; i < n; i++) { 2487 dst[i][0] = dst[i][1] = dst[i][2] = src[i]; 2488 dst[i][3] = 1; 2489 } 2490} 2491 2492 2493static void 2494unpack_int_rgba_LUMINANCE_ALPHA_UINT32(const GLuint *src, GLuint dst[][4], GLuint n) 2495{ 2496 unsigned int i; 2497 2498 for (i = 0; i < n; i++) { 2499 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0]; 2500 dst[i][3] = src[i * 2 + 1]; 2501 } 2502} 2503 2504static void 2505unpack_int_rgba_LUMINANCE_ALPHA_UINT16(const GLushort *src, GLuint dst[][4], GLuint n) 2506{ 2507 unsigned int i; 2508 2509 for (i = 0; i < n; i++) { 2510 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0]; 2511 dst[i][3] = src[i * 2 + 1]; 2512 } 2513} 2514 2515static void 2516unpack_int_rgba_LUMINANCE_ALPHA_INT16(const GLshort *src, GLuint dst[][4], GLuint n) 2517{ 2518 unsigned int i; 2519 2520 for (i = 0; i < n; i++) { 2521 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0]; 2522 dst[i][3] = src[i * 2 + 1]; 2523 } 2524} 2525 2526static void 2527unpack_int_rgba_LUMINANCE_ALPHA_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n) 2528{ 2529 unsigned int i; 2530 2531 for (i = 0; i < n; i++) { 2532 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0]; 2533 dst[i][3] = src[i * 2 + 1]; 2534 } 2535} 2536 2537static void 2538unpack_int_rgba_LUMINANCE_ALPHA_INT8(const GLbyte *src, GLuint dst[][4], GLuint n) 2539{ 2540 unsigned int i; 2541 2542 for (i = 0; i < n; i++) { 2543 dst[i][0] = dst[i][1] = dst[i][2] = src[i * 2 + 0]; 2544 dst[i][3] = src[i * 2 + 1]; 2545 } 2546} 2547 2548static void 2549unpack_int_rgba_INTENSITY_UINT32(const GLuint *src, GLuint dst[][4], GLuint n) 2550{ 2551 unsigned int i; 2552 2553 for (i = 0; i < n; i++) { 2554 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i]; 2555 } 2556} 2557 2558static void 2559unpack_int_rgba_INTENSITY_UINT16(const GLushort *src, GLuint dst[][4], GLuint n) 2560{ 2561 unsigned int i; 2562 2563 for (i = 0; i < n; i++) { 2564 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i]; 2565 } 2566} 2567 2568static void 2569unpack_int_rgba_INTENSITY_INT16(const GLshort *src, GLuint dst[][4], GLuint n) 2570{ 2571 unsigned int i; 2572 2573 for (i = 0; i < n; i++) { 2574 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i]; 2575 } 2576} 2577 2578static void 2579unpack_int_rgba_INTENSITY_UINT8(const GLubyte *src, GLuint dst[][4], GLuint n) 2580{ 2581 unsigned int i; 2582 2583 for (i = 0; i < n; i++) { 2584 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i]; 2585 } 2586} 2587 2588static void 2589unpack_int_rgba_INTENSITY_INT8(const GLbyte *src, GLuint dst[][4], GLuint n) 2590{ 2591 unsigned int i; 2592 2593 for (i = 0; i < n; i++) { 2594 dst[i][0] = dst[i][1] = dst[i][2] = dst[i][3] = src[i]; 2595 } 2596} 2597 2598static void 2599unpack_int_rgba_ARGB2101010_UINT(const GLuint *src, GLuint dst[][4], GLuint n) 2600{ 2601 unsigned int i; 2602 2603 for (i = 0; i < n; i++) { 2604 GLuint tmp = src[i]; 2605 dst[i][0] = (tmp >> 20) & 0x3ff; 2606 dst[i][1] = (tmp >> 10) & 0x3ff; 2607 dst[i][2] = (tmp >> 0) & 0x3ff; 2608 dst[i][3] = (tmp >> 30) & 0x3; 2609 } 2610} 2611 2612static void 2613unpack_int_rgba_ABGR2101010_UINT(const GLuint *src, GLuint dst[][4], GLuint n) 2614{ 2615 unsigned int i; 2616 2617 for (i = 0; i < n; i++) { 2618 GLuint tmp = src[i]; 2619 dst[i][0] = (tmp >> 0) & 0x3ff; 2620 dst[i][1] = (tmp >> 10) & 0x3ff; 2621 dst[i][2] = (tmp >> 20) & 0x3ff; 2622 dst[i][3] = (tmp >> 30) & 0x3; 2623 } 2624} 2625 2626static void 2627unpack_int_rgba_ARGB2101010(const GLuint *src, GLuint dst[][4], GLuint n) 2628{ 2629 unsigned int i; 2630 2631 for (i = 0; i < n; i++) { 2632 GLuint tmp = src[i]; 2633 dst[i][0] = (tmp >> 20) & 0x3ff; 2634 dst[i][1] = (tmp >> 10) & 0x3ff; 2635 dst[i][2] = (tmp >> 0) & 0x3ff; 2636 dst[i][3] = (tmp >> 30) & 0x3; 2637 } 2638} 2639 2640void 2641_mesa_unpack_uint_rgba_row(gl_format format, GLuint n, 2642 const void *src, GLuint dst[][4]) 2643{ 2644 switch (format) { 2645 /* Since there won't be any sign extension happening, there's no need to 2646 * make separate paths for 32-bit-to-32-bit integer unpack. 2647 */ 2648 case MESA_FORMAT_RGBA_UINT32: 2649 case MESA_FORMAT_RGBA_INT32: 2650 unpack_int_rgba_RGBA_UINT32(src, dst, n); 2651 break; 2652 2653 case MESA_FORMAT_RGBA_UINT16: 2654 unpack_int_rgba_RGBA_UINT16(src, dst, n); 2655 break; 2656 case MESA_FORMAT_RGBA_INT16: 2657 unpack_int_rgba_RGBA_INT16(src, dst, n); 2658 break; 2659 2660 case MESA_FORMAT_RGBA_UINT8: 2661 unpack_int_rgba_RGBA_UINT8(src, dst, n); 2662 break; 2663 case MESA_FORMAT_RGBA_INT8: 2664 unpack_int_rgba_RGBA_INT8(src, dst, n); 2665 break; 2666 2667 case MESA_FORMAT_ARGB8888: 2668 unpack_int_rgba_ARGB8888(src, dst, n); 2669 break; 2670 2671 case MESA_FORMAT_XRGB8888: 2672 unpack_int_rgba_XRGB8888(src, dst, n); 2673 break; 2674 2675 case MESA_FORMAT_RGB_UINT32: 2676 case MESA_FORMAT_RGB_INT32: 2677 unpack_int_rgba_RGB_UINT32(src, dst, n); 2678 break; 2679 2680 case MESA_FORMAT_RGB_UINT16: 2681 unpack_int_rgba_RGB_UINT16(src, dst, n); 2682 break; 2683 case MESA_FORMAT_RGB_INT16: 2684 unpack_int_rgba_RGB_INT16(src, dst, n); 2685 break; 2686 2687 case MESA_FORMAT_RGB_UINT8: 2688 unpack_int_rgba_RGB_UINT8(src, dst, n); 2689 break; 2690 case MESA_FORMAT_RGB_INT8: 2691 unpack_int_rgba_RGB_INT8(src, dst, n); 2692 break; 2693 2694 case MESA_FORMAT_RG_UINT32: 2695 case MESA_FORMAT_RG_INT32: 2696 unpack_int_rgba_RG_UINT32(src, dst, n); 2697 break; 2698 2699 case MESA_FORMAT_RG_UINT16: 2700 unpack_int_rgba_RG_UINT16(src, dst, n); 2701 break; 2702 case MESA_FORMAT_RG_INT16: 2703 unpack_int_rgba_RG_INT16(src, dst, n); 2704 break; 2705 2706 case MESA_FORMAT_RG_UINT8: 2707 unpack_int_rgba_RG_UINT8(src, dst, n); 2708 break; 2709 case MESA_FORMAT_RG_INT8: 2710 unpack_int_rgba_RG_INT8(src, dst, n); 2711 break; 2712 2713 case MESA_FORMAT_R_UINT32: 2714 case MESA_FORMAT_R_INT32: 2715 unpack_int_rgba_R_UINT32(src, dst, n); 2716 break; 2717 2718 case MESA_FORMAT_R_UINT16: 2719 unpack_int_rgba_R_UINT16(src, dst, n); 2720 break; 2721 case MESA_FORMAT_R_INT16: 2722 unpack_int_rgba_R_INT16(src, dst, n); 2723 break; 2724 2725 case MESA_FORMAT_R_UINT8: 2726 unpack_int_rgba_R_UINT8(src, dst, n); 2727 break; 2728 case MESA_FORMAT_R_INT8: 2729 unpack_int_rgba_R_INT8(src, dst, n); 2730 break; 2731 2732 case MESA_FORMAT_ALPHA_UINT32: 2733 case MESA_FORMAT_ALPHA_INT32: 2734 unpack_int_rgba_ALPHA_UINT32(src, dst, n); 2735 break; 2736 2737 case MESA_FORMAT_ALPHA_UINT16: 2738 unpack_int_rgba_ALPHA_UINT16(src, dst, n); 2739 break; 2740 case MESA_FORMAT_ALPHA_INT16: 2741 unpack_int_rgba_ALPHA_INT16(src, dst, n); 2742 break; 2743 2744 case MESA_FORMAT_ALPHA_UINT8: 2745 unpack_int_rgba_ALPHA_UINT8(src, dst, n); 2746 break; 2747 case MESA_FORMAT_ALPHA_INT8: 2748 unpack_int_rgba_ALPHA_INT8(src, dst, n); 2749 break; 2750 2751 case MESA_FORMAT_LUMINANCE_UINT32: 2752 case MESA_FORMAT_LUMINANCE_INT32: 2753 unpack_int_rgba_LUMINANCE_UINT32(src, dst, n); 2754 break; 2755 case MESA_FORMAT_LUMINANCE_UINT16: 2756 unpack_int_rgba_LUMINANCE_UINT16(src, dst, n); 2757 break; 2758 case MESA_FORMAT_LUMINANCE_INT16: 2759 unpack_int_rgba_LUMINANCE_INT16(src, dst, n); 2760 break; 2761 2762 case MESA_FORMAT_LUMINANCE_UINT8: 2763 unpack_int_rgba_LUMINANCE_UINT8(src, dst, n); 2764 break; 2765 case MESA_FORMAT_LUMINANCE_INT8: 2766 unpack_int_rgba_LUMINANCE_INT8(src, dst, n); 2767 break; 2768 2769 case MESA_FORMAT_LUMINANCE_ALPHA_UINT32: 2770 case MESA_FORMAT_LUMINANCE_ALPHA_INT32: 2771 unpack_int_rgba_LUMINANCE_ALPHA_UINT32(src, dst, n); 2772 break; 2773 2774 case MESA_FORMAT_LUMINANCE_ALPHA_UINT16: 2775 unpack_int_rgba_LUMINANCE_ALPHA_UINT16(src, dst, n); 2776 break; 2777 case MESA_FORMAT_LUMINANCE_ALPHA_INT16: 2778 unpack_int_rgba_LUMINANCE_ALPHA_INT16(src, dst, n); 2779 break; 2780 2781 case MESA_FORMAT_LUMINANCE_ALPHA_UINT8: 2782 unpack_int_rgba_LUMINANCE_ALPHA_UINT8(src, dst, n); 2783 break; 2784 case MESA_FORMAT_LUMINANCE_ALPHA_INT8: 2785 unpack_int_rgba_LUMINANCE_ALPHA_INT8(src, dst, n); 2786 break; 2787 2788 case MESA_FORMAT_INTENSITY_UINT32: 2789 case MESA_FORMAT_INTENSITY_INT32: 2790 unpack_int_rgba_INTENSITY_UINT32(src, dst, n); 2791 break; 2792 2793 case MESA_FORMAT_INTENSITY_UINT16: 2794 unpack_int_rgba_INTENSITY_UINT16(src, dst, n); 2795 break; 2796 case MESA_FORMAT_INTENSITY_INT16: 2797 unpack_int_rgba_INTENSITY_INT16(src, dst, n); 2798 break; 2799 2800 case MESA_FORMAT_INTENSITY_UINT8: 2801 unpack_int_rgba_INTENSITY_UINT8(src, dst, n); 2802 break; 2803 case MESA_FORMAT_INTENSITY_INT8: 2804 unpack_int_rgba_INTENSITY_INT8(src, dst, n); 2805 break; 2806 2807 case MESA_FORMAT_ARGB2101010_UINT: 2808 unpack_int_rgba_ARGB2101010_UINT(src, dst, n); 2809 break; 2810 2811 case MESA_FORMAT_ABGR2101010_UINT: 2812 unpack_int_rgba_ABGR2101010_UINT(src, dst, n); 2813 break; 2814 2815 case MESA_FORMAT_ARGB2101010: 2816 unpack_int_rgba_ARGB2101010(src, dst, n); 2817 break; 2818 2819 default: 2820 _mesa_problem(NULL, "%s: bad format %s", __FUNCTION__, 2821 _mesa_get_format_name(format)); 2822 return; 2823 } 2824} 2825 2826/** 2827 * Unpack a 2D rect of pixels returning float RGBA colors. 2828 * \param format the source image format 2829 * \param src start address of the source image 2830 * \param srcRowStride source image row stride in bytes 2831 * \param dst start address of the dest image 2832 * \param dstRowStride dest image row stride in bytes 2833 * \param x source image start X pos 2834 * \param y source image start Y pos 2835 * \param width width of rect region to convert 2836 * \param height height of rect region to convert 2837 */ 2838void 2839_mesa_unpack_rgba_block(gl_format format, 2840 const void *src, GLint srcRowStride, 2841 GLfloat dst[][4], GLint dstRowStride, 2842 GLuint x, GLuint y, GLuint width, GLuint height) 2843{ 2844 unpack_rgba_func unpack = get_unpack_rgba_function(format); 2845 const GLuint srcPixStride = _mesa_get_format_bytes(format); 2846 const GLuint dstPixStride = 4 * sizeof(GLfloat); 2847 const GLubyte *srcRow; 2848 GLubyte *dstRow; 2849 GLuint i; 2850 2851 /* XXX needs to be fixed for compressed formats */ 2852 2853 srcRow = ((const GLubyte *) src) + srcRowStride * y + srcPixStride * x; 2854 dstRow = ((GLubyte *) dst) + dstRowStride * y + dstPixStride * x; 2855 2856 for (i = 0; i < height; i++) { 2857 unpack(srcRow, (GLfloat (*)[4]) dstRow, width); 2858 2859 dstRow += dstRowStride; 2860 srcRow += srcRowStride; 2861 } 2862} 2863 2864 2865 2866 2867typedef void (*unpack_float_z_func)(GLuint n, const void *src, GLfloat *dst); 2868 2869static void 2870unpack_float_z_Z24_X8(GLuint n, const void *src, GLfloat *dst) 2871{ 2872 /* only return Z, not stencil data */ 2873 const GLuint *s = ((const GLuint *) src); 2874 const GLdouble scale = 1.0 / (GLdouble) 0xffffff; 2875 GLuint i; 2876 for (i = 0; i < n; i++) { 2877 dst[i] = (s[i] >> 8) * scale; 2878 ASSERT(dst[i] >= 0.0F); 2879 ASSERT(dst[i] <= 1.0F); 2880 } 2881} 2882 2883static void 2884unpack_float_z_X8_Z24(GLuint n, const void *src, GLfloat *dst) 2885{ 2886 /* only return Z, not stencil data */ 2887 const GLuint *s = ((const GLuint *) src); 2888 const GLdouble scale = 1.0 / (GLdouble) 0xffffff; 2889 GLuint i; 2890 for (i = 0; i < n; i++) { 2891 dst[i] = (s[i] & 0x00ffffff) * scale; 2892 ASSERT(dst[i] >= 0.0F); 2893 ASSERT(dst[i] <= 1.0F); 2894 } 2895} 2896 2897static void 2898unpack_float_z_Z16(GLuint n, const void *src, GLfloat *dst) 2899{ 2900 const GLushort *s = ((const GLushort *) src); 2901 GLuint i; 2902 for (i = 0; i < n; i++) { 2903 dst[i] = s[i] * (1.0F / 65535.0F); 2904 } 2905} 2906 2907static void 2908unpack_float_z_Z32(GLuint n, const void *src, GLfloat *dst) 2909{ 2910 const GLuint *s = ((const GLuint *) src); 2911 GLuint i; 2912 for (i = 0; i < n; i++) { 2913 dst[i] = s[i] * (1.0F / 0xffffffff); 2914 } 2915} 2916 2917static void 2918unpack_float_z_Z32F(GLuint n, const void *src, GLfloat *dst) 2919{ 2920 memcpy(dst, src, n * sizeof(float)); 2921} 2922 2923static void 2924unpack_float_z_Z32X24S8(GLuint n, const void *src, GLfloat *dst) 2925{ 2926 const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src; 2927 GLuint i; 2928 for (i = 0; i < n; i++) { 2929 dst[i] = s[i].z; 2930 } 2931} 2932 2933 2934 2935/** 2936 * Unpack Z values. 2937 * The returned values will always be in the range [0.0, 1.0]. 2938 */ 2939void 2940_mesa_unpack_float_z_row(gl_format format, GLuint n, 2941 const void *src, GLfloat *dst) 2942{ 2943 unpack_float_z_func unpack; 2944 2945 switch (format) { 2946 case MESA_FORMAT_Z24_S8: 2947 case MESA_FORMAT_Z24_X8: 2948 unpack = unpack_float_z_Z24_X8; 2949 break; 2950 case MESA_FORMAT_S8_Z24: 2951 case MESA_FORMAT_X8_Z24: 2952 unpack = unpack_float_z_X8_Z24; 2953 break; 2954 case MESA_FORMAT_Z16: 2955 unpack = unpack_float_z_Z16; 2956 break; 2957 case MESA_FORMAT_Z32: 2958 unpack = unpack_float_z_Z32; 2959 break; 2960 case MESA_FORMAT_Z32_FLOAT: 2961 unpack = unpack_float_z_Z32F; 2962 break; 2963 case MESA_FORMAT_Z32_FLOAT_X24S8: 2964 unpack = unpack_float_z_Z32X24S8; 2965 break; 2966 default: 2967 _mesa_problem(NULL, "bad format %s in _mesa_unpack_float_z_row", 2968 _mesa_get_format_name(format)); 2969 return; 2970 } 2971 2972 unpack(n, src, dst); 2973} 2974 2975 2976 2977typedef void (*unpack_uint_z_func)(const void *src, GLuint *dst, GLuint n); 2978 2979static void 2980unpack_uint_z_Z24_X8(const void *src, GLuint *dst, GLuint n) 2981{ 2982 /* only return Z, not stencil data */ 2983 const GLuint *s = ((const GLuint *) src); 2984 GLuint i; 2985 for (i = 0; i < n; i++) { 2986 dst[i] = (s[i] & 0xffffff00) | (s[i] >> 24); 2987 } 2988} 2989 2990static void 2991unpack_uint_z_X8_Z24(const void *src, GLuint *dst, GLuint n) 2992{ 2993 /* only return Z, not stencil data */ 2994 const GLuint *s = ((const GLuint *) src); 2995 GLuint i; 2996 for (i = 0; i < n; i++) { 2997 dst[i] = (s[i] << 8) | ((s[i] >> 16) & 0xff); 2998 } 2999} 3000 3001static void 3002unpack_uint_z_Z16(const void *src, GLuint *dst, GLuint n) 3003{ 3004 const GLushort *s = ((const GLushort *)src); 3005 GLuint i; 3006 for (i = 0; i < n; i++) { 3007 dst[i] = (s[i] << 16) | s[i]; 3008 } 3009} 3010 3011static void 3012unpack_uint_z_Z32(const void *src, GLuint *dst, GLuint n) 3013{ 3014 memcpy(dst, src, n * sizeof(GLuint)); 3015} 3016 3017static void 3018unpack_uint_z_Z32_FLOAT(const void *src, GLuint *dst, GLuint n) 3019{ 3020 const float *s = (const float *)src; 3021 GLuint i; 3022 for (i = 0; i < n; i++) { 3023 dst[i] = FLOAT_TO_UINT(CLAMP(s[i], 0.0F, 1.0F)); 3024 } 3025} 3026 3027static void 3028unpack_uint_z_Z32_FLOAT_X24S8(const void *src, GLuint *dst, GLuint n) 3029{ 3030 const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src; 3031 GLuint i; 3032 3033 for (i = 0; i < n; i++) { 3034 dst[i] = FLOAT_TO_UINT(CLAMP(s[i].z, 0.0F, 1.0F)); 3035 } 3036} 3037 3038 3039/** 3040 * Unpack Z values. 3041 * The returned values will always be in the range [0, 0xffffffff]. 3042 */ 3043void 3044_mesa_unpack_uint_z_row(gl_format format, GLuint n, 3045 const void *src, GLuint *dst) 3046{ 3047 unpack_uint_z_func unpack; 3048 const GLubyte *srcPtr = (GLubyte *) src; 3049 3050 switch (format) { 3051 case MESA_FORMAT_Z24_S8: 3052 case MESA_FORMAT_Z24_X8: 3053 unpack = unpack_uint_z_Z24_X8; 3054 break; 3055 case MESA_FORMAT_S8_Z24: 3056 case MESA_FORMAT_X8_Z24: 3057 unpack = unpack_uint_z_X8_Z24; 3058 break; 3059 case MESA_FORMAT_Z16: 3060 unpack = unpack_uint_z_Z16; 3061 break; 3062 case MESA_FORMAT_Z32: 3063 unpack = unpack_uint_z_Z32; 3064 break; 3065 case MESA_FORMAT_Z32_FLOAT: 3066 unpack = unpack_uint_z_Z32_FLOAT; 3067 break; 3068 case MESA_FORMAT_Z32_FLOAT_X24S8: 3069 unpack = unpack_uint_z_Z32_FLOAT_X24S8; 3070 break; 3071 default: 3072 _mesa_problem(NULL, "bad format %s in _mesa_unpack_uint_z_row", 3073 _mesa_get_format_name(format)); 3074 return; 3075 } 3076 3077 unpack(srcPtr, dst, n); 3078} 3079 3080 3081static void 3082unpack_ubyte_s_S8(const void *src, GLubyte *dst, GLuint n) 3083{ 3084 memcpy(dst, src, n); 3085} 3086 3087static void 3088unpack_ubyte_s_Z24_S8(const void *src, GLubyte *dst, GLuint n) 3089{ 3090 GLuint i; 3091 const GLuint *src32 = src; 3092 3093 for (i = 0; i < n; i++) 3094 dst[i] = src32[i] & 0xff; 3095} 3096 3097static void 3098unpack_ubyte_s_S8_Z24(const void *src, GLubyte *dst, GLuint n) 3099{ 3100 GLuint i; 3101 const GLuint *src32 = src; 3102 3103 for (i = 0; i < n; i++) 3104 dst[i] = src32[i] >> 24; 3105} 3106 3107static void 3108unpack_ubyte_s_Z32_FLOAT_X24S8(const void *src, GLubyte *dst, GLuint n) 3109{ 3110 GLuint i; 3111 const struct z32f_x24s8 *s = (const struct z32f_x24s8 *) src; 3112 3113 for (i = 0; i < n; i++) 3114 dst[i] = s[i].x24s8 & 0xff; 3115} 3116 3117void 3118_mesa_unpack_ubyte_stencil_row(gl_format format, GLuint n, 3119 const void *src, GLubyte *dst) 3120{ 3121 switch (format) { 3122 case MESA_FORMAT_S8: 3123 unpack_ubyte_s_S8(src, dst, n); 3124 break; 3125 case MESA_FORMAT_Z24_S8: 3126 unpack_ubyte_s_Z24_S8(src, dst, n); 3127 break; 3128 case MESA_FORMAT_S8_Z24: 3129 unpack_ubyte_s_S8_Z24(src, dst, n); 3130 break; 3131 case MESA_FORMAT_Z32_FLOAT_X24S8: 3132 unpack_ubyte_s_Z32_FLOAT_X24S8(src, dst, n); 3133 break; 3134 default: 3135 _mesa_problem(NULL, "bad format %s in _mesa_unpack_ubyte_s_row", 3136 _mesa_get_format_name(format)); 3137 return; 3138 } 3139} 3140 3141static void 3142unpack_uint_24_8_depth_stencil_S8_Z24(const GLuint *src, GLuint *dst, GLuint n) 3143{ 3144 GLuint i; 3145 3146 for (i = 0; i < n; i++) { 3147 GLuint val = src[i]; 3148 dst[i] = val >> 24 | val << 8; 3149 } 3150} 3151 3152static void 3153unpack_uint_24_8_depth_stencil_Z24_S8(const GLuint *src, GLuint *dst, GLuint n) 3154{ 3155 memcpy(dst, src, n * 4); 3156} 3157 3158void 3159_mesa_unpack_uint_24_8_depth_stencil_row(gl_format format, GLuint n, 3160 const void *src, GLuint *dst) 3161{ 3162 switch (format) { 3163 case MESA_FORMAT_Z24_S8: 3164 unpack_uint_24_8_depth_stencil_Z24_S8(src, dst, n); 3165 break; 3166 case MESA_FORMAT_S8_Z24: 3167 unpack_uint_24_8_depth_stencil_S8_Z24(src, dst, n); 3168 break; 3169 default: 3170 _mesa_problem(NULL, 3171 "bad format %s in _mesa_unpack_uint_24_8_depth_stencil_row", 3172 _mesa_get_format_name(format)); 3173 return; 3174 } 3175} 3176