blob: 0a704c4aa1c9415cbb25f2e5a8f8f202ab94745c [file] [log] [blame]
Chia-I Wuac6ba132014-08-07 14:21:43 +08001/*
2 * XGL
3 *
4 * Copyright (C) 2014 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
25#include "genhw/genhw.h"
26#include "dev.h"
27#include "gpu.h"
28#include "format.h"
29
30struct intel_sampler_cap {
31 int sampling;
32 int filtering;
33 int shadow_map;
34 int chroma_key;
35};
36
37struct intel_dp_cap {
38 int rt_write;
39 int rt_write_blending;
40 int typed_write;
41 int media_color_processing;
42};
43
44/*
45 * This table is based on:
46 *
47 * - the Sandy Bridge PRM, volume 4 part 1, page 88-97
48 * - the Ivy Bridge PRM, volume 4 part 1, page 84-87
49 */
50static const struct intel_sampler_cap intel_sampler_caps[] = {
51#define CAP(sampling, filtering, shadow_map, chroma_key) \
52 { INTEL_GEN(sampling), INTEL_GEN(filtering), INTEL_GEN(shadow_map), INTEL_GEN(chroma_key) }
53 [GEN6_FORMAT_R32G32B32A32_FLOAT] = CAP( 1, 5, 0, 0),
54 [GEN6_FORMAT_R32G32B32A32_SINT] = CAP( 1, 0, 0, 0),
55 [GEN6_FORMAT_R32G32B32A32_UINT] = CAP( 1, 0, 0, 0),
56 [GEN6_FORMAT_R32G32B32X32_FLOAT] = CAP( 1, 5, 0, 0),
57 [GEN6_FORMAT_R32G32B32_FLOAT] = CAP( 1, 5, 0, 0),
58 [GEN6_FORMAT_R32G32B32_SINT] = CAP( 1, 0, 0, 0),
59 [GEN6_FORMAT_R32G32B32_UINT] = CAP( 1, 0, 0, 0),
60 [GEN6_FORMAT_R16G16B16A16_UNORM] = CAP( 1, 1, 0, 0),
61 [GEN6_FORMAT_R16G16B16A16_SNORM] = CAP( 1, 1, 0, 0),
62 [GEN6_FORMAT_R16G16B16A16_SINT] = CAP( 1, 0, 0, 0),
63 [GEN6_FORMAT_R16G16B16A16_UINT] = CAP( 1, 0, 0, 0),
64 [GEN6_FORMAT_R16G16B16A16_FLOAT] = CAP( 1, 1, 0, 0),
65 [GEN6_FORMAT_R32G32_FLOAT] = CAP( 1, 5, 0, 0),
66 [GEN6_FORMAT_R32G32_SINT] = CAP( 1, 0, 0, 0),
67 [GEN6_FORMAT_R32G32_UINT] = CAP( 1, 0, 0, 0),
68 [GEN6_FORMAT_R32_FLOAT_X8X24_TYPELESS] = CAP( 1, 5, 1, 0),
69 [GEN6_FORMAT_X32_TYPELESS_G8X24_UINT] = CAP( 1, 0, 0, 0),
70 [GEN6_FORMAT_L32A32_FLOAT] = CAP( 1, 5, 0, 0),
71 [GEN6_FORMAT_R16G16B16X16_UNORM] = CAP( 1, 1, 0, 0),
72 [GEN6_FORMAT_R16G16B16X16_FLOAT] = CAP( 1, 1, 0, 0),
73 [GEN6_FORMAT_A32X32_FLOAT] = CAP( 1, 5, 0, 0),
74 [GEN6_FORMAT_L32X32_FLOAT] = CAP( 1, 5, 0, 0),
75 [GEN6_FORMAT_I32X32_FLOAT] = CAP( 1, 5, 0, 0),
76 [GEN6_FORMAT_B8G8R8A8_UNORM] = CAP( 1, 1, 0, 1),
77 [GEN6_FORMAT_B8G8R8A8_UNORM_SRGB] = CAP( 1, 1, 0, 0),
78 [GEN6_FORMAT_R10G10B10A2_UNORM] = CAP( 1, 1, 0, 0),
79 [GEN6_FORMAT_R10G10B10A2_UNORM_SRGB] = CAP( 1, 1, 0, 0),
80 [GEN6_FORMAT_R10G10B10A2_UINT] = CAP( 1, 0, 0, 0),
81 [GEN6_FORMAT_R10G10B10_SNORM_A2_UNORM] = CAP( 1, 1, 0, 0),
82 [GEN6_FORMAT_R8G8B8A8_UNORM] = CAP( 1, 1, 0, 0),
83 [GEN6_FORMAT_R8G8B8A8_UNORM_SRGB] = CAP( 1, 1, 0, 0),
84 [GEN6_FORMAT_R8G8B8A8_SNORM] = CAP( 1, 1, 0, 0),
85 [GEN6_FORMAT_R8G8B8A8_SINT] = CAP( 1, 0, 0, 0),
86 [GEN6_FORMAT_R8G8B8A8_UINT] = CAP( 1, 0, 0, 0),
87 [GEN6_FORMAT_R16G16_UNORM] = CAP( 1, 1, 0, 0),
88 [GEN6_FORMAT_R16G16_SNORM] = CAP( 1, 1, 0, 0),
89 [GEN6_FORMAT_R16G16_SINT] = CAP( 1, 0, 0, 0),
90 [GEN6_FORMAT_R16G16_UINT] = CAP( 1, 0, 0, 0),
91 [GEN6_FORMAT_R16G16_FLOAT] = CAP( 1, 1, 0, 0),
92 [GEN6_FORMAT_B10G10R10A2_UNORM] = CAP( 1, 1, 0, 0),
93 [GEN6_FORMAT_B10G10R10A2_UNORM_SRGB] = CAP( 1, 1, 0, 0),
94 [GEN6_FORMAT_R11G11B10_FLOAT] = CAP( 1, 1, 0, 0),
95 [GEN6_FORMAT_R32_SINT] = CAP( 1, 0, 0, 0),
96 [GEN6_FORMAT_R32_UINT] = CAP( 1, 0, 0, 0),
97 [GEN6_FORMAT_R32_FLOAT] = CAP( 1, 5, 1, 0),
98 [GEN6_FORMAT_R24_UNORM_X8_TYPELESS] = CAP( 1, 5, 1, 0),
99 [GEN6_FORMAT_X24_TYPELESS_G8_UINT] = CAP( 1, 0, 0, 0),
100 [GEN6_FORMAT_L16A16_UNORM] = CAP( 1, 1, 0, 0),
101 [GEN6_FORMAT_I24X8_UNORM] = CAP( 1, 5, 1, 0),
102 [GEN6_FORMAT_L24X8_UNORM] = CAP( 1, 5, 1, 0),
103 [GEN6_FORMAT_A24X8_UNORM] = CAP( 1, 5, 1, 0),
104 [GEN6_FORMAT_I32_FLOAT] = CAP( 1, 5, 1, 0),
105 [GEN6_FORMAT_L32_FLOAT] = CAP( 1, 5, 1, 0),
106 [GEN6_FORMAT_A32_FLOAT] = CAP( 1, 5, 1, 0),
107 [GEN6_FORMAT_B8G8R8X8_UNORM] = CAP( 1, 1, 0, 1),
108 [GEN6_FORMAT_B8G8R8X8_UNORM_SRGB] = CAP( 1, 1, 0, 0),
109 [GEN6_FORMAT_R8G8B8X8_UNORM] = CAP( 1, 1, 0, 0),
110 [GEN6_FORMAT_R8G8B8X8_UNORM_SRGB] = CAP( 1, 1, 0, 0),
111 [GEN6_FORMAT_R9G9B9E5_SHAREDEXP] = CAP( 1, 1, 0, 0),
112 [GEN6_FORMAT_B10G10R10X2_UNORM] = CAP( 1, 1, 0, 0),
113 [GEN6_FORMAT_L16A16_FLOAT] = CAP( 1, 1, 0, 0),
114 [GEN6_FORMAT_B5G6R5_UNORM] = CAP( 1, 1, 0, 1),
115 [GEN6_FORMAT_B5G6R5_UNORM_SRGB] = CAP( 1, 1, 0, 0),
116 [GEN6_FORMAT_B5G5R5A1_UNORM] = CAP( 1, 1, 0, 1),
117 [GEN6_FORMAT_B5G5R5A1_UNORM_SRGB] = CAP( 1, 1, 0, 0),
118 [GEN6_FORMAT_B4G4R4A4_UNORM] = CAP( 1, 1, 0, 1),
119 [GEN6_FORMAT_B4G4R4A4_UNORM_SRGB] = CAP( 1, 1, 0, 0),
120 [GEN6_FORMAT_R8G8_UNORM] = CAP( 1, 1, 0, 0),
121 [GEN6_FORMAT_R8G8_SNORM] = CAP( 1, 1, 0, 1),
122 [GEN6_FORMAT_R8G8_SINT] = CAP( 1, 0, 0, 0),
123 [GEN6_FORMAT_R8G8_UINT] = CAP( 1, 0, 0, 0),
124 [GEN6_FORMAT_R16_UNORM] = CAP( 1, 1, 1, 0),
125 [GEN6_FORMAT_R16_SNORM] = CAP( 1, 1, 0, 0),
126 [GEN6_FORMAT_R16_SINT] = CAP( 1, 0, 0, 0),
127 [GEN6_FORMAT_R16_UINT] = CAP( 1, 0, 0, 0),
128 [GEN6_FORMAT_R16_FLOAT] = CAP( 1, 1, 0, 0),
129 [GEN6_FORMAT_A8P8_UNORM_PALETTE0] = CAP( 5, 5, 0, 0),
130 [GEN6_FORMAT_A8P8_UNORM_PALETTE1] = CAP( 5, 5, 0, 0),
131 [GEN6_FORMAT_I16_UNORM] = CAP( 1, 1, 1, 0),
132 [GEN6_FORMAT_L16_UNORM] = CAP( 1, 1, 1, 0),
133 [GEN6_FORMAT_A16_UNORM] = CAP( 1, 1, 1, 0),
134 [GEN6_FORMAT_L8A8_UNORM] = CAP( 1, 1, 0, 1),
135 [GEN6_FORMAT_I16_FLOAT] = CAP( 1, 1, 1, 0),
136 [GEN6_FORMAT_L16_FLOAT] = CAP( 1, 1, 1, 0),
137 [GEN6_FORMAT_A16_FLOAT] = CAP( 1, 1, 1, 0),
138 [GEN6_FORMAT_L8A8_UNORM_SRGB] = CAP(4.5, 4.5, 0, 0),
139 [GEN6_FORMAT_R5G5_SNORM_B6_UNORM] = CAP( 1, 1, 0, 1),
140 [GEN6_FORMAT_P8A8_UNORM_PALETTE0] = CAP( 5, 5, 0, 0),
141 [GEN6_FORMAT_P8A8_UNORM_PALETTE1] = CAP( 5, 5, 0, 0),
142 [GEN6_FORMAT_R8_UNORM] = CAP( 1, 1, 0, 4.5),
143 [GEN6_FORMAT_R8_SNORM] = CAP( 1, 1, 0, 0),
144 [GEN6_FORMAT_R8_SINT] = CAP( 1, 0, 0, 0),
145 [GEN6_FORMAT_R8_UINT] = CAP( 1, 0, 0, 0),
146 [GEN6_FORMAT_A8_UNORM] = CAP( 1, 1, 0, 1),
147 [GEN6_FORMAT_I8_UNORM] = CAP( 1, 1, 0, 0),
148 [GEN6_FORMAT_L8_UNORM] = CAP( 1, 1, 0, 1),
149 [GEN6_FORMAT_P4A4_UNORM_PALETTE0] = CAP( 1, 1, 0, 0),
150 [GEN6_FORMAT_A4P4_UNORM_PALETTE0] = CAP( 1, 1, 0, 0),
151 [GEN6_FORMAT_P8_UNORM_PALETTE0] = CAP(4.5, 4.5, 0, 0),
152 [GEN6_FORMAT_L8_UNORM_SRGB] = CAP(4.5, 4.5, 0, 0),
153 [GEN6_FORMAT_P8_UNORM_PALETTE1] = CAP(4.5, 4.5, 0, 0),
154 [GEN6_FORMAT_P4A4_UNORM_PALETTE1] = CAP(4.5, 4.5, 0, 0),
155 [GEN6_FORMAT_A4P4_UNORM_PALETTE1] = CAP(4.5, 4.5, 0, 0),
156 [GEN6_FORMAT_DXT1_RGB_SRGB] = CAP(4.5, 4.5, 0, 0),
157 [GEN6_FORMAT_R1_UNORM] = CAP( 1, 1, 0, 0),
158 [GEN6_FORMAT_YCRCB_NORMAL] = CAP( 1, 1, 0, 1),
159 [GEN6_FORMAT_YCRCB_SWAPUVY] = CAP( 1, 1, 0, 1),
160 [GEN6_FORMAT_P2_UNORM_PALETTE0] = CAP(4.5, 4.5, 0, 0),
161 [GEN6_FORMAT_P2_UNORM_PALETTE1] = CAP(4.5, 4.5, 0, 0),
162 [GEN6_FORMAT_BC1_UNORM] = CAP( 1, 1, 0, 1),
163 [GEN6_FORMAT_BC2_UNORM] = CAP( 1, 1, 0, 1),
164 [GEN6_FORMAT_BC3_UNORM] = CAP( 1, 1, 0, 1),
165 [GEN6_FORMAT_BC4_UNORM] = CAP( 1, 1, 0, 0),
166 [GEN6_FORMAT_BC5_UNORM] = CAP( 1, 1, 0, 0),
167 [GEN6_FORMAT_BC1_UNORM_SRGB] = CAP( 1, 1, 0, 0),
168 [GEN6_FORMAT_BC2_UNORM_SRGB] = CAP( 1, 1, 0, 0),
169 [GEN6_FORMAT_BC3_UNORM_SRGB] = CAP( 1, 1, 0, 0),
170 [GEN6_FORMAT_MONO8] = CAP( 1, 0, 0, 0),
171 [GEN6_FORMAT_YCRCB_SWAPUV] = CAP( 1, 1, 0, 0),
172 [GEN6_FORMAT_YCRCB_SWAPY] = CAP( 1, 1, 0, 0),
173 [GEN6_FORMAT_DXT1_RGB] = CAP( 1, 1, 0, 0),
174 [GEN6_FORMAT_FXT1] = CAP( 1, 1, 0, 0),
175 [GEN6_FORMAT_BC4_SNORM] = CAP( 1, 1, 0, 0),
176 [GEN6_FORMAT_BC5_SNORM] = CAP( 1, 1, 0, 0),
177 [GEN6_FORMAT_R16G16B16_FLOAT] = CAP( 5, 5, 0, 0),
178 [GEN6_FORMAT_BC6H_SF16] = CAP( 7, 7, 0, 0),
179 [GEN6_FORMAT_BC7_UNORM] = CAP( 7, 7, 0, 0),
180 [GEN6_FORMAT_BC7_UNORM_SRGB] = CAP( 7, 7, 0, 0),
181 [GEN6_FORMAT_BC6H_UF16] = CAP( 7, 7, 0, 0),
182#undef CAP
183};
184
185/*
186 * This table is based on:
187 *
188 * - the Sandy Bridge PRM, volume 4 part 1, page 88-97
189 * - the Ivy Bridge PRM, volume 4 part 1, page 172, 252-253, and 277-278
190 * - the Haswell PRM, volume 7, page 262-264
191 */
192static const struct intel_dp_cap intel_dp_caps[] = {
193#define CAP(rt_write, rt_write_blending, typed_write, media_color_processing) \
194 { INTEL_GEN(rt_write), INTEL_GEN(rt_write_blending), INTEL_GEN(typed_write), INTEL_GEN(media_color_processing) }
195 [GEN6_FORMAT_R32G32B32A32_FLOAT] = CAP( 1, 1, 7, 0),
196 [GEN6_FORMAT_R32G32B32A32_SINT] = CAP( 1, 0, 7, 0),
197 [GEN6_FORMAT_R32G32B32A32_UINT] = CAP( 1, 0, 7, 0),
198 [GEN6_FORMAT_R16G16B16A16_UNORM] = CAP( 1, 4.5, 7, 6),
199 [GEN6_FORMAT_R16G16B16A16_SNORM] = CAP( 1, 6, 7, 0),
200 [GEN6_FORMAT_R16G16B16A16_SINT] = CAP( 1, 0, 7, 0),
201 [GEN6_FORMAT_R16G16B16A16_UINT] = CAP( 1, 0, 7, 0),
202 [GEN6_FORMAT_R16G16B16A16_FLOAT] = CAP( 1, 1, 7, 0),
203 [GEN6_FORMAT_R32G32_FLOAT] = CAP( 1, 1, 7, 0),
204 [GEN6_FORMAT_R32G32_SINT] = CAP( 1, 0, 7, 0),
205 [GEN6_FORMAT_R32G32_UINT] = CAP( 1, 0, 7, 0),
206 [GEN6_FORMAT_B8G8R8A8_UNORM] = CAP( 1, 1, 7, 6),
207 [GEN6_FORMAT_B8G8R8A8_UNORM_SRGB] = CAP( 1, 1, 0, 0),
208 [GEN6_FORMAT_R10G10B10A2_UNORM] = CAP( 1, 1, 7, 6),
209 [GEN6_FORMAT_R10G10B10A2_UNORM_SRGB] = CAP( 0, 0, 0, 6),
210 [GEN6_FORMAT_R10G10B10A2_UINT] = CAP( 1, 0, 7, 0),
211 [GEN6_FORMAT_R8G8B8A8_UNORM] = CAP( 1, 1, 7, 6),
212 [GEN6_FORMAT_R8G8B8A8_UNORM_SRGB] = CAP( 1, 1, 0, 6),
213 [GEN6_FORMAT_R8G8B8A8_SNORM] = CAP( 1, 6, 7, 0),
214 [GEN6_FORMAT_R8G8B8A8_SINT] = CAP( 1, 0, 7, 0),
215 [GEN6_FORMAT_R8G8B8A8_UINT] = CAP( 1, 0, 7, 0),
216 [GEN6_FORMAT_R16G16_UNORM] = CAP( 1, 4.5, 7, 0),
217 [GEN6_FORMAT_R16G16_SNORM] = CAP( 1, 6, 7, 0),
218 [GEN6_FORMAT_R16G16_SINT] = CAP( 1, 0, 7, 0),
219 [GEN6_FORMAT_R16G16_UINT] = CAP( 1, 0, 7, 0),
220 [GEN6_FORMAT_R16G16_FLOAT] = CAP( 1, 1, 7, 0),
221 [GEN6_FORMAT_B10G10R10A2_UNORM] = CAP( 1, 1, 7, 6),
222 [GEN6_FORMAT_B10G10R10A2_UNORM_SRGB] = CAP( 1, 1, 0, 6),
223 [GEN6_FORMAT_R11G11B10_FLOAT] = CAP( 1, 1, 7, 0),
224 [GEN6_FORMAT_R32_SINT] = CAP( 1, 0, 7, 0),
225 [GEN6_FORMAT_R32_UINT] = CAP( 1, 0, 7, 0),
226 [GEN6_FORMAT_R32_FLOAT] = CAP( 1, 1, 7, 0),
227 [GEN6_FORMAT_B8G8R8X8_UNORM] = CAP( 0, 0, 0, 6),
228 [GEN6_FORMAT_B5G6R5_UNORM] = CAP( 1, 1, 7, 0),
229 [GEN6_FORMAT_B5G6R5_UNORM_SRGB] = CAP( 1, 1, 0, 0),
230 [GEN6_FORMAT_B5G5R5A1_UNORM] = CAP( 1, 1, 7, 0),
231 [GEN6_FORMAT_B5G5R5A1_UNORM_SRGB] = CAP( 1, 1, 0, 0),
232 [GEN6_FORMAT_B4G4R4A4_UNORM] = CAP( 1, 1, 7, 0),
233 [GEN6_FORMAT_B4G4R4A4_UNORM_SRGB] = CAP( 1, 1, 0, 0),
234 [GEN6_FORMAT_R8G8_UNORM] = CAP( 1, 1, 7, 0),
235 [GEN6_FORMAT_R8G8_SNORM] = CAP( 1, 6, 7, 0),
236 [GEN6_FORMAT_R8G8_SINT] = CAP( 1, 0, 7, 0),
237 [GEN6_FORMAT_R8G8_UINT] = CAP( 1, 0, 7, 0),
238 [GEN6_FORMAT_R16_UNORM] = CAP( 1, 4.5, 7, 7),
239 [GEN6_FORMAT_R16_SNORM] = CAP( 1, 6, 7, 0),
240 [GEN6_FORMAT_R16_SINT] = CAP( 1, 0, 7, 0),
241 [GEN6_FORMAT_R16_UINT] = CAP( 1, 0, 7, 0),
242 [GEN6_FORMAT_R16_FLOAT] = CAP( 1, 1, 7, 0),
243 [GEN6_FORMAT_B5G5R5X1_UNORM] = CAP( 1, 1, 7, 0),
244 [GEN6_FORMAT_B5G5R5X1_UNORM_SRGB] = CAP( 1, 1, 0, 0),
245 [GEN6_FORMAT_R8_UNORM] = CAP( 1, 1, 7, 0),
246 [GEN6_FORMAT_R8_SNORM] = CAP( 1, 6, 7, 0),
247 [GEN6_FORMAT_R8_SINT] = CAP( 1, 0, 7, 0),
248 [GEN6_FORMAT_R8_UINT] = CAP( 1, 0, 7, 0),
249 [GEN6_FORMAT_A8_UNORM] = CAP( 1, 1, 7, 0),
250 [GEN6_FORMAT_YCRCB_NORMAL] = CAP( 1, 0, 0, 6),
251 [GEN6_FORMAT_YCRCB_SWAPUVY] = CAP( 1, 0, 0, 6),
252 [GEN6_FORMAT_YCRCB_SWAPUV] = CAP( 1, 0, 0, 6),
253 [GEN6_FORMAT_YCRCB_SWAPY] = CAP( 1, 0, 0, 6),
254#undef CAP
255};
256
257static const int intel_color_mapping[XGL_MAX_CH_FMT + 1][6] = {
258 [XGL_CH_FMT_B5G6R5] = { GEN6_FORMAT_B5G6R5_UNORM,
259 0,
260 0,
261 0,
262 0,
263 GEN6_FORMAT_B5G6R5_UNORM_SRGB, },
264 [XGL_CH_FMT_R8] = { GEN6_FORMAT_R8_UNORM,
265 GEN6_FORMAT_R8_SNORM,
266 GEN6_FORMAT_R8_UINT,
267 GEN6_FORMAT_R8_SINT,
268 0,
269 0, },
270 [XGL_CH_FMT_R8G8] = { GEN6_FORMAT_R8G8_UNORM,
271 GEN6_FORMAT_R8G8_SNORM,
272 GEN6_FORMAT_R8G8_UINT,
273 GEN6_FORMAT_R8G8_SINT,
274 0,
275 0, },
276 [XGL_CH_FMT_R8G8B8A8] = { GEN6_FORMAT_R8G8B8A8_UNORM,
277 GEN6_FORMAT_R8G8B8A8_SNORM,
278 GEN6_FORMAT_R8G8B8A8_UINT,
279 GEN6_FORMAT_R8G8B8A8_SINT,
280 0,
281 GEN6_FORMAT_R8G8B8A8_UNORM_SRGB, },
282 [XGL_CH_FMT_B8G8R8A8] = { GEN6_FORMAT_B8G8R8A8_UNORM,
283 0,
284 0,
285 0,
286 0,
287 GEN6_FORMAT_B8G8R8A8_UNORM_SRGB, },
288 [XGL_CH_FMT_R11G11B10] = { 0,
289 0,
290 0,
291 0,
292 GEN6_FORMAT_R11G11B10_FLOAT,
293 0, },
294 [XGL_CH_FMT_R10G10B10A2] = { GEN6_FORMAT_R10G10B10A2_UNORM,
295 GEN6_FORMAT_R10G10B10A2_SNORM,
296 GEN6_FORMAT_R10G10B10A2_UINT,
297 GEN6_FORMAT_R10G10B10A2_SINT,
298 0,
299 0, },
300 [XGL_CH_FMT_R16] = { GEN6_FORMAT_R16_UNORM,
301 GEN6_FORMAT_R16_SNORM,
302 GEN6_FORMAT_R16_UINT,
303 GEN6_FORMAT_R16_SINT,
304 GEN6_FORMAT_R16_FLOAT,
305 0, },
306 [XGL_CH_FMT_R16G16] = { GEN6_FORMAT_R16G16_UNORM,
307 GEN6_FORMAT_R16G16_SNORM,
308 GEN6_FORMAT_R16G16_UINT,
309 GEN6_FORMAT_R16G16_SINT,
310 GEN6_FORMAT_R16G16_FLOAT,
311 0, },
312 [XGL_CH_FMT_R16G16B16A16] = { GEN6_FORMAT_R16G16B16A16_UNORM,
313 GEN6_FORMAT_R16G16B16A16_SNORM,
314 GEN6_FORMAT_R16G16B16A16_UINT,
315 GEN6_FORMAT_R16G16B16A16_SINT,
316 GEN6_FORMAT_R16G16B16A16_FLOAT,
317 0, },
318 [XGL_CH_FMT_R32] = { GEN6_FORMAT_R32_UNORM,
319 GEN6_FORMAT_R32_SNORM,
320 GEN6_FORMAT_R32_UINT,
321 GEN6_FORMAT_R32_SINT,
322 GEN6_FORMAT_R32_FLOAT,
323 0, },
324 [XGL_CH_FMT_R32G32] = { GEN6_FORMAT_R32G32_UNORM,
325 GEN6_FORMAT_R32G32_SNORM,
326 GEN6_FORMAT_R32G32_UINT,
327 GEN6_FORMAT_R32G32_SINT,
328 GEN6_FORMAT_R32G32_FLOAT,
329 0, },
330 [XGL_CH_FMT_R32G32B32] = { GEN6_FORMAT_R32G32B32_UNORM,
331 GEN6_FORMAT_R32G32B32_SNORM,
332 GEN6_FORMAT_R32G32B32_UINT,
333 GEN6_FORMAT_R32G32B32_SINT,
334 GEN6_FORMAT_R32G32B32_FLOAT,
335 0, },
336 [XGL_CH_FMT_R32G32B32A32] = { GEN6_FORMAT_R32G32B32A32_UNORM,
337 GEN6_FORMAT_R32G32B32A32_SNORM,
338 GEN6_FORMAT_R32G32B32A32_UINT,
339 GEN6_FORMAT_R32G32B32A32_SINT,
340 GEN6_FORMAT_R32G32B32A32_FLOAT,
341 0, },
342 [XGL_CH_FMT_R9G9B9E5] = { 0,
343 0,
344 0,
345 0,
346 GEN6_FORMAT_R9G9B9E5_SHAREDEXP,
347 0, },
348 [XGL_CH_FMT_BC1] = { GEN6_FORMAT_BC1_UNORM,
349 0,
350 0,
351 0,
352 0,
353 GEN6_FORMAT_BC1_UNORM_SRGB, },
354 [XGL_CH_FMT_BC2] = { GEN6_FORMAT_BC2_UNORM,
355 0,
356 0,
357 0,
358 0,
359 GEN6_FORMAT_BC2_UNORM_SRGB, },
360 [XGL_CH_FMT_BC3] = { GEN6_FORMAT_BC3_UNORM,
361 0,
362 0,
363 0,
364 0,
365 GEN6_FORMAT_BC3_UNORM_SRGB, },
366 [XGL_CH_FMT_BC4] = { GEN6_FORMAT_BC4_UNORM,
367 GEN6_FORMAT_BC4_SNORM,
368 0,
369 0,
370 0,
371 0, },
372 [XGL_CH_FMT_BC5] = { GEN6_FORMAT_BC5_UNORM,
373 GEN6_FORMAT_BC5_SNORM,
374 0,
375 0,
376 0,
377 0, },
378 [XGL_CH_FMT_BC6U] = { GEN6_FORMAT_BC6H_UF16,
379 0,
380 0,
381 0,
382 0,
383 0, },
384 [XGL_CH_FMT_BC6S] = { GEN6_FORMAT_BC6H_SF16,
385 0,
386 0,
387 0,
388 0,
389 0, },
390 [XGL_CH_FMT_BC7] = { GEN6_FORMAT_BC7_UNORM,
391 0,
392 0,
393 0,
394 0,
395 GEN6_FORMAT_BC7_UNORM_SRGB, },
396};
397
Chia-I Wu1bf06df2014-08-16 12:33:13 +0800398int intel_format_translate_color(XGL_FORMAT format)
Chia-I Wuac6ba132014-08-07 14:21:43 +0800399{
400 int fmt;
401
402 assert(format.numericFormat != XGL_NUM_FMT_UNDEFINED &&
403 format.numericFormat != XGL_NUM_FMT_DS);
404
405 fmt = intel_color_mapping[format.channelFormat][format.numericFormat - 1];
406
407 /* GEN6_FORMAT_R32G32B32A32_FLOAT happens to be 0 */
408 if (format.channelFormat == XGL_CH_FMT_R32G32B32A32 &&
409 format.numericFormat == XGL_NUM_FMT_FLOAT)
410 assert(fmt == 0);
411 else if (!fmt)
412 fmt = -1;
413
414 return fmt;
415}
416
417static XGL_FLAGS intel_format_get_color_features(const struct intel_dev *dev,
418 XGL_FORMAT format)
419{
Chia-I Wuac6ba132014-08-07 14:21:43 +0800420 const int fmt = intel_format_translate_color(format);
421 const struct intel_sampler_cap *sampler;
422 const struct intel_dp_cap *dp;
423 XGL_FLAGS features;
424
425 if (fmt < 0)
426 return 0;
427
428 sampler = (fmt < ARRAY_SIZE(intel_sampler_caps)) ?
429 &intel_sampler_caps[fmt] : NULL;
430 dp = (fmt < ARRAY_SIZE(intel_dp_caps)) ? &intel_dp_caps[fmt] : NULL;
431
432 features = XGL_FORMAT_MEMORY_SHADER_ACCESS_BIT;
433
Chia-I Wu94192892014-08-08 21:27:45 +0800434#define TEST(dev, func, cap) ((func) && (func)->cap && \
435 intel_gpu_gen((dev)->gpu) >= (func)->cap)
436 if (TEST(dev, sampler, sampling)) {
Chia-I Wuac6ba132014-08-07 14:21:43 +0800437 if (format.numericFormat == XGL_NUM_FMT_UINT ||
438 format.numericFormat == XGL_NUM_FMT_SINT ||
Chia-I Wu94192892014-08-08 21:27:45 +0800439 TEST(dev, sampler, filtering))
Chia-I Wuac6ba132014-08-07 14:21:43 +0800440 features |= XGL_FORMAT_IMAGE_SHADER_READ_BIT;
441 }
442
Chia-I Wu94192892014-08-08 21:27:45 +0800443 if (TEST(dev, dp, typed_write))
Chia-I Wuac6ba132014-08-07 14:21:43 +0800444 features |= XGL_FORMAT_IMAGE_SHADER_WRITE_BIT;
445
Chia-I Wu94192892014-08-08 21:27:45 +0800446 if (TEST(dev, dp, rt_write)) {
Chia-I Wuac6ba132014-08-07 14:21:43 +0800447 features |= XGL_FORMAT_COLOR_ATTACHMENT_WRITE_BIT;
448
Chia-I Wu94192892014-08-08 21:27:45 +0800449 if (TEST(dev, dp, rt_write_blending))
Chia-I Wuac6ba132014-08-07 14:21:43 +0800450 features |= XGL_FORMAT_COLOR_ATTACHMENT_BLEND_BIT;
451
452 if (features & XGL_FORMAT_IMAGE_SHADER_READ_BIT) {
453 features |= XGL_FORMAT_IMAGE_COPY_BIT |
454 XGL_FORMAT_CONVERSION_BIT;
455 }
456 }
457#undef TEST
458
459 return features;
460}
461
462static XGL_FLAGS intel_format_get_ds_features(const struct intel_dev *dev,
463 XGL_FORMAT format)
464{
465 XGL_FLAGS features;
466
467 assert(format.numericFormat == XGL_NUM_FMT_DS);
468
469 switch (format.channelFormat) {
470 case XGL_CH_FMT_R8:
471 features = XGL_FORMAT_STENCIL_ATTACHMENT_BIT;;
472 break;
473 case XGL_CH_FMT_R16:
474 case XGL_CH_FMT_R32:
475 features = XGL_FORMAT_DEPTH_ATTACHMENT_BIT;
476 break;
477 case XGL_CH_FMT_R32G8:
478 features = XGL_FORMAT_DEPTH_ATTACHMENT_BIT |
479 XGL_FORMAT_STENCIL_ATTACHMENT_BIT;
480 break;
481 default:
482 features = 0;
483 break;
484 }
485
486 return features;
487}
488
489static XGL_FLAGS intel_format_get_raw_features(const struct intel_dev *dev,
490 XGL_FORMAT format)
491{
492 assert(format.numericFormat == XGL_NUM_FMT_UNDEFINED);
493
494 return (format.channelFormat == XGL_CH_FMT_UNDEFINED) ?
495 XGL_FORMAT_MEMORY_SHADER_ACCESS_BIT : 0;
496}
497
498static void intel_format_get_props(const struct intel_dev *dev,
499 XGL_FORMAT format,
500 XGL_FORMAT_PROPERTIES *props)
501{
502 switch (format.numericFormat) {
503 case XGL_NUM_FMT_UNDEFINED:
504 props->linearTilingFeatures =
505 intel_format_get_raw_features(dev, format);
506 props->optimalTilingFeatures = 0;
507 break;
508 case XGL_NUM_FMT_UNORM:
509 case XGL_NUM_FMT_SNORM:
510 case XGL_NUM_FMT_UINT:
511 case XGL_NUM_FMT_SINT:
512 case XGL_NUM_FMT_FLOAT:
513 case XGL_NUM_FMT_SRGB:
514 props->linearTilingFeatures =
515 intel_format_get_color_features(dev, format);
516 props->optimalTilingFeatures = props->linearTilingFeatures;
517 break;
518 case XGL_NUM_FMT_DS:
519 props->linearTilingFeatures = 0;
520 props->optimalTilingFeatures =
521 intel_format_get_ds_features(dev, format);
522 break;
523 default:
524 props->linearTilingFeatures = 0;
525 props->optimalTilingFeatures = 0;
526 break;
527 }
528}
529
530XGL_RESULT XGLAPI intelGetFormatInfo(
531 XGL_DEVICE device,
532 XGL_FORMAT format,
533 XGL_FORMAT_INFO_TYPE infoType,
534 XGL_SIZE* pDataSize,
535 XGL_VOID* pData)
536{
537 const struct intel_dev *dev = intel_dev(device);
538 XGL_RESULT ret = XGL_SUCCESS;
539
540 switch (infoType) {
541 case XGL_INFO_TYPE_FORMAT_PROPERTIES:
542 *pDataSize = sizeof(XGL_FORMAT_PROPERTIES);
543 intel_format_get_props(dev, format, pData);
544 break;
545 default:
546 ret = XGL_ERROR_INVALID_VALUE;
547 break;
548 }
549
550 return ret;
551}