android: gallium/radeon: attempt to fix the android build
[mesa.git] / src / gallium / drivers / ilo / ilo_format.c
1 /*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 2012-2013 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 * Chia-I Wu <olv@lunarg.com>
26 */
27
28 #include "genhw/genhw.h"
29 #include "vl/vl_video_buffer.h"
30
31 #include "ilo_screen.h"
32 #include "ilo_format.h"
33
34 struct ilo_vf_cap {
35 int vertex_element;
36 };
37
38 struct ilo_sol_cap {
39 int buffer;
40 };
41
42 struct ilo_sampler_cap {
43 int sampling;
44 int filtering;
45 int shadow_map;
46 int chroma_key;
47 };
48
49 struct ilo_dp_cap {
50 int rt_write;
51 int rt_write_blending;
52 int typed_write;
53 int media_color_processing;
54 };
55
56 /*
57 * This table is based on:
58 *
59 * - the Sandy Bridge PRM, volume 4 part 1, page 88-97
60 * - the Ivy Bridge PRM, volume 2 part 1, page 97-99
61 * - the Haswell PRM, volume 7, page 467-470
62 */
63 static const struct ilo_vf_cap ilo_vf_caps[] = {
64 #define CAP(vertex_element) { ILO_GEN(vertex_element) }
65 [GEN6_FORMAT_R32G32B32A32_FLOAT] = CAP( 1),
66 [GEN6_FORMAT_R32G32B32A32_SINT] = CAP( 1),
67 [GEN6_FORMAT_R32G32B32A32_UINT] = CAP( 1),
68 [GEN6_FORMAT_R32G32B32A32_UNORM] = CAP( 1),
69 [GEN6_FORMAT_R32G32B32A32_SNORM] = CAP( 1),
70 [GEN6_FORMAT_R64G64_FLOAT] = CAP( 1),
71 [GEN6_FORMAT_R32G32B32A32_SSCALED] = CAP( 1),
72 [GEN6_FORMAT_R32G32B32A32_USCALED] = CAP( 1),
73 [GEN6_FORMAT_R32G32B32A32_SFIXED] = CAP(7.5),
74 [GEN6_FORMAT_R32G32B32_FLOAT] = CAP( 1),
75 [GEN6_FORMAT_R32G32B32_SINT] = CAP( 1),
76 [GEN6_FORMAT_R32G32B32_UINT] = CAP( 1),
77 [GEN6_FORMAT_R32G32B32_UNORM] = CAP( 1),
78 [GEN6_FORMAT_R32G32B32_SNORM] = CAP( 1),
79 [GEN6_FORMAT_R32G32B32_SSCALED] = CAP( 1),
80 [GEN6_FORMAT_R32G32B32_USCALED] = CAP( 1),
81 [GEN6_FORMAT_R32G32B32_SFIXED] = CAP(7.5),
82 [GEN6_FORMAT_R16G16B16A16_UNORM] = CAP( 1),
83 [GEN6_FORMAT_R16G16B16A16_SNORM] = CAP( 1),
84 [GEN6_FORMAT_R16G16B16A16_SINT] = CAP( 1),
85 [GEN6_FORMAT_R16G16B16A16_UINT] = CAP( 1),
86 [GEN6_FORMAT_R16G16B16A16_FLOAT] = CAP( 1),
87 [GEN6_FORMAT_R32G32_FLOAT] = CAP( 1),
88 [GEN6_FORMAT_R32G32_SINT] = CAP( 1),
89 [GEN6_FORMAT_R32G32_UINT] = CAP( 1),
90 [GEN6_FORMAT_R32G32_UNORM] = CAP( 1),
91 [GEN6_FORMAT_R32G32_SNORM] = CAP( 1),
92 [GEN6_FORMAT_R64_FLOAT] = CAP( 1),
93 [GEN6_FORMAT_R16G16B16A16_SSCALED] = CAP( 1),
94 [GEN6_FORMAT_R16G16B16A16_USCALED] = CAP( 1),
95 [GEN6_FORMAT_R32G32_SSCALED] = CAP( 1),
96 [GEN6_FORMAT_R32G32_USCALED] = CAP( 1),
97 [GEN6_FORMAT_R32G32_SFIXED] = CAP(7.5),
98 [GEN6_FORMAT_B8G8R8A8_UNORM] = CAP( 1),
99 [GEN6_FORMAT_R10G10B10A2_UNORM] = CAP( 1),
100 [GEN6_FORMAT_R10G10B10A2_UINT] = CAP( 1),
101 [GEN6_FORMAT_R10G10B10_SNORM_A2_UNORM] = CAP( 1),
102 [GEN6_FORMAT_R8G8B8A8_UNORM] = CAP( 1),
103 [GEN6_FORMAT_R8G8B8A8_SNORM] = CAP( 1),
104 [GEN6_FORMAT_R8G8B8A8_SINT] = CAP( 1),
105 [GEN6_FORMAT_R8G8B8A8_UINT] = CAP( 1),
106 [GEN6_FORMAT_R16G16_UNORM] = CAP( 1),
107 [GEN6_FORMAT_R16G16_SNORM] = CAP( 1),
108 [GEN6_FORMAT_R16G16_SINT] = CAP( 1),
109 [GEN6_FORMAT_R16G16_UINT] = CAP( 1),
110 [GEN6_FORMAT_R16G16_FLOAT] = CAP( 1),
111 [GEN6_FORMAT_B10G10R10A2_UNORM] = CAP(7.5),
112 [GEN6_FORMAT_R11G11B10_FLOAT] = CAP( 1),
113 [GEN6_FORMAT_R32_SINT] = CAP( 1),
114 [GEN6_FORMAT_R32_UINT] = CAP( 1),
115 [GEN6_FORMAT_R32_FLOAT] = CAP( 1),
116 [GEN6_FORMAT_R32_UNORM] = CAP( 1),
117 [GEN6_FORMAT_R32_SNORM] = CAP( 1),
118 [GEN6_FORMAT_R10G10B10X2_USCALED] = CAP( 1),
119 [GEN6_FORMAT_R8G8B8A8_SSCALED] = CAP( 1),
120 [GEN6_FORMAT_R8G8B8A8_USCALED] = CAP( 1),
121 [GEN6_FORMAT_R16G16_SSCALED] = CAP( 1),
122 [GEN6_FORMAT_R16G16_USCALED] = CAP( 1),
123 [GEN6_FORMAT_R32_SSCALED] = CAP( 1),
124 [GEN6_FORMAT_R32_USCALED] = CAP( 1),
125 [GEN6_FORMAT_R8G8_UNORM] = CAP( 1),
126 [GEN6_FORMAT_R8G8_SNORM] = CAP( 1),
127 [GEN6_FORMAT_R8G8_SINT] = CAP( 1),
128 [GEN6_FORMAT_R8G8_UINT] = CAP( 1),
129 [GEN6_FORMAT_R16_UNORM] = CAP( 1),
130 [GEN6_FORMAT_R16_SNORM] = CAP( 1),
131 [GEN6_FORMAT_R16_SINT] = CAP( 1),
132 [GEN6_FORMAT_R16_UINT] = CAP( 1),
133 [GEN6_FORMAT_R16_FLOAT] = CAP( 1),
134 [GEN6_FORMAT_R8G8_SSCALED] = CAP( 1),
135 [GEN6_FORMAT_R8G8_USCALED] = CAP( 1),
136 [GEN6_FORMAT_R16_SSCALED] = CAP( 1),
137 [GEN6_FORMAT_R16_USCALED] = CAP( 1),
138 [GEN6_FORMAT_R8_UNORM] = CAP( 1),
139 [GEN6_FORMAT_R8_SNORM] = CAP( 1),
140 [GEN6_FORMAT_R8_SINT] = CAP( 1),
141 [GEN6_FORMAT_R8_UINT] = CAP( 1),
142 [GEN6_FORMAT_R8_SSCALED] = CAP( 1),
143 [GEN6_FORMAT_R8_USCALED] = CAP( 1),
144 [GEN6_FORMAT_R8G8B8_UNORM] = CAP( 1),
145 [GEN6_FORMAT_R8G8B8_SNORM] = CAP( 1),
146 [GEN6_FORMAT_R8G8B8_SSCALED] = CAP( 1),
147 [GEN6_FORMAT_R8G8B8_USCALED] = CAP( 1),
148 [GEN6_FORMAT_R64G64B64A64_FLOAT] = CAP( 1),
149 [GEN6_FORMAT_R64G64B64_FLOAT] = CAP( 1),
150 [GEN6_FORMAT_R16G16B16_FLOAT] = CAP( 6),
151 [GEN6_FORMAT_R16G16B16_UNORM] = CAP( 1),
152 [GEN6_FORMAT_R16G16B16_SNORM] = CAP( 1),
153 [GEN6_FORMAT_R16G16B16_SSCALED] = CAP( 1),
154 [GEN6_FORMAT_R16G16B16_USCALED] = CAP( 1),
155 [GEN6_FORMAT_R16G16B16_UINT] = CAP(7.5),
156 [GEN6_FORMAT_R16G16B16_SINT] = CAP(7.5),
157 [GEN6_FORMAT_R32_SFIXED] = CAP(7.5),
158 [GEN6_FORMAT_R10G10B10A2_SNORM] = CAP(7.5),
159 [GEN6_FORMAT_R10G10B10A2_USCALED] = CAP(7.5),
160 [GEN6_FORMAT_R10G10B10A2_SSCALED] = CAP(7.5),
161 [GEN6_FORMAT_R10G10B10A2_SINT] = CAP(7.5),
162 [GEN6_FORMAT_B10G10R10A2_SNORM] = CAP(7.5),
163 [GEN6_FORMAT_B10G10R10A2_USCALED] = CAP(7.5),
164 [GEN6_FORMAT_B10G10R10A2_SSCALED] = CAP(7.5),
165 [GEN6_FORMAT_B10G10R10A2_UINT] = CAP(7.5),
166 [GEN6_FORMAT_B10G10R10A2_SINT] = CAP(7.5),
167 [GEN6_FORMAT_R8G8B8_UINT] = CAP(7.5),
168 [GEN6_FORMAT_R8G8B8_SINT] = CAP(7.5),
169 #undef CAP
170 };
171
172 /*
173 * This table is based on:
174 *
175 * - the Sandy Bridge PRM, volume 4 part 1, page 88-97
176 * - the Ivy Bridge PRM, volume 2 part 1, page 195
177 * - the Haswell PRM, volume 7, page 535
178 */
179 static const struct ilo_sol_cap ilo_sol_caps[] = {
180 #define CAP(buffer) { ILO_GEN(buffer) }
181 [GEN6_FORMAT_R32G32B32A32_FLOAT] = CAP( 1),
182 [GEN6_FORMAT_R32G32B32A32_SINT] = CAP( 1),
183 [GEN6_FORMAT_R32G32B32A32_UINT] = CAP( 1),
184 [GEN6_FORMAT_R32G32B32_FLOAT] = CAP( 1),
185 [GEN6_FORMAT_R32G32B32_SINT] = CAP( 1),
186 [GEN6_FORMAT_R32G32B32_UINT] = CAP( 1),
187 [GEN6_FORMAT_R32G32_FLOAT] = CAP( 1),
188 [GEN6_FORMAT_R32G32_SINT] = CAP( 1),
189 [GEN6_FORMAT_R32G32_UINT] = CAP( 1),
190 [GEN6_FORMAT_R32_SINT] = CAP( 1),
191 [GEN6_FORMAT_R32_UINT] = CAP( 1),
192 [GEN6_FORMAT_R32_FLOAT] = CAP( 1),
193 #undef CAP
194 };
195
196 /*
197 * This table is based on:
198 *
199 * - the Sandy Bridge PRM, volume 4 part 1, page 88-97
200 * - the Ivy Bridge PRM, volume 4 part 1, page 84-87
201 */
202 static const struct ilo_sampler_cap ilo_sampler_caps[] = {
203 #define CAP(sampling, filtering, shadow_map, chroma_key) \
204 { ILO_GEN(sampling), ILO_GEN(filtering), ILO_GEN(shadow_map), ILO_GEN(chroma_key) }
205 [GEN6_FORMAT_R32G32B32A32_FLOAT] = CAP( 1, 5, 0, 0),
206 [GEN6_FORMAT_R32G32B32A32_SINT] = CAP( 1, 0, 0, 0),
207 [GEN6_FORMAT_R32G32B32A32_UINT] = CAP( 1, 0, 0, 0),
208 [GEN6_FORMAT_R32G32B32X32_FLOAT] = CAP( 1, 5, 0, 0),
209 [GEN6_FORMAT_R32G32B32_FLOAT] = CAP( 1, 5, 0, 0),
210 [GEN6_FORMAT_R32G32B32_SINT] = CAP( 1, 0, 0, 0),
211 [GEN6_FORMAT_R32G32B32_UINT] = CAP( 1, 0, 0, 0),
212 [GEN6_FORMAT_R16G16B16A16_UNORM] = CAP( 1, 1, 0, 0),
213 [GEN6_FORMAT_R16G16B16A16_SNORM] = CAP( 1, 1, 0, 0),
214 [GEN6_FORMAT_R16G16B16A16_SINT] = CAP( 1, 0, 0, 0),
215 [GEN6_FORMAT_R16G16B16A16_UINT] = CAP( 1, 0, 0, 0),
216 [GEN6_FORMAT_R16G16B16A16_FLOAT] = CAP( 1, 1, 0, 0),
217 [GEN6_FORMAT_R32G32_FLOAT] = CAP( 1, 5, 0, 0),
218 [GEN6_FORMAT_R32G32_SINT] = CAP( 1, 0, 0, 0),
219 [GEN6_FORMAT_R32G32_UINT] = CAP( 1, 0, 0, 0),
220 [GEN6_FORMAT_R32_FLOAT_X8X24_TYPELESS] = CAP( 1, 5, 1, 0),
221 [GEN6_FORMAT_X32_TYPELESS_G8X24_UINT] = CAP( 1, 0, 0, 0),
222 [GEN6_FORMAT_L32A32_FLOAT] = CAP( 1, 5, 0, 0),
223 [GEN6_FORMAT_R16G16B16X16_UNORM] = CAP( 1, 1, 0, 0),
224 [GEN6_FORMAT_R16G16B16X16_FLOAT] = CAP( 1, 1, 0, 0),
225 [GEN6_FORMAT_A32X32_FLOAT] = CAP( 1, 5, 0, 0),
226 [GEN6_FORMAT_L32X32_FLOAT] = CAP( 1, 5, 0, 0),
227 [GEN6_FORMAT_I32X32_FLOAT] = CAP( 1, 5, 0, 0),
228 [GEN6_FORMAT_B8G8R8A8_UNORM] = CAP( 1, 1, 0, 1),
229 [GEN6_FORMAT_B8G8R8A8_UNORM_SRGB] = CAP( 1, 1, 0, 0),
230 [GEN6_FORMAT_R10G10B10A2_UNORM] = CAP( 1, 1, 0, 0),
231 [GEN6_FORMAT_R10G10B10A2_UNORM_SRGB] = CAP( 1, 1, 0, 0),
232 [GEN6_FORMAT_R10G10B10A2_UINT] = CAP( 1, 0, 0, 0),
233 [GEN6_FORMAT_R10G10B10_SNORM_A2_UNORM] = CAP( 1, 1, 0, 0),
234 [GEN6_FORMAT_R8G8B8A8_UNORM] = CAP( 1, 1, 0, 0),
235 [GEN6_FORMAT_R8G8B8A8_UNORM_SRGB] = CAP( 1, 1, 0, 0),
236 [GEN6_FORMAT_R8G8B8A8_SNORM] = CAP( 1, 1, 0, 0),
237 [GEN6_FORMAT_R8G8B8A8_SINT] = CAP( 1, 0, 0, 0),
238 [GEN6_FORMAT_R8G8B8A8_UINT] = CAP( 1, 0, 0, 0),
239 [GEN6_FORMAT_R16G16_UNORM] = CAP( 1, 1, 0, 0),
240 [GEN6_FORMAT_R16G16_SNORM] = CAP( 1, 1, 0, 0),
241 [GEN6_FORMAT_R16G16_SINT] = CAP( 1, 0, 0, 0),
242 [GEN6_FORMAT_R16G16_UINT] = CAP( 1, 0, 0, 0),
243 [GEN6_FORMAT_R16G16_FLOAT] = CAP( 1, 1, 0, 0),
244 [GEN6_FORMAT_B10G10R10A2_UNORM] = CAP( 1, 1, 0, 0),
245 [GEN6_FORMAT_B10G10R10A2_UNORM_SRGB] = CAP( 1, 1, 0, 0),
246 [GEN6_FORMAT_R11G11B10_FLOAT] = CAP( 1, 1, 0, 0),
247 [GEN6_FORMAT_R32_SINT] = CAP( 1, 0, 0, 0),
248 [GEN6_FORMAT_R32_UINT] = CAP( 1, 0, 0, 0),
249 [GEN6_FORMAT_R32_FLOAT] = CAP( 1, 5, 1, 0),
250 [GEN6_FORMAT_R24_UNORM_X8_TYPELESS] = CAP( 1, 5, 1, 0),
251 [GEN6_FORMAT_X24_TYPELESS_G8_UINT] = CAP( 1, 0, 0, 0),
252 [GEN6_FORMAT_L16A16_UNORM] = CAP( 1, 1, 0, 0),
253 [GEN6_FORMAT_I24X8_UNORM] = CAP( 1, 5, 1, 0),
254 [GEN6_FORMAT_L24X8_UNORM] = CAP( 1, 5, 1, 0),
255 [GEN6_FORMAT_A24X8_UNORM] = CAP( 1, 5, 1, 0),
256 [GEN6_FORMAT_I32_FLOAT] = CAP( 1, 5, 1, 0),
257 [GEN6_FORMAT_L32_FLOAT] = CAP( 1, 5, 1, 0),
258 [GEN6_FORMAT_A32_FLOAT] = CAP( 1, 5, 1, 0),
259 [GEN6_FORMAT_B8G8R8X8_UNORM] = CAP( 1, 1, 0, 1),
260 [GEN6_FORMAT_B8G8R8X8_UNORM_SRGB] = CAP( 1, 1, 0, 0),
261 [GEN6_FORMAT_R8G8B8X8_UNORM] = CAP( 1, 1, 0, 0),
262 [GEN6_FORMAT_R8G8B8X8_UNORM_SRGB] = CAP( 1, 1, 0, 0),
263 [GEN6_FORMAT_R9G9B9E5_SHAREDEXP] = CAP( 1, 1, 0, 0),
264 [GEN6_FORMAT_B10G10R10X2_UNORM] = CAP( 1, 1, 0, 0),
265 [GEN6_FORMAT_L16A16_FLOAT] = CAP( 1, 1, 0, 0),
266 [GEN6_FORMAT_B5G6R5_UNORM] = CAP( 1, 1, 0, 1),
267 [GEN6_FORMAT_B5G6R5_UNORM_SRGB] = CAP( 1, 1, 0, 0),
268 [GEN6_FORMAT_B5G5R5A1_UNORM] = CAP( 1, 1, 0, 1),
269 [GEN6_FORMAT_B5G5R5A1_UNORM_SRGB] = CAP( 1, 1, 0, 0),
270 [GEN6_FORMAT_B4G4R4A4_UNORM] = CAP( 1, 1, 0, 1),
271 [GEN6_FORMAT_B4G4R4A4_UNORM_SRGB] = CAP( 1, 1, 0, 0),
272 [GEN6_FORMAT_R8G8_UNORM] = CAP( 1, 1, 0, 0),
273 [GEN6_FORMAT_R8G8_SNORM] = CAP( 1, 1, 0, 1),
274 [GEN6_FORMAT_R8G8_SINT] = CAP( 1, 0, 0, 0),
275 [GEN6_FORMAT_R8G8_UINT] = CAP( 1, 0, 0, 0),
276 [GEN6_FORMAT_R16_UNORM] = CAP( 1, 1, 1, 0),
277 [GEN6_FORMAT_R16_SNORM] = CAP( 1, 1, 0, 0),
278 [GEN6_FORMAT_R16_SINT] = CAP( 1, 0, 0, 0),
279 [GEN6_FORMAT_R16_UINT] = CAP( 1, 0, 0, 0),
280 [GEN6_FORMAT_R16_FLOAT] = CAP( 1, 1, 0, 0),
281 [GEN6_FORMAT_A8P8_UNORM_PALETTE0] = CAP( 5, 5, 0, 0),
282 [GEN6_FORMAT_A8P8_UNORM_PALETTE1] = CAP( 5, 5, 0, 0),
283 [GEN6_FORMAT_I16_UNORM] = CAP( 1, 1, 1, 0),
284 [GEN6_FORMAT_L16_UNORM] = CAP( 1, 1, 1, 0),
285 [GEN6_FORMAT_A16_UNORM] = CAP( 1, 1, 1, 0),
286 [GEN6_FORMAT_L8A8_UNORM] = CAP( 1, 1, 0, 1),
287 [GEN6_FORMAT_I16_FLOAT] = CAP( 1, 1, 1, 0),
288 [GEN6_FORMAT_L16_FLOAT] = CAP( 1, 1, 1, 0),
289 [GEN6_FORMAT_A16_FLOAT] = CAP( 1, 1, 1, 0),
290 [GEN6_FORMAT_L8A8_UNORM_SRGB] = CAP(4.5, 4.5, 0, 0),
291 [GEN6_FORMAT_R5G5_SNORM_B6_UNORM] = CAP( 1, 1, 0, 1),
292 [GEN6_FORMAT_P8A8_UNORM_PALETTE0] = CAP( 5, 5, 0, 0),
293 [GEN6_FORMAT_P8A8_UNORM_PALETTE1] = CAP( 5, 5, 0, 0),
294 [GEN6_FORMAT_R8_UNORM] = CAP( 1, 1, 0, 4.5),
295 [GEN6_FORMAT_R8_SNORM] = CAP( 1, 1, 0, 0),
296 [GEN6_FORMAT_R8_SINT] = CAP( 1, 0, 0, 0),
297 [GEN6_FORMAT_R8_UINT] = CAP( 1, 0, 0, 0),
298 [GEN6_FORMAT_A8_UNORM] = CAP( 1, 1, 0, 1),
299 [GEN6_FORMAT_I8_UNORM] = CAP( 1, 1, 0, 0),
300 [GEN6_FORMAT_L8_UNORM] = CAP( 1, 1, 0, 1),
301 [GEN6_FORMAT_P4A4_UNORM_PALETTE0] = CAP( 1, 1, 0, 0),
302 [GEN6_FORMAT_A4P4_UNORM_PALETTE0] = CAP( 1, 1, 0, 0),
303 [GEN6_FORMAT_P8_UNORM_PALETTE0] = CAP(4.5, 4.5, 0, 0),
304 [GEN6_FORMAT_L8_UNORM_SRGB] = CAP(4.5, 4.5, 0, 0),
305 [GEN6_FORMAT_P8_UNORM_PALETTE1] = CAP(4.5, 4.5, 0, 0),
306 [GEN6_FORMAT_P4A4_UNORM_PALETTE1] = CAP(4.5, 4.5, 0, 0),
307 [GEN6_FORMAT_A4P4_UNORM_PALETTE1] = CAP(4.5, 4.5, 0, 0),
308 [GEN6_FORMAT_DXT1_RGB_SRGB] = CAP(4.5, 4.5, 0, 0),
309 [GEN6_FORMAT_R1_UNORM] = CAP( 1, 1, 0, 0),
310 [GEN6_FORMAT_YCRCB_NORMAL] = CAP( 1, 1, 0, 1),
311 [GEN6_FORMAT_YCRCB_SWAPUVY] = CAP( 1, 1, 0, 1),
312 [GEN6_FORMAT_P2_UNORM_PALETTE0] = CAP(4.5, 4.5, 0, 0),
313 [GEN6_FORMAT_P2_UNORM_PALETTE1] = CAP(4.5, 4.5, 0, 0),
314 [GEN6_FORMAT_BC1_UNORM] = CAP( 1, 1, 0, 1),
315 [GEN6_FORMAT_BC2_UNORM] = CAP( 1, 1, 0, 1),
316 [GEN6_FORMAT_BC3_UNORM] = CAP( 1, 1, 0, 1),
317 [GEN6_FORMAT_BC4_UNORM] = CAP( 1, 1, 0, 0),
318 [GEN6_FORMAT_BC5_UNORM] = CAP( 1, 1, 0, 0),
319 [GEN6_FORMAT_BC1_UNORM_SRGB] = CAP( 1, 1, 0, 0),
320 [GEN6_FORMAT_BC2_UNORM_SRGB] = CAP( 1, 1, 0, 0),
321 [GEN6_FORMAT_BC3_UNORM_SRGB] = CAP( 1, 1, 0, 0),
322 [GEN6_FORMAT_MONO8] = CAP( 1, 0, 0, 0),
323 [GEN6_FORMAT_YCRCB_SWAPUV] = CAP( 1, 1, 0, 0),
324 [GEN6_FORMAT_YCRCB_SWAPY] = CAP( 1, 1, 0, 0),
325 [GEN6_FORMAT_DXT1_RGB] = CAP( 1, 1, 0, 0),
326 [GEN6_FORMAT_FXT1] = CAP( 1, 1, 0, 0),
327 [GEN6_FORMAT_BC4_SNORM] = CAP( 1, 1, 0, 0),
328 [GEN6_FORMAT_BC5_SNORM] = CAP( 1, 1, 0, 0),
329 [GEN6_FORMAT_R16G16B16_FLOAT] = CAP( 5, 5, 0, 0),
330 [GEN6_FORMAT_BC6H_SF16] = CAP( 7, 7, 0, 0),
331 [GEN6_FORMAT_BC7_UNORM] = CAP( 7, 7, 0, 0),
332 [GEN6_FORMAT_BC7_UNORM_SRGB] = CAP( 7, 7, 0, 0),
333 [GEN6_FORMAT_BC6H_UF16] = CAP( 7, 7, 0, 0),
334 #undef CAP
335 };
336
337 /*
338 * This table is based on:
339 *
340 * - the Sandy Bridge PRM, volume 4 part 1, page 88-97
341 * - the Ivy Bridge PRM, volume 4 part 1, page 172, 252-253, and 277-278
342 * - the Haswell PRM, volume 7, page 262-264
343 */
344 static const struct ilo_dp_cap ilo_dp_caps[] = {
345 #define CAP(rt_write, rt_write_blending, typed_write, media_color_processing) \
346 { ILO_GEN(rt_write), ILO_GEN(rt_write_blending), ILO_GEN(typed_write), ILO_GEN(media_color_processing) }
347 [GEN6_FORMAT_R32G32B32A32_FLOAT] = CAP( 1, 1, 7, 0),
348 [GEN6_FORMAT_R32G32B32A32_SINT] = CAP( 1, 0, 7, 0),
349 [GEN6_FORMAT_R32G32B32A32_UINT] = CAP( 1, 0, 7, 0),
350 [GEN6_FORMAT_R16G16B16A16_UNORM] = CAP( 1, 4.5, 7, 6),
351 [GEN6_FORMAT_R16G16B16A16_SNORM] = CAP( 1, 6, 7, 0),
352 [GEN6_FORMAT_R16G16B16A16_SINT] = CAP( 1, 0, 7, 0),
353 [GEN6_FORMAT_R16G16B16A16_UINT] = CAP( 1, 0, 7, 0),
354 [GEN6_FORMAT_R16G16B16A16_FLOAT] = CAP( 1, 1, 7, 0),
355 [GEN6_FORMAT_R32G32_FLOAT] = CAP( 1, 1, 7, 0),
356 [GEN6_FORMAT_R32G32_SINT] = CAP( 1, 0, 7, 0),
357 [GEN6_FORMAT_R32G32_UINT] = CAP( 1, 0, 7, 0),
358 [GEN6_FORMAT_B8G8R8A8_UNORM] = CAP( 1, 1, 7, 6),
359 [GEN6_FORMAT_B8G8R8A8_UNORM_SRGB] = CAP( 1, 1, 0, 0),
360 [GEN6_FORMAT_R10G10B10A2_UNORM] = CAP( 1, 1, 7, 6),
361 [GEN6_FORMAT_R10G10B10A2_UNORM_SRGB] = CAP( 0, 0, 0, 6),
362 [GEN6_FORMAT_R10G10B10A2_UINT] = CAP( 1, 0, 7, 0),
363 [GEN6_FORMAT_R8G8B8A8_UNORM] = CAP( 1, 1, 7, 6),
364 [GEN6_FORMAT_R8G8B8A8_UNORM_SRGB] = CAP( 1, 1, 0, 6),
365 [GEN6_FORMAT_R8G8B8A8_SNORM] = CAP( 1, 6, 7, 0),
366 [GEN6_FORMAT_R8G8B8A8_SINT] = CAP( 1, 0, 7, 0),
367 [GEN6_FORMAT_R8G8B8A8_UINT] = CAP( 1, 0, 7, 0),
368 [GEN6_FORMAT_R16G16_UNORM] = CAP( 1, 4.5, 7, 0),
369 [GEN6_FORMAT_R16G16_SNORM] = CAP( 1, 6, 7, 0),
370 [GEN6_FORMAT_R16G16_SINT] = CAP( 1, 0, 7, 0),
371 [GEN6_FORMAT_R16G16_UINT] = CAP( 1, 0, 7, 0),
372 [GEN6_FORMAT_R16G16_FLOAT] = CAP( 1, 1, 7, 0),
373 [GEN6_FORMAT_B10G10R10A2_UNORM] = CAP( 1, 1, 7, 6),
374 [GEN6_FORMAT_B10G10R10A2_UNORM_SRGB] = CAP( 1, 1, 0, 6),
375 [GEN6_FORMAT_R11G11B10_FLOAT] = CAP( 1, 1, 7, 0),
376 [GEN6_FORMAT_R32_SINT] = CAP( 1, 0, 7, 0),
377 [GEN6_FORMAT_R32_UINT] = CAP( 1, 0, 7, 0),
378 [GEN6_FORMAT_R32_FLOAT] = CAP( 1, 1, 7, 0),
379 [GEN6_FORMAT_B8G8R8X8_UNORM] = CAP( 0, 0, 0, 6),
380 [GEN6_FORMAT_B5G6R5_UNORM] = CAP( 1, 1, 7, 0),
381 [GEN6_FORMAT_B5G6R5_UNORM_SRGB] = CAP( 1, 1, 0, 0),
382 [GEN6_FORMAT_B5G5R5A1_UNORM] = CAP( 1, 1, 7, 0),
383 [GEN6_FORMAT_B5G5R5A1_UNORM_SRGB] = CAP( 1, 1, 0, 0),
384 [GEN6_FORMAT_B4G4R4A4_UNORM] = CAP( 1, 1, 7, 0),
385 [GEN6_FORMAT_B4G4R4A4_UNORM_SRGB] = CAP( 1, 1, 0, 0),
386 [GEN6_FORMAT_R8G8_UNORM] = CAP( 1, 1, 7, 0),
387 [GEN6_FORMAT_R8G8_SNORM] = CAP( 1, 6, 7, 0),
388 [GEN6_FORMAT_R8G8_SINT] = CAP( 1, 0, 7, 0),
389 [GEN6_FORMAT_R8G8_UINT] = CAP( 1, 0, 7, 0),
390 [GEN6_FORMAT_R16_UNORM] = CAP( 1, 4.5, 7, 7),
391 [GEN6_FORMAT_R16_SNORM] = CAP( 1, 6, 7, 0),
392 [GEN6_FORMAT_R16_SINT] = CAP( 1, 0, 7, 0),
393 [GEN6_FORMAT_R16_UINT] = CAP( 1, 0, 7, 0),
394 [GEN6_FORMAT_R16_FLOAT] = CAP( 1, 1, 7, 0),
395 [GEN6_FORMAT_B5G5R5X1_UNORM] = CAP( 1, 1, 7, 0),
396 [GEN6_FORMAT_B5G5R5X1_UNORM_SRGB] = CAP( 1, 1, 0, 0),
397 [GEN6_FORMAT_R8_UNORM] = CAP( 1, 1, 7, 0),
398 [GEN6_FORMAT_R8_SNORM] = CAP( 1, 6, 7, 0),
399 [GEN6_FORMAT_R8_SINT] = CAP( 1, 0, 7, 0),
400 [GEN6_FORMAT_R8_UINT] = CAP( 1, 0, 7, 0),
401 [GEN6_FORMAT_A8_UNORM] = CAP( 1, 1, 7, 0),
402 [GEN6_FORMAT_YCRCB_NORMAL] = CAP( 1, 0, 0, 6),
403 [GEN6_FORMAT_YCRCB_SWAPUVY] = CAP( 1, 0, 0, 6),
404 [GEN6_FORMAT_YCRCB_SWAPUV] = CAP( 1, 0, 0, 6),
405 [GEN6_FORMAT_YCRCB_SWAPY] = CAP( 1, 0, 0, 6),
406 #undef CAP
407 };
408
409 /**
410 * Translate a color (non-depth/stencil) pipe format to the matching hardware
411 * format. Return -1 on errors.
412 */
413 int
414 ilo_translate_color_format(const struct ilo_dev_info *dev,
415 enum pipe_format format)
416 {
417 static const int format_mapping[PIPE_FORMAT_COUNT] = {
418 [PIPE_FORMAT_NONE] = 0,
419 [PIPE_FORMAT_B8G8R8A8_UNORM] = GEN6_FORMAT_B8G8R8A8_UNORM,
420 [PIPE_FORMAT_B8G8R8X8_UNORM] = GEN6_FORMAT_B8G8R8X8_UNORM,
421 [PIPE_FORMAT_A8R8G8B8_UNORM] = 0,
422 [PIPE_FORMAT_X8R8G8B8_UNORM] = 0,
423 [PIPE_FORMAT_B5G5R5A1_UNORM] = GEN6_FORMAT_B5G5R5A1_UNORM,
424 [PIPE_FORMAT_B4G4R4A4_UNORM] = GEN6_FORMAT_B4G4R4A4_UNORM,
425 [PIPE_FORMAT_B5G6R5_UNORM] = GEN6_FORMAT_B5G6R5_UNORM,
426 [PIPE_FORMAT_R10G10B10A2_UNORM] = GEN6_FORMAT_R10G10B10A2_UNORM,
427 [PIPE_FORMAT_L8_UNORM] = GEN6_FORMAT_L8_UNORM,
428 [PIPE_FORMAT_A8_UNORM] = GEN6_FORMAT_A8_UNORM,
429 [PIPE_FORMAT_I8_UNORM] = GEN6_FORMAT_I8_UNORM,
430 [PIPE_FORMAT_L8A8_UNORM] = GEN6_FORMAT_L8A8_UNORM,
431 [PIPE_FORMAT_L16_UNORM] = GEN6_FORMAT_L16_UNORM,
432 [PIPE_FORMAT_UYVY] = GEN6_FORMAT_YCRCB_SWAPUVY,
433 [PIPE_FORMAT_YUYV] = GEN6_FORMAT_YCRCB_NORMAL,
434 [PIPE_FORMAT_Z16_UNORM] = 0,
435 [PIPE_FORMAT_Z32_UNORM] = 0,
436 [PIPE_FORMAT_Z32_FLOAT] = 0,
437 [PIPE_FORMAT_Z24_UNORM_S8_UINT] = 0,
438 [PIPE_FORMAT_S8_UINT_Z24_UNORM] = 0,
439 [PIPE_FORMAT_Z24X8_UNORM] = 0,
440 [PIPE_FORMAT_X8Z24_UNORM] = 0,
441 [PIPE_FORMAT_S8_UINT] = 0,
442 [PIPE_FORMAT_R64_FLOAT] = GEN6_FORMAT_R64_FLOAT,
443 [PIPE_FORMAT_R64G64_FLOAT] = GEN6_FORMAT_R64G64_FLOAT,
444 [PIPE_FORMAT_R64G64B64_FLOAT] = GEN6_FORMAT_R64G64B64_FLOAT,
445 [PIPE_FORMAT_R64G64B64A64_FLOAT] = GEN6_FORMAT_R64G64B64A64_FLOAT,
446 [PIPE_FORMAT_R32_FLOAT] = GEN6_FORMAT_R32_FLOAT,
447 [PIPE_FORMAT_R32G32_FLOAT] = GEN6_FORMAT_R32G32_FLOAT,
448 [PIPE_FORMAT_R32G32B32_FLOAT] = GEN6_FORMAT_R32G32B32_FLOAT,
449 [PIPE_FORMAT_R32G32B32A32_FLOAT] = GEN6_FORMAT_R32G32B32A32_FLOAT,
450 [PIPE_FORMAT_R32_UNORM] = GEN6_FORMAT_R32_UNORM,
451 [PIPE_FORMAT_R32G32_UNORM] = GEN6_FORMAT_R32G32_UNORM,
452 [PIPE_FORMAT_R32G32B32_UNORM] = GEN6_FORMAT_R32G32B32_UNORM,
453 [PIPE_FORMAT_R32G32B32A32_UNORM] = GEN6_FORMAT_R32G32B32A32_UNORM,
454 [PIPE_FORMAT_R32_USCALED] = GEN6_FORMAT_R32_USCALED,
455 [PIPE_FORMAT_R32G32_USCALED] = GEN6_FORMAT_R32G32_USCALED,
456 [PIPE_FORMAT_R32G32B32_USCALED] = GEN6_FORMAT_R32G32B32_USCALED,
457 [PIPE_FORMAT_R32G32B32A32_USCALED] = GEN6_FORMAT_R32G32B32A32_USCALED,
458 [PIPE_FORMAT_R32_SNORM] = GEN6_FORMAT_R32_SNORM,
459 [PIPE_FORMAT_R32G32_SNORM] = GEN6_FORMAT_R32G32_SNORM,
460 [PIPE_FORMAT_R32G32B32_SNORM] = GEN6_FORMAT_R32G32B32_SNORM,
461 [PIPE_FORMAT_R32G32B32A32_SNORM] = GEN6_FORMAT_R32G32B32A32_SNORM,
462 [PIPE_FORMAT_R32_SSCALED] = GEN6_FORMAT_R32_SSCALED,
463 [PIPE_FORMAT_R32G32_SSCALED] = GEN6_FORMAT_R32G32_SSCALED,
464 [PIPE_FORMAT_R32G32B32_SSCALED] = GEN6_FORMAT_R32G32B32_SSCALED,
465 [PIPE_FORMAT_R32G32B32A32_SSCALED] = GEN6_FORMAT_R32G32B32A32_SSCALED,
466 [PIPE_FORMAT_R16_UNORM] = GEN6_FORMAT_R16_UNORM,
467 [PIPE_FORMAT_R16G16_UNORM] = GEN6_FORMAT_R16G16_UNORM,
468 [PIPE_FORMAT_R16G16B16_UNORM] = GEN6_FORMAT_R16G16B16_UNORM,
469 [PIPE_FORMAT_R16G16B16A16_UNORM] = GEN6_FORMAT_R16G16B16A16_UNORM,
470 [PIPE_FORMAT_R16_USCALED] = GEN6_FORMAT_R16_USCALED,
471 [PIPE_FORMAT_R16G16_USCALED] = GEN6_FORMAT_R16G16_USCALED,
472 [PIPE_FORMAT_R16G16B16_USCALED] = GEN6_FORMAT_R16G16B16_USCALED,
473 [PIPE_FORMAT_R16G16B16A16_USCALED] = GEN6_FORMAT_R16G16B16A16_USCALED,
474 [PIPE_FORMAT_R16_SNORM] = GEN6_FORMAT_R16_SNORM,
475 [PIPE_FORMAT_R16G16_SNORM] = GEN6_FORMAT_R16G16_SNORM,
476 [PIPE_FORMAT_R16G16B16_SNORM] = GEN6_FORMAT_R16G16B16_SNORM,
477 [PIPE_FORMAT_R16G16B16A16_SNORM] = GEN6_FORMAT_R16G16B16A16_SNORM,
478 [PIPE_FORMAT_R16_SSCALED] = GEN6_FORMAT_R16_SSCALED,
479 [PIPE_FORMAT_R16G16_SSCALED] = GEN6_FORMAT_R16G16_SSCALED,
480 [PIPE_FORMAT_R16G16B16_SSCALED] = GEN6_FORMAT_R16G16B16_SSCALED,
481 [PIPE_FORMAT_R16G16B16A16_SSCALED] = GEN6_FORMAT_R16G16B16A16_SSCALED,
482 [PIPE_FORMAT_R8_UNORM] = GEN6_FORMAT_R8_UNORM,
483 [PIPE_FORMAT_R8G8_UNORM] = GEN6_FORMAT_R8G8_UNORM,
484 [PIPE_FORMAT_R8G8B8_UNORM] = GEN6_FORMAT_R8G8B8_UNORM,
485 [PIPE_FORMAT_R8G8B8A8_UNORM] = GEN6_FORMAT_R8G8B8A8_UNORM,
486 [PIPE_FORMAT_X8B8G8R8_UNORM] = 0,
487 [PIPE_FORMAT_R8_USCALED] = GEN6_FORMAT_R8_USCALED,
488 [PIPE_FORMAT_R8G8_USCALED] = GEN6_FORMAT_R8G8_USCALED,
489 [PIPE_FORMAT_R8G8B8_USCALED] = GEN6_FORMAT_R8G8B8_USCALED,
490 [PIPE_FORMAT_R8G8B8A8_USCALED] = GEN6_FORMAT_R8G8B8A8_USCALED,
491 [PIPE_FORMAT_R8_SNORM] = GEN6_FORMAT_R8_SNORM,
492 [PIPE_FORMAT_R8G8_SNORM] = GEN6_FORMAT_R8G8_SNORM,
493 [PIPE_FORMAT_R8G8B8_SNORM] = GEN6_FORMAT_R8G8B8_SNORM,
494 [PIPE_FORMAT_R8G8B8A8_SNORM] = GEN6_FORMAT_R8G8B8A8_SNORM,
495 [PIPE_FORMAT_R8_SSCALED] = GEN6_FORMAT_R8_SSCALED,
496 [PIPE_FORMAT_R8G8_SSCALED] = GEN6_FORMAT_R8G8_SSCALED,
497 [PIPE_FORMAT_R8G8B8_SSCALED] = GEN6_FORMAT_R8G8B8_SSCALED,
498 [PIPE_FORMAT_R8G8B8A8_SSCALED] = GEN6_FORMAT_R8G8B8A8_SSCALED,
499 [PIPE_FORMAT_R32_FIXED] = GEN6_FORMAT_R32_SFIXED,
500 [PIPE_FORMAT_R32G32_FIXED] = GEN6_FORMAT_R32G32_SFIXED,
501 [PIPE_FORMAT_R32G32B32_FIXED] = GEN6_FORMAT_R32G32B32_SFIXED,
502 [PIPE_FORMAT_R32G32B32A32_FIXED] = GEN6_FORMAT_R32G32B32A32_SFIXED,
503 [PIPE_FORMAT_R16_FLOAT] = GEN6_FORMAT_R16_FLOAT,
504 [PIPE_FORMAT_R16G16_FLOAT] = GEN6_FORMAT_R16G16_FLOAT,
505 [PIPE_FORMAT_R16G16B16_FLOAT] = GEN6_FORMAT_R16G16B16_FLOAT,
506 [PIPE_FORMAT_R16G16B16A16_FLOAT] = GEN6_FORMAT_R16G16B16A16_FLOAT,
507 [PIPE_FORMAT_L8_SRGB] = GEN6_FORMAT_L8_UNORM_SRGB,
508 [PIPE_FORMAT_L8A8_SRGB] = GEN6_FORMAT_L8A8_UNORM_SRGB,
509 [PIPE_FORMAT_R8G8B8_SRGB] = GEN6_FORMAT_R8G8B8_UNORM_SRGB,
510 [PIPE_FORMAT_A8B8G8R8_SRGB] = 0,
511 [PIPE_FORMAT_X8B8G8R8_SRGB] = 0,
512 [PIPE_FORMAT_B8G8R8A8_SRGB] = GEN6_FORMAT_B8G8R8A8_UNORM_SRGB,
513 [PIPE_FORMAT_B8G8R8X8_SRGB] = GEN6_FORMAT_B8G8R8X8_UNORM_SRGB,
514 [PIPE_FORMAT_A8R8G8B8_SRGB] = 0,
515 [PIPE_FORMAT_X8R8G8B8_SRGB] = 0,
516 [PIPE_FORMAT_R8G8B8A8_SRGB] = GEN6_FORMAT_R8G8B8A8_UNORM_SRGB,
517 [PIPE_FORMAT_DXT1_RGB] = GEN6_FORMAT_DXT1_RGB,
518 [PIPE_FORMAT_DXT1_RGBA] = GEN6_FORMAT_BC1_UNORM,
519 [PIPE_FORMAT_DXT3_RGBA] = GEN6_FORMAT_BC2_UNORM,
520 [PIPE_FORMAT_DXT5_RGBA] = GEN6_FORMAT_BC3_UNORM,
521 [PIPE_FORMAT_DXT1_SRGB] = GEN6_FORMAT_DXT1_RGB_SRGB,
522 [PIPE_FORMAT_DXT1_SRGBA] = GEN6_FORMAT_BC1_UNORM_SRGB,
523 [PIPE_FORMAT_DXT3_SRGBA] = GEN6_FORMAT_BC2_UNORM_SRGB,
524 [PIPE_FORMAT_DXT5_SRGBA] = GEN6_FORMAT_BC3_UNORM_SRGB,
525 [PIPE_FORMAT_RGTC1_UNORM] = GEN6_FORMAT_BC4_UNORM,
526 [PIPE_FORMAT_RGTC1_SNORM] = GEN6_FORMAT_BC4_SNORM,
527 [PIPE_FORMAT_RGTC2_UNORM] = GEN6_FORMAT_BC5_UNORM,
528 [PIPE_FORMAT_RGTC2_SNORM] = GEN6_FORMAT_BC5_SNORM,
529 [PIPE_FORMAT_R8G8_B8G8_UNORM] = 0,
530 [PIPE_FORMAT_G8R8_G8B8_UNORM] = 0,
531 [PIPE_FORMAT_R8SG8SB8UX8U_NORM] = 0,
532 [PIPE_FORMAT_R5SG5SB6U_NORM] = 0,
533 [PIPE_FORMAT_A8B8G8R8_UNORM] = 0,
534 [PIPE_FORMAT_B5G5R5X1_UNORM] = GEN6_FORMAT_B5G5R5X1_UNORM,
535 [PIPE_FORMAT_R10G10B10A2_USCALED] = GEN6_FORMAT_R10G10B10A2_USCALED,
536 [PIPE_FORMAT_R11G11B10_FLOAT] = GEN6_FORMAT_R11G11B10_FLOAT,
537 [PIPE_FORMAT_R9G9B9E5_FLOAT] = GEN6_FORMAT_R9G9B9E5_SHAREDEXP,
538 [PIPE_FORMAT_Z32_FLOAT_S8X24_UINT] = 0,
539 [PIPE_FORMAT_R1_UNORM] = GEN6_FORMAT_R1_UNORM,
540 [PIPE_FORMAT_R10G10B10X2_USCALED] = GEN6_FORMAT_R10G10B10X2_USCALED,
541 [PIPE_FORMAT_R10G10B10X2_SNORM] = 0,
542 [PIPE_FORMAT_L4A4_UNORM] = 0,
543 [PIPE_FORMAT_B10G10R10A2_UNORM] = GEN6_FORMAT_B10G10R10A2_UNORM,
544 [PIPE_FORMAT_R10SG10SB10SA2U_NORM] = 0,
545 [PIPE_FORMAT_R8G8Bx_SNORM] = 0,
546 [PIPE_FORMAT_R8G8B8X8_UNORM] = GEN6_FORMAT_R8G8B8X8_UNORM,
547 [PIPE_FORMAT_B4G4R4X4_UNORM] = 0,
548 [PIPE_FORMAT_X24S8_UINT] = 0,
549 [PIPE_FORMAT_S8X24_UINT] = 0,
550 [PIPE_FORMAT_X32_S8X24_UINT] = 0,
551 [PIPE_FORMAT_B2G3R3_UNORM] = 0,
552 [PIPE_FORMAT_L16A16_UNORM] = GEN6_FORMAT_L16A16_UNORM,
553 [PIPE_FORMAT_A16_UNORM] = GEN6_FORMAT_A16_UNORM,
554 [PIPE_FORMAT_I16_UNORM] = GEN6_FORMAT_I16_UNORM,
555 [PIPE_FORMAT_LATC1_UNORM] = 0,
556 [PIPE_FORMAT_LATC1_SNORM] = 0,
557 [PIPE_FORMAT_LATC2_UNORM] = 0,
558 [PIPE_FORMAT_LATC2_SNORM] = 0,
559 [PIPE_FORMAT_A8_SNORM] = 0,
560 [PIPE_FORMAT_L8_SNORM] = 0,
561 [PIPE_FORMAT_L8A8_SNORM] = 0,
562 [PIPE_FORMAT_I8_SNORM] = 0,
563 [PIPE_FORMAT_A16_SNORM] = 0,
564 [PIPE_FORMAT_L16_SNORM] = 0,
565 [PIPE_FORMAT_L16A16_SNORM] = 0,
566 [PIPE_FORMAT_I16_SNORM] = 0,
567 [PIPE_FORMAT_A16_FLOAT] = GEN6_FORMAT_A16_FLOAT,
568 [PIPE_FORMAT_L16_FLOAT] = GEN6_FORMAT_L16_FLOAT,
569 [PIPE_FORMAT_L16A16_FLOAT] = GEN6_FORMAT_L16A16_FLOAT,
570 [PIPE_FORMAT_I16_FLOAT] = GEN6_FORMAT_I16_FLOAT,
571 [PIPE_FORMAT_A32_FLOAT] = GEN6_FORMAT_A32_FLOAT,
572 [PIPE_FORMAT_L32_FLOAT] = GEN6_FORMAT_L32_FLOAT,
573 [PIPE_FORMAT_L32A32_FLOAT] = GEN6_FORMAT_L32A32_FLOAT,
574 [PIPE_FORMAT_I32_FLOAT] = GEN6_FORMAT_I32_FLOAT,
575 [PIPE_FORMAT_YV12] = 0,
576 [PIPE_FORMAT_YV16] = 0,
577 [PIPE_FORMAT_IYUV] = 0,
578 [PIPE_FORMAT_NV12] = 0,
579 [PIPE_FORMAT_NV21] = 0,
580 [PIPE_FORMAT_A4R4_UNORM] = 0,
581 [PIPE_FORMAT_R4A4_UNORM] = 0,
582 [PIPE_FORMAT_R8A8_UNORM] = 0,
583 [PIPE_FORMAT_A8R8_UNORM] = 0,
584 [PIPE_FORMAT_R10G10B10A2_SSCALED] = GEN6_FORMAT_R10G10B10A2_SSCALED,
585 [PIPE_FORMAT_R10G10B10A2_SNORM] = GEN6_FORMAT_R10G10B10A2_SNORM,
586 [PIPE_FORMAT_B10G10R10A2_USCALED] = GEN6_FORMAT_B10G10R10A2_USCALED,
587 [PIPE_FORMAT_B10G10R10A2_SSCALED] = GEN6_FORMAT_B10G10R10A2_SSCALED,
588 [PIPE_FORMAT_B10G10R10A2_SNORM] = GEN6_FORMAT_B10G10R10A2_SNORM,
589 [PIPE_FORMAT_R8_UINT] = GEN6_FORMAT_R8_UINT,
590 [PIPE_FORMAT_R8G8_UINT] = GEN6_FORMAT_R8G8_UINT,
591 [PIPE_FORMAT_R8G8B8_UINT] = GEN6_FORMAT_R8G8B8_UINT,
592 [PIPE_FORMAT_R8G8B8A8_UINT] = GEN6_FORMAT_R8G8B8A8_UINT,
593 [PIPE_FORMAT_R8_SINT] = GEN6_FORMAT_R8_SINT,
594 [PIPE_FORMAT_R8G8_SINT] = GEN6_FORMAT_R8G8_SINT,
595 [PIPE_FORMAT_R8G8B8_SINT] = GEN6_FORMAT_R8G8B8_SINT,
596 [PIPE_FORMAT_R8G8B8A8_SINT] = GEN6_FORMAT_R8G8B8A8_SINT,
597 [PIPE_FORMAT_R16_UINT] = GEN6_FORMAT_R16_UINT,
598 [PIPE_FORMAT_R16G16_UINT] = GEN6_FORMAT_R16G16_UINT,
599 [PIPE_FORMAT_R16G16B16_UINT] = GEN6_FORMAT_R16G16B16_UINT,
600 [PIPE_FORMAT_R16G16B16A16_UINT] = GEN6_FORMAT_R16G16B16A16_UINT,
601 [PIPE_FORMAT_R16_SINT] = GEN6_FORMAT_R16_SINT,
602 [PIPE_FORMAT_R16G16_SINT] = GEN6_FORMAT_R16G16_SINT,
603 [PIPE_FORMAT_R16G16B16_SINT] = GEN6_FORMAT_R16G16B16_SINT,
604 [PIPE_FORMAT_R16G16B16A16_SINT] = GEN6_FORMAT_R16G16B16A16_SINT,
605 [PIPE_FORMAT_R32_UINT] = GEN6_FORMAT_R32_UINT,
606 [PIPE_FORMAT_R32G32_UINT] = GEN6_FORMAT_R32G32_UINT,
607 [PIPE_FORMAT_R32G32B32_UINT] = GEN6_FORMAT_R32G32B32_UINT,
608 [PIPE_FORMAT_R32G32B32A32_UINT] = GEN6_FORMAT_R32G32B32A32_UINT,
609 [PIPE_FORMAT_R32_SINT] = GEN6_FORMAT_R32_SINT,
610 [PIPE_FORMAT_R32G32_SINT] = GEN6_FORMAT_R32G32_SINT,
611 [PIPE_FORMAT_R32G32B32_SINT] = GEN6_FORMAT_R32G32B32_SINT,
612 [PIPE_FORMAT_R32G32B32A32_SINT] = GEN6_FORMAT_R32G32B32A32_SINT,
613 [PIPE_FORMAT_A8_UINT] = 0,
614 [PIPE_FORMAT_I8_UINT] = GEN6_FORMAT_I8_UINT,
615 [PIPE_FORMAT_L8_UINT] = GEN6_FORMAT_L8_UINT,
616 [PIPE_FORMAT_L8A8_UINT] = GEN6_FORMAT_L8A8_UINT,
617 [PIPE_FORMAT_A8_SINT] = 0,
618 [PIPE_FORMAT_I8_SINT] = GEN6_FORMAT_I8_SINT,
619 [PIPE_FORMAT_L8_SINT] = GEN6_FORMAT_L8_SINT,
620 [PIPE_FORMAT_L8A8_SINT] = GEN6_FORMAT_L8A8_SINT,
621 [PIPE_FORMAT_A16_UINT] = 0,
622 [PIPE_FORMAT_I16_UINT] = 0,
623 [PIPE_FORMAT_L16_UINT] = 0,
624 [PIPE_FORMAT_L16A16_UINT] = 0,
625 [PIPE_FORMAT_A16_SINT] = 0,
626 [PIPE_FORMAT_I16_SINT] = 0,
627 [PIPE_FORMAT_L16_SINT] = 0,
628 [PIPE_FORMAT_L16A16_SINT] = 0,
629 [PIPE_FORMAT_A32_UINT] = 0,
630 [PIPE_FORMAT_I32_UINT] = 0,
631 [PIPE_FORMAT_L32_UINT] = 0,
632 [PIPE_FORMAT_L32A32_UINT] = 0,
633 [PIPE_FORMAT_A32_SINT] = 0,
634 [PIPE_FORMAT_I32_SINT] = 0,
635 [PIPE_FORMAT_L32_SINT] = 0,
636 [PIPE_FORMAT_L32A32_SINT] = 0,
637 [PIPE_FORMAT_B10G10R10A2_UINT] = GEN6_FORMAT_B10G10R10A2_UINT,
638 [PIPE_FORMAT_ETC1_RGB8] = GEN6_FORMAT_ETC1_RGB8,
639 [PIPE_FORMAT_R8G8_R8B8_UNORM] = 0,
640 [PIPE_FORMAT_G8R8_B8R8_UNORM] = 0,
641 [PIPE_FORMAT_R8G8B8X8_SNORM] = 0,
642 [PIPE_FORMAT_R8G8B8X8_SRGB] = 0,
643 [PIPE_FORMAT_R8G8B8X8_UINT] = 0,
644 [PIPE_FORMAT_R8G8B8X8_SINT] = 0,
645 [PIPE_FORMAT_B10G10R10X2_UNORM] = GEN6_FORMAT_B10G10R10X2_UNORM,
646 [PIPE_FORMAT_R16G16B16X16_UNORM] = GEN6_FORMAT_R16G16B16X16_UNORM,
647 [PIPE_FORMAT_R16G16B16X16_SNORM] = 0,
648 [PIPE_FORMAT_R16G16B16X16_FLOAT] = GEN6_FORMAT_R16G16B16X16_FLOAT,
649 [PIPE_FORMAT_R16G16B16X16_UINT] = 0,
650 [PIPE_FORMAT_R16G16B16X16_SINT] = 0,
651 [PIPE_FORMAT_R32G32B32X32_FLOAT] = GEN6_FORMAT_R32G32B32X32_FLOAT,
652 [PIPE_FORMAT_R32G32B32X32_UINT] = 0,
653 [PIPE_FORMAT_R32G32B32X32_SINT] = 0,
654 [PIPE_FORMAT_R8A8_SNORM] = 0,
655 [PIPE_FORMAT_R16A16_UNORM] = 0,
656 [PIPE_FORMAT_R16A16_SNORM] = 0,
657 [PIPE_FORMAT_R16A16_FLOAT] = 0,
658 [PIPE_FORMAT_R32A32_FLOAT] = 0,
659 [PIPE_FORMAT_R8A8_UINT] = 0,
660 [PIPE_FORMAT_R8A8_SINT] = 0,
661 [PIPE_FORMAT_R16A16_UINT] = 0,
662 [PIPE_FORMAT_R16A16_SINT] = 0,
663 [PIPE_FORMAT_R32A32_UINT] = 0,
664 [PIPE_FORMAT_R32A32_SINT] = 0,
665 [PIPE_FORMAT_R10G10B10A2_UINT] = GEN6_FORMAT_R10G10B10A2_UINT,
666 [PIPE_FORMAT_B5G6R5_SRGB] = GEN6_FORMAT_B5G6R5_UNORM_SRGB,
667 };
668 int sfmt = format_mapping[format];
669
670 /* GEN6_FORMAT_R32G32B32A32_FLOAT happens to be 0 */
671 if (!sfmt && format != PIPE_FORMAT_R32G32B32A32_FLOAT)
672 sfmt = -1;
673
674 return sfmt;
675 }
676
677 static bool
678 ilo_format_supports_zs(const struct ilo_dev_info *dev,
679 enum pipe_format format)
680 {
681 switch (format) {
682 case PIPE_FORMAT_Z16_UNORM:
683 case PIPE_FORMAT_Z24X8_UNORM:
684 case PIPE_FORMAT_Z32_FLOAT:
685 case PIPE_FORMAT_Z24_UNORM_S8_UINT:
686 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
687 return true;
688 case PIPE_FORMAT_S8_UINT:
689 /* TODO separate stencil */
690 default:
691 return false;
692 }
693 }
694
695 static bool
696 ilo_format_supports_rt(const struct ilo_dev_info *dev,
697 enum pipe_format format)
698 {
699 const int idx = ilo_translate_format(dev, format, PIPE_BIND_RENDER_TARGET);
700 const struct ilo_dp_cap *cap = (idx >= 0 && idx < Elements(ilo_dp_caps)) ?
701 &ilo_dp_caps[idx] : NULL;
702
703 if (!cap || !cap->rt_write)
704 return false;
705
706 assert(!cap->rt_write_blending || cap->rt_write_blending >= cap->rt_write);
707
708 return util_format_is_pure_integer(format) ? (dev->gen >= cap->rt_write) :
709 (cap->rt_write_blending) ? (dev->gen >= cap->rt_write_blending) : false;
710 }
711
712 static bool
713 ilo_format_supports_sampler(const struct ilo_dev_info *dev,
714 enum pipe_format format)
715 {
716 const int idx = ilo_translate_format(dev, format, PIPE_BIND_SAMPLER_VIEW);
717 const struct ilo_sampler_cap *cap = (idx >= 0 &&
718 idx < Elements(ilo_sampler_caps)) ? &ilo_sampler_caps[idx] : NULL;
719
720 if (!cap || !cap->sampling)
721 return false;
722
723 assert(!cap->filtering || cap->filtering >= cap->sampling);
724
725 return util_format_is_pure_integer(format) ? (dev->gen >= cap->sampling) :
726 (cap->filtering) ? (dev->gen >= cap->filtering) : false;
727 }
728
729 static bool
730 ilo_format_supports_vb(const struct ilo_dev_info *dev,
731 enum pipe_format format)
732 {
733 const int idx = ilo_translate_format(dev, format, PIPE_BIND_VERTEX_BUFFER);
734 const struct ilo_vf_cap *cap = (idx >= 0 && idx < Elements(ilo_vf_caps)) ?
735 &ilo_vf_caps[idx] : NULL;
736
737 return (cap && cap->vertex_element && dev->gen >= cap->vertex_element);
738 }
739
740 static boolean
741 ilo_is_format_supported(struct pipe_screen *screen,
742 enum pipe_format format,
743 enum pipe_texture_target target,
744 unsigned sample_count,
745 unsigned bindings)
746 {
747 struct ilo_screen *is = ilo_screen(screen);
748 const struct ilo_dev_info *dev = &is->dev;
749 unsigned bind;
750
751 if (!util_format_is_supported(format, bindings))
752 return false;
753
754 /* no MSAA support yet */
755 if (sample_count > 1)
756 return false;
757
758 bind = (bindings & PIPE_BIND_DEPTH_STENCIL);
759 if (bind && !ilo_format_supports_zs(dev, format))
760 return false;
761
762 bind = (bindings & PIPE_BIND_RENDER_TARGET);
763 if (bind && !ilo_format_supports_rt(dev, format))
764 return false;
765
766 bind = (bindings & PIPE_BIND_SAMPLER_VIEW);
767 if (bind && !ilo_format_supports_sampler(dev, format))
768 return false;
769
770 bind = (bindings & PIPE_BIND_VERTEX_BUFFER);
771 if (bind && !ilo_format_supports_vb(dev, format))
772 return false;
773
774 (void) ilo_sol_caps;
775
776 return true;
777 }
778
779 static boolean
780 ilo_is_video_format_supported(struct pipe_screen *screen,
781 enum pipe_format format,
782 enum pipe_video_profile profile,
783 enum pipe_video_entrypoint entrypoint)
784 {
785 return vl_video_buffer_is_format_supported(screen, format, profile, entrypoint);
786 }
787
788 /**
789 * Initialize format-related functions.
790 */
791 void
792 ilo_init_format_functions(struct ilo_screen *is)
793 {
794 is->base.is_format_supported = ilo_is_format_supported;
795 is->base.is_video_format_supported = ilo_is_video_format_supported;
796 }