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