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
z32_unorm_to_z16_unorm(uint32_t z)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
z16_unorm_to_z32_unorm(uint16_t z)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
z32_unorm_to_z24_unorm(uint32_t z)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
z24_unorm_to_z32_unorm(uint32_t z)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
z32_float_to_z16_unorm(float z)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
z16_unorm_to_z32_float(uint16_t z)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
z32_float_to_z24_unorm(float z)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
z24_unorm_to_z32_float(uint32_t z)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
z32_float_to_z32_unorm(float z)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
z32_unorm_to_z32_float(uint32_t z)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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
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)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