Home | History | Annotate | Download | only in util
      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 + 0.5f);
     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 = util_cpu_to_le16(*src++);
    151          *dst++ = z16_unorm_to_z32_float(value);
    152       }
    153       src_row += src_stride/sizeof(*src_row);
    154       dst_row += dst_stride/sizeof(*dst_row);
    155    }
    156 }
    157 
    158 void
    159 util_format_z16_unorm_pack_z_float(uint8_t *dst_row, unsigned dst_stride,
    160                                    const float *src_row, unsigned src_stride,
    161                                    unsigned width, unsigned height)
    162 {
    163    unsigned x, y;
    164    for(y = 0; y < height; ++y) {
    165       const float *src = src_row;
    166       uint16_t *dst = (uint16_t *)dst_row;
    167       for(x = 0; x < width; ++x) {
    168          uint16_t value;
    169          value = z32_float_to_z16_unorm(*src++);
    170          *dst++ = util_le16_to_cpu(value);
    171       }
    172       dst_row += dst_stride/sizeof(*dst_row);
    173       src_row += src_stride/sizeof(*src_row);
    174    }
    175 }
    176 
    177 void
    178 util_format_z16_unorm_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride,
    179                                        const uint8_t *src_row, unsigned src_stride,
    180                                        unsigned width, unsigned height)
    181 {
    182    unsigned x, y;
    183    for(y = 0; y < height; ++y) {
    184       uint32_t *dst = dst_row;
    185       const uint16_t *src = (const uint16_t *)src_row;
    186       for(x = 0; x < width; ++x) {
    187          uint16_t value = util_cpu_to_le16(*src++);
    188          *dst++ = z16_unorm_to_z32_unorm(value);
    189       }
    190       src_row += src_stride/sizeof(*src_row);
    191       dst_row += dst_stride/sizeof(*dst_row);
    192    }
    193 }
    194 
    195 void
    196 util_format_z16_unorm_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride,
    197                                      const uint32_t *src_row, unsigned src_stride,
    198                                      unsigned width, unsigned height)
    199 {
    200    unsigned x, y;
    201    for(y = 0; y < height; ++y) {
    202       const uint32_t *src = src_row;
    203       uint16_t *dst = (uint16_t *)dst_row;
    204       for(x = 0; x < width; ++x) {
    205          uint16_t value;
    206          value = z32_unorm_to_z16_unorm(*src++);
    207          *dst++ = util_le16_to_cpu(value);
    208       }
    209       dst_row += dst_stride/sizeof(*dst_row);
    210       src_row += src_stride/sizeof(*src_row);
    211    }
    212 }
    213 
    214 void
    215 util_format_z32_unorm_unpack_z_float(float *dst_row, unsigned dst_stride,
    216                                      const uint8_t *src_row, unsigned src_stride,
    217                                      unsigned width, unsigned height)
    218 {
    219    unsigned x, y;
    220    for(y = 0; y < height; ++y) {
    221       float *dst = dst_row;
    222       const uint32_t *src = (const uint32_t *)src_row;
    223       for(x = 0; x < width; ++x) {
    224          uint32_t value = util_cpu_to_le32(*src++);
    225          *dst++ = z32_unorm_to_z32_float(value);
    226       }
    227       src_row += src_stride/sizeof(*src_row);
    228       dst_row += dst_stride/sizeof(*dst_row);
    229    }
    230 }
    231 
    232 void
    233 util_format_z32_unorm_pack_z_float(uint8_t *dst_row, unsigned dst_stride,
    234                                    const float *src_row, unsigned src_stride,
    235                                    unsigned width, unsigned height)
    236 {
    237    unsigned x, y;
    238    for(y = 0; y < height; ++y) {
    239       const float *src = src_row;
    240       uint32_t *dst = (uint32_t *)dst_row;
    241       for(x = 0; x < width; ++x) {
    242          uint32_t value;
    243          value = z32_float_to_z32_unorm(*src++);
    244          *dst++ = util_le32_to_cpu(value);
    245       }
    246       dst_row += dst_stride/sizeof(*dst_row);
    247       src_row += src_stride/sizeof(*src_row);
    248    }
    249 }
    250 
    251 void
    252 util_format_z32_unorm_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride,
    253                                        const uint8_t *src_row, unsigned src_stride,
    254                                        unsigned width, unsigned height)
    255 {
    256    unsigned y;
    257    for(y = 0; y < height; ++y) {
    258       memcpy(dst_row, src_row, width * 4);
    259       src_row += src_stride/sizeof(*src_row);
    260       dst_row += dst_stride/sizeof(*dst_row);
    261    }
    262 }
    263 
    264 void
    265 util_format_z32_unorm_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride,
    266                                      const uint32_t *src_row, unsigned src_stride,
    267                                      unsigned width, unsigned height)
    268 {
    269    unsigned y;
    270    for(y = 0; y < height; ++y) {
    271       memcpy(dst_row, src_row, width * 4);
    272       src_row += src_stride/sizeof(*src_row);
    273       dst_row += dst_stride/sizeof(*dst_row);
    274    }
    275 }
    276 
    277 void
    278 util_format_z32_float_unpack_z_float(float *dst_row, unsigned dst_stride,
    279                                      const uint8_t *src_row, unsigned src_stride,
    280                                      unsigned width, unsigned height)
    281 {
    282    unsigned y;
    283    for(y = 0; y < height; ++y) {
    284       memcpy(dst_row, src_row, width * 4);
    285       src_row += src_stride/sizeof(*src_row);
    286       dst_row += dst_stride/sizeof(*dst_row);
    287    }
    288 }
    289 
    290 void
    291 util_format_z32_float_pack_z_float(uint8_t *dst_row, unsigned dst_stride,
    292                                    const float *src_row, unsigned src_stride,
    293                                    unsigned width, unsigned height)
    294 {
    295    unsigned y;
    296    for(y = 0; y < height; ++y) {
    297       memcpy(dst_row, src_row, width * 4);
    298       src_row += src_stride/sizeof(*src_row);
    299       dst_row += dst_stride/sizeof(*dst_row);
    300    }
    301 }
    302 
    303 void
    304 util_format_z32_float_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride,
    305                                        const uint8_t *src_row, unsigned src_stride,
    306                                        unsigned width, unsigned height)
    307 {
    308    unsigned x, y;
    309    for(y = 0; y < height; ++y) {
    310       uint32_t *dst = dst_row;
    311       const float *src = (const float *)src_row;
    312       for(x = 0; x < width; ++x) {
    313          *dst++ = z32_float_to_z32_unorm(*src++);
    314       }
    315       src_row += src_stride/sizeof(*src_row);
    316       dst_row += dst_stride/sizeof(*dst_row);
    317    }
    318 }
    319 
    320 void
    321 util_format_z32_float_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride,
    322                                      const uint32_t *src_row, unsigned src_stride,
    323                                      unsigned width, unsigned height)
    324 {
    325    unsigned x, y;
    326    for(y = 0; y < height; ++y) {
    327       const uint32_t *src = src_row;
    328       float *dst = (float *)dst_row;
    329       for(x = 0; x < width; ++x) {
    330          *dst++ = z32_unorm_to_z32_float(*src++);
    331       }
    332       dst_row += dst_stride/sizeof(*dst_row);
    333       src_row += src_stride/sizeof(*src_row);
    334    }
    335 }
    336 
    337 void
    338 util_format_z24_unorm_s8_uint_unpack_z_float(float *dst_row, unsigned dst_stride,
    339                                                 const uint8_t *src_row, unsigned src_stride,
    340                                                 unsigned width, unsigned height)
    341 {
    342    unsigned x, y;
    343    for(y = 0; y < height; ++y) {
    344       float *dst = dst_row;
    345       const uint32_t *src = (const uint32_t *)src_row;
    346       for(x = 0; x < width; ++x) {
    347          uint32_t value =  util_cpu_to_le32(*src++);
    348          *dst++ = z24_unorm_to_z32_float(value & 0xffffff);
    349       }
    350       src_row += src_stride/sizeof(*src_row);
    351       dst_row += dst_stride/sizeof(*dst_row);
    352    }
    353 }
    354 
    355 void
    356 util_format_z24_unorm_s8_uint_pack_z_float(uint8_t *dst_row, unsigned dst_stride,
    357                                               const float *src_row, unsigned src_stride,
    358                                               unsigned width, unsigned height)
    359 {
    360    unsigned x, y;
    361    for(y = 0; y < height; ++y) {
    362       const float *src = src_row;
    363       uint32_t *dst = (uint32_t *)dst_row;
    364       for(x = 0; x < width; ++x) {
    365          uint32_t value = util_le32_to_cpu(*dst);
    366          value &= 0xff000000;
    367          value |= z32_float_to_z24_unorm(*src++);
    368          *dst++ = util_cpu_to_le32(value);
    369       }
    370       dst_row += dst_stride/sizeof(*dst_row);
    371       src_row += src_stride/sizeof(*src_row);
    372    }
    373 }
    374 
    375 void
    376 util_format_z24_unorm_s8_uint_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride,
    377                                                   const uint8_t *src_row, unsigned src_stride,
    378                                                   unsigned width, unsigned height)
    379 {
    380    unsigned x, y;
    381    for(y = 0; y < height; ++y) {
    382       uint32_t *dst = dst_row;
    383       const uint32_t *src = (const uint32_t *)src_row;
    384       for(x = 0; x < width; ++x) {
    385          uint32_t value = util_cpu_to_le32(*src++);
    386          *dst++ = z24_unorm_to_z32_unorm(value & 0xffffff);
    387       }
    388       src_row += src_stride/sizeof(*src_row);
    389       dst_row += dst_stride/sizeof(*dst_row);
    390    }
    391 }
    392 
    393 void
    394 util_format_z24_unorm_s8_uint_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride,
    395                                                 const uint32_t *src_row, unsigned src_stride,
    396                                                 unsigned width, unsigned height)
    397 {
    398    unsigned x, y;
    399    for(y = 0; y < height; ++y) {
    400       const uint32_t *src = src_row;
    401       uint32_t *dst = (uint32_t *)dst_row;
    402       for(x = 0; x < width; ++x) {
    403          uint32_t value = util_le32_to_cpu(*dst);
    404          value &= 0xff000000;
    405          value |= z32_unorm_to_z24_unorm(*src++);
    406          *dst++ = util_cpu_to_le32(value);
    407       }
    408       dst_row += dst_stride/sizeof(*dst_row);
    409       src_row += src_stride/sizeof(*src_row);
    410    }
    411 }
    412 
    413 void
    414 util_format_z24_unorm_s8_uint_unpack_s_8uint(uint8_t *dst_row, unsigned dst_stride,
    415                                                    const uint8_t *src_row, unsigned src_stride,
    416                                                    unsigned width, unsigned height)
    417 {
    418    unsigned x, y;
    419    for(y = 0; y < height; ++y) {
    420       uint8_t *dst = dst_row;
    421       const uint32_t *src = (const uint32_t *)src_row;
    422       for(x = 0; x < width; ++x) {
    423          uint32_t value = util_cpu_to_le32(*src++);
    424          *dst++ = value >> 24;
    425       }
    426       src_row += src_stride/sizeof(*src_row);
    427       dst_row += dst_stride/sizeof(*dst_row);
    428    }
    429 }
    430 
    431 void
    432 util_format_z24_unorm_s8_uint_pack_s_8uint(uint8_t *dst_row, unsigned dst_stride,
    433                                                  const uint8_t *src_row, unsigned src_stride,
    434                                                  unsigned width, unsigned height)
    435 {
    436    unsigned x, y;
    437    for(y = 0; y < height; ++y) {
    438       const uint8_t *src = src_row;
    439       uint32_t *dst = (uint32_t *)dst_row;
    440       for(x = 0; x < width; ++x) {
    441          uint32_t value = util_le32_to_cpu(*dst);
    442          value &= 0x00ffffff;
    443          value |= *src++ << 24;
    444          *dst++ = util_cpu_to_le32(value);
    445       }
    446       dst_row += dst_stride/sizeof(*dst_row);
    447       src_row += src_stride/sizeof(*src_row);
    448    }
    449 }
    450 
    451 void
    452 util_format_s8_uint_z24_unorm_unpack_z_float(float *dst_row, unsigned dst_stride,
    453                                                 const uint8_t *src_row, unsigned src_stride,
    454                                                 unsigned width, unsigned height)
    455 {
    456    unsigned x, y;
    457    for(y = 0; y < height; ++y) {
    458       float *dst = dst_row;
    459       const uint32_t *src = (const uint32_t *)src_row;
    460       for(x = 0; x < width; ++x) {
    461          uint32_t value = util_cpu_to_le32(*src++);
    462          *dst++ = z24_unorm_to_z32_float(value >> 8);
    463       }
    464       src_row += src_stride/sizeof(*src_row);
    465       dst_row += dst_stride/sizeof(*dst_row);
    466    }
    467 }
    468 
    469 void
    470 util_format_s8_uint_z24_unorm_pack_z_float(uint8_t *dst_row, unsigned dst_stride,
    471                                               const float *src_row, unsigned src_stride,
    472                                               unsigned width, unsigned height)
    473 {
    474    unsigned x, y;
    475    for(y = 0; y < height; ++y) {
    476       const float *src = src_row;
    477       uint32_t *dst = (uint32_t *)dst_row;
    478       for(x = 0; x < width; ++x) {
    479          uint32_t value = util_le32_to_cpu(*dst);
    480          value &= 0x000000ff;
    481          value |= z32_float_to_z24_unorm(*src++) << 8;
    482          *dst++ = util_cpu_to_le32(value);
    483       }
    484       dst_row += dst_stride/sizeof(*dst_row);
    485       src_row += src_stride/sizeof(*src_row);
    486    }
    487 }
    488 
    489 void
    490 util_format_s8_uint_z24_unorm_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride,
    491                                                   const uint8_t *src_row, unsigned src_stride,
    492                                                   unsigned width, unsigned height)
    493 {
    494    unsigned x, y;
    495    for(y = 0; y < height; ++y) {
    496       uint32_t *dst = dst_row;
    497       const uint32_t *src = (const uint32_t *)src_row;
    498       for(x = 0; x < width; ++x) {
    499          uint32_t value = util_cpu_to_le32(*src++);
    500          *dst++ = z24_unorm_to_z32_unorm(value >> 8);
    501       }
    502       src_row += src_stride/sizeof(*src_row);
    503       dst_row += dst_stride/sizeof(*dst_row);
    504    }
    505 }
    506 
    507 void
    508 util_format_s8_uint_z24_unorm_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride,
    509                                                 const uint32_t *src_row, unsigned src_stride,
    510                                                 unsigned width, unsigned height)
    511 {
    512    unsigned x, y;
    513    for(y = 0; y < height; ++y) {
    514       const uint32_t *src = src_row;
    515       uint32_t *dst = (uint32_t *)dst_row;
    516       for(x = 0; x < width; ++x) {
    517          uint32_t value = util_le32_to_cpu(*dst);
    518          value &= 0x000000ff;
    519          value |= *src++ & 0xffffff00;
    520          *dst++ = util_cpu_to_le32(value);
    521       }
    522       dst_row += dst_stride/sizeof(*dst_row);
    523       src_row += src_stride/sizeof(*src_row);
    524    }
    525 }
    526 
    527 void
    528 util_format_s8_uint_z24_unorm_unpack_s_8uint(uint8_t *dst_row, unsigned dst_stride,
    529                                                    const uint8_t *src_row, unsigned src_stride,
    530                                                    unsigned width, unsigned height)
    531 {
    532    unsigned x, y;
    533    for(y = 0; y < height; ++y) {
    534       uint8_t *dst = dst_row;
    535       const uint32_t *src = (const uint32_t *)src_row;
    536       for(x = 0; x < width; ++x) {
    537          uint32_t value = util_cpu_to_le32(*src++);
    538          *dst++ = value & 0xff;
    539       }
    540       src_row += src_stride/sizeof(*src_row);
    541       dst_row += dst_stride/sizeof(*dst_row);
    542    }
    543 }
    544 
    545 void
    546 util_format_s8_uint_z24_unorm_pack_s_8uint(uint8_t *dst_row, unsigned dst_stride,
    547                                                  const uint8_t *src_row, unsigned src_stride,
    548                                                  unsigned width, unsigned height)
    549 {
    550    unsigned x, y;
    551    for(y = 0; y < height; ++y) {
    552       const uint8_t *src = src_row;
    553       uint32_t *dst = (uint32_t *)dst_row;
    554       for(x = 0; x < width; ++x) {
    555          uint32_t value = util_le32_to_cpu(*dst);
    556          value &= 0xffffff00;
    557          value |= *src++;
    558          *dst++ = util_cpu_to_le32(value);
    559       }
    560       dst_row += dst_stride/sizeof(*dst_row);
    561       src_row += src_stride/sizeof(*src_row);
    562    }
    563 }
    564 
    565 void
    566 util_format_z24x8_unorm_unpack_z_float(float *dst_row, unsigned dst_stride,
    567                                        const uint8_t *src_row, unsigned src_stride,
    568                                        unsigned width, unsigned height)
    569 {
    570    unsigned x, y;
    571    for(y = 0; y < height; ++y) {
    572       float *dst = dst_row;
    573       const uint32_t *src = (const uint32_t *)src_row;
    574       for(x = 0; x < width; ++x) {
    575          uint32_t value = util_cpu_to_le32(*src++);
    576          *dst++ = z24_unorm_to_z32_float(value & 0xffffff);
    577       }
    578       src_row += src_stride/sizeof(*src_row);
    579       dst_row += dst_stride/sizeof(*dst_row);
    580    }
    581 }
    582 
    583 void
    584 util_format_z24x8_unorm_pack_z_float(uint8_t *dst_row, unsigned dst_stride,
    585                                      const float *src_row, unsigned src_stride,
    586                                      unsigned width, unsigned height)
    587 {
    588    unsigned x, y;
    589    for(y = 0; y < height; ++y) {
    590       const float *src = src_row;
    591       uint32_t *dst = (uint32_t *)dst_row;
    592       for(x = 0; x < width; ++x) {
    593          uint32_t value;
    594          value = z32_float_to_z24_unorm(*src++);
    595          *dst++ = util_le32_to_cpu(value);
    596       }
    597       dst_row += dst_stride/sizeof(*dst_row);
    598       src_row += src_stride/sizeof(*src_row);
    599    }
    600 }
    601 
    602 void
    603 util_format_z24x8_unorm_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride,
    604                                          const uint8_t *src_row, unsigned src_stride,
    605                                          unsigned width, unsigned height)
    606 {
    607    unsigned x, y;
    608    for(y = 0; y < height; ++y) {
    609       uint32_t *dst = dst_row;
    610       const uint32_t *src = (const uint32_t *)src_row;
    611       for(x = 0; x < width; ++x) {
    612          uint32_t value = util_cpu_to_le32(*src++);
    613          *dst++ = z24_unorm_to_z32_unorm(value & 0xffffff);
    614       }
    615       src_row += src_stride/sizeof(*src_row);
    616       dst_row += dst_stride/sizeof(*dst_row);
    617    }
    618 }
    619 
    620 void
    621 util_format_z24x8_unorm_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride,
    622                                        const uint32_t *src_row, unsigned src_stride,
    623                                        unsigned width, unsigned height)
    624 {
    625    unsigned x, y;
    626    for(y = 0; y < height; ++y) {
    627       const uint32_t *src = src_row;
    628       uint32_t *dst = (uint32_t *)dst_row;
    629       for(x = 0; x < width; ++x) {
    630          uint32_t value;
    631          value = z32_unorm_to_z24_unorm(*src++);
    632          *dst++ = util_cpu_to_le32(value);
    633       }
    634       dst_row += dst_stride/sizeof(*dst_row);
    635       src_row += src_stride/sizeof(*src_row);
    636    }
    637 }
    638 
    639 void
    640 util_format_x8z24_unorm_unpack_z_float(float *dst_row, unsigned dst_stride,
    641                                        const uint8_t *src_row, unsigned src_stride,
    642                                        unsigned width, unsigned height)
    643 {
    644    unsigned x, y;
    645    for(y = 0; y < height; ++y) {
    646       float *dst = dst_row;
    647       const uint32_t *src = (uint32_t *)src_row;
    648       for(x = 0; x < width; ++x) {
    649          uint32_t value = util_cpu_to_le32(*src++);
    650          *dst++ = z24_unorm_to_z32_float(value >> 8);
    651       }
    652       src_row += src_stride/sizeof(*src_row);
    653       dst_row += dst_stride/sizeof(*dst_row);
    654    }
    655 }
    656 
    657 void
    658 util_format_x8z24_unorm_pack_z_float(uint8_t *dst_row, unsigned dst_stride,
    659                                      const float *src_row, unsigned src_stride,
    660                                      unsigned width, unsigned height)
    661 {
    662    unsigned x, y;
    663    for(y = 0; y < height; ++y) {
    664       const float *src = src_row;
    665       uint32_t *dst = (uint32_t *)dst_row;
    666       for(x = 0; x < width; ++x) {
    667          uint32_t value;
    668          value = z32_float_to_z24_unorm(*src++) << 8;
    669          *dst++ = util_cpu_to_le32(value);
    670       }
    671       dst_row += dst_stride/sizeof(*dst_row);
    672       src_row += src_stride/sizeof(*src_row);
    673    }
    674 }
    675 
    676 void
    677 util_format_x8z24_unorm_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride,
    678                                          const uint8_t *src_row, unsigned src_stride,
    679                                          unsigned width, unsigned height)
    680 {
    681    unsigned x, y;
    682    for(y = 0; y < height; ++y) {
    683       uint32_t *dst = dst_row;
    684       const uint32_t *src = (const uint32_t *)src_row;
    685       for(x = 0; x < width; ++x) {
    686          uint32_t value = util_cpu_to_le32(*src++);
    687          *dst++ = z24_unorm_to_z32_unorm(value >> 8);
    688       }
    689       src_row += src_stride/sizeof(*src_row);
    690       dst_row += dst_stride/sizeof(*dst_row);
    691    }
    692 }
    693 
    694 void
    695 util_format_x8z24_unorm_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride,
    696                                        const uint32_t *src_row, unsigned src_stride,
    697                                        unsigned width, unsigned height)
    698 {
    699    unsigned x, y;
    700    for(y = 0; y < height; ++y) {
    701       const uint32_t *src = src_row;
    702       uint32_t *dst = (uint32_t *)dst_row;
    703       for(x = 0; x < width; ++x) {
    704          uint32_t value;
    705          value = z32_unorm_to_z24_unorm(*src++) << 8;
    706          *dst++ = util_cpu_to_le32(value);
    707       }
    708       dst_row += dst_stride/sizeof(*dst_row);
    709       src_row += src_stride/sizeof(*src_row);
    710    }
    711 }
    712 
    713 void
    714 util_format_z32_float_s8x24_uint_unpack_z_float(float *dst_row, unsigned dst_stride,
    715                                                    const uint8_t *src_row, unsigned src_stride,
    716                                                    unsigned width, unsigned height)
    717 {
    718    unsigned x, y;
    719    for(y = 0; y < height; ++y) {
    720       float *dst = dst_row;
    721       const float *src = (const float *)src_row;
    722       for(x = 0; x < width; ++x) {
    723          *dst = *src;
    724          src += 2;
    725          dst += 1;
    726       }
    727       src_row += src_stride/sizeof(*src_row);
    728       dst_row += dst_stride/sizeof(*dst_row);
    729    }
    730 }
    731 
    732 void
    733 util_format_z32_float_s8x24_uint_pack_z_float(uint8_t *dst_row, unsigned dst_stride,
    734                                                  const float *src_row, unsigned src_stride,
    735                                                  unsigned width, unsigned height)
    736 {
    737    unsigned x, y;
    738    for(y = 0; y < height; ++y) {
    739       const float *src = src_row;
    740       float *dst = (float *)dst_row;
    741       for(x = 0; x < width; ++x) {
    742          *dst = *src;
    743          src += 1;
    744          dst += 2;
    745       }
    746       dst_row += dst_stride/sizeof(*dst_row);
    747       src_row += src_stride/sizeof(*src_row);
    748    }
    749 }
    750 
    751 void
    752 util_format_z32_float_s8x24_uint_unpack_z_32unorm(uint32_t *dst_row, unsigned dst_stride,
    753                                                      const uint8_t *src_row, unsigned src_stride,
    754                                                      unsigned width, unsigned height)
    755 {
    756    unsigned x, y;
    757    for(y = 0; y < height; ++y) {
    758       uint32_t *dst = dst_row;
    759       const float *src = (const float *)src_row;
    760       for(x = 0; x < width; ++x) {
    761          *dst = z32_float_to_z32_unorm(*src);
    762          src += 2;
    763          dst += 1;
    764       }
    765       src_row += src_stride/sizeof(*src_row);
    766       dst_row += dst_stride/sizeof(*dst_row);
    767    }
    768 }
    769 
    770 void
    771 util_format_z32_float_s8x24_uint_pack_z_32unorm(uint8_t *dst_row, unsigned dst_stride,
    772                                                    const uint32_t *src_row, unsigned src_stride,
    773                                                    unsigned width, unsigned height)
    774 {
    775    unsigned x, y;
    776    for(y = 0; y < height; ++y) {
    777       const uint32_t *src = src_row;
    778       float *dst = (float *)dst_row;
    779       for(x = 0; x < width; ++x) {
    780          *dst++ = z32_unorm_to_z32_float(*src++);
    781       }
    782       dst_row += dst_stride/sizeof(*dst_row);
    783       src_row += src_stride/sizeof(*src_row);
    784    }
    785 }
    786 
    787 void
    788 util_format_z32_float_s8x24_uint_unpack_s_8uint(uint8_t *dst_row, unsigned dst_stride,
    789                                                       const uint8_t *src_row, unsigned src_stride,
    790                                                       unsigned width, unsigned height)
    791 {
    792    unsigned x, y;
    793    for(y = 0; y < height; ++y) {
    794       uint8_t *dst = dst_row;
    795       const uint8_t *src = src_row + 4;
    796       for(x = 0; x < width; ++x) {
    797          *dst = *src;
    798          src += 8;
    799          dst += 1;
    800       }
    801       src_row += src_stride/sizeof(*src_row);
    802       dst_row += dst_stride/sizeof(*dst_row);
    803    }
    804 }
    805 
    806 void
    807 util_format_z32_float_s8x24_uint_pack_s_8uint(uint8_t *dst_row, unsigned dst_stride,
    808                                                     const uint8_t *src_row, unsigned src_stride,
    809                                                     unsigned width, unsigned height)
    810 {
    811    unsigned x, y;
    812    for(y = 0; y < height; ++y) {
    813       const uint8_t *src = src_row;
    814       uint8_t *dst = dst_row + 4;
    815       for(x = 0; x < width; ++x) {
    816          *dst = *src;
    817          src += 1;
    818          dst += 8;
    819       }
    820       dst_row += dst_stride/sizeof(*dst_row);
    821       src_row += src_stride/sizeof(*src_row);
    822    }
    823 }
    824 
    825 
    826 void
    827 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)
    828 {
    829    util_format_z24_unorm_s8_uint_unpack_s_8uint(dst_row, dst_stride,
    830 						      src_row, src_stride,
    831 						      width, height);
    832 }
    833 
    834 void
    835 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)
    836 {
    837    util_format_z24_unorm_s8_uint_pack_s_8uint(dst_row, dst_stride,
    838 						    src_row, src_stride,
    839 						    width, height);
    840 }
    841 
    842 void
    843 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)
    844 {
    845    util_format_s8_uint_z24_unorm_unpack_s_8uint(dst_row, dst_stride,
    846 						      src_row, src_stride,
    847 						      width, height);
    848 }
    849 
    850 void
    851 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)
    852 {
    853    util_format_s8_uint_z24_unorm_pack_s_8uint(dst_row, dst_stride,
    854 						      src_row, src_stride,
    855 						      width, height);
    856 }
    857 
    858 void
    859 util_format_x32_s8x24_uint_unpack_s_8uint(uint8_t *dst_row, unsigned dst_stride,
    860 						const uint8_t *src_row, unsigned src_stride,
    861 						unsigned width, unsigned height)
    862 {
    863    util_format_z32_float_s8x24_uint_unpack_s_8uint(dst_row, dst_stride,
    864 							 src_row, src_stride,
    865 							 width, height);
    866 
    867 }
    868 
    869 void
    870 util_format_x32_s8x24_uint_pack_s_8uint(uint8_t *dst_row, unsigned dst_stride,
    871 					      const uint8_t *src_row, unsigned src_stride,
    872 					      unsigned width, unsigned height)
    873 {
    874    util_format_z32_float_s8x24_uint_pack_s_8uint(dst_row, dst_stride,
    875                                                        src_row, src_stride,
    876 						       width, height);
    877 }
    878