r600g: add evergreen stencil support.
[mesa.git] / src / gallium / drivers / r600 / eg_state_inlines.h
1 /*
2 * Copyright 2010 Red Hat Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * on the rights to use, copy, modify, merge, publish, distribute, sub
8 * license, and/or sell copies of the Software, and to permit persons to whom
9 * the Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21 * USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23 #ifndef EG_STATE_INLINES_H
24 #define EG_STATE_INLINES_H
25
26 #include "util/u_format.h"
27 #include "evergreend.h"
28
29 static INLINE uint32_t r600_translate_blend_function(int blend_func)
30 {
31 switch (blend_func) {
32 case PIPE_BLEND_ADD:
33 return V_028780_COMB_DST_PLUS_SRC;
34 case PIPE_BLEND_SUBTRACT:
35 return V_028780_COMB_SRC_MINUS_DST;
36 case PIPE_BLEND_REVERSE_SUBTRACT:
37 return V_028780_COMB_DST_MINUS_SRC;
38 case PIPE_BLEND_MIN:
39 return V_028780_COMB_MIN_DST_SRC;
40 case PIPE_BLEND_MAX:
41 return V_028780_COMB_MAX_DST_SRC;
42 default:
43 R600_ERR("Unknown blend function %d\n", blend_func);
44 assert(0);
45 break;
46 }
47 return 0;
48 }
49
50 static INLINE uint32_t r600_translate_blend_factor(int blend_fact)
51 {
52 switch (blend_fact) {
53 case PIPE_BLENDFACTOR_ONE:
54 return V_028780_BLEND_ONE;
55 case PIPE_BLENDFACTOR_SRC_COLOR:
56 return V_028780_BLEND_SRC_COLOR;
57 case PIPE_BLENDFACTOR_SRC_ALPHA:
58 return V_028780_BLEND_SRC_ALPHA;
59 case PIPE_BLENDFACTOR_DST_ALPHA:
60 return V_028780_BLEND_DST_ALPHA;
61 case PIPE_BLENDFACTOR_DST_COLOR:
62 return V_028780_BLEND_DST_COLOR;
63 case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
64 return V_028780_BLEND_SRC_ALPHA_SATURATE;
65 case PIPE_BLENDFACTOR_CONST_COLOR:
66 return V_028780_BLEND_CONST_COLOR;
67 case PIPE_BLENDFACTOR_CONST_ALPHA:
68 return V_028780_BLEND_CONST_ALPHA;
69 case PIPE_BLENDFACTOR_ZERO:
70 return V_028780_BLEND_ZERO;
71 case PIPE_BLENDFACTOR_INV_SRC_COLOR:
72 return V_028780_BLEND_ONE_MINUS_SRC_COLOR;
73 case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
74 return V_028780_BLEND_ONE_MINUS_SRC_ALPHA;
75 case PIPE_BLENDFACTOR_INV_DST_ALPHA:
76 return V_028780_BLEND_ONE_MINUS_DST_ALPHA;
77 case PIPE_BLENDFACTOR_INV_DST_COLOR:
78 return V_028780_BLEND_ONE_MINUS_DST_COLOR;
79 case PIPE_BLENDFACTOR_INV_CONST_COLOR:
80 return V_028780_BLEND_ONE_MINUS_CONST_COLOR;
81 case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
82 return V_028780_BLEND_ONE_MINUS_CONST_ALPHA;
83 case PIPE_BLENDFACTOR_SRC1_COLOR:
84 return V_028780_BLEND_SRC1_COLOR;
85 case PIPE_BLENDFACTOR_SRC1_ALPHA:
86 return V_028780_BLEND_SRC1_ALPHA;
87 case PIPE_BLENDFACTOR_INV_SRC1_COLOR:
88 return V_028780_BLEND_INV_SRC1_COLOR;
89 case PIPE_BLENDFACTOR_INV_SRC1_ALPHA:
90 return V_028780_BLEND_INV_SRC1_ALPHA;
91 default:
92 R600_ERR("Bad blend factor %d not supported!\n", blend_fact);
93 assert(0);
94 break;
95 }
96 return 0;
97 }
98
99 static INLINE uint32_t r600_translate_stencil_op(int s_op)
100 {
101 switch (s_op) {
102 case PIPE_STENCIL_OP_KEEP:
103 return V_028800_STENCIL_KEEP;
104 case PIPE_STENCIL_OP_ZERO:
105 return V_028800_STENCIL_ZERO;
106 case PIPE_STENCIL_OP_REPLACE:
107 return V_028800_STENCIL_REPLACE;
108 case PIPE_STENCIL_OP_INCR:
109 return V_028800_STENCIL_INCR;
110 case PIPE_STENCIL_OP_DECR:
111 return V_028800_STENCIL_DECR;
112 case PIPE_STENCIL_OP_INCR_WRAP:
113 return V_028800_STENCIL_INCR_WRAP;
114 case PIPE_STENCIL_OP_DECR_WRAP:
115 return V_028800_STENCIL_DECR_WRAP;
116 case PIPE_STENCIL_OP_INVERT:
117 return V_028800_STENCIL_INVERT;
118 default:
119 R600_ERR("Unknown stencil op %d", s_op);
120 assert(0);
121 break;
122 }
123 return 0;
124 }
125
126 static INLINE uint32_t r600_translate_fill(uint32_t func)
127 {
128 switch(func) {
129 case PIPE_POLYGON_MODE_FILL:
130 return 2;
131 case PIPE_POLYGON_MODE_LINE:
132 return 1;
133 case PIPE_POLYGON_MODE_POINT:
134 return 0;
135 default:
136 assert(0);
137 return 0;
138 }
139 }
140
141 /* translates straight */
142 static INLINE uint32_t r600_translate_ds_func(int func)
143 {
144 return func;
145 }
146
147 static inline unsigned r600_tex_wrap(unsigned wrap)
148 {
149 switch (wrap) {
150 default:
151 case PIPE_TEX_WRAP_REPEAT:
152 return V_03C000_SQ_TEX_WRAP;
153 case PIPE_TEX_WRAP_CLAMP:
154 return V_03C000_SQ_TEX_CLAMP_HALF_BORDER;
155 case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
156 return V_03C000_SQ_TEX_CLAMP_LAST_TEXEL;
157 case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
158 return V_03C000_SQ_TEX_CLAMP_BORDER;
159 case PIPE_TEX_WRAP_MIRROR_REPEAT:
160 return V_03C000_SQ_TEX_MIRROR;
161 case PIPE_TEX_WRAP_MIRROR_CLAMP:
162 return V_03C000_SQ_TEX_MIRROR_ONCE_HALF_BORDER;
163 case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
164 return V_03C000_SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
165 case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
166 return V_03C000_SQ_TEX_MIRROR_ONCE_BORDER;
167 }
168 }
169
170 static inline unsigned r600_tex_filter(unsigned filter)
171 {
172 switch (filter) {
173 default:
174 case PIPE_TEX_FILTER_NEAREST:
175 return V_03C000_SQ_TEX_XY_FILTER_POINT;
176 case PIPE_TEX_FILTER_LINEAR:
177 return V_03C000_SQ_TEX_XY_FILTER_BILINEAR;
178 }
179 }
180
181 static inline unsigned r600_tex_mipfilter(unsigned filter)
182 {
183 switch (filter) {
184 case PIPE_TEX_MIPFILTER_NEAREST:
185 return V_03C000_SQ_TEX_Z_FILTER_POINT;
186 case PIPE_TEX_MIPFILTER_LINEAR:
187 return V_03C000_SQ_TEX_Z_FILTER_LINEAR;
188 default:
189 case PIPE_TEX_MIPFILTER_NONE:
190 return V_03C000_SQ_TEX_Z_FILTER_NONE;
191 }
192 }
193
194 static inline unsigned r600_tex_compare(unsigned compare)
195 {
196 switch (compare) {
197 default:
198 case PIPE_FUNC_NEVER:
199 return V_03C000_SQ_TEX_DEPTH_COMPARE_NEVER;
200 case PIPE_FUNC_LESS:
201 return V_03C000_SQ_TEX_DEPTH_COMPARE_LESS;
202 case PIPE_FUNC_EQUAL:
203 return V_03C000_SQ_TEX_DEPTH_COMPARE_EQUAL;
204 case PIPE_FUNC_LEQUAL:
205 return V_03C000_SQ_TEX_DEPTH_COMPARE_LESSEQUAL;
206 case PIPE_FUNC_GREATER:
207 return V_03C000_SQ_TEX_DEPTH_COMPARE_GREATER;
208 case PIPE_FUNC_NOTEQUAL:
209 return V_03C000_SQ_TEX_DEPTH_COMPARE_NOTEQUAL;
210 case PIPE_FUNC_GEQUAL:
211 return V_03C000_SQ_TEX_DEPTH_COMPARE_GREATEREQUAL;
212 case PIPE_FUNC_ALWAYS:
213 return V_03C000_SQ_TEX_DEPTH_COMPARE_ALWAYS;
214 }
215 }
216
217 static inline unsigned r600_tex_swizzle(unsigned swizzle)
218 {
219 switch (swizzle) {
220 case PIPE_SWIZZLE_RED:
221 return V_030010_SQ_SEL_X;
222 case PIPE_SWIZZLE_GREEN:
223 return V_030010_SQ_SEL_Y;
224 case PIPE_SWIZZLE_BLUE:
225 return V_030010_SQ_SEL_Z;
226 case PIPE_SWIZZLE_ALPHA:
227 return V_030010_SQ_SEL_W;
228 case PIPE_SWIZZLE_ZERO:
229 return V_030010_SQ_SEL_0;
230 default:
231 case PIPE_SWIZZLE_ONE:
232 return V_030010_SQ_SEL_1;
233 }
234 }
235
236 static inline unsigned r600_format_type(unsigned format_type)
237 {
238 switch (format_type) {
239 default:
240 case UTIL_FORMAT_TYPE_UNSIGNED:
241 return V_030010_SQ_FORMAT_COMP_UNSIGNED;
242 case UTIL_FORMAT_TYPE_SIGNED:
243 return V_030010_SQ_FORMAT_COMP_SIGNED;
244 case UTIL_FORMAT_TYPE_FIXED:
245 return V_030010_SQ_FORMAT_COMP_UNSIGNED_BIASED;
246 }
247 }
248
249 static inline unsigned r600_tex_dim(unsigned dim)
250 {
251 switch (dim) {
252 default:
253 case PIPE_TEXTURE_1D:
254 return V_030000_SQ_TEX_DIM_1D;
255 case PIPE_TEXTURE_2D:
256 case PIPE_TEXTURE_RECT:
257 return V_030000_SQ_TEX_DIM_2D;
258 case PIPE_TEXTURE_3D:
259 return V_030000_SQ_TEX_DIM_3D;
260 case PIPE_TEXTURE_CUBE:
261 return V_030000_SQ_TEX_DIM_CUBEMAP;
262 }
263 }
264
265 static inline uint32_t r600_translate_dbformat(enum pipe_format format)
266 {
267 switch (format) {
268 case PIPE_FORMAT_Z16_UNORM:
269 return V_028040_Z_16;
270 case PIPE_FORMAT_Z24X8_UNORM:
271 return V_028040_Z_24;
272 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
273 return V_028040_Z_24;
274 default:
275 return ~0;
276 }
277 }
278
279 static inline uint32_t r600_translate_stencilformat(enum pipe_format format)
280 {
281 if (format == PIPE_FORMAT_Z24_UNORM_S8_USCALED)
282 return 1;
283 else
284 return 0;
285 }
286
287 static inline uint32_t r600_translate_colorswap(enum pipe_format format)
288 {
289 switch (format) {
290 /* 8-bit buffers. */
291 case PIPE_FORMAT_A8_UNORM:
292 case PIPE_FORMAT_I8_UNORM:
293 case PIPE_FORMAT_L8_UNORM:
294 case PIPE_FORMAT_R8_UNORM:
295 case PIPE_FORMAT_R8_SNORM:
296 return V_028C70_SWAP_STD;
297
298 /* 16-bit buffers. */
299 case PIPE_FORMAT_B5G6R5_UNORM:
300 return V_028C70_SWAP_STD_REV;
301
302 case PIPE_FORMAT_B5G5R5A1_UNORM:
303 case PIPE_FORMAT_B5G5R5X1_UNORM:
304 return V_028C70_SWAP_ALT;
305
306 case PIPE_FORMAT_B4G4R4A4_UNORM:
307 case PIPE_FORMAT_B4G4R4X4_UNORM:
308 return V_028C70_SWAP_ALT;
309
310 case PIPE_FORMAT_Z16_UNORM:
311 return V_028C70_SWAP_STD;
312 /* 32-bit buffers. */
313
314 case PIPE_FORMAT_A8B8G8R8_SRGB:
315 return V_028C70_SWAP_STD_REV;
316 case PIPE_FORMAT_B8G8R8A8_SRGB:
317 return V_028C70_SWAP_ALT;
318
319 case PIPE_FORMAT_B8G8R8A8_UNORM:
320 case PIPE_FORMAT_B8G8R8X8_UNORM:
321 return V_028C70_SWAP_ALT;
322
323 case PIPE_FORMAT_A8R8G8B8_UNORM:
324 case PIPE_FORMAT_X8R8G8B8_UNORM:
325 return V_028C70_SWAP_ALT_REV;
326 case PIPE_FORMAT_R8G8B8A8_SNORM:
327 case PIPE_FORMAT_R8G8B8X8_UNORM:
328 return V_028C70_SWAP_STD;
329
330 case PIPE_FORMAT_A8B8G8R8_UNORM:
331 case PIPE_FORMAT_X8B8G8R8_UNORM:
332 // case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
333 return V_028C70_SWAP_STD_REV;
334
335 case PIPE_FORMAT_Z24X8_UNORM:
336 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
337 return V_028C70_SWAP_STD;
338
339 case PIPE_FORMAT_X8Z24_UNORM:
340 case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
341 return V_028C70_SWAP_STD;
342
343 case PIPE_FORMAT_R10G10B10A2_UNORM:
344 case PIPE_FORMAT_R10G10B10X2_SNORM:
345 case PIPE_FORMAT_B10G10R10A2_UNORM:
346 case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
347 return V_028C70_SWAP_STD_REV;
348
349 /* 64-bit buffers. */
350 case PIPE_FORMAT_R16G16B16A16_UNORM:
351 case PIPE_FORMAT_R16G16B16A16_SNORM:
352 // return V_028C70_COLOR_16_16_16_16;
353 case PIPE_FORMAT_R16G16B16A16_FLOAT:
354 // return V_028C70_COLOR_16_16_16_16_FLOAT;
355
356 /* 128-bit buffers. */
357 case PIPE_FORMAT_R32G32B32A32_FLOAT:
358 // return V_028C70_COLOR_32_32_32_32_FLOAT;
359 return 0;
360 default:
361 R600_ERR("unsupported colorswap format %d\n", format);
362 return ~0;
363 }
364 return ~0;
365 }
366
367 static INLINE uint32_t r600_translate_colorformat(enum pipe_format format)
368 {
369 switch (format) {
370 /* 8-bit buffers. */
371 case PIPE_FORMAT_A8_UNORM:
372 case PIPE_FORMAT_I8_UNORM:
373 case PIPE_FORMAT_L8_UNORM:
374 case PIPE_FORMAT_R8_UNORM:
375 case PIPE_FORMAT_R8_SNORM:
376 return V_028C70_COLOR_8;
377
378 /* 16-bit buffers. */
379 case PIPE_FORMAT_B5G6R5_UNORM:
380 return V_028C70_COLOR_5_6_5;
381
382 case PIPE_FORMAT_B5G5R5A1_UNORM:
383 case PIPE_FORMAT_B5G5R5X1_UNORM:
384 return V_028C70_COLOR_1_5_5_5;
385
386 case PIPE_FORMAT_B4G4R4A4_UNORM:
387 case PIPE_FORMAT_B4G4R4X4_UNORM:
388 return V_028C70_COLOR_4_4_4_4;
389
390 case PIPE_FORMAT_Z16_UNORM:
391 return V_028C70_COLOR_16;
392
393 /* 32-bit buffers. */
394 case PIPE_FORMAT_A8B8G8R8_SRGB:
395 case PIPE_FORMAT_A8B8G8R8_UNORM:
396 case PIPE_FORMAT_A8R8G8B8_UNORM:
397 case PIPE_FORMAT_B8G8R8A8_SRGB:
398 case PIPE_FORMAT_B8G8R8A8_UNORM:
399 case PIPE_FORMAT_B8G8R8X8_UNORM:
400 case PIPE_FORMAT_R8G8B8A8_SNORM:
401 case PIPE_FORMAT_R8G8B8A8_UNORM:
402 case PIPE_FORMAT_R8G8B8X8_UNORM:
403 case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
404 case PIPE_FORMAT_X8B8G8R8_UNORM:
405 case PIPE_FORMAT_X8R8G8B8_UNORM:
406 case PIPE_FORMAT_R8G8B8_UNORM:
407 return V_028C70_COLOR_8_8_8_8;
408
409 case PIPE_FORMAT_R10G10B10A2_UNORM:
410 case PIPE_FORMAT_R10G10B10X2_SNORM:
411 case PIPE_FORMAT_B10G10R10A2_UNORM:
412 case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
413 return V_028C70_COLOR_10_10_10_2;
414
415 case PIPE_FORMAT_Z24X8_UNORM:
416 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
417 return V_028C70_COLOR_8_24;
418
419 case PIPE_FORMAT_X8Z24_UNORM:
420 case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
421 return V_028C70_COLOR_24_8;
422
423 case PIPE_FORMAT_R32_FLOAT:
424 return V_028C70_COLOR_32_FLOAT;
425
426 case PIPE_FORMAT_R16G16_FLOAT:
427 return V_028C70_COLOR_16_16_FLOAT;
428
429 case PIPE_FORMAT_R16G16_SSCALED:
430 return V_028C70_COLOR_16_16;
431
432 /* 64-bit buffers. */
433 case PIPE_FORMAT_R16G16B16A16_SSCALED:
434 case PIPE_FORMAT_R16G16B16_SSCALED:
435 case PIPE_FORMAT_R16G16B16A16_UNORM:
436 case PIPE_FORMAT_R16G16B16A16_SNORM:
437 return V_028C70_COLOR_16_16_16_16;
438
439 case PIPE_FORMAT_R16G16B16_FLOAT:
440 case PIPE_FORMAT_R16G16B16A16_FLOAT:
441 return V_028C70_COLOR_16_16_16_16_FLOAT;
442
443 case PIPE_FORMAT_R32G32_FLOAT:
444 return V_028C70_COLOR_32_32_FLOAT;
445
446 case PIPE_FORMAT_R32G32_SSCALED:
447 return V_028C70_COLOR_32_32;
448
449 /* 128-bit buffers. */
450 case PIPE_FORMAT_R32G32B32_FLOAT:
451 return V_028C70_COLOR_32_32_32_FLOAT;
452 case PIPE_FORMAT_R32G32B32A32_FLOAT:
453 return V_028C70_COLOR_32_32_32_32_FLOAT;
454
455 /* YUV buffers. */
456 case PIPE_FORMAT_UYVY:
457 case PIPE_FORMAT_YUYV:
458 default:
459 R600_ERR("unsupported color format %d\n", format);
460 return ~0; /* Unsupported. */
461 }
462 }
463
464 static INLINE boolean r600_is_sampler_format_supported(enum pipe_format format)
465 {
466 return r600_translate_texformat(format, NULL, NULL, NULL) != ~0;
467 }
468
469 static INLINE boolean r600_is_colorbuffer_format_supported(enum pipe_format format)
470 {
471 return r600_translate_colorformat(format) != ~0 &&
472 r600_translate_colorswap(format) != ~0;
473 }
474
475 static INLINE boolean r600_is_zs_format_supported(enum pipe_format format)
476 {
477 return r600_translate_dbformat(format) != ~0;
478 }
479
480 static INLINE boolean r600_is_vertex_format_supported(enum pipe_format format)
481 {
482 return r600_translate_colorformat(format) != ~0;
483 }
484
485 static INLINE uint32_t r600_translate_vertex_data_type(enum pipe_format format)
486 {
487 uint32_t result = 0;
488 const struct util_format_description *desc;
489 unsigned i;
490
491 desc = util_format_description(format);
492 if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) {
493 goto out_unknown;
494 }
495
496 /* Find the first non-VOID channel. */
497 for (i = 0; i < 4; i++) {
498 if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
499 break;
500 }
501 }
502
503 switch (desc->channel[i].type) {
504 /* Half-floats, floats, doubles */
505 case UTIL_FORMAT_TYPE_FLOAT:
506 switch (desc->channel[i].size) {
507 case 16:
508 switch (desc->nr_channels) {
509 case 1:
510 result = V_030008_FMT_16_FLOAT;
511 break;
512 case 2:
513 result = V_030008_FMT_16_16_FLOAT;
514 break;
515 case 3:
516 result = V_030008_FMT_16_16_16_FLOAT;
517 break;
518 case 4:
519 result = V_030008_FMT_16_16_16_16_FLOAT;
520 break;
521 }
522 break;
523 case 32:
524 switch (desc->nr_channels) {
525 case 1:
526 result = V_030008_FMT_32_FLOAT;
527 break;
528 case 2:
529 result = V_030008_FMT_32_32_FLOAT;
530 break;
531 case 3:
532 result = V_030008_FMT_32_32_32_FLOAT;
533 break;
534 case 4:
535 result = V_030008_FMT_32_32_32_32_FLOAT;
536 break;
537 }
538 break;
539 default:
540 goto out_unknown;
541 }
542 break;
543 /* Unsigned ints */
544 case UTIL_FORMAT_TYPE_UNSIGNED:
545 /* Signed ints */
546 case UTIL_FORMAT_TYPE_SIGNED:
547 switch (desc->channel[i].size) {
548 case 8:
549 switch (desc->nr_channels) {
550 case 1:
551 result = V_030008_FMT_8;
552 break;
553 case 2:
554 result = V_030008_FMT_8_8;
555 break;
556 case 3:
557 // result = V_038008_FMT_8_8_8; /* fails piglit draw-vertices test */
558 // break;
559 case 4:
560 result = V_030008_FMT_8_8_8_8;
561 break;
562 }
563 break;
564 case 16:
565 switch (desc->nr_channels) {
566 case 1:
567 result = V_030008_FMT_16;
568 break;
569 case 2:
570 result = V_030008_FMT_16_16;
571 break;
572 case 3:
573 // result = V_038008_FMT_16_16_16; /* fails piglit draw-vertices test */
574 // break;
575 case 4:
576 result = V_030008_FMT_16_16_16_16;
577 break;
578 }
579 break;
580 case 32:
581 switch (desc->nr_channels) {
582 case 1:
583 result = V_030008_FMT_32;
584 break;
585 case 2:
586 result = V_030008_FMT_32_32;
587 break;
588 case 3:
589 result = V_030008_FMT_32_32_32;
590 break;
591 case 4:
592 result = V_030008_FMT_32_32_32_32;
593 break;
594 }
595 break;
596 default:
597 goto out_unknown;
598 }
599 break;
600 default:
601 goto out_unknown;
602 }
603
604 result = S_030008_DATA_FORMAT(result);
605
606 if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
607 result |= S_030008_FORMAT_COMP_ALL(1);
608 }
609 if (desc->channel[i].normalized) {
610 result |= S_030008_NUM_FORMAT_ALL(0);
611 } else {
612 result |= S_030008_NUM_FORMAT_ALL(2);
613 }
614 return result;
615 out_unknown:
616 R600_ERR("unsupported vertex format %s\n", util_format_name(format));
617 return ~0;
618 }
619
620 static INLINE uint32_t r600_translate_vertex_data_swizzle(enum pipe_format format)
621 {
622 const struct util_format_description *desc = util_format_description(format);
623 unsigned i;
624 uint32_t word3;
625
626 assert(format);
627
628 if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) {
629 fprintf(stderr, "r600: Bad format %s in %s:%d\n",
630 util_format_short_name(format), __FUNCTION__, __LINE__);
631 return 0;
632 }
633
634 word3 = 0;
635 for (i = 0; i < desc->nr_channels; i++) {
636 switch (i) {
637 case 0:
638 word3 |= S_03000C_DST_SEL_X(desc->swizzle[0]);
639 break;
640 case 1:
641 word3 |= S_03000C_DST_SEL_Y(desc->swizzle[1]);
642 break;
643 case 2:
644 word3 |= S_03000C_DST_SEL_Z(desc->swizzle[2]);
645 break;
646 case 3:
647 word3 |= S_03000C_DST_SEL_W(desc->swizzle[3]);
648 break;
649 }
650 }
651 return word3;
652 }
653
654 #endif