Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5564 | serge | 1 | /************************************************************************** |
2 | * |
||
3 | * Copyright 2007 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 above copyright notice and this permission notice (including the |
||
15 | * next paragraph) shall be included in all copies or substantial portions |
||
16 | * of the Software. |
||
17 | * |
||
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||
19 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||
20 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
||
21 | * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR |
||
22 | * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
||
23 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
||
24 | * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||
25 | * |
||
26 | **************************************************************************/ |
||
27 | |||
28 | /** |
||
29 | * RGBA/float tile get/put functions. |
||
30 | * Usable both by drivers and state trackers. |
||
31 | */ |
||
32 | |||
33 | |||
34 | #include "pipe/p_defines.h" |
||
35 | #include "util/u_inlines.h" |
||
36 | |||
37 | #include "util/u_format.h" |
||
38 | #include "util/u_math.h" |
||
39 | #include "util/u_memory.h" |
||
40 | #include "util/u_surface.h" |
||
41 | #include "util/u_tile.h" |
||
42 | |||
43 | |||
44 | /** |
||
45 | * Move raw block of pixels from transfer object to user memory. |
||
46 | */ |
||
47 | void |
||
48 | pipe_get_tile_raw(struct pipe_transfer *pt, |
||
49 | const void *src, |
||
50 | uint x, uint y, uint w, uint h, |
||
51 | void *dst, int dst_stride) |
||
52 | { |
||
53 | if (dst_stride == 0) |
||
54 | dst_stride = util_format_get_stride(pt->resource->format, w); |
||
55 | |||
56 | if (u_clip_tile(x, y, &w, &h, &pt->box)) |
||
57 | return; |
||
58 | |||
59 | util_copy_rect(dst, pt->resource->format, dst_stride, 0, 0, w, h, src, pt->stride, x, y); |
||
60 | } |
||
61 | |||
62 | |||
63 | /** |
||
64 | * Move raw block of pixels from user memory to transfer object. |
||
65 | */ |
||
66 | void |
||
67 | pipe_put_tile_raw(struct pipe_transfer *pt, |
||
68 | void *dst, |
||
69 | uint x, uint y, uint w, uint h, |
||
70 | const void *src, int src_stride) |
||
71 | { |
||
72 | enum pipe_format format = pt->resource->format; |
||
73 | |||
74 | if (src_stride == 0) |
||
75 | src_stride = util_format_get_stride(format, w); |
||
76 | |||
77 | if (u_clip_tile(x, y, &w, &h, &pt->box)) |
||
78 | return; |
||
79 | |||
80 | util_copy_rect(dst, format, pt->stride, x, y, w, h, src, src_stride, 0, 0); |
||
81 | } |
||
82 | |||
83 | |||
84 | |||
85 | |||
86 | /** Convert short in [-32768,32767] to GLfloat in [-1.0,1.0] */ |
||
87 | #define SHORT_TO_FLOAT(S) ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)) |
||
88 | |||
89 | #define UNCLAMPED_FLOAT_TO_SHORT(us, f) \ |
||
90 | us = ( (short) ( CLAMP((f), -1.0, 1.0) * 32767.0F) ) |
||
91 | |||
92 | |||
93 | |||
94 | /*** PIPE_FORMAT_Z16_UNORM ***/ |
||
95 | |||
96 | /** |
||
97 | * Return each Z value as four floats in [0,1]. |
||
98 | */ |
||
99 | static void |
||
100 | z16_get_tile_rgba(const ushort *src, |
||
101 | unsigned w, unsigned h, |
||
102 | float *p, |
||
103 | unsigned dst_stride) |
||
104 | { |
||
105 | const float scale = 1.0f / 65535.0f; |
||
106 | unsigned i, j; |
||
107 | |||
108 | for (i = 0; i < h; i++) { |
||
109 | float *pRow = p; |
||
110 | for (j = 0; j < w; j++, pRow += 4) { |
||
111 | pRow[0] = |
||
112 | pRow[1] = |
||
113 | pRow[2] = |
||
114 | pRow[3] = *src++ * scale; |
||
115 | } |
||
116 | p += dst_stride; |
||
117 | } |
||
118 | } |
||
119 | |||
120 | |||
121 | |||
122 | |||
123 | /*** PIPE_FORMAT_Z32_UNORM ***/ |
||
124 | |||
125 | /** |
||
126 | * Return each Z value as four floats in [0,1]. |
||
127 | */ |
||
128 | static void |
||
129 | z32_get_tile_rgba(const unsigned *src, |
||
130 | unsigned w, unsigned h, |
||
131 | float *p, |
||
132 | unsigned dst_stride) |
||
133 | { |
||
134 | const double scale = 1.0 / (double) 0xffffffff; |
||
135 | unsigned i, j; |
||
136 | |||
137 | for (i = 0; i < h; i++) { |
||
138 | float *pRow = p; |
||
139 | for (j = 0; j < w; j++, pRow += 4) { |
||
140 | pRow[0] = |
||
141 | pRow[1] = |
||
142 | pRow[2] = |
||
143 | pRow[3] = (float) (*src++ * scale); |
||
144 | } |
||
145 | p += dst_stride; |
||
146 | } |
||
147 | } |
||
148 | |||
149 | |||
150 | /*** PIPE_FORMAT_Z24_UNORM_S8_UINT ***/ |
||
151 | |||
152 | /** |
||
153 | * Return Z component as four float in [0,1]. Stencil part ignored. |
||
154 | */ |
||
155 | static void |
||
156 | s8z24_get_tile_rgba(const unsigned *src, |
||
157 | unsigned w, unsigned h, |
||
158 | float *p, |
||
159 | unsigned dst_stride) |
||
160 | { |
||
161 | const double scale = 1.0 / ((1 << 24) - 1); |
||
162 | unsigned i, j; |
||
163 | |||
164 | for (i = 0; i < h; i++) { |
||
165 | float *pRow = p; |
||
166 | for (j = 0; j < w; j++, pRow += 4) { |
||
167 | pRow[0] = |
||
168 | pRow[1] = |
||
169 | pRow[2] = |
||
170 | pRow[3] = (float) (scale * (*src++ & 0xffffff)); |
||
171 | } |
||
172 | p += dst_stride; |
||
173 | } |
||
174 | } |
||
175 | |||
176 | |||
177 | /*** PIPE_FORMAT_S8_UINT_Z24_UNORM ***/ |
||
178 | |||
179 | /** |
||
180 | * Return Z component as four float in [0,1]. Stencil part ignored. |
||
181 | */ |
||
182 | static void |
||
183 | z24s8_get_tile_rgba(const unsigned *src, |
||
184 | unsigned w, unsigned h, |
||
185 | float *p, |
||
186 | unsigned dst_stride) |
||
187 | { |
||
188 | const double scale = 1.0 / ((1 << 24) - 1); |
||
189 | unsigned i, j; |
||
190 | |||
191 | for (i = 0; i < h; i++) { |
||
192 | float *pRow = p; |
||
193 | for (j = 0; j < w; j++, pRow += 4) { |
||
194 | pRow[0] = |
||
195 | pRow[1] = |
||
196 | pRow[2] = |
||
197 | pRow[3] = (float) (scale * (*src++ >> 8)); |
||
198 | } |
||
199 | p += dst_stride; |
||
200 | } |
||
201 | } |
||
202 | |||
203 | /*** PIPE_FORMAT_S8X24_UINT ***/ |
||
204 | |||
205 | /** |
||
206 | * Return S component as four uint32_t in [0..255]. Z part ignored. |
||
207 | */ |
||
208 | static void |
||
209 | s8x24_get_tile_rgba(const unsigned *src, |
||
210 | unsigned w, unsigned h, |
||
211 | float *p, |
||
212 | unsigned dst_stride) |
||
213 | { |
||
214 | unsigned i, j; |
||
215 | |||
216 | for (i = 0; i < h; i++) { |
||
217 | uint32_t *pRow = (uint32_t *)p; |
||
218 | |||
219 | for (j = 0; j < w; j++, pRow += 4) { |
||
220 | pRow[0] = |
||
221 | pRow[1] = |
||
222 | pRow[2] = |
||
223 | pRow[3] = ((*src++ >> 24) & 0xff); |
||
224 | } |
||
225 | |||
226 | p += dst_stride; |
||
227 | } |
||
228 | } |
||
229 | |||
230 | /*** PIPE_FORMAT_X24S8_UINT ***/ |
||
231 | |||
232 | /** |
||
233 | * Return S component as four uint32_t in [0..255]. Z part ignored. |
||
234 | */ |
||
235 | static void |
||
236 | x24s8_get_tile_rgba(const unsigned *src, |
||
237 | unsigned w, unsigned h, |
||
238 | float *p, |
||
239 | unsigned dst_stride) |
||
240 | { |
||
241 | unsigned i, j; |
||
242 | |||
243 | for (i = 0; i < h; i++) { |
||
244 | uint32_t *pRow = (uint32_t *)p; |
||
245 | for (j = 0; j < w; j++, pRow += 4) { |
||
246 | pRow[0] = |
||
247 | pRow[1] = |
||
248 | pRow[2] = |
||
249 | pRow[3] = (*src++ & 0xff); |
||
250 | } |
||
251 | p += dst_stride; |
||
252 | } |
||
253 | } |
||
254 | |||
255 | |||
256 | /** |
||
257 | * Return S component as four uint32_t in [0..255]. Z part ignored. |
||
258 | */ |
||
259 | static void |
||
260 | s8_get_tile_rgba(const unsigned char *src, |
||
261 | unsigned w, unsigned h, |
||
262 | float *p, |
||
263 | unsigned dst_stride) |
||
264 | { |
||
265 | unsigned i, j; |
||
266 | |||
267 | for (i = 0; i < h; i++) { |
||
268 | uint32_t *pRow = (uint32_t *)p; |
||
269 | for (j = 0; j < w; j++, pRow += 4) { |
||
270 | pRow[0] = |
||
271 | pRow[1] = |
||
272 | pRow[2] = |
||
273 | pRow[3] = (*src++ & 0xff); |
||
274 | } |
||
275 | p += dst_stride; |
||
276 | } |
||
277 | } |
||
278 | |||
279 | /*** PIPE_FORMAT_Z32_FLOAT ***/ |
||
280 | |||
281 | /** |
||
282 | * Return each Z value as four floats in [0,1]. |
||
283 | */ |
||
284 | static void |
||
285 | z32f_get_tile_rgba(const float *src, |
||
286 | unsigned w, unsigned h, |
||
287 | float *p, |
||
288 | unsigned dst_stride) |
||
289 | { |
||
290 | unsigned i, j; |
||
291 | |||
292 | for (i = 0; i < h; i++) { |
||
293 | float *pRow = p; |
||
294 | for (j = 0; j < w; j++, pRow += 4) { |
||
295 | pRow[0] = |
||
296 | pRow[1] = |
||
297 | pRow[2] = |
||
298 | pRow[3] = *src++; |
||
299 | } |
||
300 | p += dst_stride; |
||
301 | } |
||
302 | } |
||
303 | |||
304 | /*** PIPE_FORMAT_Z32_FLOAT_S8X24_UINT ***/ |
||
305 | |||
306 | /** |
||
307 | * Return each Z value as four floats in [0,1]. |
||
308 | */ |
||
309 | static void |
||
310 | z32f_x24s8_get_tile_rgba(const float *src, |
||
311 | unsigned w, unsigned h, |
||
312 | float *p, |
||
313 | unsigned dst_stride) |
||
314 | { |
||
315 | unsigned i, j; |
||
316 | |||
317 | for (i = 0; i < h; i++) { |
||
318 | float *pRow = p; |
||
319 | for (j = 0; j < w; j++, pRow += 4) { |
||
320 | pRow[0] = |
||
321 | pRow[1] = |
||
322 | pRow[2] = |
||
323 | pRow[3] = *src; |
||
324 | src += 2; |
||
325 | } |
||
326 | p += dst_stride; |
||
327 | } |
||
328 | } |
||
329 | |||
330 | /*** PIPE_FORMAT_X32_S8X24_UINT ***/ |
||
331 | |||
332 | /** |
||
333 | * Return S component as four uint32_t in [0..255]. Z part ignored. |
||
334 | */ |
||
335 | static void |
||
336 | x32_s8_get_tile_rgba(const unsigned *src, |
||
337 | unsigned w, unsigned h, |
||
338 | float *p, |
||
339 | unsigned dst_stride) |
||
340 | { |
||
341 | unsigned i, j; |
||
342 | |||
343 | for (i = 0; i < h; i++) { |
||
344 | uint32_t *pRow = (uint32_t *)p; |
||
345 | for (j = 0; j < w; j++, pRow += 4) { |
||
346 | src++; |
||
347 | pRow[0] = |
||
348 | pRow[1] = |
||
349 | pRow[2] = |
||
350 | pRow[3] = (*src++ & 0xff); |
||
351 | } |
||
352 | p += dst_stride; |
||
353 | } |
||
354 | } |
||
355 | |||
356 | void |
||
357 | pipe_tile_raw_to_rgba(enum pipe_format format, |
||
358 | const void *src, |
||
359 | uint w, uint h, |
||
360 | float *dst, unsigned dst_stride) |
||
361 | { |
||
362 | switch (format) { |
||
363 | case PIPE_FORMAT_Z16_UNORM: |
||
364 | z16_get_tile_rgba((ushort *) src, w, h, dst, dst_stride); |
||
365 | break; |
||
366 | case PIPE_FORMAT_Z32_UNORM: |
||
367 | z32_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride); |
||
368 | break; |
||
369 | case PIPE_FORMAT_Z24_UNORM_S8_UINT: |
||
370 | case PIPE_FORMAT_Z24X8_UNORM: |
||
371 | s8z24_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride); |
||
372 | break; |
||
373 | case PIPE_FORMAT_S8_UINT: |
||
374 | s8_get_tile_rgba((unsigned char *) src, w, h, dst, dst_stride); |
||
375 | break; |
||
376 | case PIPE_FORMAT_X24S8_UINT: |
||
377 | s8x24_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride); |
||
378 | break; |
||
379 | case PIPE_FORMAT_S8_UINT_Z24_UNORM: |
||
380 | case PIPE_FORMAT_X8Z24_UNORM: |
||
381 | z24s8_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride); |
||
382 | break; |
||
383 | case PIPE_FORMAT_S8X24_UINT: |
||
384 | x24s8_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride); |
||
385 | break; |
||
386 | case PIPE_FORMAT_Z32_FLOAT: |
||
387 | z32f_get_tile_rgba((float *) src, w, h, dst, dst_stride); |
||
388 | break; |
||
389 | case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: |
||
390 | z32f_x24s8_get_tile_rgba((float *) src, w, h, dst, dst_stride); |
||
391 | break; |
||
392 | case PIPE_FORMAT_X32_S8X24_UINT: |
||
393 | x32_s8_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride); |
||
394 | break; |
||
395 | default: |
||
396 | util_format_read_4f(format, |
||
397 | dst, dst_stride * sizeof(float), |
||
398 | src, util_format_get_stride(format, w), |
||
399 | 0, 0, w, h); |
||
400 | } |
||
401 | } |
||
402 | |||
403 | void |
||
404 | pipe_tile_raw_to_unsigned(enum pipe_format format, |
||
405 | const void *src, |
||
406 | uint w, uint h, |
||
407 | unsigned *dst, unsigned dst_stride) |
||
408 | { |
||
409 | util_format_read_4ui(format, |
||
410 | dst, dst_stride * sizeof(float), |
||
411 | src, util_format_get_stride(format, w), |
||
412 | 0, 0, w, h); |
||
413 | } |
||
414 | |||
415 | void |
||
416 | pipe_tile_raw_to_signed(enum pipe_format format, |
||
417 | void *src, |
||
418 | uint w, uint h, |
||
419 | int *dst, unsigned dst_stride) |
||
420 | { |
||
421 | util_format_read_4i(format, |
||
422 | dst, dst_stride * sizeof(float), |
||
423 | src, util_format_get_stride(format, w), |
||
424 | 0, 0, w, h); |
||
425 | } |
||
426 | |||
427 | void |
||
428 | pipe_get_tile_rgba(struct pipe_transfer *pt, |
||
429 | const void *src, |
||
430 | uint x, uint y, uint w, uint h, |
||
431 | float *p) |
||
432 | { |
||
433 | pipe_get_tile_rgba_format(pt, src, x, y, w, h, pt->resource->format, p); |
||
434 | } |
||
435 | |||
436 | |||
437 | void |
||
438 | pipe_get_tile_rgba_format(struct pipe_transfer *pt, |
||
439 | const void *src, |
||
440 | uint x, uint y, uint w, uint h, |
||
441 | enum pipe_format format, |
||
442 | float *p) |
||
443 | { |
||
444 | unsigned dst_stride = w * 4; |
||
445 | void *packed; |
||
446 | |||
447 | if (u_clip_tile(x, y, &w, &h, &pt->box)) { |
||
448 | return; |
||
449 | } |
||
450 | |||
451 | packed = MALLOC(util_format_get_nblocks(format, w, h) * util_format_get_blocksize(format)); |
||
452 | if (!packed) { |
||
453 | return; |
||
454 | } |
||
455 | |||
456 | if (format == PIPE_FORMAT_UYVY || format == PIPE_FORMAT_YUYV) { |
||
457 | assert((x & 1) == 0); |
||
458 | } |
||
459 | |||
460 | pipe_get_tile_raw(pt, src, x, y, w, h, packed, 0); |
||
461 | |||
462 | pipe_tile_raw_to_rgba(format, packed, w, h, p, dst_stride); |
||
463 | |||
464 | FREE(packed); |
||
465 | } |
||
466 | |||
467 | |||
468 | void |
||
469 | pipe_put_tile_rgba(struct pipe_transfer *pt, |
||
470 | void *dst, |
||
471 | uint x, uint y, uint w, uint h, |
||
472 | const float *p) |
||
473 | { |
||
474 | pipe_put_tile_rgba_format(pt, dst, x, y, w, h, pt->resource->format, p); |
||
475 | } |
||
476 | |||
477 | |||
478 | void |
||
479 | pipe_put_tile_rgba_format(struct pipe_transfer *pt, |
||
480 | void *dst, |
||
481 | uint x, uint y, uint w, uint h, |
||
482 | enum pipe_format format, |
||
483 | const float *p) |
||
484 | { |
||
485 | unsigned src_stride = w * 4; |
||
486 | void *packed; |
||
487 | |||
488 | if (u_clip_tile(x, y, &w, &h, &pt->box)) |
||
489 | return; |
||
490 | |||
491 | packed = MALLOC(util_format_get_nblocks(format, w, h) * util_format_get_blocksize(format)); |
||
492 | |||
493 | if (!packed) |
||
494 | return; |
||
495 | |||
496 | switch (format) { |
||
497 | case PIPE_FORMAT_Z16_UNORM: |
||
498 | /*z16_put_tile_rgba((ushort *) packed, w, h, p, src_stride);*/ |
||
499 | break; |
||
500 | case PIPE_FORMAT_Z32_UNORM: |
||
501 | /*z32_put_tile_rgba((unsigned *) packed, w, h, p, src_stride);*/ |
||
502 | break; |
||
503 | case PIPE_FORMAT_Z24_UNORM_S8_UINT: |
||
504 | case PIPE_FORMAT_Z24X8_UNORM: |
||
505 | /*s8z24_put_tile_rgba((unsigned *) packed, w, h, p, src_stride);*/ |
||
506 | break; |
||
507 | case PIPE_FORMAT_S8_UINT_Z24_UNORM: |
||
508 | case PIPE_FORMAT_X8Z24_UNORM: |
||
509 | /*z24s8_put_tile_rgba((unsigned *) packed, w, h, p, src_stride);*/ |
||
510 | break; |
||
511 | case PIPE_FORMAT_Z32_FLOAT: |
||
512 | /*z32f_put_tile_rgba((unsigned *) packed, w, h, p, src_stride);*/ |
||
513 | break; |
||
514 | case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: |
||
515 | /*z32f_s8x24_put_tile_rgba((unsigned *) packed, w, h, p, src_stride);*/ |
||
516 | break; |
||
517 | default: |
||
518 | util_format_write_4f(format, |
||
519 | p, src_stride * sizeof(float), |
||
520 | packed, util_format_get_stride(format, w), |
||
521 | 0, 0, w, h); |
||
522 | } |
||
523 | |||
524 | pipe_put_tile_raw(pt, dst, x, y, w, h, packed, 0); |
||
525 | |||
526 | FREE(packed); |
||
527 | } |
||
528 | |||
529 | void |
||
530 | pipe_put_tile_i_format(struct pipe_transfer *pt, |
||
531 | void *dst, |
||
532 | uint x, uint y, uint w, uint h, |
||
533 | enum pipe_format format, |
||
534 | const int *p) |
||
535 | { |
||
536 | unsigned src_stride = w * 4; |
||
537 | void *packed; |
||
538 | |||
539 | if (u_clip_tile(x, y, &w, &h, &pt->box)) |
||
540 | return; |
||
541 | |||
542 | packed = MALLOC(util_format_get_nblocks(format, w, h) * util_format_get_blocksize(format)); |
||
543 | |||
544 | if (!packed) |
||
545 | return; |
||
546 | |||
547 | util_format_write_4i(format, |
||
548 | p, src_stride * sizeof(float), |
||
549 | packed, util_format_get_stride(format, w), |
||
550 | 0, 0, w, h); |
||
551 | |||
552 | pipe_put_tile_raw(pt, dst, x, y, w, h, packed, 0); |
||
553 | |||
554 | FREE(packed); |
||
555 | } |
||
556 | |||
557 | void |
||
558 | pipe_put_tile_ui_format(struct pipe_transfer *pt, |
||
559 | void *dst, |
||
560 | uint x, uint y, uint w, uint h, |
||
561 | enum pipe_format format, |
||
562 | const unsigned int *p) |
||
563 | { |
||
564 | unsigned src_stride = w * 4; |
||
565 | void *packed; |
||
566 | |||
567 | if (u_clip_tile(x, y, &w, &h, &pt->box)) |
||
568 | return; |
||
569 | |||
570 | packed = MALLOC(util_format_get_nblocks(format, w, h) * util_format_get_blocksize(format)); |
||
571 | |||
572 | if (!packed) |
||
573 | return; |
||
574 | |||
575 | util_format_write_4ui(format, |
||
576 | p, src_stride * sizeof(float), |
||
577 | packed, util_format_get_stride(format, w), |
||
578 | 0, 0, w, h); |
||
579 | |||
580 | pipe_put_tile_raw(pt, dst, x, y, w, h, packed, 0); |
||
581 | |||
582 | FREE(packed); |
||
583 | } |
||
584 | |||
585 | /** |
||
586 | * Get a block of Z values, converted to 32-bit range. |
||
587 | */ |
||
588 | void |
||
589 | pipe_get_tile_z(struct pipe_transfer *pt, |
||
590 | const void *src, |
||
591 | uint x, uint y, uint w, uint h, |
||
592 | uint *z) |
||
593 | { |
||
594 | const uint dstStride = w; |
||
595 | const ubyte *map = src; |
||
596 | uint *pDest = z; |
||
597 | uint i, j; |
||
598 | enum pipe_format format = pt->resource->format; |
||
599 | |||
600 | if (u_clip_tile(x, y, &w, &h, &pt->box)) |
||
601 | return; |
||
602 | |||
603 | switch (format) { |
||
604 | case PIPE_FORMAT_Z32_UNORM: |
||
605 | { |
||
606 | const uint *ptrc |
||
607 | = (const uint *)(map + y * pt->stride + x*4); |
||
608 | for (i = 0; i < h; i++) { |
||
609 | memcpy(pDest, ptrc, 4 * w); |
||
610 | pDest += dstStride; |
||
611 | ptrc += pt->stride/4; |
||
612 | } |
||
613 | } |
||
614 | break; |
||
615 | case PIPE_FORMAT_Z24_UNORM_S8_UINT: |
||
616 | case PIPE_FORMAT_Z24X8_UNORM: |
||
617 | { |
||
618 | const uint *ptrc |
||
619 | = (const uint *)(map + y * pt->stride + x*4); |
||
620 | for (i = 0; i < h; i++) { |
||
621 | for (j = 0; j < w; j++) { |
||
622 | /* convert 24-bit Z to 32-bit Z */ |
||
623 | pDest[j] = (ptrc[j] << 8) | ((ptrc[j] >> 16) & 0xff); |
||
624 | } |
||
625 | pDest += dstStride; |
||
626 | ptrc += pt->stride/4; |
||
627 | } |
||
628 | } |
||
629 | break; |
||
630 | case PIPE_FORMAT_S8_UINT_Z24_UNORM: |
||
631 | case PIPE_FORMAT_X8Z24_UNORM: |
||
632 | { |
||
633 | const uint *ptrc |
||
634 | = (const uint *)(map + y * pt->stride + x*4); |
||
635 | for (i = 0; i < h; i++) { |
||
636 | for (j = 0; j < w; j++) { |
||
637 | /* convert 24-bit Z to 32-bit Z */ |
||
638 | pDest[j] = (ptrc[j] & 0xffffff00) | ((ptrc[j] >> 24) & 0xff); |
||
639 | } |
||
640 | pDest += dstStride; |
||
641 | ptrc += pt->stride/4; |
||
642 | } |
||
643 | } |
||
644 | break; |
||
645 | case PIPE_FORMAT_Z16_UNORM: |
||
646 | { |
||
647 | const ushort *ptrc |
||
648 | = (const ushort *)(map + y * pt->stride + x*2); |
||
649 | for (i = 0; i < h; i++) { |
||
650 | for (j = 0; j < w; j++) { |
||
651 | /* convert 16-bit Z to 32-bit Z */ |
||
652 | pDest[j] = (ptrc[j] << 16) | ptrc[j]; |
||
653 | } |
||
654 | pDest += dstStride; |
||
655 | ptrc += pt->stride/2; |
||
656 | } |
||
657 | } |
||
658 | break; |
||
659 | case PIPE_FORMAT_Z32_FLOAT: |
||
660 | { |
||
661 | const float *ptrc = (const float *)(map + y * pt->stride + x*4); |
||
662 | for (i = 0; i < h; i++) { |
||
663 | for (j = 0; j < w; j++) { |
||
664 | /* convert float Z to 32-bit Z */ |
||
665 | if (ptrc[j] <= 0.0) { |
||
666 | pDest[j] = 0; |
||
667 | } |
||
668 | else if (ptrc[j] >= 1.0) { |
||
669 | pDest[j] = 0xffffffff; |
||
670 | } |
||
671 | else { |
||
672 | double z = ptrc[j] * 0xffffffff; |
||
673 | pDest[j] = (uint) z; |
||
674 | } |
||
675 | } |
||
676 | pDest += dstStride; |
||
677 | ptrc += pt->stride/4; |
||
678 | } |
||
679 | } |
||
680 | break; |
||
681 | case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: |
||
682 | { |
||
683 | const float *ptrc = (const float *)(map + y * pt->stride + x*8); |
||
684 | for (i = 0; i < h; i++) { |
||
685 | for (j = 0; j < w; j++) { |
||
686 | /* convert float Z to 32-bit Z */ |
||
687 | if (ptrc[j] <= 0.0) { |
||
688 | pDest[j*2] = 0; |
||
689 | } |
||
690 | else if (ptrc[j] >= 1.0) { |
||
691 | pDest[j*2] = 0xffffffff; |
||
692 | } |
||
693 | else { |
||
694 | double z = ptrc[j] * 0xffffffff; |
||
695 | pDest[j*2] = (uint) z; |
||
696 | } |
||
697 | } |
||
698 | pDest += dstStride; |
||
699 | ptrc += pt->stride/4; |
||
700 | } |
||
701 | } |
||
702 | break; |
||
703 | default: |
||
704 | assert(0); |
||
705 | } |
||
706 | } |
||
707 | |||
708 | |||
709 | void |
||
710 | pipe_put_tile_z(struct pipe_transfer *pt, |
||
711 | void *dst, |
||
712 | uint x, uint y, uint w, uint h, |
||
713 | const uint *zSrc) |
||
714 | { |
||
715 | const uint srcStride = w; |
||
716 | const uint *ptrc = zSrc; |
||
717 | ubyte *map = dst; |
||
718 | uint i, j; |
||
719 | enum pipe_format format = pt->resource->format; |
||
720 | |||
721 | if (u_clip_tile(x, y, &w, &h, &pt->box)) |
||
722 | return; |
||
723 | |||
724 | switch (format) { |
||
725 | case PIPE_FORMAT_Z32_UNORM: |
||
726 | { |
||
727 | uint *pDest = (uint *) (map + y * pt->stride + x*4); |
||
728 | for (i = 0; i < h; i++) { |
||
729 | memcpy(pDest, ptrc, 4 * w); |
||
730 | pDest += pt->stride/4; |
||
731 | ptrc += srcStride; |
||
732 | } |
||
733 | } |
||
734 | break; |
||
735 | case PIPE_FORMAT_Z24_UNORM_S8_UINT: |
||
736 | { |
||
737 | uint *pDest = (uint *) (map + y * pt->stride + x*4); |
||
738 | /*assert((pt->usage & PIPE_TRANSFER_READ_WRITE) == PIPE_TRANSFER_READ_WRITE);*/ |
||
739 | for (i = 0; i < h; i++) { |
||
740 | for (j = 0; j < w; j++) { |
||
741 | /* convert 32-bit Z to 24-bit Z, preserve stencil */ |
||
742 | pDest[j] = (pDest[j] & 0xff000000) | ptrc[j] >> 8; |
||
743 | } |
||
744 | pDest += pt->stride/4; |
||
745 | ptrc += srcStride; |
||
746 | } |
||
747 | } |
||
748 | break; |
||
749 | case PIPE_FORMAT_Z24X8_UNORM: |
||
750 | { |
||
751 | uint *pDest = (uint *) (map + y * pt->stride + x*4); |
||
752 | for (i = 0; i < h; i++) { |
||
753 | for (j = 0; j < w; j++) { |
||
754 | /* convert 32-bit Z to 24-bit Z (0 stencil) */ |
||
755 | pDest[j] = ptrc[j] >> 8; |
||
756 | } |
||
757 | pDest += pt->stride/4; |
||
758 | ptrc += srcStride; |
||
759 | } |
||
760 | } |
||
761 | break; |
||
762 | case PIPE_FORMAT_S8_UINT_Z24_UNORM: |
||
763 | { |
||
764 | uint *pDest = (uint *) (map + y * pt->stride + x*4); |
||
765 | /*assert((pt->usage & PIPE_TRANSFER_READ_WRITE) == PIPE_TRANSFER_READ_WRITE);*/ |
||
766 | for (i = 0; i < h; i++) { |
||
767 | for (j = 0; j < w; j++) { |
||
768 | /* convert 32-bit Z to 24-bit Z, preserve stencil */ |
||
769 | pDest[j] = (pDest[j] & 0xff) | (ptrc[j] & 0xffffff00); |
||
770 | } |
||
771 | pDest += pt->stride/4; |
||
772 | ptrc += srcStride; |
||
773 | } |
||
774 | } |
||
775 | break; |
||
776 | case PIPE_FORMAT_X8Z24_UNORM: |
||
777 | { |
||
778 | uint *pDest = (uint *) (map + y * pt->stride + x*4); |
||
779 | for (i = 0; i < h; i++) { |
||
780 | for (j = 0; j < w; j++) { |
||
781 | /* convert 32-bit Z to 24-bit Z (0 stencil) */ |
||
782 | pDest[j] = ptrc[j] & 0xffffff00; |
||
783 | } |
||
784 | pDest += pt->stride/4; |
||
785 | ptrc += srcStride; |
||
786 | } |
||
787 | } |
||
788 | break; |
||
789 | case PIPE_FORMAT_Z16_UNORM: |
||
790 | { |
||
791 | ushort *pDest = (ushort *) (map + y * pt->stride + x*2); |
||
792 | for (i = 0; i < h; i++) { |
||
793 | for (j = 0; j < w; j++) { |
||
794 | /* convert 32-bit Z to 16-bit Z */ |
||
795 | pDest[j] = ptrc[j] >> 16; |
||
796 | } |
||
797 | pDest += pt->stride/2; |
||
798 | ptrc += srcStride; |
||
799 | } |
||
800 | } |
||
801 | break; |
||
802 | case PIPE_FORMAT_Z32_FLOAT: |
||
803 | { |
||
804 | float *pDest = (float *) (map + y * pt->stride + x*4); |
||
805 | for (i = 0; i < h; i++) { |
||
806 | for (j = 0; j < w; j++) { |
||
807 | /* convert 32-bit integer Z to float Z */ |
||
808 | const double scale = 1.0 / 0xffffffffU; |
||
809 | pDest[j] = (float) (ptrc[j] * scale); |
||
810 | } |
||
811 | pDest += pt->stride/4; |
||
812 | ptrc += srcStride; |
||
813 | } |
||
814 | } |
||
815 | break; |
||
816 | case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: |
||
817 | { |
||
818 | float *pDest = (float *) (map + y * pt->stride + x*8); |
||
819 | for (i = 0; i < h; i++) { |
||
820 | for (j = 0; j < w; j++) { |
||
821 | /* convert 32-bit integer Z to float Z */ |
||
822 | const double scale = 1.0 / 0xffffffffU; |
||
823 | pDest[j*2] = (float) (ptrc[j] * scale); |
||
824 | } |
||
825 | pDest += pt->stride/4; |
||
826 | ptrc += srcStride; |
||
827 | } |
||
828 | } |
||
829 | break; |
||
830 | default: |
||
831 | assert(0); |
||
832 | } |
||
833 | } |
||
834 | |||
835 | |||
836 | void |
||
837 | pipe_get_tile_ui_format(struct pipe_transfer *pt, |
||
838 | const void *src, |
||
839 | uint x, uint y, uint w, uint h, |
||
840 | enum pipe_format format, |
||
841 | unsigned int *p) |
||
842 | { |
||
843 | unsigned dst_stride = w * 4; |
||
844 | void *packed; |
||
845 | |||
846 | if (u_clip_tile(x, y, &w, &h, &pt->box)) { |
||
847 | return; |
||
848 | } |
||
849 | |||
850 | packed = MALLOC(util_format_get_nblocks(format, w, h) * util_format_get_blocksize(format)); |
||
851 | if (!packed) { |
||
852 | return; |
||
853 | } |
||
854 | |||
855 | if (format == PIPE_FORMAT_UYVY || format == PIPE_FORMAT_YUYV) { |
||
856 | assert((x & 1) == 0); |
||
857 | } |
||
858 | |||
859 | pipe_get_tile_raw(pt, src, x, y, w, h, packed, 0); |
||
860 | |||
861 | pipe_tile_raw_to_unsigned(format, packed, w, h, p, dst_stride); |
||
862 | |||
863 | FREE(packed); |
||
864 | } |
||
865 | |||
866 | |||
867 | void |
||
868 | pipe_get_tile_i_format(struct pipe_transfer *pt, |
||
869 | const void *src, |
||
870 | uint x, uint y, uint w, uint h, |
||
871 | enum pipe_format format, |
||
872 | int *p) |
||
873 | { |
||
874 | unsigned dst_stride = w * 4; |
||
875 | void *packed; |
||
876 | |||
877 | if (u_clip_tile(x, y, &w, &h, &pt->box)) { |
||
878 | return; |
||
879 | } |
||
880 | |||
881 | packed = MALLOC(util_format_get_nblocks(format, w, h) * util_format_get_blocksize(format)); |
||
882 | if (!packed) { |
||
883 | return; |
||
884 | } |
||
885 | |||
886 | if (format == PIPE_FORMAT_UYVY || format == PIPE_FORMAT_YUYV) { |
||
887 | assert((x & 1) == 0); |
||
888 | } |
||
889 | |||
890 | pipe_get_tile_raw(pt, src, x, y, w, h, packed, 0); |
||
891 | |||
892 | pipe_tile_raw_to_signed(format, packed, w, h, p, dst_stride); |
||
893 | |||
894 | FREE(packed); |
||
895 | }>>>>>>>>>>>>>>>=>>>=>>>><>>>>>><>>>>>>>>>>>>>>>>>>><>>>><>>>>> |