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 R600_STATE_INLINES_H
24 #define R600_STATE_INLINES_H
26 #include "util/u_format.h"
29 static INLINE
uint32_t r600_translate_blend_function(int blend_func
)
33 return V_028804_COMB_DST_PLUS_SRC
;
34 case PIPE_BLEND_SUBTRACT
:
35 return V_028804_COMB_SRC_MINUS_DST
;
36 case PIPE_BLEND_REVERSE_SUBTRACT
:
37 return V_028804_COMB_DST_MINUS_SRC
;
39 return V_028804_COMB_MIN_DST_SRC
;
41 return V_028804_COMB_MAX_DST_SRC
;
43 R600_ERR("Unknown blend function %d\n", blend_func
);
50 static INLINE
uint32_t r600_translate_blend_factor(int blend_fact
)
53 case PIPE_BLENDFACTOR_ONE
:
54 return V_028804_BLEND_ONE
;
55 case PIPE_BLENDFACTOR_SRC_COLOR
:
56 return V_028804_BLEND_SRC_COLOR
;
57 case PIPE_BLENDFACTOR_SRC_ALPHA
:
58 return V_028804_BLEND_SRC_ALPHA
;
59 case PIPE_BLENDFACTOR_DST_ALPHA
:
60 return V_028804_BLEND_DST_ALPHA
;
61 case PIPE_BLENDFACTOR_DST_COLOR
:
62 return V_028804_BLEND_DST_COLOR
;
63 case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE
:
64 return V_028804_BLEND_SRC_ALPHA_SATURATE
;
65 case PIPE_BLENDFACTOR_CONST_COLOR
:
66 return V_028804_BLEND_CONST_COLOR
;
67 case PIPE_BLENDFACTOR_CONST_ALPHA
:
68 return V_028804_BLEND_CONST_ALPHA
;
69 case PIPE_BLENDFACTOR_ZERO
:
70 return V_028804_BLEND_ZERO
;
71 case PIPE_BLENDFACTOR_INV_SRC_COLOR
:
72 return V_028804_BLEND_ONE_MINUS_SRC_COLOR
;
73 case PIPE_BLENDFACTOR_INV_SRC_ALPHA
:
74 return V_028804_BLEND_ONE_MINUS_SRC_ALPHA
;
75 case PIPE_BLENDFACTOR_INV_DST_ALPHA
:
76 return V_028804_BLEND_ONE_MINUS_DST_ALPHA
;
77 case PIPE_BLENDFACTOR_INV_DST_COLOR
:
78 return V_028804_BLEND_ONE_MINUS_DST_COLOR
;
79 case PIPE_BLENDFACTOR_INV_CONST_COLOR
:
80 return V_028804_BLEND_ONE_MINUS_CONST_COLOR
;
81 case PIPE_BLENDFACTOR_INV_CONST_ALPHA
:
82 return V_028804_BLEND_ONE_MINUS_CONST_ALPHA
;
83 case PIPE_BLENDFACTOR_SRC1_COLOR
:
84 return V_028804_BLEND_SRC1_COLOR
;
85 case PIPE_BLENDFACTOR_SRC1_ALPHA
:
86 return V_028804_BLEND_SRC1_ALPHA
;
87 case PIPE_BLENDFACTOR_INV_SRC1_COLOR
:
88 return V_028804_BLEND_INV_SRC1_COLOR
;
89 case PIPE_BLENDFACTOR_INV_SRC1_ALPHA
:
90 return V_028804_BLEND_INV_SRC1_ALPHA
;
92 R600_ERR("Bad blend factor %d not supported!\n", blend_fact
);
99 static INLINE
uint32_t r600_translate_stencil_op(int 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
;
119 R600_ERR("Unknown stencil op %d", s_op
);
126 static INLINE
uint32_t r600_translate_fill(uint32_t func
)
129 case PIPE_POLYGON_MODE_FILL
:
131 case PIPE_POLYGON_MODE_LINE
:
133 case PIPE_POLYGON_MODE_POINT
:
141 /* translates straight */
142 static INLINE
uint32_t r600_translate_ds_func(int func
)
147 static inline unsigned r600_tex_wrap(unsigned wrap
)
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
;
170 static inline unsigned r600_tex_filter(unsigned filter
)
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
;
181 static inline unsigned r600_tex_mipfilter(unsigned 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
;
189 case PIPE_TEX_MIPFILTER_NONE
:
190 return V_03C000_SQ_TEX_Z_FILTER_NONE
;
194 static inline unsigned r600_tex_compare(unsigned compare
)
198 case PIPE_FUNC_NEVER
:
199 return V_03C000_SQ_TEX_DEPTH_COMPARE_NEVER
;
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
;
217 static inline unsigned r600_tex_swizzle(unsigned swizzle
)
220 case PIPE_SWIZZLE_RED
:
221 return V_038010_SQ_SEL_X
;
222 case PIPE_SWIZZLE_GREEN
:
223 return V_038010_SQ_SEL_Y
;
224 case PIPE_SWIZZLE_BLUE
:
225 return V_038010_SQ_SEL_Z
;
226 case PIPE_SWIZZLE_ALPHA
:
227 return V_038010_SQ_SEL_W
;
228 case PIPE_SWIZZLE_ZERO
:
229 return V_038010_SQ_SEL_0
;
231 case PIPE_SWIZZLE_ONE
:
232 return V_038010_SQ_SEL_1
;
236 static inline unsigned r600_format_type(unsigned format_type
)
238 switch (format_type
) {
240 case UTIL_FORMAT_TYPE_UNSIGNED
:
241 return V_038010_SQ_FORMAT_COMP_UNSIGNED
;
242 case UTIL_FORMAT_TYPE_SIGNED
:
243 return V_038010_SQ_FORMAT_COMP_SIGNED
;
244 case UTIL_FORMAT_TYPE_FIXED
:
245 return V_038010_SQ_FORMAT_COMP_UNSIGNED_BIASED
;
249 static inline unsigned r600_tex_dim(unsigned dim
)
253 case PIPE_TEXTURE_1D
:
254 return V_038000_SQ_TEX_DIM_1D
;
255 case PIPE_TEXTURE_2D
:
256 case PIPE_TEXTURE_RECT
:
257 return V_038000_SQ_TEX_DIM_2D
;
258 case PIPE_TEXTURE_3D
:
259 return V_038000_SQ_TEX_DIM_3D
;
260 case PIPE_TEXTURE_CUBE
:
261 return V_038000_SQ_TEX_DIM_CUBEMAP
;
265 static inline uint32_t r600_translate_dbformat(enum pipe_format format
)
268 case PIPE_FORMAT_Z16_UNORM
:
269 return V_028010_DEPTH_16
;
270 case PIPE_FORMAT_Z24X8_UNORM
:
271 return V_028010_DEPTH_X8_24
;
272 case PIPE_FORMAT_Z24_UNORM_S8_USCALED
:
273 return V_028010_DEPTH_8_24
;
279 static inline uint32_t r600_translate_colorswap(enum pipe_format format
)
283 case PIPE_FORMAT_A8_UNORM
:
284 case PIPE_FORMAT_I8_UNORM
:
285 case PIPE_FORMAT_L8_UNORM
:
286 case PIPE_FORMAT_R8_UNORM
:
287 case PIPE_FORMAT_R8_SNORM
:
288 return V_0280A0_SWAP_STD
;
290 /* 16-bit buffers. */
291 case PIPE_FORMAT_B5G6R5_UNORM
:
292 return V_0280A0_SWAP_STD_REV
;
294 case PIPE_FORMAT_B5G5R5A1_UNORM
:
295 case PIPE_FORMAT_B5G5R5X1_UNORM
:
296 return V_0280A0_SWAP_ALT
;
298 case PIPE_FORMAT_B4G4R4A4_UNORM
:
299 case PIPE_FORMAT_B4G4R4X4_UNORM
:
300 return V_0280A0_SWAP_ALT
;
302 case PIPE_FORMAT_Z16_UNORM
:
303 return V_0280A0_SWAP_STD
;
305 case PIPE_FORMAT_L8A8_UNORM
:
306 return V_0280A0_SWAP_STD
;
308 /* 32-bit buffers. */
310 case PIPE_FORMAT_A8B8G8R8_SRGB
:
311 return V_0280A0_SWAP_STD_REV
;
312 case PIPE_FORMAT_B8G8R8A8_SRGB
:
313 return V_0280A0_SWAP_ALT
;
315 case PIPE_FORMAT_B8G8R8A8_UNORM
:
316 case PIPE_FORMAT_B8G8R8X8_UNORM
:
317 return V_0280A0_SWAP_ALT
;
319 case PIPE_FORMAT_A8R8G8B8_UNORM
:
320 case PIPE_FORMAT_X8R8G8B8_UNORM
:
321 return V_0280A0_SWAP_ALT_REV
;
322 case PIPE_FORMAT_R8G8B8A8_SNORM
:
323 case PIPE_FORMAT_R8G8B8X8_UNORM
:
324 return V_0280A0_SWAP_STD
;
326 case PIPE_FORMAT_A8B8G8R8_UNORM
:
327 case PIPE_FORMAT_X8B8G8R8_UNORM
:
328 // case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
329 return V_0280A0_SWAP_STD_REV
;
331 case PIPE_FORMAT_Z24X8_UNORM
:
332 case PIPE_FORMAT_Z24_UNORM_S8_USCALED
:
333 return V_0280A0_SWAP_STD
;
335 case PIPE_FORMAT_X8Z24_UNORM
:
336 case PIPE_FORMAT_S8_USCALED_Z24_UNORM
:
337 return V_0280A0_SWAP_STD
;
339 case PIPE_FORMAT_R10G10B10A2_UNORM
:
340 case PIPE_FORMAT_R10G10B10X2_SNORM
:
341 case PIPE_FORMAT_B10G10R10A2_UNORM
:
342 case PIPE_FORMAT_R10SG10SB10SA2U_NORM
:
343 return V_0280A0_SWAP_STD_REV
;
345 /* 64-bit buffers. */
346 case PIPE_FORMAT_R16G16B16A16_UNORM
:
347 case PIPE_FORMAT_R16G16B16A16_SNORM
:
348 // return V_0280A0_COLOR_16_16_16_16;
349 case PIPE_FORMAT_R16G16B16A16_FLOAT
:
350 // return V_0280A0_COLOR_16_16_16_16_FLOAT;
352 /* 128-bit buffers. */
353 case PIPE_FORMAT_R32G32B32A32_FLOAT
:
354 // return V_0280A0_COLOR_32_32_32_32_FLOAT;
357 R600_ERR("unsupported colorswap format %d\n", format
);
363 static INLINE
uint32_t r600_translate_colorformat(enum pipe_format format
)
367 case PIPE_FORMAT_A8_UNORM
:
368 case PIPE_FORMAT_I8_UNORM
:
369 case PIPE_FORMAT_L8_UNORM
:
370 case PIPE_FORMAT_R8_UNORM
:
371 case PIPE_FORMAT_R8_SNORM
:
372 return V_0280A0_COLOR_8
;
374 /* 16-bit buffers. */
375 case PIPE_FORMAT_B5G6R5_UNORM
:
376 return V_0280A0_COLOR_5_6_5
;
378 case PIPE_FORMAT_B5G5R5A1_UNORM
:
379 case PIPE_FORMAT_B5G5R5X1_UNORM
:
380 return V_0280A0_COLOR_1_5_5_5
;
382 case PIPE_FORMAT_B4G4R4A4_UNORM
:
383 case PIPE_FORMAT_B4G4R4X4_UNORM
:
384 return V_0280A0_COLOR_4_4_4_4
;
386 case PIPE_FORMAT_Z16_UNORM
:
387 return V_0280A0_COLOR_16
;
389 case PIPE_FORMAT_L8A8_UNORM
:
390 return V_0280A0_COLOR_8_8
;
392 /* 32-bit buffers. */
393 case PIPE_FORMAT_A8B8G8R8_SRGB
:
394 case PIPE_FORMAT_A8B8G8R8_UNORM
:
395 case PIPE_FORMAT_A8R8G8B8_UNORM
:
396 case PIPE_FORMAT_B8G8R8A8_SRGB
:
397 case PIPE_FORMAT_B8G8R8A8_UNORM
:
398 case PIPE_FORMAT_B8G8R8X8_UNORM
:
399 case PIPE_FORMAT_R8G8B8A8_SNORM
:
400 case PIPE_FORMAT_R8G8B8A8_UNORM
:
401 case PIPE_FORMAT_R8G8B8X8_UNORM
:
402 case PIPE_FORMAT_R8SG8SB8UX8U_NORM
:
403 case PIPE_FORMAT_X8B8G8R8_UNORM
:
404 case PIPE_FORMAT_X8R8G8B8_UNORM
:
405 case PIPE_FORMAT_R8G8B8_UNORM
:
406 return V_0280A0_COLOR_8_8_8_8
;
408 case PIPE_FORMAT_R10G10B10A2_UNORM
:
409 case PIPE_FORMAT_R10G10B10X2_SNORM
:
410 case PIPE_FORMAT_B10G10R10A2_UNORM
:
411 case PIPE_FORMAT_R10SG10SB10SA2U_NORM
:
412 return V_0280A0_COLOR_10_10_10_2
;
414 case PIPE_FORMAT_Z24X8_UNORM
:
415 case PIPE_FORMAT_Z24_UNORM_S8_USCALED
:
416 return V_0280A0_COLOR_8_24
;
418 case PIPE_FORMAT_X8Z24_UNORM
:
419 case PIPE_FORMAT_S8_USCALED_Z24_UNORM
:
420 return V_0280A0_COLOR_24_8
;
422 case PIPE_FORMAT_R32_FLOAT
:
423 return V_0280A0_COLOR_32_FLOAT
;
425 case PIPE_FORMAT_R16G16_FLOAT
:
426 return V_0280A0_COLOR_16_16_FLOAT
;
428 case PIPE_FORMAT_R16G16_SSCALED
:
429 return V_0280A0_COLOR_16_16
;
432 /* 64-bit buffers. */
433 case PIPE_FORMAT_R16G16B16_USCALED
:
434 case PIPE_FORMAT_R16G16B16A16_USCALED
:
435 case PIPE_FORMAT_R16G16B16_SSCALED
:
436 case PIPE_FORMAT_R16G16B16A16_SSCALED
:
437 case PIPE_FORMAT_R16G16B16A16_UNORM
:
438 case PIPE_FORMAT_R16G16B16A16_SNORM
:
439 return V_0280A0_COLOR_16_16_16_16
;
441 case PIPE_FORMAT_R16G16B16_FLOAT
:
442 case PIPE_FORMAT_R16G16B16A16_FLOAT
:
443 return V_0280A0_COLOR_16_16_16_16_FLOAT
;
445 case PIPE_FORMAT_R32G32_FLOAT
:
446 return V_0280A0_COLOR_32_32_FLOAT
;
448 case PIPE_FORMAT_R32G32_USCALED
:
449 case PIPE_FORMAT_R32G32_SSCALED
:
450 return V_0280A0_COLOR_32_32
;
452 /* 128-bit buffers. */
453 case PIPE_FORMAT_R32G32B32_FLOAT
:
454 return V_0280A0_COLOR_32_32_32_FLOAT
;
455 case PIPE_FORMAT_R32G32B32A32_FLOAT
:
456 return V_0280A0_COLOR_32_32_32_32_FLOAT
;
459 case PIPE_FORMAT_UYVY
:
460 case PIPE_FORMAT_YUYV
:
462 R600_ERR("unsupported color format %d %s\n", format
, util_format_name(format
));
463 return ~0; /* Unsupported. */
467 static INLINE boolean
r600_is_sampler_format_supported(enum pipe_format format
)
469 return r600_translate_texformat(format
, NULL
, NULL
, NULL
) != ~0;
472 static INLINE boolean
r600_is_colorbuffer_format_supported(enum pipe_format format
)
474 return r600_translate_colorformat(format
) != ~0 &&
475 r600_translate_colorswap(format
) != ~0;
478 static INLINE boolean
r600_is_zs_format_supported(enum pipe_format format
)
480 return r600_translate_dbformat(format
) != ~0;
483 static INLINE boolean
r600_is_vertex_format_supported(enum pipe_format format
)
485 return r600_translate_colorformat(format
) != ~0;
488 static INLINE
uint32_t r600_translate_vertex_data_type(enum pipe_format format
)
491 const struct util_format_description
*desc
;
494 desc
= util_format_description(format
);
495 if (desc
->layout
!= UTIL_FORMAT_LAYOUT_PLAIN
) {
499 /* Find the first non-VOID channel. */
500 for (i
= 0; i
< 4; i
++) {
501 if (desc
->channel
[i
].type
!= UTIL_FORMAT_TYPE_VOID
) {
506 switch (desc
->channel
[i
].type
) {
507 /* Half-floats, floats, doubles */
508 case UTIL_FORMAT_TYPE_FLOAT
:
509 switch (desc
->channel
[i
].size
) {
511 switch (desc
->nr_channels
) {
513 result
= V_038008_FMT_16_FLOAT
;
516 result
= V_038008_FMT_16_16_FLOAT
;
519 result
= V_038008_FMT_16_16_16_FLOAT
;
522 result
= V_038008_FMT_16_16_16_16_FLOAT
;
527 switch (desc
->nr_channels
) {
529 result
= V_038008_FMT_32_FLOAT
;
532 result
= V_038008_FMT_32_32_FLOAT
;
535 result
= V_038008_FMT_32_32_32_FLOAT
;
538 result
= V_038008_FMT_32_32_32_32_FLOAT
;
547 case UTIL_FORMAT_TYPE_UNSIGNED
:
549 case UTIL_FORMAT_TYPE_SIGNED
:
550 switch (desc
->channel
[i
].size
) {
552 switch (desc
->nr_channels
) {
554 result
= V_038008_FMT_8
;
557 result
= V_038008_FMT_8_8
;
560 // result = V_038008_FMT_8_8_8; /* fails piglit draw-vertices test */
563 result
= V_038008_FMT_8_8_8_8
;
568 switch (desc
->nr_channels
) {
570 result
= V_038008_FMT_16
;
573 result
= V_038008_FMT_16_16
;
576 // result = V_038008_FMT_16_16_16; /* fails piglit draw-vertices test */
579 result
= V_038008_FMT_16_16_16_16
;
584 switch (desc
->nr_channels
) {
586 result
= V_038008_FMT_32
;
589 result
= V_038008_FMT_32_32
;
592 result
= V_038008_FMT_32_32_32
;
595 result
= V_038008_FMT_32_32_32_32
;
607 result
= S_038008_DATA_FORMAT(result
);
609 if (desc
->channel
[i
].type
== UTIL_FORMAT_TYPE_SIGNED
) {
610 result
|= S_038008_FORMAT_COMP_ALL(1);
612 if (desc
->channel
[i
].normalized
) {
613 result
|= S_038008_NUM_FORMAT_ALL(0);
615 result
|= S_038008_NUM_FORMAT_ALL(2);
619 R600_ERR("unsupported vertex format %s\n", util_format_name(format
));