1 /************************************************************************** 2 * 3 * Copyright 2010 VMware, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 18 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 19 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 20 * USE OR OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * The above copyright notice and this permission notice (including the 23 * next paragraph) shall be included in all copies or substantial portions 24 * of the Software. 25 * 26 **************************************************************************/ 27 28 29 #include "u_debug.h" 30 #include "u_math.h" 31 #include "u_format_zs.h" 32 33 34 /* 35 * z32_unorm conversion functions 36 */ 37 38 static INLINE uint16_t 39 z32_unorm_to_z16_unorm(uint32_t z) 40 { 41 /* z * 0xffff / 0xffffffff */ 42 return z >> 16; 43 } 44 45 static INLINE uint32_t 46 z16_unorm_to_z32_unorm(uint16_t z) 47 { 48 /* z * 0xffffffff / 0xffff */ 49 return (z << 16) | z; 50 } 51 52 static INLINE uint32_t 53 z32_unorm_to_z24_unorm(uint32_t z) 54 { 55 /* z * 0xffffff / 0xffffffff */ 56 return z >> 8; 57 } 58 59 static INLINE uint32_t 60 z24_unorm_to_z32_unorm(uint32_t z) 61 { 62 /* z * 0xffffffff / 0xffffff */ 63 return (z << 8) | (z >> 16); 64 } 65 66 67 /* 68 * z32_float conversion functions 69 */ 70 71 static INLINE uint16_t 72 z32_float_to_z16_unorm(float z) 73 { 74 const float scale = 0xffff; 75 return (uint16_t)(z * scale); 76 } 77 78 static INLINE float 79 z16_unorm_to_z32_float(uint16_t z) 80 { 81 const float scale = 1.0 / 0xffff; 82 return (float)(z * scale); 83 } 84 85 static INLINE uint32_t 86 z32_float_to_z24_unorm(float z) 87 { 88 const double scale = 0xffffff; 89 return (uint32_t)(z * scale) & 0xffffff; 90 } 91 92 static INLINE float 93 z24_unorm_to_z32_float(uint32_t z) 94 { 95 const double scale = 1.0 / 0xffffff; 96 return (float)(z * scale); 97 } 98 99 static INLINE uint32_t 100 z32_float_to_z32_unorm(float z) 101 { 102 const double scale = 0xffffffff; 103 return (uint32_t)(z * scale); 104 } 105 106 static INLINE float 107 z32_unorm_to_z32_float(uint32_t z) 108 { 109 const double scale = 1.0 / 0xffffffff; 110 return (float)(z * scale); 111 } 112 113 114 void 115 util_format_s8_uint_unpack_s_8uint(uint8_t *dst_row, unsigned dst_stride, 116 const uint8_t *src_row, unsigned src_stride, 117 unsigned width, unsigned height) 118 { 119 unsigned y; 120 for(y = 0; y < height; ++y) { 121 memcpy(dst_row, src_row, width); 122 src_row += src_stride/sizeof(*src_row); 123 dst_row += dst_stride/sizeof(*dst_row); 124 } 125 } 126 127 void 128 util_format_s8_uint_pack_s_8uint(uint8_t *dst_row, unsigned dst_stride, 129 const uint8_t *src_row, unsigned src_stride, 130 unsigned width, unsigned height) 131 { 132 unsigned y; 133 for(y = 0; y < height; ++y) { 134 memcpy(dst_row, src_row, width); 135 src_row += src_stride/sizeof(*src_row); 136 dst_row += dst_stride/sizeof(*dst_row); 137 } 138 } 139 140 void 141 util_format_z16_unorm_unpack_z_float(float *dst_row, unsigned dst_stride, 142 const uint8_t *src_row, unsigned src_stride, 143 unsigned width, unsigned height) 144 { 145 unsigned x, y; 146 for(y = 0; y < height; ++y) { 147 float *dst = dst_row; 148 const uint16_t *src = (const uint16_t *)src_row; 149 for(x = 0; x < width; ++x) { 150 uint16_t value = *src++; 151 #ifdef PIPE_ARCH_BIG_ENDIAN 152 value = util_bswap16(value); 153 #endif 154 *dst++ = z16_unorm_to_z32_float(value); 155 } 156 src_row += src_stride/sizeof(*src_row); 157 dst_row += dst_stride/sizeof(*dst_row); 158 } 159 } 160 161 void 162 util_format_z16_unorm_pack_z_float(uint8_t *dst_row, unsigned dst_stride, 163 const float *src_row, unsigned src_stride, 164 unsigned width, unsigned height) 165 { 166 unsigned x, y; 167 for(y = 0; y < height; ++y) { 168 const float *src = src_row; 169 uint16_t *dst = (uint16_t *)dst_row; 170 for(x = 0; x < width; ++x) { 171 uint16_t value; 172 value = z32_float_to_z16_unorm(*src++); 173 #ifdef PIPE_ARCH_BIG_ENDIAN 174 value = util_bswap16(value); 175 #endif 176 *dst++ = value; 177 } 178 dst_row += dst_stride/sizeof(*dst_row); 179 src_row += src_stride/sizeof(*src_row); 180 } 181 } 182 183 void 184 util_format_z16_unorm_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride, 185 const uint8_t *src_row, unsigned src_stride, 186 unsigned width, unsigned height) 187 { 188 unsigned x, y; 189 for(y = 0; y < height; ++y) { 190 uint32_t *dst = dst_row; 191 const uint16_t *src = (const uint16_t *)src_row; 192 for(x = 0; x < width; ++x) { 193 uint16_t value = *src++; 194 #ifdef PIPE_ARCH_BIG_ENDIAN 195 value = util_bswap16(value); 196 #endif 197 *dst++ = z16_unorm_to_z32_unorm(value); 198 } 199 src_row += src_stride/sizeof(*src_row); 200 dst_row += dst_stride/sizeof(*dst_row); 201 } 202 } 203 204 void 205 util_format_z16_unorm_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride, 206 const uint32_t *src_row, unsigned src_stride, 207 unsigned width, unsigned height) 208 { 209 unsigned x, y; 210 for(y = 0; y < height; ++y) { 211 const uint32_t *src = src_row; 212 uint16_t *dst = (uint16_t *)dst_row; 213 for(x = 0; x < width; ++x) { 214 uint16_t value; 215 value = z32_unorm_to_z16_unorm(*src++); 216 #ifdef PIPE_ARCH_BIG_ENDIAN 217 value = util_bswap16(value); 218 #endif 219 *dst++ = value; 220 } 221 dst_row += dst_stride/sizeof(*dst_row); 222 src_row += src_stride/sizeof(*src_row); 223 } 224 } 225 226 void 227 util_format_z32_unorm_unpack_z_float(float *dst_row, unsigned dst_stride, 228 const uint8_t *src_row, unsigned src_stride, 229 unsigned width, unsigned height) 230 { 231 unsigned x, y; 232 for(y = 0; y < height; ++y) { 233 float *dst = dst_row; 234 const uint32_t *src = (const uint32_t *)src_row; 235 for(x = 0; x < width; ++x) { 236 uint32_t value = *src++; 237 #ifdef PIPE_ARCH_BIG_ENDIAN 238 value = util_bswap32(value); 239 #endif 240 *dst++ = z32_unorm_to_z32_float(value); 241 } 242 src_row += src_stride/sizeof(*src_row); 243 dst_row += dst_stride/sizeof(*dst_row); 244 } 245 } 246 247 void 248 util_format_z32_unorm_pack_z_float(uint8_t *dst_row, unsigned dst_stride, 249 const float *src_row, unsigned src_stride, 250 unsigned width, unsigned height) 251 { 252 unsigned x, y; 253 for(y = 0; y < height; ++y) { 254 const float *src = src_row; 255 uint32_t *dst = (uint32_t *)dst_row; 256 for(x = 0; x < width; ++x) { 257 uint32_t value; 258 value = z32_float_to_z32_unorm(*src++); 259 #ifdef PIPE_ARCH_BIG_ENDIAN 260 value = util_bswap32(value); 261 #endif 262 *dst++ = value; 263 } 264 dst_row += dst_stride/sizeof(*dst_row); 265 src_row += src_stride/sizeof(*src_row); 266 } 267 } 268 269 void 270 util_format_z32_unorm_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride, 271 const uint8_t *src_row, unsigned src_stride, 272 unsigned width, unsigned height) 273 { 274 unsigned y; 275 for(y = 0; y < height; ++y) { 276 memcpy(dst_row, src_row, width * 4); 277 src_row += src_stride/sizeof(*src_row); 278 dst_row += dst_stride/sizeof(*dst_row); 279 } 280 } 281 282 void 283 util_format_z32_unorm_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride, 284 const uint32_t *src_row, unsigned src_stride, 285 unsigned width, unsigned height) 286 { 287 unsigned y; 288 for(y = 0; y < height; ++y) { 289 memcpy(dst_row, src_row, width * 4); 290 src_row += src_stride/sizeof(*src_row); 291 dst_row += dst_stride/sizeof(*dst_row); 292 } 293 } 294 295 void 296 util_format_z32_float_unpack_z_float(float *dst_row, unsigned dst_stride, 297 const uint8_t *src_row, unsigned src_stride, 298 unsigned width, unsigned height) 299 { 300 unsigned y; 301 for(y = 0; y < height; ++y) { 302 memcpy(dst_row, src_row, width * 4); 303 src_row += src_stride/sizeof(*src_row); 304 dst_row += dst_stride/sizeof(*dst_row); 305 } 306 } 307 308 void 309 util_format_z32_float_pack_z_float(uint8_t *dst_row, unsigned dst_stride, 310 const float *src_row, unsigned src_stride, 311 unsigned width, unsigned height) 312 { 313 unsigned y; 314 for(y = 0; y < height; ++y) { 315 memcpy(dst_row, src_row, width * 4); 316 src_row += src_stride/sizeof(*src_row); 317 dst_row += dst_stride/sizeof(*dst_row); 318 } 319 } 320 321 void 322 util_format_z32_float_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride, 323 const uint8_t *src_row, unsigned src_stride, 324 unsigned width, unsigned height) 325 { 326 unsigned x, y; 327 for(y = 0; y < height; ++y) { 328 uint32_t *dst = dst_row; 329 const float *src = (const float *)src_row; 330 for(x = 0; x < width; ++x) { 331 *dst++ = z32_float_to_z32_unorm(*src++); 332 } 333 src_row += src_stride/sizeof(*src_row); 334 dst_row += dst_stride/sizeof(*dst_row); 335 } 336 } 337 338 void 339 util_format_z32_float_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride, 340 const uint32_t *src_row, unsigned src_stride, 341 unsigned width, unsigned height) 342 { 343 unsigned x, y; 344 for(y = 0; y < height; ++y) { 345 const uint32_t *src = src_row; 346 float *dst = (float *)dst_row; 347 for(x = 0; x < width; ++x) { 348 *dst++ = z32_unorm_to_z32_float(*src++); 349 } 350 dst_row += dst_stride/sizeof(*dst_row); 351 src_row += src_stride/sizeof(*src_row); 352 } 353 } 354 355 void 356 util_format_z24_unorm_s8_uint_unpack_z_float(float *dst_row, unsigned dst_stride, 357 const uint8_t *src_row, unsigned src_stride, 358 unsigned width, unsigned height) 359 { 360 unsigned x, y; 361 for(y = 0; y < height; ++y) { 362 float *dst = dst_row; 363 const uint32_t *src = (const uint32_t *)src_row; 364 for(x = 0; x < width; ++x) { 365 uint32_t value = *src++; 366 #ifdef PIPE_ARCH_BIG_ENDIAN 367 value = util_bswap32(value); 368 #endif 369 *dst++ = z24_unorm_to_z32_float(value & 0xffffff); 370 } 371 src_row += src_stride/sizeof(*src_row); 372 dst_row += dst_stride/sizeof(*dst_row); 373 } 374 } 375 376 void 377 util_format_z24_unorm_s8_uint_pack_z_float(uint8_t *dst_row, unsigned dst_stride, 378 const float *src_row, unsigned src_stride, 379 unsigned width, unsigned height) 380 { 381 unsigned x, y; 382 for(y = 0; y < height; ++y) { 383 const float *src = src_row; 384 uint32_t *dst = (uint32_t *)dst_row; 385 for(x = 0; x < width; ++x) { 386 uint32_t value = *dst; 387 #ifdef PIPE_ARCH_BIG_ENDIAN 388 value = util_bswap32(value); 389 #endif 390 value &= 0xff000000; 391 value |= z32_float_to_z24_unorm(*src++); 392 #ifdef PIPE_ARCH_BIG_ENDIAN 393 value = util_bswap32(value); 394 #endif 395 *dst++ = value; 396 } 397 dst_row += dst_stride/sizeof(*dst_row); 398 src_row += src_stride/sizeof(*src_row); 399 } 400 } 401 402 void 403 util_format_z24_unorm_s8_uint_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride, 404 const uint8_t *src_row, unsigned src_stride, 405 unsigned width, unsigned height) 406 { 407 unsigned x, y; 408 for(y = 0; y < height; ++y) { 409 uint32_t *dst = dst_row; 410 const uint32_t *src = (const uint32_t *)src_row; 411 for(x = 0; x < width; ++x) { 412 uint32_t value = *src++; 413 #ifdef PIPE_ARCH_BIG_ENDIAN 414 value = util_bswap32(value); 415 #endif 416 *dst++ = z24_unorm_to_z32_unorm(value & 0xffffff); 417 } 418 src_row += src_stride/sizeof(*src_row); 419 dst_row += dst_stride/sizeof(*dst_row); 420 } 421 } 422 423 void 424 util_format_z24_unorm_s8_uint_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride, 425 const uint32_t *src_row, unsigned src_stride, 426 unsigned width, unsigned height) 427 { 428 unsigned x, y; 429 for(y = 0; y < height; ++y) { 430 const uint32_t *src = src_row; 431 uint32_t *dst = (uint32_t *)dst_row; 432 for(x = 0; x < width; ++x) { 433 uint32_t value= *dst; 434 #ifdef PIPE_ARCH_BIG_ENDIAN 435 value = util_bswap32(value); 436 #endif 437 value &= 0xff000000; 438 value |= z32_unorm_to_z24_unorm(*src++); 439 #ifdef PIPE_ARCH_BIG_ENDIAN 440 value = util_bswap32(value); 441 #endif 442 *dst++ = value; 443 } 444 dst_row += dst_stride/sizeof(*dst_row); 445 src_row += src_stride/sizeof(*src_row); 446 } 447 } 448 449 void 450 util_format_z24_unorm_s8_uint_unpack_s_8uint(uint8_t *dst_row, unsigned dst_stride, 451 const uint8_t *src_row, unsigned src_stride, 452 unsigned width, unsigned height) 453 { 454 unsigned x, y; 455 for(y = 0; y < height; ++y) { 456 uint8_t *dst = dst_row; 457 const uint32_t *src = (const uint32_t *)src_row; 458 for(x = 0; x < width; ++x) { 459 uint32_t value = *src++; 460 #ifdef PIPE_ARCH_BIG_ENDIAN 461 value = util_bswap32(value); 462 #endif 463 *dst++ = value >> 24; 464 } 465 src_row += src_stride/sizeof(*src_row); 466 dst_row += dst_stride/sizeof(*dst_row); 467 } 468 } 469 470 void 471 util_format_z24_unorm_s8_uint_pack_s_8uint(uint8_t *dst_row, unsigned dst_stride, 472 const uint8_t *src_row, unsigned src_stride, 473 unsigned width, unsigned height) 474 { 475 unsigned x, y; 476 for(y = 0; y < height; ++y) { 477 const uint8_t *src = src_row; 478 uint32_t *dst = (uint32_t *)dst_row; 479 for(x = 0; x < width; ++x) { 480 uint32_t value = *dst; 481 #ifdef PIPE_ARCH_BIG_ENDIAN 482 value = util_bswap32(value); 483 #endif 484 value &= 0x00ffffff; 485 value |= *src++ << 24; 486 #ifdef PIPE_ARCH_BIG_ENDIAN 487 value = util_bswap32(value); 488 #endif 489 *dst++ = value; 490 } 491 dst_row += dst_stride/sizeof(*dst_row); 492 src_row += src_stride/sizeof(*src_row); 493 } 494 } 495 496 void 497 util_format_s8_uint_z24_unorm_unpack_z_float(float *dst_row, unsigned dst_stride, 498 const uint8_t *src_row, unsigned src_stride, 499 unsigned width, unsigned height) 500 { 501 unsigned x, y; 502 for(y = 0; y < height; ++y) { 503 float *dst = dst_row; 504 const uint32_t *src = (const uint32_t *)src_row; 505 for(x = 0; x < width; ++x) { 506 uint32_t value = *src++; 507 #ifdef PIPE_ARCH_BIG_ENDIAN 508 value = util_bswap32(value); 509 #endif 510 *dst++ = z24_unorm_to_z32_float(value >> 8); 511 } 512 src_row += src_stride/sizeof(*src_row); 513 dst_row += dst_stride/sizeof(*dst_row); 514 } 515 } 516 517 void 518 util_format_s8_uint_z24_unorm_pack_z_float(uint8_t *dst_row, unsigned dst_stride, 519 const float *src_row, unsigned src_stride, 520 unsigned width, unsigned height) 521 { 522 unsigned x, y; 523 for(y = 0; y < height; ++y) { 524 const float *src = src_row; 525 uint32_t *dst = (uint32_t *)dst_row; 526 for(x = 0; x < width; ++x) { 527 uint32_t value = *dst; 528 #ifdef PIPE_ARCH_BIG_ENDIAN 529 value = util_bswap32(value); 530 #endif 531 value &= 0x000000ff; 532 value |= z32_float_to_z24_unorm(*src++) << 8; 533 #ifdef PIPE_ARCH_BIG_ENDIAN 534 value = util_bswap32(value); 535 #endif 536 *dst++ = value; 537 } 538 dst_row += dst_stride/sizeof(*dst_row); 539 src_row += src_stride/sizeof(*src_row); 540 } 541 } 542 543 void 544 util_format_s8_uint_z24_unorm_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride, 545 const uint8_t *src_row, unsigned src_stride, 546 unsigned width, unsigned height) 547 { 548 unsigned x, y; 549 for(y = 0; y < height; ++y) { 550 uint32_t *dst = dst_row; 551 const uint32_t *src = (const uint32_t *)src_row; 552 for(x = 0; x < width; ++x) { 553 uint32_t value = *src++; 554 #ifdef PIPE_ARCH_BIG_ENDIAN 555 value = util_bswap32(value); 556 #endif 557 *dst++ = z24_unorm_to_z32_unorm(value >> 8); 558 } 559 src_row += src_stride/sizeof(*src_row); 560 dst_row += dst_stride/sizeof(*dst_row); 561 } 562 } 563 564 void 565 util_format_s8_uint_z24_unorm_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride, 566 const uint32_t *src_row, unsigned src_stride, 567 unsigned width, unsigned height) 568 { 569 unsigned x, y; 570 for(y = 0; y < height; ++y) { 571 const uint32_t *src = src_row; 572 uint32_t *dst = (uint32_t *)dst_row; 573 for(x = 0; x < width; ++x) { 574 uint32_t value = *dst; 575 #ifdef PIPE_ARCH_BIG_ENDIAN 576 value = util_bswap32(value); 577 #endif 578 value &= 0x000000ff; 579 value |= *src++ & 0xffffff00; 580 #ifdef PIPE_ARCH_BIG_ENDIAN 581 value = util_bswap32(value); 582 #endif 583 *dst++ = value; 584 } 585 dst_row += dst_stride/sizeof(*dst_row); 586 src_row += src_stride/sizeof(*src_row); 587 } 588 } 589 590 void 591 util_format_s8_uint_z24_unorm_unpack_s_8uint(uint8_t *dst_row, unsigned dst_stride, 592 const uint8_t *src_row, unsigned src_stride, 593 unsigned width, unsigned height) 594 { 595 unsigned x, y; 596 for(y = 0; y < height; ++y) { 597 uint8_t *dst = dst_row; 598 const uint32_t *src = (const uint32_t *)src_row; 599 for(x = 0; x < width; ++x) { 600 uint32_t value = *src++; 601 #ifdef PIPE_ARCH_BIG_ENDIAN 602 value = util_bswap32(value); 603 #endif 604 *dst++ = value & 0xff; 605 } 606 src_row += src_stride/sizeof(*src_row); 607 dst_row += dst_stride/sizeof(*dst_row); 608 } 609 } 610 611 void 612 util_format_s8_uint_z24_unorm_pack_s_8uint(uint8_t *dst_row, unsigned dst_stride, 613 const uint8_t *src_row, unsigned src_stride, 614 unsigned width, unsigned height) 615 { 616 unsigned x, y; 617 for(y = 0; y < height; ++y) { 618 const uint8_t *src = src_row; 619 uint32_t *dst = (uint32_t *)dst_row; 620 for(x = 0; x < width; ++x) { 621 uint32_t value = *dst; 622 #ifdef PIPE_ARCH_BIG_ENDIAN 623 value = util_bswap32(value); 624 #endif 625 value &= 0xffffff00; 626 value |= *src++; 627 #ifdef PIPE_ARCH_BIG_ENDIAN 628 value = util_bswap32(value); 629 #endif 630 *dst++ = value; 631 } 632 dst_row += dst_stride/sizeof(*dst_row); 633 src_row += src_stride/sizeof(*src_row); 634 } 635 } 636 637 void 638 util_format_z24x8_unorm_unpack_z_float(float *dst_row, unsigned dst_stride, 639 const uint8_t *src_row, unsigned src_stride, 640 unsigned width, unsigned height) 641 { 642 unsigned x, y; 643 for(y = 0; y < height; ++y) { 644 float *dst = dst_row; 645 const uint32_t *src = (const uint32_t *)src_row; 646 for(x = 0; x < width; ++x) { 647 uint32_t value = *src++; 648 #ifdef PIPE_ARCH_BIG_ENDIAN 649 value = util_bswap32(value); 650 #endif 651 *dst++ = z24_unorm_to_z32_float(value & 0xffffff); 652 } 653 src_row += src_stride/sizeof(*src_row); 654 dst_row += dst_stride/sizeof(*dst_row); 655 } 656 } 657 658 void 659 util_format_z24x8_unorm_pack_z_float(uint8_t *dst_row, unsigned dst_stride, 660 const float *src_row, unsigned src_stride, 661 unsigned width, unsigned height) 662 { 663 unsigned x, y; 664 for(y = 0; y < height; ++y) { 665 const float *src = src_row; 666 uint32_t *dst = (uint32_t *)dst_row; 667 for(x = 0; x < width; ++x) { 668 uint32_t value; 669 value = z32_float_to_z24_unorm(*src++); 670 #ifdef PIPE_ARCH_BIG_ENDIAN 671 value = util_bswap32(value); 672 #endif 673 *dst++ = value; 674 } 675 dst_row += dst_stride/sizeof(*dst_row); 676 src_row += src_stride/sizeof(*src_row); 677 } 678 } 679 680 void 681 util_format_z24x8_unorm_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride, 682 const uint8_t *src_row, unsigned src_stride, 683 unsigned width, unsigned height) 684 { 685 unsigned x, y; 686 for(y = 0; y < height; ++y) { 687 uint32_t *dst = dst_row; 688 const uint32_t *src = (const uint32_t *)src_row; 689 for(x = 0; x < width; ++x) { 690 uint32_t value = *src++; 691 #ifdef PIPE_ARCH_BIG_ENDIAN 692 value = util_bswap32(value); 693 #endif 694 *dst++ = z24_unorm_to_z32_unorm(value & 0xffffff); 695 } 696 src_row += src_stride/sizeof(*src_row); 697 dst_row += dst_stride/sizeof(*dst_row); 698 } 699 } 700 701 void 702 util_format_z24x8_unorm_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride, 703 const uint32_t *src_row, unsigned src_stride, 704 unsigned width, unsigned height) 705 { 706 unsigned x, y; 707 for(y = 0; y < height; ++y) { 708 const uint32_t *src = src_row; 709 uint32_t *dst = (uint32_t *)dst_row; 710 for(x = 0; x < width; ++x) { 711 uint32_t value; 712 value = z32_unorm_to_z24_unorm(*src++); 713 #ifdef PIPE_ARCH_BIG_ENDIAN 714 value = util_bswap32(value); 715 #endif 716 *dst++ = value; 717 } 718 dst_row += dst_stride/sizeof(*dst_row); 719 src_row += src_stride/sizeof(*src_row); 720 } 721 } 722 723 void 724 util_format_x8z24_unorm_unpack_z_float(float *dst_row, unsigned dst_stride, 725 const uint8_t *src_row, unsigned src_stride, 726 unsigned width, unsigned height) 727 { 728 unsigned x, y; 729 for(y = 0; y < height; ++y) { 730 float *dst = dst_row; 731 const uint32_t *src = (uint32_t *)src_row; 732 for(x = 0; x < width; ++x) { 733 uint32_t value = *src++; 734 #ifdef PIPE_ARCH_BIG_ENDIAN 735 value = util_bswap32(value); 736 #endif 737 *dst++ = z24_unorm_to_z32_float(value >> 8); 738 } 739 src_row += src_stride/sizeof(*src_row); 740 dst_row += dst_stride/sizeof(*dst_row); 741 } 742 } 743 744 void 745 util_format_x8z24_unorm_pack_z_float(uint8_t *dst_row, unsigned dst_stride, 746 const float *src_row, unsigned src_stride, 747 unsigned width, unsigned height) 748 { 749 unsigned x, y; 750 for(y = 0; y < height; ++y) { 751 const float *src = src_row; 752 uint32_t *dst = (uint32_t *)dst_row; 753 for(x = 0; x < width; ++x) { 754 uint32_t value; 755 value = z32_float_to_z24_unorm(*src++) << 8; 756 #ifdef PIPE_ARCH_BIG_ENDIAN 757 value = util_bswap32(value); 758 #endif 759 *dst++ = value; 760 } 761 dst_row += dst_stride/sizeof(*dst_row); 762 src_row += src_stride/sizeof(*src_row); 763 } 764 } 765 766 void 767 util_format_x8z24_unorm_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride, 768 const uint8_t *src_row, unsigned src_stride, 769 unsigned width, unsigned height) 770 { 771 unsigned x, y; 772 for(y = 0; y < height; ++y) { 773 uint32_t *dst = dst_row; 774 const uint32_t *src = (const uint32_t *)src_row; 775 for(x = 0; x < width; ++x) { 776 uint32_t value = *src++; 777 #ifdef PIPE_ARCH_BIG_ENDIAN 778 value = util_bswap32(value); 779 #endif 780 *dst++ = z24_unorm_to_z32_unorm(value >> 8); 781 } 782 src_row += src_stride/sizeof(*src_row); 783 dst_row += dst_stride/sizeof(*dst_row); 784 } 785 } 786 787 void 788 util_format_x8z24_unorm_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride, 789 const uint32_t *src_row, unsigned src_stride, 790 unsigned width, unsigned height) 791 { 792 unsigned x, y; 793 for(y = 0; y < height; ++y) { 794 const uint32_t *src = src_row; 795 uint32_t *dst = (uint32_t *)dst_row; 796 for(x = 0; x < width; ++x) { 797 uint32_t value; 798 value = z32_unorm_to_z24_unorm(*src++) << 8; 799 #ifdef PIPE_ARCH_BIG_ENDIAN 800 value = util_bswap32(value); 801 #endif 802 *dst++ = value; 803 } 804 dst_row += dst_stride/sizeof(*dst_row); 805 src_row += src_stride/sizeof(*src_row); 806 } 807 } 808 809 void 810 util_format_z32_float_s8x24_uint_unpack_z_float(float *dst_row, unsigned dst_stride, 811 const uint8_t *src_row, unsigned src_stride, 812 unsigned width, unsigned height) 813 { 814 unsigned x, y; 815 for(y = 0; y < height; ++y) { 816 float *dst = dst_row; 817 const float *src = (const float *)src_row; 818 for(x = 0; x < width; ++x) { 819 *dst = *src; 820 src += 2; 821 dst += 1; 822 } 823 src_row += src_stride/sizeof(*src_row); 824 dst_row += dst_stride/sizeof(*dst_row); 825 } 826 } 827 828 void 829 util_format_z32_float_s8x24_uint_pack_z_float(uint8_t *dst_row, unsigned dst_stride, 830 const float *src_row, unsigned src_stride, 831 unsigned width, unsigned height) 832 { 833 unsigned x, y; 834 for(y = 0; y < height; ++y) { 835 const float *src = src_row; 836 float *dst = (float *)dst_row; 837 for(x = 0; x < width; ++x) { 838 *dst = *src; 839 src += 1; 840 dst += 2; 841 } 842 dst_row += dst_stride/sizeof(*dst_row); 843 src_row += src_stride/sizeof(*src_row); 844 } 845 } 846 847 void 848 util_format_z32_float_s8x24_uint_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride, 849 const uint8_t *src_row, unsigned src_stride, 850 unsigned width, unsigned height) 851 { 852 unsigned x, y; 853 for(y = 0; y < height; ++y) { 854 uint32_t *dst = dst_row; 855 const float *src = (const float *)src_row; 856 for(x = 0; x < width; ++x) { 857 *dst = z32_float_to_z32_unorm(*src); 858 src += 2; 859 dst += 1; 860 } 861 src_row += src_stride/sizeof(*src_row); 862 dst_row += dst_stride/sizeof(*dst_row); 863 } 864 } 865 866 void 867 util_format_z32_float_s8x24_uint_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride, 868 const uint32_t *src_row, unsigned src_stride, 869 unsigned width, unsigned height) 870 { 871 unsigned x, y; 872 for(y = 0; y < height; ++y) { 873 const uint32_t *src = src_row; 874 float *dst = (float *)dst_row; 875 for(x = 0; x < width; ++x) { 876 *dst++ = z32_unorm_to_z32_float(*src++); 877 } 878 dst_row += dst_stride/sizeof(*dst_row); 879 src_row += src_stride/sizeof(*src_row); 880 } 881 } 882 883 void 884 util_format_z32_float_s8x24_uint_unpack_s_8uint(uint8_t *dst_row, unsigned dst_stride, 885 const uint8_t *src_row, unsigned src_stride, 886 unsigned width, unsigned height) 887 { 888 unsigned x, y; 889 for(y = 0; y < height; ++y) { 890 uint8_t *dst = dst_row; 891 const uint8_t *src = src_row + 4; 892 for(x = 0; x < width; ++x) { 893 *dst = *src; 894 src += 8; 895 dst += 1; 896 } 897 src_row += src_stride/sizeof(*src_row); 898 dst_row += dst_stride/sizeof(*dst_row); 899 } 900 } 901 902 void 903 util_format_z32_float_s8x24_uint_pack_s_8uint(uint8_t *dst_row, unsigned dst_stride, 904 const uint8_t *src_row, unsigned src_stride, 905 unsigned width, unsigned height) 906 { 907 unsigned x, y; 908 for(y = 0; y < height; ++y) { 909 const uint8_t *src = src_row; 910 uint8_t *dst = dst_row + 4; 911 for(x = 0; x < width; ++x) { 912 *dst = *src; 913 src += 1; 914 dst += 8; 915 } 916 dst_row += dst_stride/sizeof(*dst_row); 917 src_row += src_stride/sizeof(*src_row); 918 } 919 } 920 921 922 void 923 util_format_x24s8_uint_unpack_s_8uint(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) 924 { 925 util_format_z24_unorm_s8_uint_unpack_s_8uint(dst_row, dst_stride, 926 src_row, src_stride, 927 width, height); 928 } 929 930 void 931 util_format_x24s8_uint_pack_s_8uint(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) 932 { 933 util_format_z24_unorm_s8_uint_pack_s_8uint(dst_row, dst_stride, 934 src_row, src_stride, 935 width, height); 936 } 937 938 void 939 util_format_s8x24_uint_unpack_s_8uint(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) 940 { 941 util_format_s8_uint_z24_unorm_unpack_s_8uint(dst_row, dst_stride, 942 src_row, src_stride, 943 width, height); 944 } 945 946 void 947 util_format_s8x24_uint_pack_s_8uint(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height) 948 { 949 util_format_s8_uint_z24_unorm_pack_s_8uint(dst_row, dst_stride, 950 src_row, src_stride, 951 width, height); 952 } 953 954 void 955 util_format_x32_s8x24_uint_unpack_s_8uint(uint8_t *dst_row, unsigned dst_stride, 956 const uint8_t *src_row, unsigned src_stride, 957 unsigned width, unsigned height) 958 { 959 util_format_z32_float_s8x24_uint_unpack_s_8uint(dst_row, dst_stride, 960 src_row, src_stride, 961 width, height); 962 963 } 964 965 void 966 util_format_x32_s8x24_uint_pack_s_8uint(uint8_t *dst_row, unsigned dst_stride, 967 const uint8_t *src_row, unsigned src_stride, 968 unsigned width, unsigned height) 969 { 970 util_format_z32_float_s8x24_uint_pack_s_8uint(dst_row, dst_stride, 971 src_row, src_stride, 972 width, height); 973 } 974