ilo: update and tailor the surface format table
[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 /* this idea is taken from i965 */
35 struct ilo_format_info {
36 bool exists;
37 int sampling;
38 int filtering;
39 int shadow_compare;
40 int chroma_key;
41 int render_target;
42 int alpha_blend;
43 int input_vb;
44 int streamed_output_vb;
45 int color_processing;
46 };
47
48 #define FI_INITIALIZER(exist, sampl, filt, shad, ck, rt, ab, vb, so, color) \
49 { exist, ILO_GEN(sampl), ILO_GEN(filt), ILO_GEN(shad), ILO_GEN(ck), \
50 ILO_GEN(rt), ILO_GEN(ab), ILO_GEN(vb), ILO_GEN(so), ILO_GEN(color) }
51
52 #define FI_ENTRY(sampl, filt, shad, ck, rt, ab, vb, so, color, sf) \
53 [GEN6_FORMAT_ ## sf] = FI_INITIALIZER(true, \
54 sampl, filt, shad, ck, rt, ab, vb, so, color)
55
56 #define X 999
57
58 static const struct ilo_format_info ilo_format_nonexist =
59 FI_INITIALIZER(false, X, X, X, X, X, X, X, X, X);
60
61 /*
62 * This table is based on:
63 *
64 * - the Sandy Bridge PRM, volume 4 part 1, page 88-97
65 * - the Ivy Bridge PRM, volume 2 part 1, page 97-99 and 195
66 * - the Ivy Bridge PRM, volume 4 part 1, page 84-87, 172, and 277-278
67 * - the Haswell PRM, volume 7, page 262-264, 467-470, and 535.
68 * - i965 surface_format_info (for BC6/BC7)
69 */
70 static const struct ilo_format_info ilo_format_table[] = {
71 /* sampl filt shad ck rt ab vb so color */
72 FI_ENTRY( 1, 5, X, X, 1, 1, 1, 1, X, R32G32B32A32_FLOAT),
73 FI_ENTRY( 1, X, X, X, 1, X, 1, 1, X, R32G32B32A32_SINT),
74 FI_ENTRY( 1, X, X, X, 1, X, 1, 1, X, R32G32B32A32_UINT),
75 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32G32B32A32_UNORM),
76 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32G32B32A32_SNORM),
77 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R64G64_FLOAT),
78 FI_ENTRY( 1, 5, X, X, X, X, X, X, X, R32G32B32X32_FLOAT),
79 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32G32B32A32_SSCALED),
80 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32G32B32A32_USCALED),
81 FI_ENTRY( X, X, X, X, X, X, X, X, X, R32G32B32A32_SFIXED),
82 FI_ENTRY( X, X, X, X, X, X, X, X, X, R64G64_PASSTHRU),
83 FI_ENTRY( 1, 5, X, X, X, X, 1, 1, X, R32G32B32_FLOAT),
84 FI_ENTRY( 1, X, X, X, X, X, 1, 1, X, R32G32B32_SINT),
85 FI_ENTRY( 1, X, X, X, X, X, 1, 1, X, R32G32B32_UINT),
86 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32G32B32_UNORM),
87 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32G32B32_SNORM),
88 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32G32B32_SSCALED),
89 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32G32B32_USCALED),
90 FI_ENTRY( X, X, X, X, X, X, X, X, X, R32G32B32_SFIXED),
91 FI_ENTRY( 1, 1, X, X, 1, 4.5, 1, X, 6, R16G16B16A16_UNORM),
92 FI_ENTRY( 1, 1, X, X, 1, 6, 1, X, X, R16G16B16A16_SNORM),
93 FI_ENTRY( 1, X, X, X, 1, X, 1, X, X, R16G16B16A16_SINT),
94 FI_ENTRY( 1, X, X, X, 1, X, 1, X, X, R16G16B16A16_UINT),
95 FI_ENTRY( 1, 1, X, X, 1, 1, 1, X, X, R16G16B16A16_FLOAT),
96 FI_ENTRY( 1, 5, X, X, 1, 1, 1, 1, X, R32G32_FLOAT),
97 FI_ENTRY( 1, X, X, X, 1, X, 1, 1, X, R32G32_SINT),
98 FI_ENTRY( 1, X, X, X, 1, X, 1, 1, X, R32G32_UINT),
99 FI_ENTRY( 1, 5, 1, X, X, X, X, X, X, R32_FLOAT_X8X24_TYPELESS),
100 FI_ENTRY( 1, X, X, X, X, X, X, X, X, X32_TYPELESS_G8X24_UINT),
101 FI_ENTRY( 1, 5, X, X, X, X, X, X, X, L32A32_FLOAT),
102 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32G32_UNORM),
103 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32G32_SNORM),
104 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R64_FLOAT),
105 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, R16G16B16X16_UNORM),
106 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, R16G16B16X16_FLOAT),
107 FI_ENTRY( 1, 5, X, X, X, X, X, X, X, A32X32_FLOAT),
108 FI_ENTRY( 1, 5, X, X, X, X, X, X, X, L32X32_FLOAT),
109 FI_ENTRY( 1, 5, X, X, X, X, X, X, X, I32X32_FLOAT),
110 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R16G16B16A16_SSCALED),
111 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R16G16B16A16_USCALED),
112 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32G32_SSCALED),
113 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32G32_USCALED),
114 FI_ENTRY( X, X, X, X, X, X, X, X, X, R32G32_SFIXED),
115 FI_ENTRY( X, X, X, X, X, X, X, X, X, R64_PASSTHRU),
116 FI_ENTRY( 1, 1, X, 1, 1, 1, 1, X, 6, B8G8R8A8_UNORM),
117 FI_ENTRY( 1, 1, X, X, 1, 1, X, X, X, B8G8R8A8_UNORM_SRGB),
118 FI_ENTRY( 1, 1, X, X, 1, 1, 1, X, 6, R10G10B10A2_UNORM),
119 FI_ENTRY( 1, 1, X, X, X, X, X, X, 6, R10G10B10A2_UNORM_SRGB),
120 FI_ENTRY( 1, X, X, X, 1, X, 1, X, X, R10G10B10A2_UINT),
121 FI_ENTRY( 1, 1, X, X, X, X, 1, X, X, R10G10B10_SNORM_A2_UNORM),
122 FI_ENTRY( 1, 1, X, X, 1, 1, 1, X, 6, R8G8B8A8_UNORM),
123 FI_ENTRY( 1, 1, X, X, 1, 1, X, X, 6, R8G8B8A8_UNORM_SRGB),
124 FI_ENTRY( 1, 1, X, X, 1, 6, 1, X, X, R8G8B8A8_SNORM),
125 FI_ENTRY( 1, X, X, X, 1, X, 1, X, X, R8G8B8A8_SINT),
126 FI_ENTRY( 1, X, X, X, 1, X, 1, X, X, R8G8B8A8_UINT),
127 FI_ENTRY( 1, 1, X, X, 1, 4.5, 1, X, X, R16G16_UNORM),
128 FI_ENTRY( 1, 1, X, X, 1, 6, 1, X, X, R16G16_SNORM),
129 FI_ENTRY( 1, X, X, X, 1, X, 1, X, X, R16G16_SINT),
130 FI_ENTRY( 1, X, X, X, 1, X, 1, X, X, R16G16_UINT),
131 FI_ENTRY( 1, 1, X, X, 1, 1, 1, X, X, R16G16_FLOAT),
132 FI_ENTRY( 1, 1, X, X, 1, 1, X, X, 6, B10G10R10A2_UNORM),
133 FI_ENTRY( 1, 1, X, X, 1, 1, X, X, 6, B10G10R10A2_UNORM_SRGB),
134 FI_ENTRY( 1, 1, X, X, 1, 1, 1, X, X, R11G11B10_FLOAT),
135 FI_ENTRY( 1, X, X, X, 1, X, 1, 1, X, R32_SINT),
136 FI_ENTRY( 1, X, X, X, 1, X, 1, 1, X, R32_UINT),
137 FI_ENTRY( 1, 5, 1, X, 1, 1, 1, 1, X, R32_FLOAT),
138 FI_ENTRY( 1, 5, 1, X, X, X, X, X, X, R24_UNORM_X8_TYPELESS),
139 FI_ENTRY( 1, X, X, X, X, X, X, X, X, X24_TYPELESS_G8_UINT),
140 FI_ENTRY( X, X, X, X, X, X, X, X, X, L32_UNORM),
141 FI_ENTRY( X, X, X, X, X, X, X, X, X, A32_UNORM),
142 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, L16A16_UNORM),
143 FI_ENTRY( 1, 5, 1, X, X, X, X, X, X, I24X8_UNORM),
144 FI_ENTRY( 1, 5, 1, X, X, X, X, X, X, L24X8_UNORM),
145 FI_ENTRY( 1, 5, 1, X, X, X, X, X, X, A24X8_UNORM),
146 FI_ENTRY( 1, 5, 1, X, X, X, X, X, X, I32_FLOAT),
147 FI_ENTRY( 1, 5, 1, X, X, X, X, X, X, L32_FLOAT),
148 FI_ENTRY( 1, 5, 1, X, X, X, X, X, X, A32_FLOAT),
149 FI_ENTRY( X, X, X, X, X, X, X, X, X, X8B8_UNORM_G8R8_SNORM),
150 FI_ENTRY( X, X, X, X, X, X, X, X, X, A8X8_UNORM_G8R8_SNORM),
151 FI_ENTRY( X, X, X, X, X, X, X, X, X, B8X8_UNORM_G8R8_SNORM),
152 FI_ENTRY( 1, 1, X, 1, X, X, X, X, 6, B8G8R8X8_UNORM),
153 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, B8G8R8X8_UNORM_SRGB),
154 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, R8G8B8X8_UNORM),
155 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, R8G8B8X8_UNORM_SRGB),
156 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, R9G9B9E5_SHAREDEXP),
157 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, B10G10R10X2_UNORM),
158 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, L16A16_FLOAT),
159 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32_UNORM),
160 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32_SNORM),
161 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R10G10B10X2_USCALED),
162 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R8G8B8A8_SSCALED),
163 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R8G8B8A8_USCALED),
164 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R16G16_SSCALED),
165 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R16G16_USCALED),
166 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32_SSCALED),
167 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R32_USCALED),
168 FI_ENTRY( 1, 1, X, 1, 1, 1, X, X, X, B5G6R5_UNORM),
169 FI_ENTRY( 1, 1, X, X, 1, 1, X, X, X, B5G6R5_UNORM_SRGB),
170 FI_ENTRY( 1, 1, X, 1, 1, 1, X, X, X, B5G5R5A1_UNORM),
171 FI_ENTRY( 1, 1, X, X, 1, 1, X, X, X, B5G5R5A1_UNORM_SRGB),
172 FI_ENTRY( 1, 1, X, 1, 1, 1, X, X, X, B4G4R4A4_UNORM),
173 FI_ENTRY( 1, 1, X, X, 1, 1, X, X, X, B4G4R4A4_UNORM_SRGB),
174 FI_ENTRY( 1, 1, X, X, 1, 1, 1, X, X, R8G8_UNORM),
175 FI_ENTRY( 1, 1, X, 1, 1, 6, 1, X, X, R8G8_SNORM),
176 FI_ENTRY( 1, X, X, X, 1, X, 1, X, X, R8G8_SINT),
177 FI_ENTRY( 1, X, X, X, 1, X, 1, X, X, R8G8_UINT),
178 FI_ENTRY( 1, 1, 1, X, 1, 4.5, 1, X, 7, R16_UNORM),
179 FI_ENTRY( 1, 1, X, X, 1, 6, 1, X, X, R16_SNORM),
180 FI_ENTRY( 1, X, X, X, 1, X, 1, X, X, R16_SINT),
181 FI_ENTRY( 1, X, X, X, 1, X, 1, X, X, R16_UINT),
182 FI_ENTRY( 1, 1, X, X, 1, 1, 1, X, X, R16_FLOAT),
183 FI_ENTRY( 5, 5, X, X, X, X, X, X, X, A8P8_UNORM_PALETTE0),
184 FI_ENTRY( 5, 5, X, X, X, X, X, X, X, A8P8_UNORM_PALETTE1),
185 FI_ENTRY( 1, 1, 1, X, X, X, X, X, X, I16_UNORM),
186 FI_ENTRY( 1, 1, 1, X, X, X, X, X, X, L16_UNORM),
187 FI_ENTRY( 1, 1, 1, X, X, X, X, X, X, A16_UNORM),
188 FI_ENTRY( 1, 1, X, 1, X, X, X, X, X, L8A8_UNORM),
189 FI_ENTRY( 1, 1, 1, X, X, X, X, X, X, I16_FLOAT),
190 FI_ENTRY( 1, 1, 1, X, X, X, X, X, X, L16_FLOAT),
191 FI_ENTRY( 1, 1, 1, X, X, X, X, X, X, A16_FLOAT),
192 FI_ENTRY(4.5, 4.5, X, X, X, X, X, X, X, L8A8_UNORM_SRGB),
193 FI_ENTRY( 1, 1, X, 1, X, X, X, X, X, R5G5_SNORM_B6_UNORM),
194 FI_ENTRY( X, X, X, X, 1, 1, X, X, X, B5G5R5X1_UNORM),
195 FI_ENTRY( X, X, X, X, 1, 1, X, X, X, B5G5R5X1_UNORM_SRGB),
196 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R8G8_SSCALED),
197 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R8G8_USCALED),
198 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R16_SSCALED),
199 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R16_USCALED),
200 FI_ENTRY( 5, 5, X, X, X, X, X, X, X, P8A8_UNORM_PALETTE0),
201 FI_ENTRY( 5, 5, X, X, X, X, X, X, X, P8A8_UNORM_PALETTE1),
202 FI_ENTRY( X, X, X, X, X, X, X, X, X, A1B5G5R5_UNORM),
203 FI_ENTRY( X, X, X, X, X, X, X, X, X, A4B4G4R4_UNORM),
204 FI_ENTRY( X, X, X, X, X, X, X, X, X, L8A8_UINT),
205 FI_ENTRY( X, X, X, X, X, X, X, X, X, L8A8_SINT),
206 FI_ENTRY( 1, 1, X, 4.5, 1, 1, 1, X, X, R8_UNORM),
207 FI_ENTRY( 1, 1, X, X, 1, 6, 1, X, X, R8_SNORM),
208 FI_ENTRY( 1, X, X, X, 1, X, 1, X, X, R8_SINT),
209 FI_ENTRY( 1, X, X, X, 1, X, 1, X, X, R8_UINT),
210 FI_ENTRY( 1, 1, X, 1, 1, 1, X, X, X, A8_UNORM),
211 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, I8_UNORM),
212 FI_ENTRY( 1, 1, X, 1, X, X, X, X, X, L8_UNORM),
213 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, P4A4_UNORM_PALETTE0),
214 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, A4P4_UNORM_PALETTE0),
215 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R8_SSCALED),
216 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R8_USCALED),
217 FI_ENTRY(4.5, 4.5, X, X, X, X, X, X, X, P8_UNORM_PALETTE0),
218 FI_ENTRY(4.5, 4.5, X, X, X, X, X, X, X, L8_UNORM_SRGB),
219 FI_ENTRY(4.5, 4.5, X, X, X, X, X, X, X, P8_UNORM_PALETTE1),
220 FI_ENTRY(4.5, 4.5, X, X, X, X, X, X, X, P4A4_UNORM_PALETTE1),
221 FI_ENTRY(4.5, 4.5, X, X, X, X, X, X, X, A4P4_UNORM_PALETTE1),
222 FI_ENTRY( X, X, X, X, X, X, X, X, X, Y8_UNORM),
223 FI_ENTRY( X, X, X, X, X, X, X, X, X, L8_UINT),
224 FI_ENTRY( X, X, X, X, X, X, X, X, X, L8_SINT),
225 FI_ENTRY( X, X, X, X, X, X, X, X, X, I8_UINT),
226 FI_ENTRY( X, X, X, X, X, X, X, X, X, I8_SINT),
227 FI_ENTRY(4.5, 4.5, X, X, X, X, X, X, X, DXT1_RGB_SRGB),
228 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, R1_UNORM),
229 FI_ENTRY( 1, 1, X, 1, 1, X, X, X, 6, YCRCB_NORMAL),
230 FI_ENTRY( 1, 1, X, 1, 1, X, X, X, 6, YCRCB_SWAPUVY),
231 FI_ENTRY(4.5, 4.5, X, X, X, X, X, X, X, P2_UNORM_PALETTE0),
232 FI_ENTRY(4.5, 4.5, X, X, X, X, X, X, X, P2_UNORM_PALETTE1),
233 FI_ENTRY( 1, 1, X, 1, X, X, X, X, X, BC1_UNORM),
234 FI_ENTRY( 1, 1, X, 1, X, X, X, X, X, BC2_UNORM),
235 FI_ENTRY( 1, 1, X, 1, X, X, X, X, X, BC3_UNORM),
236 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, BC4_UNORM),
237 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, BC5_UNORM),
238 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, BC1_UNORM_SRGB),
239 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, BC2_UNORM_SRGB),
240 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, BC3_UNORM_SRGB),
241 FI_ENTRY( 1, X, X, X, X, X, X, X, X, MONO8),
242 FI_ENTRY( 1, 1, X, X, 1, X, X, X, 6, YCRCB_SWAPUV),
243 FI_ENTRY( 1, 1, X, X, 1, X, X, X, 6, YCRCB_SWAPY),
244 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, DXT1_RGB),
245 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, FXT1),
246 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R8G8B8_UNORM),
247 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R8G8B8_SNORM),
248 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R8G8B8_SSCALED),
249 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R8G8B8_USCALED),
250 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R64G64B64A64_FLOAT),
251 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R64G64B64_FLOAT),
252 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, BC4_SNORM),
253 FI_ENTRY( 1, 1, X, X, X, X, X, X, X, BC5_SNORM),
254 FI_ENTRY( 5, 5, X, X, X, X, 6, X, X, R16G16B16_FLOAT),
255 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R16G16B16_UNORM),
256 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R16G16B16_SNORM),
257 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R16G16B16_SSCALED),
258 FI_ENTRY( X, X, X, X, X, X, 1, X, X, R16G16B16_USCALED),
259 FI_ENTRY( 7, 7, X, X, X, X, X, X, X, BC6H_SF16),
260 FI_ENTRY( 7, 7, X, X, X, X, X, X, X, BC7_UNORM),
261 FI_ENTRY( 7, 7, X, X, X, X, X, X, X, BC7_UNORM_SRGB),
262 FI_ENTRY( 7, 7, X, X, X, X, X, X, X, BC6H_UF16),
263 FI_ENTRY( X, X, X, X, X, X, X, X, X, PLANAR_420_8),
264 FI_ENTRY( X, X, X, X, X, X, X, X, X, R8G8B8_UNORM_SRGB),
265 FI_ENTRY( X, X, X, X, X, X, X, X, X, ETC1_RGB8),
266 FI_ENTRY( X, X, X, X, X, X, X, X, X, ETC2_RGB8),
267 FI_ENTRY( X, X, X, X, X, X, X, X, X, EAC_R11),
268 FI_ENTRY( X, X, X, X, X, X, X, X, X, EAC_RG11),
269 FI_ENTRY( X, X, X, X, X, X, X, X, X, EAC_SIGNED_R11),
270 FI_ENTRY( X, X, X, X, X, X, X, X, X, EAC_SIGNED_RG11),
271 FI_ENTRY( X, X, X, X, X, X, X, X, X, ETC2_SRGB8),
272 FI_ENTRY( X, X, X, X, X, X, X, X, X, R16G16B16_UINT),
273 FI_ENTRY( X, X, X, X, X, X, X, X, X, R16G16B16_SINT),
274 FI_ENTRY( X, X, X, X, X, X, X, X, X, R32_SFIXED),
275 FI_ENTRY( X, X, X, X, X, X, X, X, X, R10G10B10A2_SNORM),
276 FI_ENTRY( X, X, X, X, X, X, X, X, X, R10G10B10A2_USCALED),
277 FI_ENTRY( X, X, X, X, X, X, X, X, X, R10G10B10A2_SSCALED),
278 FI_ENTRY( X, X, X, X, X, X, X, X, X, R10G10B10A2_SINT),
279 FI_ENTRY( X, X, X, X, X, X, X, X, X, B10G10R10A2_SNORM),
280 FI_ENTRY( X, X, X, X, X, X, X, X, X, B10G10R10A2_USCALED),
281 FI_ENTRY( X, X, X, X, X, X, X, X, X, B10G10R10A2_SSCALED),
282 FI_ENTRY( X, X, X, X, X, X, X, X, X, B10G10R10A2_UINT),
283 FI_ENTRY( X, X, X, X, X, X, X, X, X, B10G10R10A2_SINT),
284 FI_ENTRY( X, X, X, X, X, X, X, X, X, R64G64B64A64_PASSTHRU),
285 FI_ENTRY( X, X, X, X, X, X, X, X, X, R64G64B64_PASSTHRU),
286 FI_ENTRY( X, X, X, X, X, X, X, X, X, ETC2_RGB8_PTA),
287 FI_ENTRY( X, X, X, X, X, X, X, X, X, ETC2_SRGB8_PTA),
288 FI_ENTRY( X, X, X, X, X, X, X, X, X, ETC2_EAC_RGBA8),
289 FI_ENTRY( X, X, X, X, X, X, X, X, X, ETC2_EAC_SRGB8_A8),
290 FI_ENTRY( X, X, X, X, X, X, X, X, X, R8G8B8_UINT),
291 FI_ENTRY( X, X, X, X, X, X, X, X, X, R8G8B8_SINT),
292 FI_ENTRY( X, X, X, X, X, X, X, X, X, RAW),
293 };
294
295 #undef X
296 #undef FI_ENTRY
297 #undef FI_INITIALIZER
298
299 static const struct ilo_format_info *
300 lookup_format_info(enum pipe_format format, unsigned bind)
301 {
302 const int surfaceformat = ilo_translate_format(format, bind);
303
304 return (surfaceformat >= 0 && surfaceformat < Elements(ilo_format_table) &&
305 ilo_format_table[surfaceformat].exists) ?
306 &ilo_format_table[surfaceformat] : &ilo_format_nonexist;
307 }
308
309 /**
310 * Translate a color (non-depth/stencil) pipe format to the matching hardware
311 * format. Return -1 on errors.
312 */
313 int
314 ilo_translate_color_format(enum pipe_format format)
315 {
316 static const int format_mapping[PIPE_FORMAT_COUNT] = {
317 [PIPE_FORMAT_NONE] = 0,
318 [PIPE_FORMAT_B8G8R8A8_UNORM] = GEN6_FORMAT_B8G8R8A8_UNORM,
319 [PIPE_FORMAT_B8G8R8X8_UNORM] = GEN6_FORMAT_B8G8R8X8_UNORM,
320 [PIPE_FORMAT_A8R8G8B8_UNORM] = 0,
321 [PIPE_FORMAT_X8R8G8B8_UNORM] = 0,
322 [PIPE_FORMAT_B5G5R5A1_UNORM] = GEN6_FORMAT_B5G5R5A1_UNORM,
323 [PIPE_FORMAT_B4G4R4A4_UNORM] = GEN6_FORMAT_B4G4R4A4_UNORM,
324 [PIPE_FORMAT_B5G6R5_UNORM] = GEN6_FORMAT_B5G6R5_UNORM,
325 [PIPE_FORMAT_R10G10B10A2_UNORM] = GEN6_FORMAT_R10G10B10A2_UNORM,
326 [PIPE_FORMAT_L8_UNORM] = GEN6_FORMAT_L8_UNORM,
327 [PIPE_FORMAT_A8_UNORM] = GEN6_FORMAT_A8_UNORM,
328 [PIPE_FORMAT_I8_UNORM] = GEN6_FORMAT_I8_UNORM,
329 [PIPE_FORMAT_L8A8_UNORM] = GEN6_FORMAT_L8A8_UNORM,
330 [PIPE_FORMAT_L16_UNORM] = GEN6_FORMAT_L16_UNORM,
331 [PIPE_FORMAT_UYVY] = GEN6_FORMAT_YCRCB_SWAPUVY,
332 [PIPE_FORMAT_YUYV] = GEN6_FORMAT_YCRCB_NORMAL,
333 [PIPE_FORMAT_Z16_UNORM] = 0,
334 [PIPE_FORMAT_Z32_UNORM] = 0,
335 [PIPE_FORMAT_Z32_FLOAT] = 0,
336 [PIPE_FORMAT_Z24_UNORM_S8_UINT] = 0,
337 [PIPE_FORMAT_S8_UINT_Z24_UNORM] = 0,
338 [PIPE_FORMAT_Z24X8_UNORM] = 0,
339 [PIPE_FORMAT_X8Z24_UNORM] = 0,
340 [PIPE_FORMAT_S8_UINT] = 0,
341 [PIPE_FORMAT_R64_FLOAT] = GEN6_FORMAT_R64_FLOAT,
342 [PIPE_FORMAT_R64G64_FLOAT] = GEN6_FORMAT_R64G64_FLOAT,
343 [PIPE_FORMAT_R64G64B64_FLOAT] = GEN6_FORMAT_R64G64B64_FLOAT,
344 [PIPE_FORMAT_R64G64B64A64_FLOAT] = GEN6_FORMAT_R64G64B64A64_FLOAT,
345 [PIPE_FORMAT_R32_FLOAT] = GEN6_FORMAT_R32_FLOAT,
346 [PIPE_FORMAT_R32G32_FLOAT] = GEN6_FORMAT_R32G32_FLOAT,
347 [PIPE_FORMAT_R32G32B32_FLOAT] = GEN6_FORMAT_R32G32B32_FLOAT,
348 [PIPE_FORMAT_R32G32B32A32_FLOAT] = GEN6_FORMAT_R32G32B32A32_FLOAT,
349 [PIPE_FORMAT_R32_UNORM] = GEN6_FORMAT_R32_UNORM,
350 [PIPE_FORMAT_R32G32_UNORM] = GEN6_FORMAT_R32G32_UNORM,
351 [PIPE_FORMAT_R32G32B32_UNORM] = GEN6_FORMAT_R32G32B32_UNORM,
352 [PIPE_FORMAT_R32G32B32A32_UNORM] = GEN6_FORMAT_R32G32B32A32_UNORM,
353 [PIPE_FORMAT_R32_USCALED] = GEN6_FORMAT_R32_USCALED,
354 [PIPE_FORMAT_R32G32_USCALED] = GEN6_FORMAT_R32G32_USCALED,
355 [PIPE_FORMAT_R32G32B32_USCALED] = GEN6_FORMAT_R32G32B32_USCALED,
356 [PIPE_FORMAT_R32G32B32A32_USCALED] = GEN6_FORMAT_R32G32B32A32_USCALED,
357 [PIPE_FORMAT_R32_SNORM] = GEN6_FORMAT_R32_SNORM,
358 [PIPE_FORMAT_R32G32_SNORM] = GEN6_FORMAT_R32G32_SNORM,
359 [PIPE_FORMAT_R32G32B32_SNORM] = GEN6_FORMAT_R32G32B32_SNORM,
360 [PIPE_FORMAT_R32G32B32A32_SNORM] = GEN6_FORMAT_R32G32B32A32_SNORM,
361 [PIPE_FORMAT_R32_SSCALED] = GEN6_FORMAT_R32_SSCALED,
362 [PIPE_FORMAT_R32G32_SSCALED] = GEN6_FORMAT_R32G32_SSCALED,
363 [PIPE_FORMAT_R32G32B32_SSCALED] = GEN6_FORMAT_R32G32B32_SSCALED,
364 [PIPE_FORMAT_R32G32B32A32_SSCALED] = GEN6_FORMAT_R32G32B32A32_SSCALED,
365 [PIPE_FORMAT_R16_UNORM] = GEN6_FORMAT_R16_UNORM,
366 [PIPE_FORMAT_R16G16_UNORM] = GEN6_FORMAT_R16G16_UNORM,
367 [PIPE_FORMAT_R16G16B16_UNORM] = GEN6_FORMAT_R16G16B16_UNORM,
368 [PIPE_FORMAT_R16G16B16A16_UNORM] = GEN6_FORMAT_R16G16B16A16_UNORM,
369 [PIPE_FORMAT_R16_USCALED] = GEN6_FORMAT_R16_USCALED,
370 [PIPE_FORMAT_R16G16_USCALED] = GEN6_FORMAT_R16G16_USCALED,
371 [PIPE_FORMAT_R16G16B16_USCALED] = GEN6_FORMAT_R16G16B16_USCALED,
372 [PIPE_FORMAT_R16G16B16A16_USCALED] = GEN6_FORMAT_R16G16B16A16_USCALED,
373 [PIPE_FORMAT_R16_SNORM] = GEN6_FORMAT_R16_SNORM,
374 [PIPE_FORMAT_R16G16_SNORM] = GEN6_FORMAT_R16G16_SNORM,
375 [PIPE_FORMAT_R16G16B16_SNORM] = GEN6_FORMAT_R16G16B16_SNORM,
376 [PIPE_FORMAT_R16G16B16A16_SNORM] = GEN6_FORMAT_R16G16B16A16_SNORM,
377 [PIPE_FORMAT_R16_SSCALED] = GEN6_FORMAT_R16_SSCALED,
378 [PIPE_FORMAT_R16G16_SSCALED] = GEN6_FORMAT_R16G16_SSCALED,
379 [PIPE_FORMAT_R16G16B16_SSCALED] = GEN6_FORMAT_R16G16B16_SSCALED,
380 [PIPE_FORMAT_R16G16B16A16_SSCALED] = GEN6_FORMAT_R16G16B16A16_SSCALED,
381 [PIPE_FORMAT_R8_UNORM] = GEN6_FORMAT_R8_UNORM,
382 [PIPE_FORMAT_R8G8_UNORM] = GEN6_FORMAT_R8G8_UNORM,
383 [PIPE_FORMAT_R8G8B8_UNORM] = GEN6_FORMAT_R8G8B8_UNORM,
384 [PIPE_FORMAT_R8G8B8A8_UNORM] = GEN6_FORMAT_R8G8B8A8_UNORM,
385 [PIPE_FORMAT_X8B8G8R8_UNORM] = 0,
386 [PIPE_FORMAT_R8_USCALED] = GEN6_FORMAT_R8_USCALED,
387 [PIPE_FORMAT_R8G8_USCALED] = GEN6_FORMAT_R8G8_USCALED,
388 [PIPE_FORMAT_R8G8B8_USCALED] = GEN6_FORMAT_R8G8B8_USCALED,
389 [PIPE_FORMAT_R8G8B8A8_USCALED] = GEN6_FORMAT_R8G8B8A8_USCALED,
390 [PIPE_FORMAT_R8_SNORM] = GEN6_FORMAT_R8_SNORM,
391 [PIPE_FORMAT_R8G8_SNORM] = GEN6_FORMAT_R8G8_SNORM,
392 [PIPE_FORMAT_R8G8B8_SNORM] = GEN6_FORMAT_R8G8B8_SNORM,
393 [PIPE_FORMAT_R8G8B8A8_SNORM] = GEN6_FORMAT_R8G8B8A8_SNORM,
394 [PIPE_FORMAT_R8_SSCALED] = GEN6_FORMAT_R8_SSCALED,
395 [PIPE_FORMAT_R8G8_SSCALED] = GEN6_FORMAT_R8G8_SSCALED,
396 [PIPE_FORMAT_R8G8B8_SSCALED] = GEN6_FORMAT_R8G8B8_SSCALED,
397 [PIPE_FORMAT_R8G8B8A8_SSCALED] = GEN6_FORMAT_R8G8B8A8_SSCALED,
398 [PIPE_FORMAT_R32_FIXED] = GEN6_FORMAT_R32_SFIXED,
399 [PIPE_FORMAT_R32G32_FIXED] = GEN6_FORMAT_R32G32_SFIXED,
400 [PIPE_FORMAT_R32G32B32_FIXED] = GEN6_FORMAT_R32G32B32_SFIXED,
401 [PIPE_FORMAT_R32G32B32A32_FIXED] = GEN6_FORMAT_R32G32B32A32_SFIXED,
402 [PIPE_FORMAT_R16_FLOAT] = GEN6_FORMAT_R16_FLOAT,
403 [PIPE_FORMAT_R16G16_FLOAT] = GEN6_FORMAT_R16G16_FLOAT,
404 [PIPE_FORMAT_R16G16B16_FLOAT] = GEN6_FORMAT_R16G16B16_FLOAT,
405 [PIPE_FORMAT_R16G16B16A16_FLOAT] = GEN6_FORMAT_R16G16B16A16_FLOAT,
406 [PIPE_FORMAT_L8_SRGB] = GEN6_FORMAT_L8_UNORM_SRGB,
407 [PIPE_FORMAT_L8A8_SRGB] = GEN6_FORMAT_L8A8_UNORM_SRGB,
408 [PIPE_FORMAT_R8G8B8_SRGB] = GEN6_FORMAT_R8G8B8_UNORM_SRGB,
409 [PIPE_FORMAT_A8B8G8R8_SRGB] = 0,
410 [PIPE_FORMAT_X8B8G8R8_SRGB] = 0,
411 [PIPE_FORMAT_B8G8R8A8_SRGB] = GEN6_FORMAT_B8G8R8A8_UNORM_SRGB,
412 [PIPE_FORMAT_B8G8R8X8_SRGB] = 0,
413 [PIPE_FORMAT_A8R8G8B8_SRGB] = 0,
414 [PIPE_FORMAT_X8R8G8B8_SRGB] = 0,
415 [PIPE_FORMAT_R8G8B8A8_SRGB] = 0,
416 [PIPE_FORMAT_DXT1_RGB] = GEN6_FORMAT_DXT1_RGB,
417 [PIPE_FORMAT_DXT1_RGBA] = GEN6_FORMAT_BC1_UNORM,
418 [PIPE_FORMAT_DXT3_RGBA] = GEN6_FORMAT_BC2_UNORM,
419 [PIPE_FORMAT_DXT5_RGBA] = GEN6_FORMAT_BC3_UNORM,
420 [PIPE_FORMAT_DXT1_SRGB] = GEN6_FORMAT_DXT1_RGB_SRGB,
421 [PIPE_FORMAT_DXT1_SRGBA] = GEN6_FORMAT_BC1_UNORM_SRGB,
422 [PIPE_FORMAT_DXT3_SRGBA] = GEN6_FORMAT_BC2_UNORM_SRGB,
423 [PIPE_FORMAT_DXT5_SRGBA] = GEN6_FORMAT_BC3_UNORM_SRGB,
424 [PIPE_FORMAT_RGTC1_UNORM] = GEN6_FORMAT_BC4_UNORM,
425 [PIPE_FORMAT_RGTC1_SNORM] = GEN6_FORMAT_BC4_SNORM,
426 [PIPE_FORMAT_RGTC2_UNORM] = GEN6_FORMAT_BC5_UNORM,
427 [PIPE_FORMAT_RGTC2_SNORM] = GEN6_FORMAT_BC5_SNORM,
428 [PIPE_FORMAT_R8G8_B8G8_UNORM] = 0,
429 [PIPE_FORMAT_G8R8_G8B8_UNORM] = 0,
430 [PIPE_FORMAT_R8SG8SB8UX8U_NORM] = 0,
431 [PIPE_FORMAT_R5SG5SB6U_NORM] = 0,
432 [PIPE_FORMAT_A8B8G8R8_UNORM] = 0,
433 [PIPE_FORMAT_B5G5R5X1_UNORM] = GEN6_FORMAT_B5G5R5X1_UNORM,
434 [PIPE_FORMAT_R10G10B10A2_USCALED] = GEN6_FORMAT_R10G10B10A2_USCALED,
435 [PIPE_FORMAT_R11G11B10_FLOAT] = GEN6_FORMAT_R11G11B10_FLOAT,
436 [PIPE_FORMAT_R9G9B9E5_FLOAT] = GEN6_FORMAT_R9G9B9E5_SHAREDEXP,
437 [PIPE_FORMAT_Z32_FLOAT_S8X24_UINT] = 0,
438 [PIPE_FORMAT_R1_UNORM] = 0,
439 [PIPE_FORMAT_R10G10B10X2_USCALED] = GEN6_FORMAT_R10G10B10X2_USCALED,
440 [PIPE_FORMAT_R10G10B10X2_SNORM] = 0,
441 [PIPE_FORMAT_L4A4_UNORM] = 0,
442 [PIPE_FORMAT_B10G10R10A2_UNORM] = GEN6_FORMAT_B10G10R10A2_UNORM,
443 [PIPE_FORMAT_R10SG10SB10SA2U_NORM] = 0,
444 [PIPE_FORMAT_R8G8Bx_SNORM] = 0,
445 [PIPE_FORMAT_R8G8B8X8_UNORM] = GEN6_FORMAT_R8G8B8X8_UNORM,
446 [PIPE_FORMAT_B4G4R4X4_UNORM] = 0,
447 [PIPE_FORMAT_X24S8_UINT] = 0,
448 [PIPE_FORMAT_S8X24_UINT] = 0,
449 [PIPE_FORMAT_X32_S8X24_UINT] = 0,
450 [PIPE_FORMAT_B2G3R3_UNORM] = 0,
451 [PIPE_FORMAT_L16A16_UNORM] = GEN6_FORMAT_L16A16_UNORM,
452 [PIPE_FORMAT_A16_UNORM] = GEN6_FORMAT_A16_UNORM,
453 [PIPE_FORMAT_I16_UNORM] = GEN6_FORMAT_I16_UNORM,
454 [PIPE_FORMAT_LATC1_UNORM] = 0,
455 [PIPE_FORMAT_LATC1_SNORM] = 0,
456 [PIPE_FORMAT_LATC2_UNORM] = 0,
457 [PIPE_FORMAT_LATC2_SNORM] = 0,
458 [PIPE_FORMAT_A8_SNORM] = 0,
459 [PIPE_FORMAT_L8_SNORM] = 0,
460 [PIPE_FORMAT_L8A8_SNORM] = 0,
461 [PIPE_FORMAT_I8_SNORM] = 0,
462 [PIPE_FORMAT_A16_SNORM] = 0,
463 [PIPE_FORMAT_L16_SNORM] = 0,
464 [PIPE_FORMAT_L16A16_SNORM] = 0,
465 [PIPE_FORMAT_I16_SNORM] = 0,
466 [PIPE_FORMAT_A16_FLOAT] = GEN6_FORMAT_A16_FLOAT,
467 [PIPE_FORMAT_L16_FLOAT] = GEN6_FORMAT_L16_FLOAT,
468 [PIPE_FORMAT_L16A16_FLOAT] = GEN6_FORMAT_L16A16_FLOAT,
469 [PIPE_FORMAT_I16_FLOAT] = GEN6_FORMAT_I16_FLOAT,
470 [PIPE_FORMAT_A32_FLOAT] = GEN6_FORMAT_A32_FLOAT,
471 [PIPE_FORMAT_L32_FLOAT] = GEN6_FORMAT_L32_FLOAT,
472 [PIPE_FORMAT_L32A32_FLOAT] = GEN6_FORMAT_L32A32_FLOAT,
473 [PIPE_FORMAT_I32_FLOAT] = GEN6_FORMAT_I32_FLOAT,
474 [PIPE_FORMAT_YV12] = 0,
475 [PIPE_FORMAT_YV16] = 0,
476 [PIPE_FORMAT_IYUV] = 0,
477 [PIPE_FORMAT_NV12] = 0,
478 [PIPE_FORMAT_NV21] = 0,
479 [PIPE_FORMAT_A4R4_UNORM] = 0,
480 [PIPE_FORMAT_R4A4_UNORM] = 0,
481 [PIPE_FORMAT_R8A8_UNORM] = 0,
482 [PIPE_FORMAT_A8R8_UNORM] = 0,
483 [PIPE_FORMAT_R10G10B10A2_SSCALED] = GEN6_FORMAT_R10G10B10A2_SSCALED,
484 [PIPE_FORMAT_R10G10B10A2_SNORM] = GEN6_FORMAT_R10G10B10A2_SNORM,
485 [PIPE_FORMAT_B10G10R10A2_USCALED] = GEN6_FORMAT_B10G10R10A2_USCALED,
486 [PIPE_FORMAT_B10G10R10A2_SSCALED] = GEN6_FORMAT_B10G10R10A2_SSCALED,
487 [PIPE_FORMAT_B10G10R10A2_SNORM] = GEN6_FORMAT_B10G10R10A2_SNORM,
488 [PIPE_FORMAT_R8_UINT] = GEN6_FORMAT_R8_UINT,
489 [PIPE_FORMAT_R8G8_UINT] = GEN6_FORMAT_R8G8_UINT,
490 [PIPE_FORMAT_R8G8B8_UINT] = GEN6_FORMAT_R8G8B8_UINT,
491 [PIPE_FORMAT_R8G8B8A8_UINT] = GEN6_FORMAT_R8G8B8A8_UINT,
492 [PIPE_FORMAT_R8_SINT] = GEN6_FORMAT_R8_SINT,
493 [PIPE_FORMAT_R8G8_SINT] = GEN6_FORMAT_R8G8_SINT,
494 [PIPE_FORMAT_R8G8B8_SINT] = GEN6_FORMAT_R8G8B8_SINT,
495 [PIPE_FORMAT_R8G8B8A8_SINT] = GEN6_FORMAT_R8G8B8A8_SINT,
496 [PIPE_FORMAT_R16_UINT] = GEN6_FORMAT_R16_UINT,
497 [PIPE_FORMAT_R16G16_UINT] = GEN6_FORMAT_R16G16_UINT,
498 [PIPE_FORMAT_R16G16B16_UINT] = GEN6_FORMAT_R16G16B16_UINT,
499 [PIPE_FORMAT_R16G16B16A16_UINT] = GEN6_FORMAT_R16G16B16A16_UINT,
500 [PIPE_FORMAT_R16_SINT] = GEN6_FORMAT_R16_SINT,
501 [PIPE_FORMAT_R16G16_SINT] = GEN6_FORMAT_R16G16_SINT,
502 [PIPE_FORMAT_R16G16B16_SINT] = GEN6_FORMAT_R16G16B16_SINT,
503 [PIPE_FORMAT_R16G16B16A16_SINT] = GEN6_FORMAT_R16G16B16A16_SINT,
504 [PIPE_FORMAT_R32_UINT] = GEN6_FORMAT_R32_UINT,
505 [PIPE_FORMAT_R32G32_UINT] = GEN6_FORMAT_R32G32_UINT,
506 [PIPE_FORMAT_R32G32B32_UINT] = GEN6_FORMAT_R32G32B32_UINT,
507 [PIPE_FORMAT_R32G32B32A32_UINT] = GEN6_FORMAT_R32G32B32A32_UINT,
508 [PIPE_FORMAT_R32_SINT] = GEN6_FORMAT_R32_SINT,
509 [PIPE_FORMAT_R32G32_SINT] = GEN6_FORMAT_R32G32_SINT,
510 [PIPE_FORMAT_R32G32B32_SINT] = GEN6_FORMAT_R32G32B32_SINT,
511 [PIPE_FORMAT_R32G32B32A32_SINT] = GEN6_FORMAT_R32G32B32A32_SINT,
512 [PIPE_FORMAT_A8_UINT] = 0,
513 [PIPE_FORMAT_I8_UINT] = GEN6_FORMAT_I8_UINT,
514 [PIPE_FORMAT_L8_UINT] = GEN6_FORMAT_L8_UINT,
515 [PIPE_FORMAT_L8A8_UINT] = GEN6_FORMAT_L8A8_UINT,
516 [PIPE_FORMAT_A8_SINT] = 0,
517 [PIPE_FORMAT_I8_SINT] = GEN6_FORMAT_I8_SINT,
518 [PIPE_FORMAT_L8_SINT] = GEN6_FORMAT_L8_SINT,
519 [PIPE_FORMAT_L8A8_SINT] = GEN6_FORMAT_L8A8_SINT,
520 [PIPE_FORMAT_A16_UINT] = 0,
521 [PIPE_FORMAT_I16_UINT] = 0,
522 [PIPE_FORMAT_L16_UINT] = 0,
523 [PIPE_FORMAT_L16A16_UINT] = 0,
524 [PIPE_FORMAT_A16_SINT] = 0,
525 [PIPE_FORMAT_I16_SINT] = 0,
526 [PIPE_FORMAT_L16_SINT] = 0,
527 [PIPE_FORMAT_L16A16_SINT] = 0,
528 [PIPE_FORMAT_A32_UINT] = 0,
529 [PIPE_FORMAT_I32_UINT] = 0,
530 [PIPE_FORMAT_L32_UINT] = 0,
531 [PIPE_FORMAT_L32A32_UINT] = 0,
532 [PIPE_FORMAT_A32_SINT] = 0,
533 [PIPE_FORMAT_I32_SINT] = 0,
534 [PIPE_FORMAT_L32_SINT] = 0,
535 [PIPE_FORMAT_L32A32_SINT] = 0,
536 [PIPE_FORMAT_B10G10R10A2_UINT] = GEN6_FORMAT_B10G10R10A2_UINT,
537 [PIPE_FORMAT_ETC1_RGB8] = GEN6_FORMAT_ETC1_RGB8,
538 [PIPE_FORMAT_R8G8_R8B8_UNORM] = 0,
539 [PIPE_FORMAT_G8R8_B8R8_UNORM] = 0,
540 [PIPE_FORMAT_R8G8B8X8_SNORM] = 0,
541 [PIPE_FORMAT_R8G8B8X8_SRGB] = 0,
542 [PIPE_FORMAT_R8G8B8X8_UINT] = 0,
543 [PIPE_FORMAT_R8G8B8X8_SINT] = 0,
544 [PIPE_FORMAT_B10G10R10X2_UNORM] = GEN6_FORMAT_B10G10R10X2_UNORM,
545 [PIPE_FORMAT_R16G16B16X16_UNORM] = GEN6_FORMAT_R16G16B16X16_UNORM,
546 [PIPE_FORMAT_R16G16B16X16_SNORM] = 0,
547 [PIPE_FORMAT_R16G16B16X16_FLOAT] = GEN6_FORMAT_R16G16B16X16_FLOAT,
548 [PIPE_FORMAT_R16G16B16X16_UINT] = 0,
549 [PIPE_FORMAT_R16G16B16X16_SINT] = 0,
550 [PIPE_FORMAT_R32G32B32X32_FLOAT] = GEN6_FORMAT_R32G32B32X32_FLOAT,
551 [PIPE_FORMAT_R32G32B32X32_UINT] = 0,
552 [PIPE_FORMAT_R32G32B32X32_SINT] = 0,
553 [PIPE_FORMAT_R8A8_SNORM] = 0,
554 [PIPE_FORMAT_R16A16_UNORM] = 0,
555 [PIPE_FORMAT_R16A16_SNORM] = 0,
556 [PIPE_FORMAT_R16A16_FLOAT] = 0,
557 [PIPE_FORMAT_R32A32_FLOAT] = 0,
558 [PIPE_FORMAT_R8A8_UINT] = 0,
559 [PIPE_FORMAT_R8A8_SINT] = 0,
560 [PIPE_FORMAT_R16A16_UINT] = 0,
561 [PIPE_FORMAT_R16A16_SINT] = 0,
562 [PIPE_FORMAT_R32A32_UINT] = 0,
563 [PIPE_FORMAT_R32A32_SINT] = 0,
564 [PIPE_FORMAT_R10G10B10A2_UINT] = GEN6_FORMAT_R10G10B10A2_UINT,
565 };
566 int sfmt = format_mapping[format];
567
568 /* GEN6_FORMAT_R32G32B32A32_FLOAT happens to be 0 */
569 if (!sfmt && format != PIPE_FORMAT_R32G32B32A32_FLOAT)
570 sfmt = -1;
571
572 return sfmt;
573 }
574
575 static boolean
576 ilo_is_format_supported(struct pipe_screen *screen,
577 enum pipe_format format,
578 enum pipe_texture_target target,
579 unsigned sample_count,
580 unsigned bindings)
581 {
582 struct ilo_screen *is = ilo_screen(screen);
583 const int gen = is->dev.gen;
584 const bool is_pure_int = util_format_is_pure_integer(format);
585 const struct ilo_format_info *info;
586 unsigned bind;
587
588 if (!util_format_is_supported(format, bindings))
589 return false;
590
591 /* no MSAA support yet */
592 if (sample_count > 1)
593 return false;
594
595 bind = (bindings & PIPE_BIND_DEPTH_STENCIL);
596 if (bind) {
597 switch (format) {
598 case PIPE_FORMAT_Z16_UNORM:
599 case PIPE_FORMAT_Z24X8_UNORM:
600 case PIPE_FORMAT_Z32_FLOAT:
601 case PIPE_FORMAT_Z24_UNORM_S8_UINT:
602 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
603 break;
604 case PIPE_FORMAT_S8_UINT:
605 /* TODO separate stencil */
606 default:
607 return false;
608 }
609 }
610
611 bind = (bindings & PIPE_BIND_RENDER_TARGET);
612 if (bind) {
613 info = lookup_format_info(format, bind);
614
615 if (gen < info->render_target)
616 return false;
617
618 if (!is_pure_int && gen < info->alpha_blend)
619 return false;
620 }
621
622 bind = (bindings & PIPE_BIND_SAMPLER_VIEW);
623 if (bind) {
624 info = lookup_format_info(format, bind);
625
626 if (gen < info->sampling)
627 return false;
628
629 if (!is_pure_int && gen < info->filtering)
630 return false;
631 }
632
633 bind = (bindings & PIPE_BIND_VERTEX_BUFFER);
634 if (bind) {
635 info = lookup_format_info(format, bind);
636
637 if (gen < info->input_vb)
638 return false;
639 }
640
641 return true;
642 }
643
644 static boolean
645 ilo_is_video_format_supported(struct pipe_screen *screen,
646 enum pipe_format format,
647 enum pipe_video_profile profile,
648 enum pipe_video_entrypoint entrypoint)
649 {
650 return vl_video_buffer_is_format_supported(screen, format, profile, entrypoint);
651 }
652
653 /**
654 * Initialize format-related functions.
655 */
656 void
657 ilo_init_format_functions(struct ilo_screen *is)
658 {
659 is->base.is_format_supported = ilo_is_format_supported;
660 is->base.is_video_format_supported = ilo_is_video_format_supported;
661 }