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