2 * Copyright 2010 Red Hat Inc.
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:
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
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.
23 #ifndef EG_STATE_INLINES_H
24 #define EG_STATE_INLINES_H
26 #include "util/u_format.h"
27 #include "evergreend.h"
28 #include "r600_formats.h"
30 static INLINE uint32_t r600_translate_blend_function(int blend_func)
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;
40 return V_028780_COMB_MIN_DST_SRC;
42 return V_028780_COMB_MAX_DST_SRC;
44 R600_ERR("Unknown blend function %d\n", blend_func);
51 static INLINE uint32_t r600_translate_blend_factor(int 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;
93 R600_ERR("Bad blend factor %d not supported!\n", blend_fact);
100 static INLINE uint32_t r600_translate_stencil_op(int 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;
120 R600_ERR("Unknown stencil op %d", s_op);
127 static INLINE uint32_t r600_translate_fill(uint32_t func)
130 case PIPE_POLYGON_MODE_FILL:
132 case PIPE_POLYGON_MODE_LINE:
134 case PIPE_POLYGON_MODE_POINT:
142 /* translates straight */
143 static INLINE uint32_t r600_translate_ds_func(int func)
148 static inline unsigned r600_tex_wrap(unsigned wrap)
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;
171 static inline unsigned r600_tex_filter(unsigned filter)
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;
182 static inline unsigned r600_tex_mipfilter(unsigned 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;
190 case PIPE_TEX_MIPFILTER_NONE:
191 return V_03C000_SQ_TEX_Z_FILTER_NONE;
195 static inline unsigned r600_tex_compare(unsigned compare)
199 case PIPE_FUNC_NEVER:
200 return V_03C000_SQ_TEX_DEPTH_COMPARE_NEVER;
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;
218 static inline unsigned r600_tex_swizzle(unsigned 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;
232 case PIPE_SWIZZLE_ONE:
233 return V_030010_SQ_SEL_1;
237 static inline unsigned r600_format_type(unsigned format_type)
239 switch (format_type) {
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;
250 static inline unsigned r600_tex_dim(unsigned dim)
254 case PIPE_TEXTURE_1D:
255 return V_030000_SQ_TEX_DIM_1D;
256 case PIPE_TEXTURE_1D_ARRAY:
257 return V_030000_SQ_TEX_DIM_1D_ARRAY;
258 case PIPE_TEXTURE_2D:
259 case PIPE_TEXTURE_RECT:
260 return V_030000_SQ_TEX_DIM_2D;
261 case PIPE_TEXTURE_2D_ARRAY:
262 return V_030000_SQ_TEX_DIM_2D_ARRAY;
263 case PIPE_TEXTURE_3D:
264 return V_030000_SQ_TEX_DIM_3D;
265 case PIPE_TEXTURE_CUBE:
266 return V_030000_SQ_TEX_DIM_CUBEMAP;
270 static inline uint32_t r600_translate_dbformat(enum pipe_format format)
273 case PIPE_FORMAT_Z16_UNORM:
274 return V_028040_Z_16;
275 case PIPE_FORMAT_Z24X8_UNORM:
276 return V_028040_Z_24;
277 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
278 return V_028040_Z_24;
284 static inline uint32_t r600_translate_stencilformat(enum pipe_format format)
286 if (format == PIPE_FORMAT_Z24_UNORM_S8_USCALED)
292 static inline uint32_t r600_translate_colorswap(enum pipe_format format)
296 case PIPE_FORMAT_L4A4_UNORM:
297 return V_028C70_SWAP_ALT;
299 case PIPE_FORMAT_A8_UNORM:
300 return V_028C70_SWAP_ALT_REV;
301 case PIPE_FORMAT_I8_UNORM:
302 case PIPE_FORMAT_L8_UNORM:
303 case PIPE_FORMAT_L8_SRGB:
304 case PIPE_FORMAT_R8_UNORM:
305 case PIPE_FORMAT_R8_SNORM:
306 return V_028C70_SWAP_STD;
308 /* 16-bit buffers. */
309 case PIPE_FORMAT_B5G6R5_UNORM:
310 return V_028C70_SWAP_STD_REV;
312 case PIPE_FORMAT_B5G5R5A1_UNORM:
313 case PIPE_FORMAT_B5G5R5X1_UNORM:
314 return V_028C70_SWAP_ALT;
316 case PIPE_FORMAT_B4G4R4A4_UNORM:
317 case PIPE_FORMAT_B4G4R4X4_UNORM:
318 return V_028C70_SWAP_ALT;
320 case PIPE_FORMAT_Z16_UNORM:
321 return V_028C70_SWAP_STD;
323 case PIPE_FORMAT_L8A8_UNORM:
324 case PIPE_FORMAT_L8A8_SRGB:
325 return V_028C70_SWAP_ALT;
326 case PIPE_FORMAT_R8G8_UNORM:
327 return V_028C70_SWAP_STD;
329 case PIPE_FORMAT_R16_UNORM:
330 case PIPE_FORMAT_R16_FLOAT:
331 return V_028C70_SWAP_STD;
333 /* 32-bit buffers. */
334 case PIPE_FORMAT_A8B8G8R8_SRGB:
335 return V_028C70_SWAP_STD_REV;
336 case PIPE_FORMAT_B8G8R8A8_SRGB:
337 return V_028C70_SWAP_ALT;
339 case PIPE_FORMAT_B8G8R8A8_UNORM:
340 case PIPE_FORMAT_B8G8R8X8_UNORM:
341 return V_028C70_SWAP_ALT;
343 case PIPE_FORMAT_A8R8G8B8_UNORM:
344 case PIPE_FORMAT_X8R8G8B8_UNORM:
345 return V_028C70_SWAP_ALT_REV;
346 case PIPE_FORMAT_R8G8B8A8_SNORM:
347 case PIPE_FORMAT_R8G8B8A8_UNORM:
348 case PIPE_FORMAT_R8G8B8X8_UNORM:
349 return V_028C70_SWAP_STD;
351 case PIPE_FORMAT_A8B8G8R8_UNORM:
352 case PIPE_FORMAT_X8B8G8R8_UNORM:
353 /* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */
354 return V_028C70_SWAP_STD_REV;
356 case PIPE_FORMAT_Z24X8_UNORM:
357 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
358 return V_028C70_SWAP_STD;
360 case PIPE_FORMAT_X8Z24_UNORM:
361 case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
362 return V_028C70_SWAP_STD;
364 case PIPE_FORMAT_R10G10B10A2_UNORM:
365 case PIPE_FORMAT_R10G10B10X2_SNORM:
366 case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
367 return V_028C70_SWAP_STD;
369 case PIPE_FORMAT_B10G10R10A2_UNORM:
370 return V_028C70_SWAP_ALT;
372 case PIPE_FORMAT_R11G11B10_FLOAT:
373 case PIPE_FORMAT_R32_FLOAT:
374 case PIPE_FORMAT_R16G16_FLOAT:
375 case PIPE_FORMAT_R16G16_UNORM:
376 return V_028C70_SWAP_STD;
378 /* 64-bit buffers. */
379 case PIPE_FORMAT_R32G32_FLOAT:
380 case PIPE_FORMAT_R16G16B16A16_UNORM:
381 case PIPE_FORMAT_R16G16B16A16_SNORM:
382 case PIPE_FORMAT_R16G16B16A16_FLOAT:
384 /* 128-bit buffers. */
385 case PIPE_FORMAT_R32G32B32A32_FLOAT:
386 case PIPE_FORMAT_R32G32B32A32_SNORM:
387 case PIPE_FORMAT_R32G32B32A32_UNORM:
388 return V_028C70_SWAP_STD;
390 R600_ERR("unsupported colorswap format %d\n", format);
396 static INLINE uint32_t r600_translate_colorformat(enum pipe_format format)
400 case PIPE_FORMAT_L4A4_UNORM:
401 return V_028C70_COLOR_4_4;
403 case PIPE_FORMAT_A8_UNORM:
404 case PIPE_FORMAT_I8_UNORM:
405 case PIPE_FORMAT_L8_UNORM:
406 case PIPE_FORMAT_L8_SRGB:
407 case PIPE_FORMAT_R8_UNORM:
408 case PIPE_FORMAT_R8_SNORM:
409 return V_028C70_COLOR_8;
411 /* 16-bit buffers. */
412 case PIPE_FORMAT_B5G6R5_UNORM:
413 return V_028C70_COLOR_5_6_5;
415 case PIPE_FORMAT_B5G5R5A1_UNORM:
416 case PIPE_FORMAT_B5G5R5X1_UNORM:
417 return V_028C70_COLOR_1_5_5_5;
419 case PIPE_FORMAT_B4G4R4A4_UNORM:
420 case PIPE_FORMAT_B4G4R4X4_UNORM:
421 return V_028C70_COLOR_4_4_4_4;
423 case PIPE_FORMAT_Z16_UNORM:
424 return V_028C70_COLOR_16;
426 case PIPE_FORMAT_L8A8_UNORM:
427 case PIPE_FORMAT_L8A8_SRGB:
428 case PIPE_FORMAT_R8G8_UNORM:
429 return V_028C70_COLOR_8_8;
431 case PIPE_FORMAT_R16_UNORM:
432 return V_028C70_COLOR_16;
434 case PIPE_FORMAT_R16_FLOAT:
435 return V_028C70_COLOR_16_FLOAT;
437 /* 32-bit buffers. */
438 case PIPE_FORMAT_A8B8G8R8_SRGB:
439 case PIPE_FORMAT_A8B8G8R8_UNORM:
440 case PIPE_FORMAT_A8R8G8B8_UNORM:
441 case PIPE_FORMAT_B8G8R8A8_SRGB:
442 case PIPE_FORMAT_B8G8R8A8_UNORM:
443 case PIPE_FORMAT_B8G8R8X8_UNORM:
444 case PIPE_FORMAT_R8G8B8A8_SNORM:
445 case PIPE_FORMAT_R8G8B8A8_UNORM:
446 case PIPE_FORMAT_R8G8B8X8_UNORM:
447 case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
448 case PIPE_FORMAT_X8B8G8R8_UNORM:
449 case PIPE_FORMAT_X8R8G8B8_UNORM:
450 case PIPE_FORMAT_R8G8B8_UNORM:
451 return V_028C70_COLOR_8_8_8_8;
453 case PIPE_FORMAT_R10G10B10A2_UNORM:
454 case PIPE_FORMAT_R10G10B10X2_SNORM:
455 case PIPE_FORMAT_B10G10R10A2_UNORM:
456 case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
457 return V_028C70_COLOR_2_10_10_10;
459 case PIPE_FORMAT_Z24X8_UNORM:
460 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
461 return V_028C70_COLOR_8_24;
463 case PIPE_FORMAT_X8Z24_UNORM:
464 case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
465 return V_028C70_COLOR_24_8;
467 case PIPE_FORMAT_R32_FLOAT:
468 return V_028C70_COLOR_32_FLOAT;
470 case PIPE_FORMAT_R16G16_FLOAT:
471 return V_028C70_COLOR_16_16_FLOAT;
473 case PIPE_FORMAT_R16G16_SSCALED:
474 case PIPE_FORMAT_R16G16_UNORM:
475 return V_028C70_COLOR_16_16;
477 case PIPE_FORMAT_R11G11B10_FLOAT:
478 return V_028C70_COLOR_10_11_11_FLOAT;
480 /* 64-bit buffers. */
481 case PIPE_FORMAT_R16G16B16_USCALED:
482 case PIPE_FORMAT_R16G16B16A16_USCALED:
483 case PIPE_FORMAT_R16G16B16_SSCALED:
484 case PIPE_FORMAT_R16G16B16A16_SSCALED:
485 case PIPE_FORMAT_R16G16B16A16_UNORM:
486 case PIPE_FORMAT_R16G16B16A16_SNORM:
487 return V_028C70_COLOR_16_16_16_16;
489 case PIPE_FORMAT_R16G16B16_FLOAT:
490 case PIPE_FORMAT_R16G16B16A16_FLOAT:
491 return V_028C70_COLOR_16_16_16_16_FLOAT;
493 case PIPE_FORMAT_R32G32_FLOAT:
494 return V_028C70_COLOR_32_32_FLOAT;
496 case PIPE_FORMAT_R32G32_USCALED:
497 case PIPE_FORMAT_R32G32_SSCALED:
498 return V_028C70_COLOR_32_32;
500 /* 96-bit buffers. */
501 case PIPE_FORMAT_R32G32B32_FLOAT:
502 return V_028C70_COLOR_32_32_32_FLOAT;
504 /* 128-bit buffers. */
505 case PIPE_FORMAT_R32G32B32A32_SNORM:
506 case PIPE_FORMAT_R32G32B32A32_UNORM:
507 return V_028C70_COLOR_32_32_32_32;
508 case PIPE_FORMAT_R32G32B32A32_FLOAT:
509 return V_028C70_COLOR_32_32_32_32_FLOAT;
512 case PIPE_FORMAT_UYVY:
513 case PIPE_FORMAT_YUYV:
515 return ~0; /* Unsupported. */
519 static INLINE uint32_t r600_colorformat_endian_swap(uint32_t colorformat)
521 if (R600_BIG_ENDIAN) {
522 switch(colorformat) {
523 case V_028C70_COLOR_4_4:
527 case V_028C70_COLOR_8:
530 /* 16-bit buffers. */
531 case V_028C70_COLOR_5_6_5:
532 case V_028C70_COLOR_1_5_5_5:
533 case V_028C70_COLOR_4_4_4_4:
534 case V_028C70_COLOR_16:
535 case V_028C70_COLOR_8_8:
536 return(ENDIAN_8IN16);
538 /* 32-bit buffers. */
539 case V_028C70_COLOR_8_8_8_8:
540 case V_028C70_COLOR_2_10_10_10:
541 case V_028C70_COLOR_8_24:
542 case V_028C70_COLOR_24_8:
543 case V_028C70_COLOR_32_FLOAT:
544 case V_028C70_COLOR_16_16_FLOAT:
545 case V_028C70_COLOR_16_16:
546 return(ENDIAN_8IN32);
548 /* 64-bit buffers. */
549 case V_028C70_COLOR_16_16_16_16:
550 case V_028C70_COLOR_16_16_16_16_FLOAT:
551 return(ENDIAN_8IN16);
553 case V_028C70_COLOR_32_32_FLOAT:
554 case V_028C70_COLOR_32_32:
555 return(ENDIAN_8IN32);
557 /* 96-bit buffers. */
558 case V_028C70_COLOR_32_32_32_FLOAT:
559 /* 128-bit buffers. */
560 case V_028C70_COLOR_32_32_32_32_FLOAT:
561 case V_028C70_COLOR_32_32_32_32:
562 return(ENDIAN_8IN32);
564 return ENDIAN_NONE; /* Unsupported. */
571 static INLINE boolean r600_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format)
573 return r600_translate_texformat(screen, format, NULL, NULL, NULL) != ~0;
576 static INLINE boolean r600_is_colorbuffer_format_supported(enum pipe_format format)
578 return r600_translate_colorformat(format) != ~0 &&
579 r600_translate_colorswap(format) != ~0;
582 static INLINE boolean r600_is_zs_format_supported(enum pipe_format format)
584 return r600_translate_dbformat(format) != ~0;