r600g: fixup z format translations.
[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_INVERT;
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 /* translates straight */
127 static INLINE uint32_t r600_translate_ds_func(int func)
128 {
129 return func;
130 }
131
132 static uint32_t r600_translate_dbformat(enum pipe_format format)
133 {
134 switch (format) {
135 case PIPE_FORMAT_Z16_UNORM:
136 return V_028010_DEPTH_16;
137 case PIPE_FORMAT_Z24X8_UNORM:
138 return V_028010_DEPTH_X8_24;
139 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
140 return V_028010_DEPTH_8_24;
141 default:
142 return ~0;
143 }
144 }
145
146 static uint32_t r600_translate_colorswap(enum pipe_format format)
147 {
148 switch (format) {
149 /* 8-bit buffers. */
150 case PIPE_FORMAT_A8_UNORM:
151 case PIPE_FORMAT_I8_UNORM:
152 case PIPE_FORMAT_L8_UNORM:
153 case PIPE_FORMAT_R8_UNORM:
154 case PIPE_FORMAT_R8_SNORM:
155 return SWAP_STD;
156
157 /* 16-bit buffers. */
158 case PIPE_FORMAT_B5G6R5_UNORM:
159 return SWAP_STD_REV;
160
161 case PIPE_FORMAT_B5G5R5A1_UNORM:
162 case PIPE_FORMAT_B5G5R5X1_UNORM:
163 return SWAP_ALT;
164
165 case PIPE_FORMAT_B4G4R4A4_UNORM:
166 case PIPE_FORMAT_B4G4R4X4_UNORM:
167 return SWAP_ALT;
168 /* 32-bit buffers. */
169 case PIPE_FORMAT_B8G8R8A8_UNORM:
170 case PIPE_FORMAT_B8G8R8X8_UNORM:
171 return SWAP_ALT;
172
173 case PIPE_FORMAT_A8R8G8B8_UNORM:
174 case PIPE_FORMAT_X8R8G8B8_UNORM:
175 return SWAP_ALT_REV;
176 case PIPE_FORMAT_R8G8B8A8_SNORM:
177 case PIPE_FORMAT_R8G8B8X8_UNORM:
178 return SWAP_STD;
179
180 case PIPE_FORMAT_A8B8G8R8_UNORM:
181 case PIPE_FORMAT_X8B8G8R8_UNORM:
182 // case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
183 return SWAP_STD_REV;
184
185 case PIPE_FORMAT_Z24X8_UNORM:
186 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
187 return SWAP_STD;
188
189 case PIPE_FORMAT_R10G10B10A2_UNORM:
190 case PIPE_FORMAT_R10G10B10X2_SNORM:
191 case PIPE_FORMAT_B10G10R10A2_UNORM:
192 case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
193 return SWAP_STD_REV;
194
195 /* 64-bit buffers. */
196 case PIPE_FORMAT_R16G16B16A16_UNORM:
197 case PIPE_FORMAT_R16G16B16A16_SNORM:
198 // return V_0280A0_COLOR_16_16_16_16;
199 case PIPE_FORMAT_R16G16B16A16_FLOAT:
200 // return V_0280A0_COLOR_16_16_16_16_FLOAT;
201
202 /* 128-bit buffers. */
203 case PIPE_FORMAT_R32G32B32A32_FLOAT:
204 // return V_0280A0_COLOR_32_32_32_32_FLOAT;
205 return 0;
206 default:
207 R600_ERR("unsupported colorswap format %d\n", format);
208 return ~0;
209 }
210 return ~0;
211
212 }
213
214 static INLINE uint32_t r600_translate_colorformat(enum pipe_format format)
215 {
216 switch (format) {
217 /* 8-bit buffers. */
218 case PIPE_FORMAT_A8_UNORM:
219 case PIPE_FORMAT_I8_UNORM:
220 case PIPE_FORMAT_L8_UNORM:
221 case PIPE_FORMAT_R8_UNORM:
222 case PIPE_FORMAT_R8_SNORM:
223 return V_0280A0_COLOR_8;
224
225 /* 16-bit buffers. */
226 case PIPE_FORMAT_B5G6R5_UNORM:
227 return V_0280A0_COLOR_5_6_5;
228
229 case PIPE_FORMAT_B5G5R5A1_UNORM:
230 case PIPE_FORMAT_B5G5R5X1_UNORM:
231 return V_0280A0_COLOR_1_5_5_5;
232
233 case PIPE_FORMAT_B4G4R4A4_UNORM:
234 case PIPE_FORMAT_B4G4R4X4_UNORM:
235 return V_0280A0_COLOR_4_4_4_4;
236
237 /* 32-bit buffers. */
238 case PIPE_FORMAT_B8G8R8A8_UNORM:
239 case PIPE_FORMAT_B8G8R8X8_UNORM:
240 case PIPE_FORMAT_A8R8G8B8_UNORM:
241 case PIPE_FORMAT_X8R8G8B8_UNORM:
242 case PIPE_FORMAT_A8B8G8R8_UNORM:
243 case PIPE_FORMAT_R8G8B8A8_SNORM:
244 case PIPE_FORMAT_X8B8G8R8_UNORM:
245 case PIPE_FORMAT_R8G8B8X8_UNORM:
246 case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
247 return V_0280A0_COLOR_8_8_8_8;
248
249 case PIPE_FORMAT_R10G10B10A2_UNORM:
250 case PIPE_FORMAT_R10G10B10X2_SNORM:
251 case PIPE_FORMAT_B10G10R10A2_UNORM:
252 case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
253 return V_0280A0_COLOR_10_10_10_2;
254
255 case PIPE_FORMAT_Z24X8_UNORM:
256 case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
257 return V_0280A0_COLOR_24_8;
258
259 /* 64-bit buffers. */
260 case PIPE_FORMAT_R16G16B16A16_UNORM:
261 case PIPE_FORMAT_R16G16B16A16_SNORM:
262 return V_0280A0_COLOR_16_16_16_16;
263 case PIPE_FORMAT_R16G16B16A16_FLOAT:
264 return V_0280A0_COLOR_16_16_16_16_FLOAT;
265 case PIPE_FORMAT_R32G32_FLOAT:
266 return V_0280A0_COLOR_32_32_FLOAT;
267
268 /* 128-bit buffers. */
269 case PIPE_FORMAT_R32G32B32_FLOAT:
270 case PIPE_FORMAT_R32G32B32A32_FLOAT:
271 return V_0280A0_COLOR_32_32_32_32_FLOAT;
272
273 /* YUV buffers. */
274 case PIPE_FORMAT_UYVY:
275 // return R300_COLOR_FORMAT_YVYU;
276 case PIPE_FORMAT_YUYV:
277 // return R300_COLOR_FORMAT_VYUY;
278 default:
279 return ~0; /* Unsupported. */
280 }
281 }
282
283 static INLINE boolean r600_is_sampler_format_supported(enum pipe_format format)
284 {
285 return r600_translate_colorformat(format) != ~0;
286 }
287
288 static INLINE boolean r600_is_colorbuffer_format_supported(enum pipe_format format)
289 {
290 return r600_translate_colorformat(format) != ~0 &&
291 r600_translate_colorswap(format) != ~0;
292 }
293
294 static INLINE boolean r600_is_zs_format_supported(enum pipe_format format)
295 {
296 return r600_translate_dbformat(format) != ~0;
297 }
298
299 static INLINE boolean r600_is_vertex_format_supported(enum pipe_format format)
300 {
301 return r600_translate_colorformat(format) != ~0;
302 }
303
304 #endif