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