r600g: fix polygon mode
[mesa.git] / src / gallium / drivers / r600 / r600_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 R600_STATE_INLINES_H
24 #define R600_STATE_INLINES_H
25
26 #include "util/u_format.h"
27 #include "r600d.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_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;
38 case PIPE_BLEND_MIN:
39 return V_028804_COMB_MIN_DST_SRC;
40 case PIPE_BLEND_MAX:
41 return V_028804_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_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;
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 }
136 }
137
138 /* translates straight */
139 static INLINE uint32_t r600_translate_ds_func(int func)
140 {
141 return func;
142 }
143
144 static inline unsigned r600_tex_wrap(unsigned wrap)
145 {
146 switch (wrap) {
147 default:
148 case PIPE_TEX_WRAP_REPEAT:
149 return V_03C000_SQ_TEX_WRAP;
150 case PIPE_TEX_WRAP_CLAMP:
151 return V_03C000_SQ_TEX_CLAMP_HALF_BORDER;
152 case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
153 return V_03C000_SQ_TEX_CLAMP_LAST_TEXEL;
154 case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
155 return V_03C000_SQ_TEX_CLAMP_BORDER;
156 case PIPE_TEX_WRAP_MIRROR_REPEAT:
157 return V_03C000_SQ_TEX_MIRROR;
158 case PIPE_TEX_WRAP_MIRROR_CLAMP:
159 return V_03C000_SQ_TEX_MIRROR_ONCE_HALF_BORDER;
160 case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
161 return V_03C000_SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
162 case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
163 return V_03C000_SQ_TEX_MIRROR_ONCE_BORDER;
164 }
165 }
166
167 static inline unsigned r600_tex_filter(unsigned filter)
168 {
169 switch (filter) {
170 default:
171 case PIPE_TEX_FILTER_NEAREST:
172 return V_03C000_SQ_TEX_XY_FILTER_POINT;
173 case PIPE_TEX_FILTER_LINEAR:
174 return V_03C000_SQ_TEX_XY_FILTER_BILINEAR;
175 }
176 }
177
178 static inline unsigned r600_tex_mipfilter(unsigned filter)
179 {
180 switch (filter) {
181 case PIPE_TEX_MIPFILTER_NEAREST:
182 return V_03C000_SQ_TEX_Z_FILTER_POINT;
183 case PIPE_TEX_MIPFILTER_LINEAR:
184 return V_03C000_SQ_TEX_Z_FILTER_LINEAR;
185 default:
186 case PIPE_TEX_MIPFILTER_NONE:
187 return V_03C000_SQ_TEX_Z_FILTER_NONE;
188 }
189 }
190
191 static inline unsigned r600_tex_compare(unsigned compare)
192 {
193 switch (compare) {
194 default:
195 case PIPE_FUNC_NEVER:
196 return V_03C000_SQ_TEX_DEPTH_COMPARE_NEVER;
197 case PIPE_FUNC_LESS:
198 return V_03C000_SQ_TEX_DEPTH_COMPARE_LESS;
199 case PIPE_FUNC_EQUAL:
200 return V_03C000_SQ_TEX_DEPTH_COMPARE_EQUAL;
201 case PIPE_FUNC_LEQUAL:
202 return V_03C000_SQ_TEX_DEPTH_COMPARE_LESSEQUAL;
203 case PIPE_FUNC_GREATER:
204 return V_03C000_SQ_TEX_DEPTH_COMPARE_GREATER;
205 case PIPE_FUNC_NOTEQUAL:
206 return V_03C000_SQ_TEX_DEPTH_COMPARE_NOTEQUAL;
207 case PIPE_FUNC_GEQUAL:
208 return V_03C000_SQ_TEX_DEPTH_COMPARE_GREATEREQUAL;
209 case PIPE_FUNC_ALWAYS:
210 return V_03C000_SQ_TEX_DEPTH_COMPARE_ALWAYS;
211 }
212 }
213
214 static inline unsigned r600_tex_swizzle(unsigned swizzle)
215 {
216 switch (swizzle) {
217 case PIPE_SWIZZLE_RED:
218 return V_038010_SQ_SEL_X;
219 case PIPE_SWIZZLE_GREEN:
220 return V_038010_SQ_SEL_Y;
221 case PIPE_SWIZZLE_BLUE:
222 return V_038010_SQ_SEL_Z;
223 case PIPE_SWIZZLE_ALPHA:
224 return V_038010_SQ_SEL_W;
225 case PIPE_SWIZZLE_ZERO:
226 return V_038010_SQ_SEL_0;
227 default:
228 case PIPE_SWIZZLE_ONE:
229 return V_038010_SQ_SEL_1;
230 }
231 }
232
233 static inline unsigned r600_format_type(unsigned format_type)
234 {
235 switch (format_type) {
236 default:
237 case UTIL_FORMAT_TYPE_UNSIGNED:
238 return V_038010_SQ_FORMAT_COMP_UNSIGNED;
239 case UTIL_FORMAT_TYPE_SIGNED:
240 return V_038010_SQ_FORMAT_COMP_SIGNED;
241 case UTIL_FORMAT_TYPE_FIXED:
242 return V_038010_SQ_FORMAT_COMP_UNSIGNED_BIASED;
243 }
244 }
245
246 static inline unsigned r600_tex_dim(unsigned dim)
247 {
248 switch (dim) {
249 default:
250 case PIPE_TEXTURE_1D:
251 return V_038000_SQ_TEX_DIM_1D;
252 case PIPE_TEXTURE_2D:
253 case PIPE_TEXTURE_RECT:
254 return V_038000_SQ_TEX_DIM_2D;
255 case PIPE_TEXTURE_3D:
256 return V_038000_SQ_TEX_DIM_3D;
257 case PIPE_TEXTURE_CUBE:
258 return V_038000_SQ_TEX_DIM_CUBEMAP;
259 }
260 }
261
262 static inline uint32_t r600_translate_dbformat(enum pipe_format format)
263 {
264 switch (format) {
265 case PIPE_FORMAT_Z16_UNORM:
266 return V_028010_DEPTH_16;
267 case PIPE_FORMAT_Z24X8_UNORM:
268 return V_028010_DEPTH_X8_24;
269 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
270 return V_028010_DEPTH_8_24;
271 default:
272 return ~0;
273 }
274 }
275
276 static inline uint32_t r600_translate_colorswap(enum pipe_format format)
277 {
278 switch (format) {
279 /* 8-bit buffers. */
280 case PIPE_FORMAT_A8_UNORM:
281 case PIPE_FORMAT_I8_UNORM:
282 case PIPE_FORMAT_L8_UNORM:
283 case PIPE_FORMAT_R8_UNORM:
284 case PIPE_FORMAT_R8_SNORM:
285 return V_0280A0_SWAP_STD;
286
287 /* 16-bit buffers. */
288 case PIPE_FORMAT_B5G6R5_UNORM:
289 return V_0280A0_SWAP_STD_REV;
290
291 case PIPE_FORMAT_B5G5R5A1_UNORM:
292 case PIPE_FORMAT_B5G5R5X1_UNORM:
293 return V_0280A0_SWAP_ALT;
294
295 case PIPE_FORMAT_B4G4R4A4_UNORM:
296 case PIPE_FORMAT_B4G4R4X4_UNORM:
297 return V_0280A0_SWAP_ALT;
298
299 case PIPE_FORMAT_Z16_UNORM:
300 return V_0280A0_SWAP_STD;
301
302 /* 32-bit buffers. */
303
304 case PIPE_FORMAT_A8B8G8R8_SRGB:
305 return V_0280A0_SWAP_STD_REV;
306 case PIPE_FORMAT_B8G8R8A8_SRGB:
307 return V_0280A0_SWAP_ALT;
308
309 case PIPE_FORMAT_B8G8R8A8_UNORM:
310 case PIPE_FORMAT_B8G8R8X8_UNORM:
311 return V_0280A0_SWAP_ALT;
312
313 case PIPE_FORMAT_A8R8G8B8_UNORM:
314 case PIPE_FORMAT_X8R8G8B8_UNORM:
315 return V_0280A0_SWAP_ALT_REV;
316 case PIPE_FORMAT_R8G8B8A8_SNORM:
317 case PIPE_FORMAT_R8G8B8X8_UNORM:
318 return V_0280A0_SWAP_STD;
319
320 case PIPE_FORMAT_A8B8G8R8_UNORM:
321 case PIPE_FORMAT_X8B8G8R8_UNORM:
322 // case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
323 return V_0280A0_SWAP_STD_REV;
324
325 case PIPE_FORMAT_Z24X8_UNORM:
326 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
327 return V_0280A0_SWAP_STD;
328
329 case PIPE_FORMAT_X8Z24_UNORM:
330 case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
331 return V_0280A0_SWAP_STD;
332
333 case PIPE_FORMAT_R10G10B10A2_UNORM:
334 case PIPE_FORMAT_R10G10B10X2_SNORM:
335 case PIPE_FORMAT_B10G10R10A2_UNORM:
336 case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
337 return V_0280A0_SWAP_STD_REV;
338
339 /* 64-bit buffers. */
340 case PIPE_FORMAT_R16G16B16A16_UNORM:
341 case PIPE_FORMAT_R16G16B16A16_SNORM:
342 // return V_0280A0_COLOR_16_16_16_16;
343 case PIPE_FORMAT_R16G16B16A16_FLOAT:
344 // return V_0280A0_COLOR_16_16_16_16_FLOAT;
345
346 /* 128-bit buffers. */
347 case PIPE_FORMAT_R32G32B32A32_FLOAT:
348 // return V_0280A0_COLOR_32_32_32_32_FLOAT;
349 return 0;
350 default:
351 R600_ERR("unsupported colorswap format %d\n", format);
352 return ~0;
353 }
354 return ~0;
355 }
356
357 static INLINE uint32_t r600_translate_colorformat(enum pipe_format format)
358 {
359 switch (format) {
360 /* 8-bit buffers. */
361 case PIPE_FORMAT_A8_UNORM:
362 case PIPE_FORMAT_I8_UNORM:
363 case PIPE_FORMAT_L8_UNORM:
364 case PIPE_FORMAT_R8_UNORM:
365 case PIPE_FORMAT_R8_SNORM:
366 return V_0280A0_COLOR_8;
367
368 /* 16-bit buffers. */
369 case PIPE_FORMAT_B5G6R5_UNORM:
370 return V_0280A0_COLOR_5_6_5;
371
372 case PIPE_FORMAT_B5G5R5A1_UNORM:
373 case PIPE_FORMAT_B5G5R5X1_UNORM:
374 return V_0280A0_COLOR_1_5_5_5;
375
376 case PIPE_FORMAT_B4G4R4A4_UNORM:
377 case PIPE_FORMAT_B4G4R4X4_UNORM:
378 return V_0280A0_COLOR_4_4_4_4;
379
380 case PIPE_FORMAT_Z16_UNORM:
381 return V_0280A0_COLOR_16;
382
383 /* 32-bit buffers. */
384 case PIPE_FORMAT_A8B8G8R8_SRGB:
385 case PIPE_FORMAT_A8B8G8R8_UNORM:
386 case PIPE_FORMAT_A8R8G8B8_UNORM:
387 case PIPE_FORMAT_B8G8R8A8_SRGB:
388 case PIPE_FORMAT_B8G8R8A8_UNORM:
389 case PIPE_FORMAT_B8G8R8X8_UNORM:
390 case PIPE_FORMAT_R8G8B8A8_SNORM:
391 case PIPE_FORMAT_R8G8B8A8_UNORM:
392 case PIPE_FORMAT_R8G8B8X8_UNORM:
393 case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
394 case PIPE_FORMAT_X8B8G8R8_UNORM:
395 case PIPE_FORMAT_X8R8G8B8_UNORM:
396 case PIPE_FORMAT_R8G8B8_UNORM:
397 return V_0280A0_COLOR_8_8_8_8;
398
399 case PIPE_FORMAT_R10G10B10A2_UNORM:
400 case PIPE_FORMAT_R10G10B10X2_SNORM:
401 case PIPE_FORMAT_B10G10R10A2_UNORM:
402 case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
403 return V_0280A0_COLOR_10_10_10_2;
404
405 case PIPE_FORMAT_Z24X8_UNORM:
406 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
407 return V_0280A0_COLOR_8_24;
408
409 case PIPE_FORMAT_X8Z24_UNORM:
410 case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
411 return V_0280A0_COLOR_24_8;
412
413 case PIPE_FORMAT_R32_FLOAT:
414 return V_0280A0_COLOR_32_FLOAT;
415
416 case PIPE_FORMAT_R16G16_FLOAT:
417 return V_0280A0_COLOR_16_16_FLOAT;
418
419 case PIPE_FORMAT_R16G16_SSCALED:
420 return V_0280A0_COLOR_16_16;
421
422
423 /* 64-bit buffers. */
424 case PIPE_FORMAT_R16G16B16_USCALED:
425 case PIPE_FORMAT_R16G16B16A16_USCALED:
426 case PIPE_FORMAT_R16G16B16_SSCALED:
427 case PIPE_FORMAT_R16G16B16A16_SSCALED:
428 case PIPE_FORMAT_R16G16B16A16_UNORM:
429 case PIPE_FORMAT_R16G16B16A16_SNORM:
430 return V_0280A0_COLOR_16_16_16_16;
431
432 case PIPE_FORMAT_R16G16B16_FLOAT:
433 case PIPE_FORMAT_R16G16B16A16_FLOAT:
434 return V_0280A0_COLOR_16_16_16_16_FLOAT;
435
436 case PIPE_FORMAT_R32G32_FLOAT:
437 return V_0280A0_COLOR_32_32_FLOAT;
438
439 case PIPE_FORMAT_R32G32_USCALED:
440 case PIPE_FORMAT_R32G32_SSCALED:
441 return V_0280A0_COLOR_32_32;
442
443 /* 128-bit buffers. */
444 case PIPE_FORMAT_R32G32B32_FLOAT:
445 return V_0280A0_COLOR_32_32_32_FLOAT;
446 case PIPE_FORMAT_R32G32B32A32_FLOAT:
447 return V_0280A0_COLOR_32_32_32_32_FLOAT;
448
449 /* YUV buffers. */
450 case PIPE_FORMAT_UYVY:
451 case PIPE_FORMAT_YUYV:
452 default:
453 R600_ERR("unsupported color format %d %s\n", format, util_format_name(format));
454 return ~0; /* Unsupported. */
455 }
456 }
457
458 static INLINE void r600_translate_vertex_num_format(enum pipe_format format, uint32_t *num_format_p,
459 uint32_t *format_comp_p)
460 {
461 uint32_t num_format = 0, format_comp = 0;
462 switch (format) {
463 case PIPE_FORMAT_R16G16B16A16_SSCALED:
464 case PIPE_FORMAT_R16G16B16_SSCALED:
465 case PIPE_FORMAT_R16G16_SSCALED:
466 case PIPE_FORMAT_R32G32_SSCALED:
467 format_comp = 1;
468 case PIPE_FORMAT_R16G16B16A16_USCALED:
469 case PIPE_FORMAT_R16G16B16_USCALED:
470 case PIPE_FORMAT_R16G16_USCALED:
471 case PIPE_FORMAT_R32G32_USCALED:
472 num_format = V_038008_SQ_NUM_FORMAT_SCALED;
473 break;
474 default:
475 break;
476 }
477 *num_format_p = num_format;
478 *format_comp_p = format_comp;
479 }
480
481 static INLINE boolean r600_is_sampler_format_supported(enum pipe_format format)
482 {
483 return r600_translate_texformat(format, NULL, NULL, NULL) != ~0;
484 }
485
486 static INLINE boolean r600_is_colorbuffer_format_supported(enum pipe_format format)
487 {
488 return r600_translate_colorformat(format) != ~0 &&
489 r600_translate_colorswap(format) != ~0;
490 }
491
492 static INLINE boolean r600_is_zs_format_supported(enum pipe_format format)
493 {
494 return r600_translate_dbformat(format) != ~0;
495 }
496
497 static INLINE boolean r600_is_vertex_format_supported(enum pipe_format format)
498 {
499 return r600_translate_colorformat(format) != ~0;
500 }
501
502 #endif