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