ilo: hook up pipe context 3D functions
[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 "vl/vl_video_buffer.h"
29 #include "brw_defines.h"
30
31 #include "ilo_screen.h"
32 #include "ilo_format.h"
33
34 /* stolen from classic i965 */
35 struct surface_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 /* This macro allows us to write the table almost as it appears in the PRM,
49 * while restructuring it to turn it into the C code we want.
50 */
51 #define SF(sampl, filt, shad, ck, rt, ab, vb, so, color, sf) \
52 [sf] = { true, sampl, filt, shad, ck, rt, ab, vb, so, color },
53
54 #define Y 0
55 #define x 999
56 /**
57 * This is the table of support for surface (texture, renderbuffer, and vertex
58 * buffer, but not depthbuffer) formats across the various hardware generations.
59 *
60 * The table is formatted to match the documentation, except that the docs have
61 * this ridiculous mapping of Y[*+~^#&] for "supported on DevWhatever". To put
62 * it in our table, here's the mapping:
63 *
64 * Y*: 45
65 * Y+: 45 (g45/gm45)
66 * Y~: 50 (gen5)
67 * Y^: 60 (gen6)
68 * Y#: 70 (gen7)
69 *
70 * The abbreviations in the header below are:
71 * smpl - Sampling Engine
72 * filt - Sampling Engine Filtering
73 * shad - Sampling Engine Shadow Map
74 * CK - Sampling Engine Chroma Key
75 * RT - Render Target
76 * AB - Alpha Blend Render Target
77 * VB - Input Vertex Buffer
78 * SO - Steamed Output Vertex Buffers (transform feedback)
79 * color - Color Processing
80 *
81 * See page 88 of the Sandybridge PRM VOL4_Part1 PDF.
82 */
83 static const struct surface_format_info surface_formats[] = {
84 /* smpl filt shad CK RT AB VB SO color */
85 SF( Y, 50, x, x, Y, Y, Y, Y, x, BRW_SURFACEFORMAT_R32G32B32A32_FLOAT)
86 SF( Y, x, x, x, Y, x, Y, Y, x, BRW_SURFACEFORMAT_R32G32B32A32_SINT)
87 SF( Y, x, x, x, Y, x, Y, Y, x, BRW_SURFACEFORMAT_R32G32B32A32_UINT)
88 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32B32A32_UNORM)
89 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32B32A32_SNORM)
90 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R64G64_FLOAT)
91 SF( Y, 50, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R32G32B32X32_FLOAT)
92 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32B32A32_SSCALED)
93 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32B32A32_USCALED)
94 SF( Y, 50, x, x, x, x, Y, Y, x, BRW_SURFACEFORMAT_R32G32B32_FLOAT)
95 SF( Y, x, x, x, x, x, Y, Y, x, BRW_SURFACEFORMAT_R32G32B32_SINT)
96 SF( Y, x, x, x, x, x, Y, Y, x, BRW_SURFACEFORMAT_R32G32B32_UINT)
97 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32B32_UNORM)
98 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32B32_SNORM)
99 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32B32_SSCALED)
100 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32B32_USCALED)
101 SF( Y, Y, x, x, Y, 45, Y, x, 60, BRW_SURFACEFORMAT_R16G16B16A16_UNORM)
102 SF( Y, Y, x, x, Y, 60, Y, x, x, BRW_SURFACEFORMAT_R16G16B16A16_SNORM)
103 SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R16G16B16A16_SINT)
104 SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R16G16B16A16_UINT)
105 SF( Y, Y, x, x, Y, Y, Y, x, x, BRW_SURFACEFORMAT_R16G16B16A16_FLOAT)
106 SF( Y, 50, x, x, Y, Y, Y, Y, x, BRW_SURFACEFORMAT_R32G32_FLOAT)
107 SF( Y, x, x, x, Y, x, Y, Y, x, BRW_SURFACEFORMAT_R32G32_SINT)
108 SF( Y, x, x, x, Y, x, Y, Y, x, BRW_SURFACEFORMAT_R32G32_UINT)
109 SF( Y, 50, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_R32_FLOAT_X8X24_TYPELESS)
110 SF( Y, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_X32_TYPELESS_G8X24_UINT)
111 SF( Y, 50, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_L32A32_FLOAT)
112 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32_UNORM)
113 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32_SNORM)
114 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R64_FLOAT)
115 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R16G16B16X16_UNORM)
116 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R16G16B16X16_FLOAT)
117 SF( Y, 50, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_A32X32_FLOAT)
118 SF( Y, 50, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_L32X32_FLOAT)
119 SF( Y, 50, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_I32X32_FLOAT)
120 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16G16B16A16_SSCALED)
121 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16G16B16A16_USCALED)
122 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32_SSCALED)
123 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32G32_USCALED)
124 SF( Y, Y, x, Y, Y, Y, Y, x, 60, BRW_SURFACEFORMAT_B8G8R8A8_UNORM)
125 SF( Y, Y, x, x, Y, Y, x, x, x, BRW_SURFACEFORMAT_B8G8R8A8_UNORM_SRGB)
126 /* smpl filt shad CK RT AB VB SO color */
127 SF( Y, Y, x, x, Y, Y, Y, x, 60, BRW_SURFACEFORMAT_R10G10B10A2_UNORM)
128 SF( Y, Y, x, x, x, x, x, x, 60, BRW_SURFACEFORMAT_R10G10B10A2_UNORM_SRGB)
129 SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R10G10B10A2_UINT)
130 SF( Y, Y, x, x, x, Y, Y, x, x, BRW_SURFACEFORMAT_R10G10B10_SNORM_A2_UNORM)
131 SF( Y, Y, x, x, Y, Y, Y, x, 60, BRW_SURFACEFORMAT_R8G8B8A8_UNORM)
132 SF( Y, Y, x, x, Y, Y, x, x, 60, BRW_SURFACEFORMAT_R8G8B8A8_UNORM_SRGB)
133 SF( Y, Y, x, x, Y, 60, Y, x, x, BRW_SURFACEFORMAT_R8G8B8A8_SNORM)
134 SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R8G8B8A8_SINT)
135 SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R8G8B8A8_UINT)
136 SF( Y, Y, x, x, Y, 45, Y, x, x, BRW_SURFACEFORMAT_R16G16_UNORM)
137 SF( Y, Y, x, x, Y, 60, Y, x, x, BRW_SURFACEFORMAT_R16G16_SNORM)
138 SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R16G16_SINT)
139 SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R16G16_UINT)
140 SF( Y, Y, x, x, Y, Y, Y, x, x, BRW_SURFACEFORMAT_R16G16_FLOAT)
141 SF( Y, Y, x, x, Y, Y, x, x, 60, BRW_SURFACEFORMAT_B10G10R10A2_UNORM)
142 SF( Y, Y, x, x, Y, Y, x, x, 60, BRW_SURFACEFORMAT_B10G10R10A2_UNORM_SRGB)
143 SF( Y, Y, x, x, Y, Y, Y, x, x, BRW_SURFACEFORMAT_R11G11B10_FLOAT)
144 SF( Y, x, x, x, Y, x, Y, Y, x, BRW_SURFACEFORMAT_R32_SINT)
145 SF( Y, x, x, x, Y, x, Y, Y, x, BRW_SURFACEFORMAT_R32_UINT)
146 SF( Y, 50, Y, x, Y, Y, Y, Y, x, BRW_SURFACEFORMAT_R32_FLOAT)
147 SF( Y, 50, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_R24_UNORM_X8_TYPELESS)
148 SF( Y, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_X24_TYPELESS_G8_UINT)
149 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_L16A16_UNORM)
150 SF( Y, 50, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_I24X8_UNORM)
151 SF( Y, 50, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_L24X8_UNORM)
152 SF( Y, 50, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_A24X8_UNORM)
153 SF( Y, 50, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_I32_FLOAT)
154 SF( Y, 50, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_L32_FLOAT)
155 SF( Y, 50, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_A32_FLOAT)
156 SF( Y, Y, x, Y, x, x, x, x, 60, BRW_SURFACEFORMAT_B8G8R8X8_UNORM)
157 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_B8G8R8X8_UNORM_SRGB)
158 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R8G8B8X8_UNORM)
159 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R8G8B8X8_UNORM_SRGB)
160 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R9G9B9E5_SHAREDEXP)
161 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_B10G10R10X2_UNORM)
162 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_L16A16_FLOAT)
163 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32_UNORM)
164 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32_SNORM)
165 /* smpl filt shad CK RT AB VB SO color */
166 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R10G10B10X2_USCALED)
167 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R8G8B8A8_SSCALED)
168 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R8G8B8A8_USCALED)
169 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16G16_SSCALED)
170 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16G16_USCALED)
171 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32_SSCALED)
172 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R32_USCALED)
173 SF( Y, Y, x, Y, Y, Y, x, x, x, BRW_SURFACEFORMAT_B5G6R5_UNORM)
174 SF( Y, Y, x, x, Y, Y, x, x, x, BRW_SURFACEFORMAT_B5G6R5_UNORM_SRGB)
175 SF( Y, Y, x, Y, Y, Y, x, x, x, BRW_SURFACEFORMAT_B5G5R5A1_UNORM)
176 SF( Y, Y, x, x, Y, Y, x, x, x, BRW_SURFACEFORMAT_B5G5R5A1_UNORM_SRGB)
177 SF( Y, Y, x, Y, Y, Y, x, x, x, BRW_SURFACEFORMAT_B4G4R4A4_UNORM)
178 SF( Y, Y, x, x, Y, Y, x, x, x, BRW_SURFACEFORMAT_B4G4R4A4_UNORM_SRGB)
179 SF( Y, Y, x, x, Y, Y, Y, x, x, BRW_SURFACEFORMAT_R8G8_UNORM)
180 SF( Y, Y, x, Y, Y, 60, Y, x, x, BRW_SURFACEFORMAT_R8G8_SNORM)
181 SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R8G8_SINT)
182 SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R8G8_UINT)
183 SF( Y, Y, Y, x, Y, 45, Y, x, 70, BRW_SURFACEFORMAT_R16_UNORM)
184 SF( Y, Y, x, x, Y, 60, Y, x, x, BRW_SURFACEFORMAT_R16_SNORM)
185 SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R16_SINT)
186 SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R16_UINT)
187 SF( Y, Y, x, x, Y, Y, Y, x, x, BRW_SURFACEFORMAT_R16_FLOAT)
188 SF( Y, Y, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_I16_UNORM)
189 SF( Y, Y, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_L16_UNORM)
190 SF( Y, Y, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_A16_UNORM)
191 SF( Y, Y, x, Y, x, x, x, x, x, BRW_SURFACEFORMAT_L8A8_UNORM)
192 SF( Y, Y, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_I16_FLOAT)
193 SF( Y, Y, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_L16_FLOAT)
194 SF( Y, Y, Y, x, x, x, x, x, x, BRW_SURFACEFORMAT_A16_FLOAT)
195 SF(45, 45, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_L8A8_UNORM_SRGB)
196 SF( Y, Y, x, Y, x, x, x, x, x, BRW_SURFACEFORMAT_R5G5_SNORM_B6_UNORM)
197 SF( x, x, x, x, Y, Y, x, x, x, BRW_SURFACEFORMAT_B5G5R5X1_UNORM)
198 SF( x, x, x, x, Y, Y, x, x, x, BRW_SURFACEFORMAT_B5G5R5X1_UNORM_SRGB)
199 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R8G8_SSCALED)
200 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R8G8_USCALED)
201 /* smpl filt shad CK RT AB VB SO color */
202 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16_SSCALED)
203 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16_USCALED)
204 SF( Y, Y, x, 45, Y, Y, Y, x, x, BRW_SURFACEFORMAT_R8_UNORM)
205 SF( Y, Y, x, x, Y, 60, Y, x, x, BRW_SURFACEFORMAT_R8_SNORM)
206 SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R8_SINT)
207 SF( Y, x, x, x, Y, x, Y, x, x, BRW_SURFACEFORMAT_R8_UINT)
208 SF( Y, Y, x, Y, Y, Y, x, x, x, BRW_SURFACEFORMAT_A8_UNORM)
209 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_I8_UNORM)
210 SF( Y, Y, x, Y, x, x, x, x, x, BRW_SURFACEFORMAT_L8_UNORM)
211 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_P4A4_UNORM)
212 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_A4P4_UNORM)
213 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R8_SSCALED)
214 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R8_USCALED)
215 SF(45, 45, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_L8_UNORM_SRGB)
216 SF(45, 45, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_DXT1_RGB_SRGB)
217 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_R1_UINT)
218 SF( Y, Y, x, Y, Y, x, x, x, 60, BRW_SURFACEFORMAT_YCRCB_NORMAL)
219 SF( Y, Y, x, Y, Y, x, x, x, 60, BRW_SURFACEFORMAT_YCRCB_SWAPUVY)
220 SF( Y, Y, x, Y, x, x, x, x, x, BRW_SURFACEFORMAT_BC1_UNORM)
221 SF( Y, Y, x, Y, x, x, x, x, x, BRW_SURFACEFORMAT_BC2_UNORM)
222 SF( Y, Y, x, Y, x, x, x, x, x, BRW_SURFACEFORMAT_BC3_UNORM)
223 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_BC4_UNORM)
224 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_BC5_UNORM)
225 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_BC1_UNORM_SRGB)
226 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_BC2_UNORM_SRGB)
227 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_BC3_UNORM_SRGB)
228 SF( Y, x, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_MONO8)
229 SF( Y, Y, x, x, Y, x, x, x, 60, BRW_SURFACEFORMAT_YCRCB_SWAPUV)
230 SF( Y, Y, x, x, Y, x, x, x, 60, BRW_SURFACEFORMAT_YCRCB_SWAPY)
231 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_DXT1_RGB)
232 /* smpl filt shad CK RT AB VB SO color */
233 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_FXT1)
234 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R8G8B8_UNORM)
235 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R8G8B8_SNORM)
236 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R8G8B8_SSCALED)
237 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R8G8B8_USCALED)
238 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R64G64B64A64_FLOAT)
239 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R64G64B64_FLOAT)
240 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_BC4_SNORM)
241 SF( Y, Y, x, x, x, x, x, x, x, BRW_SURFACEFORMAT_BC5_SNORM)
242 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16G16B16_UNORM)
243 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16G16B16_SNORM)
244 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16G16B16_SSCALED)
245 SF( x, x, x, x, x, x, Y, x, x, BRW_SURFACEFORMAT_R16G16B16_USCALED)
246 };
247 #undef x
248 #undef Y
249
250 static const struct surface_format_info *
251 lookup_surface_format_info(enum pipe_format format, unsigned bind)
252 {
253 static const struct surface_format_info nonexist = {
254 .exists = false,
255 .sampling = 999,
256 .filtering = 999,
257 .shadow_compare = 999,
258 .chroma_key = 999,
259 .render_target = 999,
260 .alpha_blend = 999,
261 .input_vb = 999,
262 .streamed_output_vb = 999,
263 .color_processing = 999,
264 };
265 const int surfaceformat = ilo_translate_format(format, bind);
266
267 return (surfaceformat >= 0 && surfaceformat < Elements(surface_formats) &&
268 surface_formats[surfaceformat].exists) ?
269 &surface_formats[surfaceformat] : &nonexist;
270 }
271
272 /**
273 * Translate a color (non-depth/stencil) pipe format to the matching hardware
274 * format. Return -1 on errors.
275 */
276 int
277 ilo_translate_color_format(enum pipe_format format)
278 {
279 static const int format_mapping[PIPE_FORMAT_COUNT] = {
280 [PIPE_FORMAT_NONE] = 0,
281 [PIPE_FORMAT_B8G8R8A8_UNORM] = BRW_SURFACEFORMAT_B8G8R8A8_UNORM,
282 [PIPE_FORMAT_B8G8R8X8_UNORM] = BRW_SURFACEFORMAT_B8G8R8X8_UNORM,
283 [PIPE_FORMAT_A8R8G8B8_UNORM] = 0,
284 [PIPE_FORMAT_X8R8G8B8_UNORM] = 0,
285 [PIPE_FORMAT_B5G5R5A1_UNORM] = BRW_SURFACEFORMAT_B5G5R5A1_UNORM,
286 [PIPE_FORMAT_B4G4R4A4_UNORM] = BRW_SURFACEFORMAT_B4G4R4A4_UNORM,
287 [PIPE_FORMAT_B5G6R5_UNORM] = BRW_SURFACEFORMAT_B5G6R5_UNORM,
288 [PIPE_FORMAT_R10G10B10A2_UNORM] = BRW_SURFACEFORMAT_R10G10B10A2_UNORM,
289 [PIPE_FORMAT_L8_UNORM] = BRW_SURFACEFORMAT_L8_UNORM,
290 [PIPE_FORMAT_A8_UNORM] = BRW_SURFACEFORMAT_A8_UNORM,
291 [PIPE_FORMAT_I8_UNORM] = BRW_SURFACEFORMAT_I8_UNORM,
292 [PIPE_FORMAT_L8A8_UNORM] = BRW_SURFACEFORMAT_L8A8_UNORM,
293 [PIPE_FORMAT_L16_UNORM] = BRW_SURFACEFORMAT_L16_UNORM,
294 [PIPE_FORMAT_UYVY] = BRW_SURFACEFORMAT_YCRCB_SWAPUVY,
295 [PIPE_FORMAT_YUYV] = BRW_SURFACEFORMAT_YCRCB_NORMAL,
296 [PIPE_FORMAT_Z16_UNORM] = 0,
297 [PIPE_FORMAT_Z32_UNORM] = 0,
298 [PIPE_FORMAT_Z32_FLOAT] = 0,
299 [PIPE_FORMAT_Z24_UNORM_S8_UINT] = 0,
300 [PIPE_FORMAT_S8_UINT_Z24_UNORM] = 0,
301 [PIPE_FORMAT_Z24X8_UNORM] = 0,
302 [PIPE_FORMAT_X8Z24_UNORM] = 0,
303 [PIPE_FORMAT_S8_UINT] = 0,
304 [PIPE_FORMAT_R64_FLOAT] = BRW_SURFACEFORMAT_R64_FLOAT,
305 [PIPE_FORMAT_R64G64_FLOAT] = BRW_SURFACEFORMAT_R64G64_FLOAT,
306 [PIPE_FORMAT_R64G64B64_FLOAT] = BRW_SURFACEFORMAT_R64G64B64_FLOAT,
307 [PIPE_FORMAT_R64G64B64A64_FLOAT] = BRW_SURFACEFORMAT_R64G64B64A64_FLOAT,
308 [PIPE_FORMAT_R32_FLOAT] = BRW_SURFACEFORMAT_R32_FLOAT,
309 [PIPE_FORMAT_R32G32_FLOAT] = BRW_SURFACEFORMAT_R32G32_FLOAT,
310 [PIPE_FORMAT_R32G32B32_FLOAT] = BRW_SURFACEFORMAT_R32G32B32_FLOAT,
311 [PIPE_FORMAT_R32G32B32A32_FLOAT] = BRW_SURFACEFORMAT_R32G32B32A32_FLOAT,
312 [PIPE_FORMAT_R32_UNORM] = BRW_SURFACEFORMAT_R32_UNORM,
313 [PIPE_FORMAT_R32G32_UNORM] = BRW_SURFACEFORMAT_R32G32_UNORM,
314 [PIPE_FORMAT_R32G32B32_UNORM] = BRW_SURFACEFORMAT_R32G32B32_UNORM,
315 [PIPE_FORMAT_R32G32B32A32_UNORM] = BRW_SURFACEFORMAT_R32G32B32A32_UNORM,
316 [PIPE_FORMAT_R32_USCALED] = BRW_SURFACEFORMAT_R32_USCALED,
317 [PIPE_FORMAT_R32G32_USCALED] = BRW_SURFACEFORMAT_R32G32_USCALED,
318 [PIPE_FORMAT_R32G32B32_USCALED] = BRW_SURFACEFORMAT_R32G32B32_USCALED,
319 [PIPE_FORMAT_R32G32B32A32_USCALED] = BRW_SURFACEFORMAT_R32G32B32A32_USCALED,
320 [PIPE_FORMAT_R32_SNORM] = BRW_SURFACEFORMAT_R32_SNORM,
321 [PIPE_FORMAT_R32G32_SNORM] = BRW_SURFACEFORMAT_R32G32_SNORM,
322 [PIPE_FORMAT_R32G32B32_SNORM] = BRW_SURFACEFORMAT_R32G32B32_SNORM,
323 [PIPE_FORMAT_R32G32B32A32_SNORM] = BRW_SURFACEFORMAT_R32G32B32A32_SNORM,
324 [PIPE_FORMAT_R32_SSCALED] = BRW_SURFACEFORMAT_R32_SSCALED,
325 [PIPE_FORMAT_R32G32_SSCALED] = BRW_SURFACEFORMAT_R32G32_SSCALED,
326 [PIPE_FORMAT_R32G32B32_SSCALED] = BRW_SURFACEFORMAT_R32G32B32_SSCALED,
327 [PIPE_FORMAT_R32G32B32A32_SSCALED] = BRW_SURFACEFORMAT_R32G32B32A32_SSCALED,
328 [PIPE_FORMAT_R16_UNORM] = BRW_SURFACEFORMAT_R16_UNORM,
329 [PIPE_FORMAT_R16G16_UNORM] = BRW_SURFACEFORMAT_R16G16_UNORM,
330 [PIPE_FORMAT_R16G16B16_UNORM] = BRW_SURFACEFORMAT_R16G16B16_UNORM,
331 [PIPE_FORMAT_R16G16B16A16_UNORM] = BRW_SURFACEFORMAT_R16G16B16A16_UNORM,
332 [PIPE_FORMAT_R16_USCALED] = BRW_SURFACEFORMAT_R16_USCALED,
333 [PIPE_FORMAT_R16G16_USCALED] = BRW_SURFACEFORMAT_R16G16_USCALED,
334 [PIPE_FORMAT_R16G16B16_USCALED] = BRW_SURFACEFORMAT_R16G16B16_USCALED,
335 [PIPE_FORMAT_R16G16B16A16_USCALED] = BRW_SURFACEFORMAT_R16G16B16A16_USCALED,
336 [PIPE_FORMAT_R16_SNORM] = BRW_SURFACEFORMAT_R16_SNORM,
337 [PIPE_FORMAT_R16G16_SNORM] = BRW_SURFACEFORMAT_R16G16_SNORM,
338 [PIPE_FORMAT_R16G16B16_SNORM] = BRW_SURFACEFORMAT_R16G16B16_SNORM,
339 [PIPE_FORMAT_R16G16B16A16_SNORM] = BRW_SURFACEFORMAT_R16G16B16A16_SNORM,
340 [PIPE_FORMAT_R16_SSCALED] = BRW_SURFACEFORMAT_R16_SSCALED,
341 [PIPE_FORMAT_R16G16_SSCALED] = BRW_SURFACEFORMAT_R16G16_SSCALED,
342 [PIPE_FORMAT_R16G16B16_SSCALED] = BRW_SURFACEFORMAT_R16G16B16_SSCALED,
343 [PIPE_FORMAT_R16G16B16A16_SSCALED] = BRW_SURFACEFORMAT_R16G16B16A16_SSCALED,
344 [PIPE_FORMAT_R8_UNORM] = BRW_SURFACEFORMAT_R8_UNORM,
345 [PIPE_FORMAT_R8G8_UNORM] = BRW_SURFACEFORMAT_R8G8_UNORM,
346 [PIPE_FORMAT_R8G8B8_UNORM] = BRW_SURFACEFORMAT_R8G8B8_UNORM,
347 [PIPE_FORMAT_R8G8B8A8_UNORM] = BRW_SURFACEFORMAT_R8G8B8A8_UNORM,
348 [PIPE_FORMAT_X8B8G8R8_UNORM] = 0,
349 [PIPE_FORMAT_R8_USCALED] = BRW_SURFACEFORMAT_R8_USCALED,
350 [PIPE_FORMAT_R8G8_USCALED] = BRW_SURFACEFORMAT_R8G8_USCALED,
351 [PIPE_FORMAT_R8G8B8_USCALED] = BRW_SURFACEFORMAT_R8G8B8_USCALED,
352 [PIPE_FORMAT_R8G8B8A8_USCALED] = BRW_SURFACEFORMAT_R8G8B8A8_USCALED,
353 [PIPE_FORMAT_R8_SNORM] = BRW_SURFACEFORMAT_R8_SNORM,
354 [PIPE_FORMAT_R8G8_SNORM] = BRW_SURFACEFORMAT_R8G8_SNORM,
355 [PIPE_FORMAT_R8G8B8_SNORM] = BRW_SURFACEFORMAT_R8G8B8_SNORM,
356 [PIPE_FORMAT_R8G8B8A8_SNORM] = BRW_SURFACEFORMAT_R8G8B8A8_SNORM,
357 [PIPE_FORMAT_R8_SSCALED] = BRW_SURFACEFORMAT_R8_SSCALED,
358 [PIPE_FORMAT_R8G8_SSCALED] = BRW_SURFACEFORMAT_R8G8_SSCALED,
359 [PIPE_FORMAT_R8G8B8_SSCALED] = BRW_SURFACEFORMAT_R8G8B8_SSCALED,
360 [PIPE_FORMAT_R8G8B8A8_SSCALED] = BRW_SURFACEFORMAT_R8G8B8A8_SSCALED,
361 [PIPE_FORMAT_R32_FIXED] = BRW_SURFACEFORMAT_R32_SFIXED,
362 [PIPE_FORMAT_R32G32_FIXED] = BRW_SURFACEFORMAT_R32G32_SFIXED,
363 [PIPE_FORMAT_R32G32B32_FIXED] = BRW_SURFACEFORMAT_R32G32B32_SFIXED,
364 [PIPE_FORMAT_R32G32B32A32_FIXED] = BRW_SURFACEFORMAT_R32G32B32A32_SFIXED,
365 [PIPE_FORMAT_R16_FLOAT] = BRW_SURFACEFORMAT_R16_FLOAT,
366 [PIPE_FORMAT_R16G16_FLOAT] = BRW_SURFACEFORMAT_R16G16_FLOAT,
367 [PIPE_FORMAT_R16G16B16_FLOAT] = 0,
368 [PIPE_FORMAT_R16G16B16A16_FLOAT] = BRW_SURFACEFORMAT_R16G16B16A16_FLOAT,
369 [PIPE_FORMAT_L8_SRGB] = BRW_SURFACEFORMAT_L8_UNORM_SRGB,
370 [PIPE_FORMAT_L8A8_SRGB] = BRW_SURFACEFORMAT_L8A8_UNORM_SRGB,
371 [PIPE_FORMAT_R8G8B8_SRGB] = 0,
372 [PIPE_FORMAT_A8B8G8R8_SRGB] = 0,
373 [PIPE_FORMAT_X8B8G8R8_SRGB] = 0,
374 [PIPE_FORMAT_B8G8R8A8_SRGB] = BRW_SURFACEFORMAT_B8G8R8A8_UNORM_SRGB,
375 [PIPE_FORMAT_B8G8R8X8_SRGB] = 0,
376 [PIPE_FORMAT_A8R8G8B8_SRGB] = 0,
377 [PIPE_FORMAT_X8R8G8B8_SRGB] = 0,
378 [PIPE_FORMAT_R8G8B8A8_SRGB] = 0,
379 [PIPE_FORMAT_DXT1_RGB] = BRW_SURFACEFORMAT_DXT1_RGB,
380 [PIPE_FORMAT_DXT1_RGBA] = BRW_SURFACEFORMAT_BC1_UNORM,
381 [PIPE_FORMAT_DXT3_RGBA] = BRW_SURFACEFORMAT_BC2_UNORM,
382 [PIPE_FORMAT_DXT5_RGBA] = BRW_SURFACEFORMAT_BC3_UNORM,
383 [PIPE_FORMAT_DXT1_SRGB] = BRW_SURFACEFORMAT_DXT1_RGB_SRGB,
384 [PIPE_FORMAT_DXT1_SRGBA] = BRW_SURFACEFORMAT_BC1_UNORM_SRGB,
385 [PIPE_FORMAT_DXT3_SRGBA] = BRW_SURFACEFORMAT_BC2_UNORM_SRGB,
386 [PIPE_FORMAT_DXT5_SRGBA] = BRW_SURFACEFORMAT_BC3_UNORM_SRGB,
387 [PIPE_FORMAT_RGTC1_UNORM] = BRW_SURFACEFORMAT_BC4_UNORM,
388 [PIPE_FORMAT_RGTC1_SNORM] = BRW_SURFACEFORMAT_BC4_SNORM,
389 [PIPE_FORMAT_RGTC2_UNORM] = BRW_SURFACEFORMAT_BC5_UNORM,
390 [PIPE_FORMAT_RGTC2_SNORM] = BRW_SURFACEFORMAT_BC5_SNORM,
391 [PIPE_FORMAT_R8G8_B8G8_UNORM] = 0,
392 [PIPE_FORMAT_G8R8_G8B8_UNORM] = 0,
393 [PIPE_FORMAT_R8SG8SB8UX8U_NORM] = 0,
394 [PIPE_FORMAT_R5SG5SB6U_NORM] = 0,
395 [PIPE_FORMAT_A8B8G8R8_UNORM] = 0,
396 [PIPE_FORMAT_B5G5R5X1_UNORM] = BRW_SURFACEFORMAT_B5G5R5X1_UNORM,
397 [PIPE_FORMAT_R10G10B10A2_USCALED] = BRW_SURFACEFORMAT_R10G10B10A2_USCALED,
398 [PIPE_FORMAT_R11G11B10_FLOAT] = BRW_SURFACEFORMAT_R11G11B10_FLOAT,
399 [PIPE_FORMAT_R9G9B9E5_FLOAT] = BRW_SURFACEFORMAT_R9G9B9E5_SHAREDEXP,
400 [PIPE_FORMAT_Z32_FLOAT_S8X24_UINT] = 0,
401 [PIPE_FORMAT_R1_UNORM] = 0,
402 [PIPE_FORMAT_R10G10B10X2_USCALED] = BRW_SURFACEFORMAT_R10G10B10X2_USCALED,
403 [PIPE_FORMAT_R10G10B10X2_SNORM] = 0,
404 [PIPE_FORMAT_L4A4_UNORM] = 0,
405 [PIPE_FORMAT_B10G10R10A2_UNORM] = BRW_SURFACEFORMAT_B10G10R10A2_UNORM,
406 [PIPE_FORMAT_R10SG10SB10SA2U_NORM] = 0,
407 [PIPE_FORMAT_R8G8Bx_SNORM] = 0,
408 [PIPE_FORMAT_R8G8B8X8_UNORM] = BRW_SURFACEFORMAT_R8G8B8X8_UNORM,
409 [PIPE_FORMAT_B4G4R4X4_UNORM] = 0,
410 [PIPE_FORMAT_X24S8_UINT] = 0,
411 [PIPE_FORMAT_S8X24_UINT] = 0,
412 [PIPE_FORMAT_X32_S8X24_UINT] = 0,
413 [PIPE_FORMAT_B2G3R3_UNORM] = 0,
414 [PIPE_FORMAT_L16A16_UNORM] = BRW_SURFACEFORMAT_L16A16_UNORM,
415 [PIPE_FORMAT_A16_UNORM] = BRW_SURFACEFORMAT_A16_UNORM,
416 [PIPE_FORMAT_I16_UNORM] = BRW_SURFACEFORMAT_I16_UNORM,
417 [PIPE_FORMAT_LATC1_UNORM] = 0,
418 [PIPE_FORMAT_LATC1_SNORM] = 0,
419 [PIPE_FORMAT_LATC2_UNORM] = 0,
420 [PIPE_FORMAT_LATC2_SNORM] = 0,
421 [PIPE_FORMAT_A8_SNORM] = 0,
422 [PIPE_FORMAT_L8_SNORM] = 0,
423 [PIPE_FORMAT_L8A8_SNORM] = 0,
424 [PIPE_FORMAT_I8_SNORM] = 0,
425 [PIPE_FORMAT_A16_SNORM] = 0,
426 [PIPE_FORMAT_L16_SNORM] = 0,
427 [PIPE_FORMAT_L16A16_SNORM] = 0,
428 [PIPE_FORMAT_I16_SNORM] = 0,
429 [PIPE_FORMAT_A16_FLOAT] = BRW_SURFACEFORMAT_A16_FLOAT,
430 [PIPE_FORMAT_L16_FLOAT] = BRW_SURFACEFORMAT_L16_FLOAT,
431 [PIPE_FORMAT_L16A16_FLOAT] = BRW_SURFACEFORMAT_L16A16_FLOAT,
432 [PIPE_FORMAT_I16_FLOAT] = BRW_SURFACEFORMAT_I16_FLOAT,
433 [PIPE_FORMAT_A32_FLOAT] = BRW_SURFACEFORMAT_A32_FLOAT,
434 [PIPE_FORMAT_L32_FLOAT] = BRW_SURFACEFORMAT_L32_FLOAT,
435 [PIPE_FORMAT_L32A32_FLOAT] = BRW_SURFACEFORMAT_L32A32_FLOAT,
436 [PIPE_FORMAT_I32_FLOAT] = BRW_SURFACEFORMAT_I32_FLOAT,
437 [PIPE_FORMAT_YV12] = 0,
438 [PIPE_FORMAT_YV16] = 0,
439 [PIPE_FORMAT_IYUV] = 0,
440 [PIPE_FORMAT_NV12] = 0,
441 [PIPE_FORMAT_NV21] = 0,
442 [PIPE_FORMAT_R4A4_UNORM] = 0,
443 [PIPE_FORMAT_A4R4_UNORM] = 0,
444 [PIPE_FORMAT_R8A8_UNORM] = 0,
445 [PIPE_FORMAT_A8R8_UNORM] = 0,
446 [PIPE_FORMAT_R10G10B10A2_SSCALED] = BRW_SURFACEFORMAT_R10G10B10A2_SSCALED,
447 [PIPE_FORMAT_R10G10B10A2_SNORM] = BRW_SURFACEFORMAT_R10G10B10A2_SNORM,
448 [PIPE_FORMAT_B10G10R10A2_USCALED] = BRW_SURFACEFORMAT_B10G10R10A2_USCALED,
449 [PIPE_FORMAT_B10G10R10A2_SSCALED] = BRW_SURFACEFORMAT_B10G10R10A2_SSCALED,
450 [PIPE_FORMAT_B10G10R10A2_SNORM] = BRW_SURFACEFORMAT_B10G10R10A2_SNORM,
451 [PIPE_FORMAT_R8_UINT] = BRW_SURFACEFORMAT_R8_UINT,
452 [PIPE_FORMAT_R8G8_UINT] = BRW_SURFACEFORMAT_R8G8_UINT,
453 [PIPE_FORMAT_R8G8B8_UINT] = 0,
454 [PIPE_FORMAT_R8G8B8A8_UINT] = BRW_SURFACEFORMAT_R8G8B8A8_UINT,
455 [PIPE_FORMAT_R8_SINT] = BRW_SURFACEFORMAT_R8_SINT,
456 [PIPE_FORMAT_R8G8_SINT] = BRW_SURFACEFORMAT_R8G8_SINT,
457 [PIPE_FORMAT_R8G8B8_SINT] = 0,
458 [PIPE_FORMAT_R8G8B8A8_SINT] = BRW_SURFACEFORMAT_R8G8B8A8_SINT,
459 [PIPE_FORMAT_R16_UINT] = BRW_SURFACEFORMAT_R16_UINT,
460 [PIPE_FORMAT_R16G16_UINT] = BRW_SURFACEFORMAT_R16G16_UINT,
461 [PIPE_FORMAT_R16G16B16_UINT] = 0,
462 [PIPE_FORMAT_R16G16B16A16_UINT] = BRW_SURFACEFORMAT_R16G16B16A16_UINT,
463 [PIPE_FORMAT_R16_SINT] = BRW_SURFACEFORMAT_R16_SINT,
464 [PIPE_FORMAT_R16G16_SINT] = BRW_SURFACEFORMAT_R16G16_SINT,
465 [PIPE_FORMAT_R16G16B16_SINT] = 0,
466 [PIPE_FORMAT_R16G16B16A16_SINT] = BRW_SURFACEFORMAT_R16G16B16A16_SINT,
467 [PIPE_FORMAT_R32_UINT] = BRW_SURFACEFORMAT_R32_UINT,
468 [PIPE_FORMAT_R32G32_UINT] = BRW_SURFACEFORMAT_R32G32_UINT,
469 [PIPE_FORMAT_R32G32B32_UINT] = BRW_SURFACEFORMAT_R32G32B32_UINT,
470 [PIPE_FORMAT_R32G32B32A32_UINT] = BRW_SURFACEFORMAT_R32G32B32A32_UINT,
471 [PIPE_FORMAT_R32_SINT] = BRW_SURFACEFORMAT_R32_SINT,
472 [PIPE_FORMAT_R32G32_SINT] = BRW_SURFACEFORMAT_R32G32_SINT,
473 [PIPE_FORMAT_R32G32B32_SINT] = BRW_SURFACEFORMAT_R32G32B32_SINT,
474 [PIPE_FORMAT_R32G32B32A32_SINT] = BRW_SURFACEFORMAT_R32G32B32A32_SINT,
475 [PIPE_FORMAT_A8_UINT] = 0,
476 [PIPE_FORMAT_I8_UINT] = 0,
477 [PIPE_FORMAT_L8_UINT] = 0,
478 [PIPE_FORMAT_L8A8_UINT] = 0,
479 [PIPE_FORMAT_A8_SINT] = 0,
480 [PIPE_FORMAT_I8_SINT] = 0,
481 [PIPE_FORMAT_L8_SINT] = 0,
482 [PIPE_FORMAT_L8A8_SINT] = 0,
483 [PIPE_FORMAT_A16_UINT] = 0,
484 [PIPE_FORMAT_I16_UINT] = 0,
485 [PIPE_FORMAT_L16_UINT] = 0,
486 [PIPE_FORMAT_L16A16_UINT] = 0,
487 [PIPE_FORMAT_A16_SINT] = 0,
488 [PIPE_FORMAT_I16_SINT] = 0,
489 [PIPE_FORMAT_L16_SINT] = 0,
490 [PIPE_FORMAT_L16A16_SINT] = 0,
491 [PIPE_FORMAT_A32_UINT] = 0,
492 [PIPE_FORMAT_I32_UINT] = 0,
493 [PIPE_FORMAT_L32_UINT] = 0,
494 [PIPE_FORMAT_L32A32_UINT] = 0,
495 [PIPE_FORMAT_A32_SINT] = 0,
496 [PIPE_FORMAT_I32_SINT] = 0,
497 [PIPE_FORMAT_L32_SINT] = 0,
498 [PIPE_FORMAT_L32A32_SINT] = 0,
499 [PIPE_FORMAT_B10G10R10A2_UINT] = BRW_SURFACEFORMAT_B10G10R10A2_UINT,
500 [PIPE_FORMAT_ETC1_RGB8] = 0,
501 [PIPE_FORMAT_R8G8_R8B8_UNORM] = 0,
502 [PIPE_FORMAT_G8R8_B8R8_UNORM] = 0,
503 [PIPE_FORMAT_R8G8B8X8_SNORM] = 0,
504 [PIPE_FORMAT_R8G8B8X8_SRGB] = 0,
505 [PIPE_FORMAT_R8G8B8X8_UINT] = 0,
506 [PIPE_FORMAT_R8G8B8X8_SINT] = 0,
507 [PIPE_FORMAT_B10G10R10X2_UNORM] = BRW_SURFACEFORMAT_B10G10R10X2_UNORM,
508 [PIPE_FORMAT_R16G16B16X16_UNORM] = BRW_SURFACEFORMAT_R16G16B16X16_UNORM,
509 [PIPE_FORMAT_R16G16B16X16_SNORM] = 0,
510 [PIPE_FORMAT_R16G16B16X16_FLOAT] = BRW_SURFACEFORMAT_R16G16B16X16_FLOAT,
511 [PIPE_FORMAT_R16G16B16X16_UINT] = 0,
512 [PIPE_FORMAT_R16G16B16X16_SINT] = 0,
513 [PIPE_FORMAT_R32G32B32X32_FLOAT] = BRW_SURFACEFORMAT_R32G32B32X32_FLOAT,
514 [PIPE_FORMAT_R32G32B32X32_UINT] = 0,
515 [PIPE_FORMAT_R32G32B32X32_SINT] = 0,
516 [PIPE_FORMAT_R8A8_SNORM] = 0,
517 [PIPE_FORMAT_R16A16_UNORM] = 0,
518 [PIPE_FORMAT_R16A16_SNORM] = 0,
519 [PIPE_FORMAT_R16A16_FLOAT] = 0,
520 [PIPE_FORMAT_R32A32_FLOAT] = 0,
521 [PIPE_FORMAT_R8A8_UINT] = 0,
522 [PIPE_FORMAT_R8A8_SINT] = 0,
523 [PIPE_FORMAT_R16A16_UINT] = 0,
524 [PIPE_FORMAT_R16A16_SINT] = 0,
525 [PIPE_FORMAT_R32A32_UINT] = 0,
526 [PIPE_FORMAT_R32A32_SINT] = 0,
527 };
528 int sfmt = format_mapping[format];
529
530 /* BRW_SURFACEFORMAT_R32G32B32A32_FLOAT happens to be 0 */
531 if (!sfmt && format != PIPE_FORMAT_R32G32B32A32_FLOAT)
532 sfmt = -1;
533
534 return sfmt;
535 }
536
537 static boolean
538 ilo_is_format_supported(struct pipe_screen *screen,
539 enum pipe_format format,
540 enum pipe_texture_target target,
541 unsigned sample_count,
542 unsigned bindings)
543 {
544 struct ilo_screen *is = ilo_screen(screen);
545 const int gen = ILO_GEN_GET_MAJOR(is->gen * 10);
546 const struct surface_format_info *info;
547 unsigned bind;
548
549 if (!util_format_is_supported(format, bindings))
550 return false;
551
552 /* no MSAA support yet */
553 if (sample_count > 1)
554 return false;
555
556 bind = (bindings & PIPE_BIND_DEPTH_STENCIL);
557 if (bind) {
558 switch (format) {
559 case PIPE_FORMAT_Z16_UNORM:
560 case PIPE_FORMAT_Z24X8_UNORM:
561 case PIPE_FORMAT_Z32_FLOAT:
562 case PIPE_FORMAT_Z24_UNORM_S8_UINT:
563 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
564 break;
565 case PIPE_FORMAT_S8_UINT:
566 /* TODO separate stencil */
567 default:
568 return false;
569 }
570 }
571
572 bind = (bindings & PIPE_BIND_RENDER_TARGET);
573 if (bind) {
574 info = lookup_surface_format_info(format, bind);
575
576 if (gen < info->render_target)
577 return false;
578
579 if (gen < info->alpha_blend)
580 return false;
581 }
582
583 bind = (bindings & PIPE_BIND_SAMPLER_VIEW);
584 if (bind) {
585 info = lookup_surface_format_info(format, bind);
586
587 if (gen < info->sampling)
588 return false;
589
590 if (gen < info->filtering)
591 return false;
592 }
593
594 bind = (bindings & PIPE_BIND_VERTEX_BUFFER);
595 if (bind) {
596 info = lookup_surface_format_info(format, bind);
597
598 if (gen < info->input_vb)
599 return false;
600 }
601
602 return true;
603 }
604
605 static boolean
606 ilo_is_video_format_supported(struct pipe_screen *screen,
607 enum pipe_format format,
608 enum pipe_video_profile profile)
609 {
610 return vl_video_buffer_is_format_supported(screen, format, profile);
611 }
612
613 /**
614 * Initialize format-related functions.
615 */
616 void
617 ilo_init_format_functions(struct ilo_screen *is)
618 {
619 is->base.is_format_supported = ilo_is_format_supported;
620 is->base.is_video_format_supported = ilo_is_video_format_supported;
621 }