2 * Copyright 2015 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
28 #include "dev/gen_device_info.h"
30 #include "main/macros.h" /* Needed for MAX3 and MAX2 for format_rgb9e5 */
31 #include "util/format_srgb.h"
32 #include "util/format_rgb9e5.h"
33 #include "util/format_r11g11b10f.h"
35 /* Header-only format conversion include */
36 #include "main/format_utils.h"
38 struct surface_format_info
{
42 uint8_t shadow_compare
;
44 uint8_t render_target
;
47 uint8_t streamed_output_vb
;
48 uint8_t color_processing
;
54 /* This macro allows us to write the table almost as it appears in the PRM,
55 * while restructuring it to turn it into the C code we want.
57 #define SF(sampl, filt, shad, ck, rt, ab, vb, so, color, tw, tr, ccs_e, sf) \
58 [ISL_FORMAT_##sf] = { true, sampl, filt, shad, ck, rt, ab, vb, so, color, tw, tr, ccs_e},
63 * This is the table of support for surface (texture, renderbuffer, and vertex
64 * buffer, but not depthbuffer) formats across the various hardware generations.
66 * The table is formatted to match the documentation, except that the docs have
67 * this ridiculous mapping of Y[*+~^#&] for "supported on DevWhatever". To put
68 * it in our table, here's the mapping:
76 * The abbreviations in the header below are:
77 * smpl - Sampling Engine
78 * filt - Sampling Engine Filtering
79 * shad - Sampling Engine Shadow Map
80 * CK - Sampling Engine Chroma Key
82 * AB - Alpha Blend Render Target
83 * VB - Input Vertex Buffer
84 * SO - Steamed Output Vertex Buffers (transform feedback)
85 * color - Color Processing
86 * ccs_e - Lossless Compression Support (gen9+ only)
89 * See page 88 of the Sandybridge PRM VOL4_Part1 PDF.
91 * As of Ivybridge, the columns are no longer in that table and the
92 * information can be found spread across:
94 * - VOL2_Part1 section 2.5.11 Format Conversion (vertex fetch).
95 * - VOL4_Part1 section 2.12.2.1.2 Sampler Output Channel Mapping.
96 * - VOL4_Part1 section 3.9.11 Render Target Write.
97 * - Render Target Surface Types [SKL+]
99 static const struct surface_format_info format_info
[] = {
100 /* smpl filt shad CK RT AB VB SO color TW TR ccs_e */
101 SF( Y
, 50, x
, x
, Y
, Y
, Y
, Y
, x
, 70, 90, 90, R32G32B32A32_FLOAT
)
102 SF( Y
, x
, x
, x
, Y
, x
, Y
, Y
, x
, 70, 90, 90, R32G32B32A32_SINT
)
103 SF( Y
, x
, x
, x
, Y
, x
, Y
, Y
, x
, 70, 90, 90, R32G32B32A32_UINT
)
104 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32G32B32A32_UNORM
)
105 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32G32B32A32_SNORM
)
106 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R64G64_FLOAT
)
107 SF( Y
, 50, x
, x
, 100, 100, x
, x
, x
, x
, x
, 100, R32G32B32X32_FLOAT
)
108 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32G32B32A32_SSCALED
)
109 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32G32B32A32_USCALED
)
110 SF( x
, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, R32G32B32A32_SFIXED
)
111 SF( x
, x
, x
, x
, x
, x
, 80, x
, x
, x
, x
, x
, R64G64_PASSTHRU
)
112 SF( Y
, 50, x
, x
, x
, x
, Y
, Y
, x
, x
, x
, x
, R32G32B32_FLOAT
)
113 SF( Y
, x
, x
, x
, x
, x
, Y
, Y
, x
, x
, x
, x
, R32G32B32_SINT
)
114 SF( Y
, x
, x
, x
, x
, x
, Y
, Y
, x
, x
, x
, x
, R32G32B32_UINT
)
115 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32G32B32_UNORM
)
116 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32G32B32_SNORM
)
117 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32G32B32_SSCALED
)
118 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32G32B32_USCALED
)
119 SF( x
, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, R32G32B32_SFIXED
)
120 SF( Y
, Y
, x
, x
, Y
, 45, Y
, x
, 60, 70, 110, 90, R16G16B16A16_UNORM
)
121 SF( Y
, Y
, x
, x
, Y
, 60, Y
, x
, x
, 70, 110, 90, R16G16B16A16_SNORM
)
122 SF( Y
, x
, x
, x
, Y
, x
, Y
, x
, x
, 70, 90, 90, R16G16B16A16_SINT
)
123 SF( Y
, x
, x
, x
, Y
, x
, Y
, x
, x
, 70, 75, 90, R16G16B16A16_UINT
)
124 SF( Y
, Y
, x
, x
, Y
, Y
, Y
, x
, x
, 70, 90, 90, R16G16B16A16_FLOAT
)
125 SF( Y
, 50, x
, x
, Y
, Y
, Y
, Y
, x
, 70, 90, 90, R32G32_FLOAT
)
126 SF( Y
, 70, x
, x
, Y
, Y
, Y
, Y
, x
, x
, x
, x
, R32G32_FLOAT_LD
)
127 SF( Y
, x
, x
, x
, Y
, x
, Y
, Y
, x
, 70, 90, 90, R32G32_SINT
)
128 SF( Y
, x
, x
, x
, Y
, x
, Y
, Y
, x
, 70, 90, 90, R32G32_UINT
)
129 SF( Y
, 50, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, R32_FLOAT_X8X24_TYPELESS
)
130 SF( Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, X32_TYPELESS_G8X24_UINT
)
131 SF( Y
, 50, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, L32A32_FLOAT
)
132 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32G32_UNORM
)
133 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32G32_SNORM
)
134 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R64_FLOAT
)
135 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, R16G16B16X16_UNORM
)
136 SF( Y
, Y
, x
, x
, 90, 90, x
, x
, x
, x
, x
, 90, R16G16B16X16_FLOAT
)
137 SF( Y
, 50, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, A32X32_FLOAT
)
138 SF( Y
, 50, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, L32X32_FLOAT
)
139 SF( Y
, 50, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, I32X32_FLOAT
)
140 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R16G16B16A16_SSCALED
)
141 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R16G16B16A16_USCALED
)
142 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32G32_SSCALED
)
143 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32G32_USCALED
)
144 SF( x
, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, R32G32_SFIXED
)
145 SF( x
, x
, x
, x
, x
, x
, 80, x
, x
, x
, x
, x
, R64_PASSTHRU
)
146 SF( Y
, Y
, x
, Y
, Y
, Y
, Y
, x
, 60, 70, x
, 90, B8G8R8A8_UNORM
)
147 SF( Y
, Y
, x
, x
, Y
, Y
, x
, x
, x
, x
, x
, 100, B8G8R8A8_UNORM_SRGB
)
148 /* smpl filt shad CK RT AB VB SO color TW TR ccs_e */
149 SF( Y
, Y
, x
, x
, Y
, Y
, Y
, x
, 60, 70, x
, 100, R10G10B10A2_UNORM
)
150 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, 60, x
, x
, 120, R10G10B10A2_UNORM_SRGB
)
151 SF( Y
, x
, x
, x
, Y
, x
, Y
, x
, x
, 70, x
, 100, R10G10B10A2_UINT
)
152 SF( Y
, Y
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R10G10B10_SNORM_A2_UNORM
)
153 SF( Y
, Y
, x
, x
, Y
, Y
, Y
, x
, 60, 70, 110, 90, R8G8B8A8_UNORM
)
154 SF( Y
, Y
, x
, x
, Y
, Y
, x
, x
, 60, x
, x
, 100, R8G8B8A8_UNORM_SRGB
)
155 SF( Y
, Y
, x
, x
, Y
, 60, Y
, x
, x
, 70, 110, 90, R8G8B8A8_SNORM
)
156 SF( Y
, x
, x
, x
, Y
, x
, Y
, x
, x
, 70, 90, 90, R8G8B8A8_SINT
)
157 SF( Y
, x
, x
, x
, Y
, x
, Y
, x
, x
, 70, 75, 90, R8G8B8A8_UINT
)
158 SF( Y
, Y
, x
, x
, Y
, 45, Y
, x
, x
, 70, 110, 90, R16G16_UNORM
)
159 SF( Y
, Y
, x
, x
, Y
, 60, Y
, x
, x
, 70, 110, 90, R16G16_SNORM
)
160 SF( Y
, x
, x
, x
, Y
, x
, Y
, x
, x
, 70, 90, 90, R16G16_SINT
)
161 SF( Y
, x
, x
, x
, Y
, x
, Y
, x
, x
, 70, 75, 90, R16G16_UINT
)
162 SF( Y
, Y
, x
, x
, Y
, Y
, Y
, x
, x
, 70, 90, 90, R16G16_FLOAT
)
163 SF( Y
, Y
, x
, x
, Y
, Y
, 75, x
, 60, 70, x
, 100, B10G10R10A2_UNORM
)
164 SF( Y
, Y
, x
, x
, Y
, Y
, x
, x
, 60, x
, x
, 100, B10G10R10A2_UNORM_SRGB
)
165 SF( Y
, Y
, x
, x
, Y
, Y
, Y
, x
, x
, 70, x
, 100, R11G11B10_FLOAT
)
166 SF(120, 120, x
, x
, 120, 120, x
, x
, x
, x
, x
, 120, R10G10B10_FLOAT_A2_UNORM
)
167 SF( Y
, x
, x
, x
, Y
, x
, Y
, Y
, x
, 70, 70, 90, R32_SINT
)
168 SF( Y
, x
, x
, x
, Y
, x
, Y
, Y
, x
, 70, 70, 90, R32_UINT
)
169 SF( Y
, 50, Y
, x
, Y
, Y
, Y
, Y
, x
, 70, 70, 90, R32_FLOAT
)
170 SF( Y
, 50, Y
, x
, x
, x
, x
, x
, x
, x
, x
, 120, R24_UNORM_X8_TYPELESS
)
171 SF( Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, X24_TYPELESS_G8_UINT
)
172 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, L16A16_UNORM
)
173 SF( Y
, 50, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, I24X8_UNORM
)
174 SF( Y
, 50, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, L24X8_UNORM
)
175 SF( Y
, 50, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, A24X8_UNORM
)
176 SF( Y
, 50, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, I32_FLOAT
)
177 SF( Y
, 50, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, L32_FLOAT
)
178 SF( Y
, 50, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, A32_FLOAT
)
179 SF( Y
, Y
, x
, Y
, 80, 80, x
, x
, 60, x
, x
, 90, B8G8R8X8_UNORM
)
180 SF( Y
, Y
, x
, x
, 80, 80, x
, x
, x
, x
, x
, 100, B8G8R8X8_UNORM_SRGB
)
181 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, R8G8B8X8_UNORM
)
182 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, R8G8B8X8_UNORM_SRGB
)
183 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, R9G9B9E5_SHAREDEXP
)
184 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, B10G10R10X2_UNORM
)
185 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, L16A16_FLOAT
)
186 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32_UNORM
)
187 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32_SNORM
)
188 /* smpl filt shad CK RT AB VB SO color TW TR ccs_e */
189 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R10G10B10X2_USCALED
)
190 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R8G8B8A8_SSCALED
)
191 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R8G8B8A8_USCALED
)
192 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R16G16_SSCALED
)
193 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R16G16_USCALED
)
194 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32_SSCALED
)
195 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R32_USCALED
)
196 SF( Y
, Y
, x
, Y
, Y
, Y
, x
, x
, x
, 70, x
, 120, B5G6R5_UNORM
)
197 SF( Y
, Y
, x
, x
, Y
, Y
, x
, x
, x
, x
, x
, 120, B5G6R5_UNORM_SRGB
)
198 SF( Y
, Y
, x
, Y
, Y
, Y
, x
, x
, x
, 70, x
, 120, B5G5R5A1_UNORM
)
199 SF( Y
, Y
, x
, x
, Y
, Y
, x
, x
, x
, x
, x
, 120, B5G5R5A1_UNORM_SRGB
)
200 SF( Y
, Y
, x
, Y
, Y
, Y
, x
, x
, x
, 70, x
, 120, B4G4R4A4_UNORM
)
201 SF( Y
, Y
, x
, x
, Y
, Y
, x
, x
, x
, x
, x
, 120, B4G4R4A4_UNORM_SRGB
)
202 SF( Y
, Y
, x
, x
, Y
, Y
, Y
, x
, x
, 70, 110, 120, R8G8_UNORM
)
203 SF( Y
, Y
, x
, Y
, Y
, 60, Y
, x
, x
, 70, 110, 120, R8G8_SNORM
)
204 SF( Y
, x
, x
, x
, Y
, x
, Y
, x
, x
, 70, 90, 120, R8G8_SINT
)
205 SF( Y
, x
, x
, x
, Y
, x
, Y
, x
, x
, 70, 75, 120, R8G8_UINT
)
206 SF( Y
, Y
, Y
, x
, Y
, 45, Y
, x
, 70, 70, 110, 120, R16_UNORM
)
207 SF( Y
, Y
, x
, x
, Y
, 60, Y
, x
, x
, 70, 110, 120, R16_SNORM
)
208 SF( Y
, x
, x
, x
, Y
, x
, Y
, x
, x
, 70, 90, 120, R16_SINT
)
209 SF( Y
, x
, x
, x
, Y
, x
, Y
, x
, x
, 70, 75, 120, R16_UINT
)
210 SF( Y
, Y
, x
, x
, Y
, Y
, Y
, x
, x
, 70, 90, 120, R16_FLOAT
)
211 SF( 50, 50, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, A8P8_UNORM_PALETTE0
)
212 SF( 50, 50, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, A8P8_UNORM_PALETTE1
)
213 SF( Y
, Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, I16_UNORM
)
214 SF( Y
, Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, L16_UNORM
)
215 SF( Y
, Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, A16_UNORM
)
216 SF( Y
, Y
, x
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, L8A8_UNORM
)
217 SF( Y
, Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, I16_FLOAT
)
218 SF( Y
, Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, L16_FLOAT
)
219 SF( Y
, Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, A16_FLOAT
)
220 SF( 45, 45, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, L8A8_UNORM_SRGB
)
221 SF( Y
, Y
, x
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, R5G5_SNORM_B6_UNORM
)
222 SF( x
, x
, x
, x
, Y
, Y
, x
, x
, x
, 70, x
, 120, B5G5R5X1_UNORM
)
223 SF( x
, x
, x
, x
, Y
, Y
, x
, x
, x
, x
, x
, 120, B5G5R5X1_UNORM_SRGB
)
224 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R8G8_SSCALED
)
225 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R8G8_USCALED
)
226 /* smpl filt shad CK RT AB VB SO color TW TR ccs_e */
227 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R16_SSCALED
)
228 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R16_USCALED
)
229 SF( 50, 50, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, P8A8_UNORM_PALETTE0
)
230 SF( 50, 50, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, P8A8_UNORM_PALETTE1
)
231 SF(120, 120, x
, x
, 120, 120, x
, x
, x
, x
, x
, 120, A1B5G5R5_UNORM
)
232 /* According to the PRM, A4B4G4R4_UNORM isn't supported until Sky Lake
233 * but empirical testing indicates that at least sampling works just fine
236 SF( 80, 80, x
, x
, 90, 120, x
, x
, x
, x
, x
, 120, A4B4G4R4_UNORM
)
237 SF( 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, L8A8_UINT
)
238 SF( 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, L8A8_SINT
)
239 SF( Y
, Y
, x
, 45, Y
, Y
, Y
, x
, x
, 70, 110, 120, R8_UNORM
)
240 SF( Y
, Y
, x
, x
, Y
, 60, Y
, x
, x
, 70, 110, 120, R8_SNORM
)
241 SF( Y
, x
, x
, x
, Y
, x
, Y
, x
, x
, 70, 90, 120, R8_SINT
)
242 SF( Y
, x
, x
, x
, Y
, x
, Y
, x
, x
, 70, 75, 120, R8_UINT
)
243 SF( Y
, Y
, x
, Y
, Y
, Y
, x
, x
, x
, 70, 110, 120, A8_UNORM
)
244 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, I8_UNORM
)
245 SF( Y
, Y
, x
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, L8_UNORM
)
246 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, P4A4_UNORM_PALETTE0
)
247 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, A4P4_UNORM_PALETTE0
)
248 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R8_SSCALED
)
249 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R8_USCALED
)
250 SF( 45, 45, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, P8_UNORM_PALETTE0
)
251 SF( 45, 45, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, L8_UNORM_SRGB
)
252 SF( 45, 45, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, P8_UNORM_PALETTE1
)
253 SF( 45, 45, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, P4A4_UNORM_PALETTE1
)
254 SF( 45, 45, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, A4P4_UNORM_PALETTE1
)
255 SF( x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, Y8_UNORM
)
256 SF( 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, L8_UINT
)
257 SF( 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, L8_SINT
)
258 SF( 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, I8_UINT
)
259 SF( 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, I8_SINT
)
260 SF( 45, 45, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, DXT1_RGB_SRGB
)
261 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, R1_UNORM
)
262 SF( Y
, Y
, x
, Y
, Y
, x
, x
, x
, 60, x
, x
, x
, YCRCB_NORMAL
)
263 SF( Y
, Y
, x
, Y
, Y
, x
, x
, x
, 60, x
, x
, x
, YCRCB_SWAPUVY
)
264 SF( 45, 45, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, P2_UNORM_PALETTE0
)
265 SF( 45, 45, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, P2_UNORM_PALETTE1
)
266 SF( Y
, Y
, x
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, BC1_UNORM
)
267 SF( Y
, Y
, x
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, BC2_UNORM
)
268 SF( Y
, Y
, x
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, BC3_UNORM
)
269 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, BC4_UNORM
)
270 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, BC5_UNORM
)
271 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, BC1_UNORM_SRGB
)
272 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, BC2_UNORM_SRGB
)
273 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, BC3_UNORM_SRGB
)
274 SF( Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, MONO8
)
275 SF( Y
, Y
, x
, x
, Y
, x
, x
, x
, 60, x
, x
, x
, YCRCB_SWAPUV
)
276 SF( Y
, Y
, x
, x
, Y
, x
, x
, x
, 60, x
, x
, x
, YCRCB_SWAPY
)
277 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, DXT1_RGB
)
278 /* smpl filt shad CK RT AB VB SO color TW TR ccs_e */
279 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, FXT1
)
280 SF( 75, 75, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R8G8B8_UNORM
)
281 SF( 75, 75, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R8G8B8_SNORM
)
282 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R8G8B8_SSCALED
)
283 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R8G8B8_USCALED
)
284 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R64G64B64A64_FLOAT
)
285 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R64G64B64_FLOAT
)
286 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, BC4_SNORM
)
287 SF( Y
, Y
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, BC5_SNORM
)
288 SF( 50, 50, x
, x
, x
, x
, 60, x
, x
, x
, x
, x
, R16G16B16_FLOAT
)
289 SF( 75, 75, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R16G16B16_UNORM
)
290 SF( 75, 75, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R16G16B16_SNORM
)
291 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R16G16B16_SSCALED
)
292 SF( x
, x
, x
, x
, x
, x
, Y
, x
, x
, x
, x
, x
, R16G16B16_USCALED
)
293 SF( 70, 70, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, BC6H_SF16
)
294 SF( 70, 70, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, BC7_UNORM
)
295 SF( 70, 70, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, BC7_UNORM_SRGB
)
296 SF( 70, 70, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, BC6H_UF16
)
297 SF( x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, PLANAR_420_8
)
298 /* The format enum for R8G8B8_UNORM_SRGB first shows up in the HSW PRM but
299 * empirical testing indicates that it doesn't actually sRGB decode and
300 * acts identical to R8G8B8_UNORM. It does work on gen8+.
302 SF( 80, 80, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, R8G8B8_UNORM_SRGB
)
303 SF( 80, 80, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ETC1_RGB8
)
304 SF( 80, 80, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ETC2_RGB8
)
305 SF( 80, 80, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, EAC_R11
)
306 SF( 80, 80, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, EAC_RG11
)
307 SF( 80, 80, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, EAC_SIGNED_R11
)
308 SF( 80, 80, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, EAC_SIGNED_RG11
)
309 SF( 80, 80, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ETC2_SRGB8
)
310 SF( 90, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, R16G16B16_UINT
)
311 SF( 90, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, R16G16B16_SINT
)
312 SF( x
, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, R32_SFIXED
)
313 SF( x
, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, R10G10B10A2_SNORM
)
314 SF( x
, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, R10G10B10A2_USCALED
)
315 SF( x
, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, R10G10B10A2_SSCALED
)
316 SF( x
, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, R10G10B10A2_SINT
)
317 SF( x
, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, B10G10R10A2_SNORM
)
318 SF( x
, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, B10G10R10A2_USCALED
)
319 SF( x
, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, B10G10R10A2_SSCALED
)
320 SF( x
, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, B10G10R10A2_UINT
)
321 SF( x
, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, B10G10R10A2_SINT
)
322 SF( x
, x
, x
, x
, x
, x
, 80, x
, x
, x
, x
, x
, R64G64B64A64_PASSTHRU
)
323 SF( x
, x
, x
, x
, x
, x
, 80, x
, x
, x
, x
, x
, R64G64B64_PASSTHRU
)
324 SF( 80, 80, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ETC2_RGB8_PTA
)
325 SF( 80, 80, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ETC2_SRGB8_PTA
)
326 SF( 80, 80, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ETC2_EAC_RGBA8
)
327 SF( 80, 80, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ETC2_EAC_SRGB8_A8
)
328 SF( 90, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, R8G8B8_UINT
)
329 SF( 90, x
, x
, x
, x
, x
, 75, x
, x
, x
, x
, x
, R8G8B8_SINT
)
330 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_4X4_FLT16
)
331 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_5X4_FLT16
)
332 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_5X5_FLT16
)
333 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_6X5_FLT16
)
334 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_6X6_FLT16
)
335 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_8X5_FLT16
)
336 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_8X6_FLT16
)
337 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_8X8_FLT16
)
338 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_10X5_FLT16
)
339 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_10X6_FLT16
)
340 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_10X8_FLT16
)
341 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_10X10_FLT16
)
342 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_12X10_FLT16
)
343 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_12X12_FLT16
)
344 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_4X4_U8SRGB
)
345 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_5X4_U8SRGB
)
346 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_5X5_U8SRGB
)
347 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_6X5_U8SRGB
)
348 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_6X6_U8SRGB
)
349 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_8X5_U8SRGB
)
350 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_8X6_U8SRGB
)
351 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_8X8_U8SRGB
)
352 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_10X5_U8SRGB
)
353 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_10X6_U8SRGB
)
354 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_10X8_U8SRGB
)
355 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_10X10_U8SRGB
)
356 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_12X10_U8SRGB
)
357 SF( 90, 90, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_LDR_2D_12X12_U8SRGB
)
358 SF(100, 100, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_HDR_2D_4X4_FLT16
)
359 SF(100, 100, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_HDR_2D_5X4_FLT16
)
360 SF(100, 100, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_HDR_2D_5X5_FLT16
)
361 SF(100, 100, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_HDR_2D_6X5_FLT16
)
362 SF(100, 100, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_HDR_2D_6X6_FLT16
)
363 SF(100, 100, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_HDR_2D_8X5_FLT16
)
364 SF(100, 100, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_HDR_2D_8X6_FLT16
)
365 SF(100, 100, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_HDR_2D_8X8_FLT16
)
366 SF(100, 100, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_HDR_2D_10X5_FLT16
)
367 SF(100, 100, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_HDR_2D_10X6_FLT16
)
368 SF(100, 100, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_HDR_2D_10X8_FLT16
)
369 SF(100, 100, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_HDR_2D_10X10_FLT16
)
370 SF(100, 100, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_HDR_2D_12X10_FLT16
)
371 SF(100, 100, x
, x
, x
, x
, x
, x
, x
, x
, x
, x
, ASTC_HDR_2D_12X12_FLT16
)
378 isl_format_for_pipe_format(enum pipe_format pf
)
380 static const enum isl_format table
[PIPE_FORMAT_COUNT
] = {
381 [0 ... PIPE_FORMAT_COUNT
-1] = ISL_FORMAT_UNSUPPORTED
,
383 [PIPE_FORMAT_B8G8R8A8_UNORM
] = ISL_FORMAT_B8G8R8A8_UNORM
,
384 [PIPE_FORMAT_B8G8R8X8_UNORM
] = ISL_FORMAT_B8G8R8X8_UNORM
,
385 [PIPE_FORMAT_B5G5R5A1_UNORM
] = ISL_FORMAT_B5G5R5A1_UNORM
,
386 [PIPE_FORMAT_B4G4R4A4_UNORM
] = ISL_FORMAT_B4G4R4A4_UNORM
,
387 [PIPE_FORMAT_B5G6R5_UNORM
] = ISL_FORMAT_B5G6R5_UNORM
,
388 [PIPE_FORMAT_R10G10B10A2_UNORM
] = ISL_FORMAT_R10G10B10A2_UNORM
,
390 [PIPE_FORMAT_Z16_UNORM
] = ISL_FORMAT_R16_UNORM
,
391 [PIPE_FORMAT_Z32_UNORM
] = ISL_FORMAT_R32_UNORM
,
392 [PIPE_FORMAT_Z32_FLOAT
] = ISL_FORMAT_R32_FLOAT
,
394 /* We translate the combined depth/stencil formats to depth only here */
395 [PIPE_FORMAT_Z24_UNORM_S8_UINT
] = ISL_FORMAT_R24_UNORM_X8_TYPELESS
,
396 [PIPE_FORMAT_Z24X8_UNORM
] = ISL_FORMAT_R24_UNORM_X8_TYPELESS
,
397 [PIPE_FORMAT_Z32_FLOAT_S8X24_UINT
] = ISL_FORMAT_R32_FLOAT
,
399 [PIPE_FORMAT_S8_UINT
] = ISL_FORMAT_R8_UINT
,
400 [PIPE_FORMAT_X24S8_UINT
] = ISL_FORMAT_R8_UINT
,
401 [PIPE_FORMAT_X32_S8X24_UINT
] = ISL_FORMAT_R8_UINT
,
403 [PIPE_FORMAT_R64_FLOAT
] = ISL_FORMAT_R64_FLOAT
,
404 [PIPE_FORMAT_R64G64_FLOAT
] = ISL_FORMAT_R64G64_FLOAT
,
405 [PIPE_FORMAT_R64G64B64_FLOAT
] = ISL_FORMAT_R64G64B64_FLOAT
,
406 [PIPE_FORMAT_R64G64B64A64_FLOAT
] = ISL_FORMAT_R64G64B64A64_FLOAT
,
407 [PIPE_FORMAT_R32_FLOAT
] = ISL_FORMAT_R32_FLOAT
,
408 [PIPE_FORMAT_R32G32_FLOAT
] = ISL_FORMAT_R32G32_FLOAT
,
409 [PIPE_FORMAT_R32G32B32_FLOAT
] = ISL_FORMAT_R32G32B32_FLOAT
,
410 [PIPE_FORMAT_R32G32B32A32_FLOAT
] = ISL_FORMAT_R32G32B32A32_FLOAT
,
411 [PIPE_FORMAT_R32_UNORM
] = ISL_FORMAT_R32_UNORM
,
412 [PIPE_FORMAT_R32G32_UNORM
] = ISL_FORMAT_R32G32_UNORM
,
413 [PIPE_FORMAT_R32G32B32_UNORM
] = ISL_FORMAT_R32G32B32_UNORM
,
414 [PIPE_FORMAT_R32G32B32A32_UNORM
] = ISL_FORMAT_R32G32B32A32_UNORM
,
415 [PIPE_FORMAT_R32_USCALED
] = ISL_FORMAT_R32_USCALED
,
416 [PIPE_FORMAT_R32G32_USCALED
] = ISL_FORMAT_R32G32_USCALED
,
417 [PIPE_FORMAT_R32G32B32_USCALED
] = ISL_FORMAT_R32G32B32_USCALED
,
418 [PIPE_FORMAT_R32G32B32A32_USCALED
] = ISL_FORMAT_R32G32B32A32_USCALED
,
419 [PIPE_FORMAT_R32_SNORM
] = ISL_FORMAT_R32_SNORM
,
420 [PIPE_FORMAT_R32G32_SNORM
] = ISL_FORMAT_R32G32_SNORM
,
421 [PIPE_FORMAT_R32G32B32_SNORM
] = ISL_FORMAT_R32G32B32_SNORM
,
422 [PIPE_FORMAT_R32G32B32A32_SNORM
] = ISL_FORMAT_R32G32B32A32_SNORM
,
423 [PIPE_FORMAT_R32_SSCALED
] = ISL_FORMAT_R32_SSCALED
,
424 [PIPE_FORMAT_R32G32_SSCALED
] = ISL_FORMAT_R32G32_SSCALED
,
425 [PIPE_FORMAT_R32G32B32_SSCALED
] = ISL_FORMAT_R32G32B32_SSCALED
,
426 [PIPE_FORMAT_R32G32B32A32_SSCALED
] = ISL_FORMAT_R32G32B32A32_SSCALED
,
427 [PIPE_FORMAT_R16_UNORM
] = ISL_FORMAT_R16_UNORM
,
428 [PIPE_FORMAT_R16G16_UNORM
] = ISL_FORMAT_R16G16_UNORM
,
429 [PIPE_FORMAT_R16G16B16_UNORM
] = ISL_FORMAT_R16G16B16_UNORM
,
430 [PIPE_FORMAT_R16G16B16A16_UNORM
] = ISL_FORMAT_R16G16B16A16_UNORM
,
431 [PIPE_FORMAT_R16_USCALED
] = ISL_FORMAT_R16_USCALED
,
432 [PIPE_FORMAT_R16G16_USCALED
] = ISL_FORMAT_R16G16_USCALED
,
433 [PIPE_FORMAT_R16G16B16_USCALED
] = ISL_FORMAT_R16G16B16_USCALED
,
434 [PIPE_FORMAT_R16G16B16A16_USCALED
] = ISL_FORMAT_R16G16B16A16_USCALED
,
435 [PIPE_FORMAT_R16_SNORM
] = ISL_FORMAT_R16_SNORM
,
436 [PIPE_FORMAT_R16G16_SNORM
] = ISL_FORMAT_R16G16_SNORM
,
437 [PIPE_FORMAT_R16G16B16_SNORM
] = ISL_FORMAT_R16G16B16_SNORM
,
438 [PIPE_FORMAT_R16G16B16A16_SNORM
] = ISL_FORMAT_R16G16B16A16_SNORM
,
439 [PIPE_FORMAT_R16_SSCALED
] = ISL_FORMAT_R16_SSCALED
,
440 [PIPE_FORMAT_R16G16_SSCALED
] = ISL_FORMAT_R16G16_SSCALED
,
441 [PIPE_FORMAT_R16G16B16_SSCALED
] = ISL_FORMAT_R16G16B16_SSCALED
,
442 [PIPE_FORMAT_R16G16B16A16_SSCALED
] = ISL_FORMAT_R16G16B16A16_SSCALED
,
443 [PIPE_FORMAT_R8_UNORM
] = ISL_FORMAT_R8_UNORM
,
444 [PIPE_FORMAT_R8G8_UNORM
] = ISL_FORMAT_R8G8_UNORM
,
445 [PIPE_FORMAT_R8G8B8_UNORM
] = ISL_FORMAT_R8G8B8_UNORM
,
446 [PIPE_FORMAT_R8G8B8A8_UNORM
] = ISL_FORMAT_R8G8B8A8_UNORM
,
447 [PIPE_FORMAT_R8_USCALED
] = ISL_FORMAT_R8_USCALED
,
448 [PIPE_FORMAT_R8G8_USCALED
] = ISL_FORMAT_R8G8_USCALED
,
449 [PIPE_FORMAT_R8G8B8_USCALED
] = ISL_FORMAT_R8G8B8_USCALED
,
450 [PIPE_FORMAT_R8G8B8A8_USCALED
] = ISL_FORMAT_R8G8B8A8_USCALED
,
451 [PIPE_FORMAT_R8_SNORM
] = ISL_FORMAT_R8_SNORM
,
452 [PIPE_FORMAT_R8G8_SNORM
] = ISL_FORMAT_R8G8_SNORM
,
453 [PIPE_FORMAT_R8G8B8_SNORM
] = ISL_FORMAT_R8G8B8_SNORM
,
454 [PIPE_FORMAT_R8G8B8A8_SNORM
] = ISL_FORMAT_R8G8B8A8_SNORM
,
455 [PIPE_FORMAT_R8_SSCALED
] = ISL_FORMAT_R8_SSCALED
,
456 [PIPE_FORMAT_R8G8_SSCALED
] = ISL_FORMAT_R8G8_SSCALED
,
457 [PIPE_FORMAT_R8G8B8_SSCALED
] = ISL_FORMAT_R8G8B8_SSCALED
,
458 [PIPE_FORMAT_R8G8B8A8_SSCALED
] = ISL_FORMAT_R8G8B8A8_SSCALED
,
459 [PIPE_FORMAT_R32_FIXED
] = ISL_FORMAT_R32_SFIXED
,
460 [PIPE_FORMAT_R32G32_FIXED
] = ISL_FORMAT_R32G32_SFIXED
,
461 [PIPE_FORMAT_R32G32B32_FIXED
] = ISL_FORMAT_R32G32B32_SFIXED
,
462 [PIPE_FORMAT_R32G32B32A32_FIXED
] = ISL_FORMAT_R32G32B32A32_SFIXED
,
463 [PIPE_FORMAT_R16_FLOAT
] = ISL_FORMAT_R16_FLOAT
,
464 [PIPE_FORMAT_R16G16_FLOAT
] = ISL_FORMAT_R16G16_FLOAT
,
465 [PIPE_FORMAT_R16G16B16_FLOAT
] = ISL_FORMAT_R16G16B16_FLOAT
,
466 [PIPE_FORMAT_R16G16B16A16_FLOAT
] = ISL_FORMAT_R16G16B16A16_FLOAT
,
468 [PIPE_FORMAT_R8G8B8_SRGB
] = ISL_FORMAT_R8G8B8_UNORM_SRGB
,
469 [PIPE_FORMAT_B8G8R8A8_SRGB
] = ISL_FORMAT_B8G8R8A8_UNORM_SRGB
,
470 [PIPE_FORMAT_B8G8R8X8_SRGB
] = ISL_FORMAT_B8G8R8X8_UNORM_SRGB
,
471 [PIPE_FORMAT_R8G8B8A8_SRGB
] = ISL_FORMAT_R8G8B8A8_UNORM_SRGB
,
473 [PIPE_FORMAT_DXT1_RGB
] = ISL_FORMAT_BC1_UNORM
,
474 [PIPE_FORMAT_DXT1_RGBA
] = ISL_FORMAT_BC1_UNORM
,
475 [PIPE_FORMAT_DXT3_RGBA
] = ISL_FORMAT_BC2_UNORM
,
476 [PIPE_FORMAT_DXT5_RGBA
] = ISL_FORMAT_BC3_UNORM
,
478 [PIPE_FORMAT_DXT1_SRGB
] = ISL_FORMAT_BC1_UNORM_SRGB
,
479 [PIPE_FORMAT_DXT1_SRGBA
] = ISL_FORMAT_BC1_UNORM_SRGB
,
480 [PIPE_FORMAT_DXT3_SRGBA
] = ISL_FORMAT_BC2_UNORM_SRGB
,
481 [PIPE_FORMAT_DXT5_SRGBA
] = ISL_FORMAT_BC3_UNORM_SRGB
,
483 [PIPE_FORMAT_RGTC1_UNORM
] = ISL_FORMAT_BC4_UNORM
,
484 [PIPE_FORMAT_RGTC1_SNORM
] = ISL_FORMAT_BC4_SNORM
,
485 [PIPE_FORMAT_RGTC2_UNORM
] = ISL_FORMAT_BC5_UNORM
,
486 [PIPE_FORMAT_RGTC2_SNORM
] = ISL_FORMAT_BC5_SNORM
,
488 [PIPE_FORMAT_R10G10B10A2_USCALED
] = ISL_FORMAT_R10G10B10A2_USCALED
,
489 [PIPE_FORMAT_R11G11B10_FLOAT
] = ISL_FORMAT_R11G11B10_FLOAT
,
490 [PIPE_FORMAT_R9G9B9E5_FLOAT
] = ISL_FORMAT_R9G9B9E5_SHAREDEXP
,
491 [PIPE_FORMAT_R1_UNORM
] = ISL_FORMAT_R1_UNORM
,
492 [PIPE_FORMAT_R10G10B10X2_USCALED
] = ISL_FORMAT_R10G10B10X2_USCALED
,
493 [PIPE_FORMAT_B10G10R10A2_UNORM
] = ISL_FORMAT_B10G10R10A2_UNORM
,
494 [PIPE_FORMAT_R8G8B8X8_UNORM
] = ISL_FORMAT_R8G8B8X8_UNORM
,
496 /* Just use red formats for these - they're actually renderable,
497 * and faster to sample than the legacy L/I/A/LA formats.
499 [PIPE_FORMAT_I8_UNORM
] = ISL_FORMAT_R8_UNORM
,
500 [PIPE_FORMAT_I8_UINT
] = ISL_FORMAT_R8_UINT
,
501 [PIPE_FORMAT_I8_SINT
] = ISL_FORMAT_R8_SINT
,
502 [PIPE_FORMAT_I8_SNORM
] = ISL_FORMAT_R8_SNORM
,
503 [PIPE_FORMAT_I16_UINT
] = ISL_FORMAT_R16_UINT
,
504 [PIPE_FORMAT_I16_UNORM
] = ISL_FORMAT_R16_UNORM
,
505 [PIPE_FORMAT_I16_SINT
] = ISL_FORMAT_R16_SINT
,
506 [PIPE_FORMAT_I16_SNORM
] = ISL_FORMAT_R16_SNORM
,
507 [PIPE_FORMAT_I16_FLOAT
] = ISL_FORMAT_R16_FLOAT
,
508 [PIPE_FORMAT_I32_UINT
] = ISL_FORMAT_R32_UINT
,
509 [PIPE_FORMAT_I32_SINT
] = ISL_FORMAT_R32_SINT
,
510 [PIPE_FORMAT_I32_FLOAT
] = ISL_FORMAT_R32_FLOAT
,
512 [PIPE_FORMAT_L8_UINT
] = ISL_FORMAT_R8_UINT
,
513 [PIPE_FORMAT_L8_UNORM
] = ISL_FORMAT_R8_UNORM
,
514 [PIPE_FORMAT_L8_SINT
] = ISL_FORMAT_R8_SINT
,
515 [PIPE_FORMAT_L8_SNORM
] = ISL_FORMAT_R8_SNORM
,
516 [PIPE_FORMAT_L16_UINT
] = ISL_FORMAT_R16_UINT
,
517 [PIPE_FORMAT_L16_UNORM
] = ISL_FORMAT_R16_UNORM
,
518 [PIPE_FORMAT_L16_SINT
] = ISL_FORMAT_R16_SINT
,
519 [PIPE_FORMAT_L16_SNORM
] = ISL_FORMAT_R16_SNORM
,
520 [PIPE_FORMAT_L16_FLOAT
] = ISL_FORMAT_R16_FLOAT
,
521 [PIPE_FORMAT_L32_UINT
] = ISL_FORMAT_R32_UINT
,
522 [PIPE_FORMAT_L32_SINT
] = ISL_FORMAT_R32_SINT
,
523 [PIPE_FORMAT_L32_FLOAT
] = ISL_FORMAT_R32_FLOAT
,
525 /* We also map alpha and luminance-alpha formats to red as well,
526 * though most of these (other than A8_UNORM) will be non-renderable.
528 [PIPE_FORMAT_A8_UINT
] = ISL_FORMAT_R8_UINT
,
529 [PIPE_FORMAT_A8_UNORM
] = ISL_FORMAT_R8_UNORM
,
530 [PIPE_FORMAT_A8_SINT
] = ISL_FORMAT_R8_SINT
,
531 [PIPE_FORMAT_A8_SNORM
] = ISL_FORMAT_R8_SNORM
,
532 [PIPE_FORMAT_A16_UINT
] = ISL_FORMAT_R16_UINT
,
533 [PIPE_FORMAT_A16_UNORM
] = ISL_FORMAT_R16_UNORM
,
534 [PIPE_FORMAT_A16_SINT
] = ISL_FORMAT_R16_SINT
,
535 [PIPE_FORMAT_A16_SNORM
] = ISL_FORMAT_R16_SNORM
,
536 [PIPE_FORMAT_A16_FLOAT
] = ISL_FORMAT_R16_FLOAT
,
537 [PIPE_FORMAT_A32_UINT
] = ISL_FORMAT_R32_UINT
,
538 [PIPE_FORMAT_A32_SINT
] = ISL_FORMAT_R32_SINT
,
539 [PIPE_FORMAT_A32_FLOAT
] = ISL_FORMAT_R32_FLOAT
,
541 [PIPE_FORMAT_L8A8_UINT
] = ISL_FORMAT_R8G8_UINT
,
542 [PIPE_FORMAT_L8A8_UNORM
] = ISL_FORMAT_R8G8_UNORM
,
543 [PIPE_FORMAT_L8A8_SINT
] = ISL_FORMAT_R8G8_SINT
,
544 [PIPE_FORMAT_L8A8_SNORM
] = ISL_FORMAT_R8G8_SNORM
,
545 [PIPE_FORMAT_L16A16_UINT
] = ISL_FORMAT_R16G16_UINT
,
546 [PIPE_FORMAT_L16A16_UNORM
] = ISL_FORMAT_R16G16_UNORM
,
547 [PIPE_FORMAT_L16A16_SINT
] = ISL_FORMAT_R16G16_SINT
,
548 [PIPE_FORMAT_L16A16_SNORM
] = ISL_FORMAT_R16G16_SNORM
,
549 [PIPE_FORMAT_L16A16_FLOAT
] = ISL_FORMAT_R16G16_FLOAT
,
550 [PIPE_FORMAT_L32A32_UINT
] = ISL_FORMAT_R32G32_UINT
,
551 [PIPE_FORMAT_L32A32_SINT
] = ISL_FORMAT_R32G32_SINT
,
552 [PIPE_FORMAT_L32A32_FLOAT
] = ISL_FORMAT_R32G32_FLOAT
,
554 /* Sadly, we have to use luminance[-alpha] formats for sRGB decoding. */
555 [PIPE_FORMAT_R8_SRGB
] = ISL_FORMAT_L8_UNORM_SRGB
,
556 [PIPE_FORMAT_L8_SRGB
] = ISL_FORMAT_L8_UNORM_SRGB
,
557 [PIPE_FORMAT_L8A8_SRGB
] = ISL_FORMAT_L8A8_UNORM_SRGB
,
559 [PIPE_FORMAT_R10G10B10A2_SSCALED
] = ISL_FORMAT_R10G10B10A2_SSCALED
,
560 [PIPE_FORMAT_R10G10B10A2_SNORM
] = ISL_FORMAT_R10G10B10A2_SNORM
,
562 [PIPE_FORMAT_B10G10R10A2_USCALED
] = ISL_FORMAT_B10G10R10A2_USCALED
,
563 [PIPE_FORMAT_B10G10R10A2_SSCALED
] = ISL_FORMAT_B10G10R10A2_SSCALED
,
564 [PIPE_FORMAT_B10G10R10A2_SNORM
] = ISL_FORMAT_B10G10R10A2_SNORM
,
566 [PIPE_FORMAT_R8_UINT
] = ISL_FORMAT_R8_UINT
,
567 [PIPE_FORMAT_R8G8_UINT
] = ISL_FORMAT_R8G8_UINT
,
568 [PIPE_FORMAT_R8G8B8_UINT
] = ISL_FORMAT_R8G8B8_UINT
,
569 [PIPE_FORMAT_R8G8B8A8_UINT
] = ISL_FORMAT_R8G8B8A8_UINT
,
571 [PIPE_FORMAT_R8_SINT
] = ISL_FORMAT_R8_SINT
,
572 [PIPE_FORMAT_R8G8_SINT
] = ISL_FORMAT_R8G8_SINT
,
573 [PIPE_FORMAT_R8G8B8_SINT
] = ISL_FORMAT_R8G8B8_SINT
,
574 [PIPE_FORMAT_R8G8B8A8_SINT
] = ISL_FORMAT_R8G8B8A8_SINT
,
576 [PIPE_FORMAT_R16_UINT
] = ISL_FORMAT_R16_UINT
,
577 [PIPE_FORMAT_R16G16_UINT
] = ISL_FORMAT_R16G16_UINT
,
578 [PIPE_FORMAT_R16G16B16_UINT
] = ISL_FORMAT_R16G16B16_UINT
,
579 [PIPE_FORMAT_R16G16B16A16_UINT
] = ISL_FORMAT_R16G16B16A16_UINT
,
581 [PIPE_FORMAT_R16_SINT
] = ISL_FORMAT_R16_SINT
,
582 [PIPE_FORMAT_R16G16_SINT
] = ISL_FORMAT_R16G16_SINT
,
583 [PIPE_FORMAT_R16G16B16_SINT
] = ISL_FORMAT_R16G16B16_SINT
,
584 [PIPE_FORMAT_R16G16B16A16_SINT
] = ISL_FORMAT_R16G16B16A16_SINT
,
586 [PIPE_FORMAT_R32_UINT
] = ISL_FORMAT_R32_UINT
,
587 [PIPE_FORMAT_R32G32_UINT
] = ISL_FORMAT_R32G32_UINT
,
588 [PIPE_FORMAT_R32G32B32_UINT
] = ISL_FORMAT_R32G32B32_UINT
,
589 [PIPE_FORMAT_R32G32B32A32_UINT
] = ISL_FORMAT_R32G32B32A32_UINT
,
591 [PIPE_FORMAT_R32_SINT
] = ISL_FORMAT_R32_SINT
,
592 [PIPE_FORMAT_R32G32_SINT
] = ISL_FORMAT_R32G32_SINT
,
593 [PIPE_FORMAT_R32G32B32_SINT
] = ISL_FORMAT_R32G32B32_SINT
,
594 [PIPE_FORMAT_R32G32B32A32_SINT
] = ISL_FORMAT_R32G32B32A32_SINT
,
596 [PIPE_FORMAT_B10G10R10A2_UINT
] = ISL_FORMAT_B10G10R10A2_UINT
,
598 [PIPE_FORMAT_ETC1_RGB8
] = ISL_FORMAT_ETC1_RGB8
,
600 [PIPE_FORMAT_R8G8B8X8_SRGB
] = ISL_FORMAT_R8G8B8X8_UNORM_SRGB
,
601 [PIPE_FORMAT_B10G10R10X2_UNORM
] = ISL_FORMAT_B10G10R10X2_UNORM
,
602 [PIPE_FORMAT_R16G16B16X16_UNORM
] = ISL_FORMAT_R16G16B16X16_UNORM
,
603 [PIPE_FORMAT_R16G16B16X16_FLOAT
] = ISL_FORMAT_R16G16B16X16_FLOAT
,
604 [PIPE_FORMAT_R32G32B32X32_FLOAT
] = ISL_FORMAT_R32G32B32X32_FLOAT
,
606 [PIPE_FORMAT_R10G10B10A2_UINT
] = ISL_FORMAT_R10G10B10A2_UINT
,
608 [PIPE_FORMAT_B5G6R5_SRGB
] = ISL_FORMAT_B5G6R5_UNORM_SRGB
,
610 [PIPE_FORMAT_BPTC_RGBA_UNORM
] = ISL_FORMAT_BC7_UNORM
,
611 [PIPE_FORMAT_BPTC_SRGBA
] = ISL_FORMAT_BC7_UNORM_SRGB
,
612 [PIPE_FORMAT_BPTC_RGB_FLOAT
] = ISL_FORMAT_BC6H_SF16
,
613 [PIPE_FORMAT_BPTC_RGB_UFLOAT
] = ISL_FORMAT_BC6H_UF16
,
615 [PIPE_FORMAT_ETC2_RGB8
] = ISL_FORMAT_ETC2_RGB8
,
616 [PIPE_FORMAT_ETC2_SRGB8
] = ISL_FORMAT_ETC2_SRGB8
,
617 [PIPE_FORMAT_ETC2_RGB8A1
] = ISL_FORMAT_ETC2_RGB8_PTA
,
618 [PIPE_FORMAT_ETC2_SRGB8A1
] = ISL_FORMAT_ETC2_SRGB8_PTA
,
619 [PIPE_FORMAT_ETC2_RGBA8
] = ISL_FORMAT_ETC2_EAC_RGBA8
,
620 [PIPE_FORMAT_ETC2_SRGBA8
] = ISL_FORMAT_ETC2_EAC_SRGB8_A8
,
621 [PIPE_FORMAT_ETC2_R11_UNORM
] = ISL_FORMAT_EAC_R11
,
622 [PIPE_FORMAT_ETC2_R11_SNORM
] = ISL_FORMAT_EAC_SIGNED_R11
,
623 [PIPE_FORMAT_ETC2_RG11_UNORM
] = ISL_FORMAT_EAC_RG11
,
624 [PIPE_FORMAT_ETC2_RG11_SNORM
] = ISL_FORMAT_EAC_SIGNED_RG11
,
626 [PIPE_FORMAT_FXT1_RGB
] = ISL_FORMAT_FXT1
,
627 [PIPE_FORMAT_FXT1_RGBA
] = ISL_FORMAT_FXT1
,
629 [PIPE_FORMAT_ASTC_4x4
] = ISL_FORMAT_ASTC_LDR_2D_4X4_FLT16
,
630 [PIPE_FORMAT_ASTC_5x4
] = ISL_FORMAT_ASTC_LDR_2D_5X4_FLT16
,
631 [PIPE_FORMAT_ASTC_5x5
] = ISL_FORMAT_ASTC_LDR_2D_5X5_FLT16
,
632 [PIPE_FORMAT_ASTC_6x5
] = ISL_FORMAT_ASTC_LDR_2D_6X5_FLT16
,
633 [PIPE_FORMAT_ASTC_6x6
] = ISL_FORMAT_ASTC_LDR_2D_6X6_FLT16
,
634 [PIPE_FORMAT_ASTC_8x5
] = ISL_FORMAT_ASTC_LDR_2D_8X5_FLT16
,
635 [PIPE_FORMAT_ASTC_8x6
] = ISL_FORMAT_ASTC_LDR_2D_8X6_FLT16
,
636 [PIPE_FORMAT_ASTC_8x8
] = ISL_FORMAT_ASTC_LDR_2D_8X8_FLT16
,
637 [PIPE_FORMAT_ASTC_10x5
] = ISL_FORMAT_ASTC_LDR_2D_10X5_FLT16
,
638 [PIPE_FORMAT_ASTC_10x6
] = ISL_FORMAT_ASTC_LDR_2D_10X6_FLT16
,
639 [PIPE_FORMAT_ASTC_10x8
] = ISL_FORMAT_ASTC_LDR_2D_10X8_FLT16
,
640 [PIPE_FORMAT_ASTC_10x10
] = ISL_FORMAT_ASTC_LDR_2D_10X10_FLT16
,
641 [PIPE_FORMAT_ASTC_12x10
] = ISL_FORMAT_ASTC_LDR_2D_12X10_FLT16
,
642 [PIPE_FORMAT_ASTC_12x12
] = ISL_FORMAT_ASTC_LDR_2D_12X12_FLT16
,
644 [PIPE_FORMAT_ASTC_4x4_SRGB
] = ISL_FORMAT_ASTC_LDR_2D_4X4_U8SRGB
,
645 [PIPE_FORMAT_ASTC_5x4_SRGB
] = ISL_FORMAT_ASTC_LDR_2D_5X4_U8SRGB
,
646 [PIPE_FORMAT_ASTC_5x5_SRGB
] = ISL_FORMAT_ASTC_LDR_2D_5X5_U8SRGB
,
647 [PIPE_FORMAT_ASTC_6x5_SRGB
] = ISL_FORMAT_ASTC_LDR_2D_6X5_U8SRGB
,
648 [PIPE_FORMAT_ASTC_6x6_SRGB
] = ISL_FORMAT_ASTC_LDR_2D_6X6_U8SRGB
,
649 [PIPE_FORMAT_ASTC_8x5_SRGB
] = ISL_FORMAT_ASTC_LDR_2D_8X5_U8SRGB
,
650 [PIPE_FORMAT_ASTC_8x6_SRGB
] = ISL_FORMAT_ASTC_LDR_2D_8X6_U8SRGB
,
651 [PIPE_FORMAT_ASTC_8x8_SRGB
] = ISL_FORMAT_ASTC_LDR_2D_8X8_U8SRGB
,
652 [PIPE_FORMAT_ASTC_10x5_SRGB
] = ISL_FORMAT_ASTC_LDR_2D_10X5_U8SRGB
,
653 [PIPE_FORMAT_ASTC_10x6_SRGB
] = ISL_FORMAT_ASTC_LDR_2D_10X6_U8SRGB
,
654 [PIPE_FORMAT_ASTC_10x8_SRGB
] = ISL_FORMAT_ASTC_LDR_2D_10X8_U8SRGB
,
655 [PIPE_FORMAT_ASTC_10x10_SRGB
] = ISL_FORMAT_ASTC_LDR_2D_10X10_U8SRGB
,
656 [PIPE_FORMAT_ASTC_12x10_SRGB
] = ISL_FORMAT_ASTC_LDR_2D_12X10_U8SRGB
,
657 [PIPE_FORMAT_ASTC_12x12_SRGB
] = ISL_FORMAT_ASTC_LDR_2D_12X12_U8SRGB
,
659 [PIPE_FORMAT_A1B5G5R5_UNORM
] = ISL_FORMAT_A1B5G5R5_UNORM
,
661 /* We support these so that we know the API expects no alpha channel.
662 * Otherwise, the state tracker would just give us a format with alpha
663 * and we wouldn't know to override the swizzle to 1.
665 [PIPE_FORMAT_R16G16B16X16_UINT
] = ISL_FORMAT_R16G16B16A16_UINT
,
666 [PIPE_FORMAT_R16G16B16X16_SINT
] = ISL_FORMAT_R16G16B16A16_SINT
,
667 [PIPE_FORMAT_R32G32B32X32_UINT
] = ISL_FORMAT_R32G32B32A32_UINT
,
668 [PIPE_FORMAT_R32G32B32X32_SINT
] = ISL_FORMAT_R32G32B32A32_SINT
,
669 [PIPE_FORMAT_R10G10B10X2_SNORM
] = ISL_FORMAT_R10G10B10A2_SNORM
,
671 assert(pf
< PIPE_FORMAT_COUNT
);
676 format_gen(const struct gen_device_info
*devinfo
)
678 return devinfo
->gen
* 10 + (devinfo
->is_g4x
|| devinfo
->is_haswell
) * 5;
682 format_info_exists(enum isl_format format
)
684 assert(format
!= ISL_FORMAT_UNSUPPORTED
);
685 assert(format
< ISL_NUM_FORMATS
);
686 return format
< ARRAY_SIZE(format_info
) && format_info
[format
].exists
;
690 isl_format_supports_rendering(const struct gen_device_info
*devinfo
,
691 enum isl_format format
)
693 if (!format_info_exists(format
))
696 return format_gen(devinfo
) >= format_info
[format
].render_target
;
700 isl_format_supports_alpha_blending(const struct gen_device_info
*devinfo
,
701 enum isl_format format
)
703 if (!format_info_exists(format
))
706 return format_gen(devinfo
) >= format_info
[format
].alpha_blend
;
710 isl_format_supports_sampling(const struct gen_device_info
*devinfo
,
711 enum isl_format format
)
713 if (!format_info_exists(format
))
716 if (devinfo
->is_baytrail
) {
717 const struct isl_format_layout
*fmtl
= isl_format_get_layout(format
);
718 /* Support for ETC1 and ETC2 exists on Bay Trail even though big-core
719 * GPUs didn't get it until Broadwell.
721 if (fmtl
->txc
== ISL_TXC_ETC1
|| fmtl
->txc
== ISL_TXC_ETC2
)
723 } else if (devinfo
->is_cherryview
) {
724 const struct isl_format_layout
*fmtl
= isl_format_get_layout(format
);
725 /* Support for ASTC LDR exists on Cherry View even though big-core
726 * GPUs didn't get it until Skylake.
728 if (fmtl
->txc
== ISL_TXC_ASTC
)
729 return format
< ISL_FORMAT_ASTC_HDR_2D_4X4_FLT16
;
730 } else if (gen_device_info_is_9lp(devinfo
)) {
731 const struct isl_format_layout
*fmtl
= isl_format_get_layout(format
);
732 /* Support for ASTC HDR exists on Broxton even though big-core
733 * GPUs didn't get it until Cannonlake.
735 if (fmtl
->txc
== ISL_TXC_ASTC
)
739 return format_gen(devinfo
) >= format_info
[format
].sampling
;
743 isl_format_supports_filtering(const struct gen_device_info
*devinfo
,
744 enum isl_format format
)
746 if (!format_info_exists(format
))
749 if (devinfo
->is_baytrail
) {
750 const struct isl_format_layout
*fmtl
= isl_format_get_layout(format
);
751 /* Support for ETC1 and ETC2 exists on Bay Trail even though big-core
752 * GPUs didn't get it until Broadwell.
754 if (fmtl
->txc
== ISL_TXC_ETC1
|| fmtl
->txc
== ISL_TXC_ETC2
)
756 } else if (devinfo
->is_cherryview
) {
757 const struct isl_format_layout
*fmtl
= isl_format_get_layout(format
);
758 /* Support for ASTC LDR exists on Cherry View even though big-core
759 * GPUs didn't get it until Skylake.
761 if (fmtl
->txc
== ISL_TXC_ASTC
)
762 return format
< ISL_FORMAT_ASTC_HDR_2D_4X4_FLT16
;
763 } else if (gen_device_info_is_9lp(devinfo
)) {
764 const struct isl_format_layout
*fmtl
= isl_format_get_layout(format
);
765 /* Support for ASTC HDR exists on Broxton even though big-core
766 * GPUs didn't get it until Cannonlake.
768 if (fmtl
->txc
== ISL_TXC_ASTC
)
772 return format_gen(devinfo
) >= format_info
[format
].filtering
;
776 isl_format_supports_vertex_fetch(const struct gen_device_info
*devinfo
,
777 enum isl_format format
)
779 if (!format_info_exists(format
))
782 /* For vertex fetch, Bay Trail supports the same set of formats as Haswell
783 * but is a superset of Ivy Bridge.
785 if (devinfo
->is_baytrail
)
786 return 75 >= format_info
[format
].input_vb
;
788 return format_gen(devinfo
) >= format_info
[format
].input_vb
;
792 * Returns true if the given format can support typed writes.
795 isl_format_supports_typed_writes(const struct gen_device_info
*devinfo
,
796 enum isl_format format
)
798 if (!format_info_exists(format
))
801 return format_gen(devinfo
) >= format_info
[format
].typed_write
;
806 * Returns true if the given format can support typed reads with format
807 * conversion fully handled by hardware. On Sky Lake, all formats which are
808 * supported for typed writes also support typed reads but some of them return
809 * the raw image data and don't provide format conversion.
811 * For anyone looking to find this data in the PRM, the easiest way to find
812 * format tables is to search for R11G11B10. There are only a few
816 isl_format_supports_typed_reads(const struct gen_device_info
*devinfo
,
817 enum isl_format format
)
819 if (!format_info_exists(format
))
822 return format_gen(devinfo
) >= format_info
[format
].typed_read
;
826 * Returns true if the given format can support single-sample fast clears.
827 * This function only checks the format. In order to determine if a surface
828 * supports CCS_E, several other factors need to be considered such as tiling
829 * and sample count. See isl_surf_get_ccs_surf for details.
832 isl_format_supports_ccs_d(const struct gen_device_info
*devinfo
,
833 enum isl_format format
)
835 /* Clear-only compression was first added on Ivy Bridge and was last
836 * implemented on Ice lake (see BSpec: 43862).
838 if (devinfo
->gen
< 7 || devinfo
->gen
> 11)
841 if (!isl_format_supports_rendering(devinfo
, format
))
844 const struct isl_format_layout
*fmtl
= isl_format_get_layout(format
);
846 return fmtl
->bpb
== 32 || fmtl
->bpb
== 64 || fmtl
->bpb
== 128;
850 * Returns true if the given format can support single-sample color
851 * compression. This function only checks the format. In order to determine
852 * if a surface supports CCS_E, several other factors need to be considered
853 * such as tiling and sample count. See isl_surf_get_ccs_surf for details.
856 isl_format_supports_ccs_e(const struct gen_device_info
*devinfo
,
857 enum isl_format format
)
859 if (!format_info_exists(format
))
862 /* For simplicity, only report that a format supports CCS_E if blorp can
863 * perform bit-for-bit copies with an image of that format while compressed.
864 * Unfortunately, R11G11B10_FLOAT is in a compression class of its own and
865 * there is no way to copy to/from it which doesn't potentially loose data
866 * if one of the bit patterns being copied isn't valid finite floats.
868 if (format
== ISL_FORMAT_R11G11B10_FLOAT
)
871 return format_gen(devinfo
) >= format_info
[format
].ccs_e
;
875 isl_format_supports_multisampling(const struct gen_device_info
*devinfo
,
876 enum isl_format format
)
878 /* From the Sandybridge PRM, Volume 4 Part 1 p72, SURFACE_STATE, Surface
881 * If Number of Multisamples is set to a value other than
882 * MULTISAMPLECOUNT_1, this field cannot be set to the following
885 * - any format with greater than 64 bits per element
886 * - any compressed texture format (BC*)
887 * - any YCRCB* format
889 * The restriction on the format's size is removed on Broadwell. Moreover,
890 * empirically it looks that even IvyBridge can handle multisampled surfaces
891 * with format sizes all the way to 128-bits (RGBA32F, RGBA32I, RGBA32UI).
893 * Also, there is an exception for HiZ which we treat as a compressed
894 * format and is allowed to be multisampled on Broadwell and earlier.
896 if (format
== ISL_FORMAT_HIZ
) {
897 /* On SKL+, HiZ is always single-sampled even when the primary surface
898 * is multisampled. See also isl_surf_get_hiz_surf().
900 return devinfo
->gen
<= 8;
901 } else if (devinfo
->gen
< 7 && isl_format_get_layout(format
)->bpb
> 64) {
903 } else if (isl_format_is_compressed(format
)) {
905 } else if (isl_format_is_yuv(format
)) {
913 * Returns true if the two formats are "CCS_E compatible" meaning that you can
914 * render in one format with CCS_E enabled and then texture using the other
915 * format without needing a resolve.
917 * Note: Even if the formats are compatible, special care must be taken if a
918 * clear color is involved because the encoding of the clear color is heavily
922 isl_formats_are_ccs_e_compatible(const struct gen_device_info
*devinfo
,
923 enum isl_format format1
,
924 enum isl_format format2
)
926 /* They must support CCS_E */
927 if (!isl_format_supports_ccs_e(devinfo
, format1
) ||
928 !isl_format_supports_ccs_e(devinfo
, format2
))
931 /* Gen12 added CCS_E support for A8_UNORM, A8_UNORM and R8_UNORM share the
932 * same aux map format encoding so they are definitely compatible.
934 if (format1
== ISL_FORMAT_A8_UNORM
)
935 format1
= ISL_FORMAT_R8_UNORM
;
937 if (format2
== ISL_FORMAT_A8_UNORM
)
938 format2
= ISL_FORMAT_R8_UNORM
;
940 const struct isl_format_layout
*fmtl1
= isl_format_get_layout(format1
);
941 const struct isl_format_layout
*fmtl2
= isl_format_get_layout(format2
);
943 /* The compression used by CCS is not dependent on the actual data encoding
944 * of the format but only depends on the bit-layout of the channels.
946 return fmtl1
->channels
.r
.bits
== fmtl2
->channels
.r
.bits
&&
947 fmtl1
->channels
.g
.bits
== fmtl2
->channels
.g
.bits
&&
948 fmtl1
->channels
.b
.bits
== fmtl2
->channels
.b
.bits
&&
949 fmtl1
->channels
.a
.bits
== fmtl2
->channels
.a
.bits
;
953 isl_format_has_channel_type(enum isl_format fmt
, enum isl_base_type type
)
955 const struct isl_format_layout
*fmtl
= isl_format_get_layout(fmt
);
957 return fmtl
->channels
.r
.type
== type
||
958 fmtl
->channels
.g
.type
== type
||
959 fmtl
->channels
.b
.type
== type
||
960 fmtl
->channels
.a
.type
== type
||
961 fmtl
->channels
.l
.type
== type
||
962 fmtl
->channels
.i
.type
== type
||
963 fmtl
->channels
.p
.type
== type
;
967 isl_format_has_unorm_channel(enum isl_format fmt
)
969 return isl_format_has_channel_type(fmt
, ISL_UNORM
);
973 isl_format_has_snorm_channel(enum isl_format fmt
)
975 return isl_format_has_channel_type(fmt
, ISL_SNORM
);
979 isl_format_has_ufloat_channel(enum isl_format fmt
)
981 return isl_format_has_channel_type(fmt
, ISL_UFLOAT
);
985 isl_format_has_sfloat_channel(enum isl_format fmt
)
987 return isl_format_has_channel_type(fmt
, ISL_SFLOAT
);
991 isl_format_has_uint_channel(enum isl_format fmt
)
993 return isl_format_has_channel_type(fmt
, ISL_UINT
);
997 isl_format_has_sint_channel(enum isl_format fmt
)
999 return isl_format_has_channel_type(fmt
, ISL_SINT
);
1003 isl_format_has_color_component(enum isl_format fmt
, int component
)
1005 const struct isl_format_layout
*fmtl
= isl_format_get_layout(fmt
);
1006 const uint8_t intensity
= fmtl
->channels
.i
.bits
;
1007 const uint8_t luminance
= fmtl
->channels
.l
.bits
;
1009 switch (component
) {
1011 return (fmtl
->channels
.r
.bits
+ intensity
+ luminance
) > 0;
1013 return (fmtl
->channels
.g
.bits
+ intensity
+ luminance
) > 0;
1015 return (fmtl
->channels
.b
.bits
+ intensity
+ luminance
) > 0;
1017 return (fmtl
->channels
.a
.bits
+ intensity
) > 0;
1019 assert(!"Invalid color component: must be 0..3");
1025 isl_format_get_num_channels(enum isl_format fmt
)
1027 const struct isl_format_layout
*fmtl
= isl_format_get_layout(fmt
);
1029 assert(fmtl
->channels
.p
.bits
== 0);
1031 return (fmtl
->channels
.r
.bits
> 0) +
1032 (fmtl
->channels
.g
.bits
> 0) +
1033 (fmtl
->channels
.b
.bits
> 0) +
1034 (fmtl
->channels
.a
.bits
> 0) +
1035 (fmtl
->channels
.l
.bits
> 0) +
1036 (fmtl
->channels
.i
.bits
> 0);
1040 isl_format_get_depth_format(enum isl_format fmt
, bool has_stencil
)
1044 unreachable("bad isl depth format");
1045 case ISL_FORMAT_R32_FLOAT_X8X24_TYPELESS
:
1046 assert(has_stencil
);
1047 return 0; /* D32_FLOAT_S8X24_UINT */
1048 case ISL_FORMAT_R32_FLOAT
:
1049 assert(!has_stencil
);
1050 return 1; /* D32_FLOAT */
1051 case ISL_FORMAT_R24_UNORM_X8_TYPELESS
:
1053 return 2; /* D24_UNORM_S8_UINT */
1055 return 3; /* D24_UNORM_X8_UINT */
1057 case ISL_FORMAT_R16_UNORM
:
1058 assert(!has_stencil
);
1059 return 5; /* D16_UNORM */
1064 isl_format_rgb_to_rgba(enum isl_format rgb
)
1066 assert(isl_format_is_rgb(rgb
));
1069 case ISL_FORMAT_R32G32B32_FLOAT
: return ISL_FORMAT_R32G32B32A32_FLOAT
;
1070 case ISL_FORMAT_R32G32B32_SINT
: return ISL_FORMAT_R32G32B32A32_SINT
;
1071 case ISL_FORMAT_R32G32B32_UINT
: return ISL_FORMAT_R32G32B32A32_UINT
;
1072 case ISL_FORMAT_R32G32B32_UNORM
: return ISL_FORMAT_R32G32B32A32_UNORM
;
1073 case ISL_FORMAT_R32G32B32_SNORM
: return ISL_FORMAT_R32G32B32A32_SNORM
;
1074 case ISL_FORMAT_R32G32B32_SSCALED
: return ISL_FORMAT_R32G32B32A32_SSCALED
;
1075 case ISL_FORMAT_R32G32B32_USCALED
: return ISL_FORMAT_R32G32B32A32_USCALED
;
1076 case ISL_FORMAT_R32G32B32_SFIXED
: return ISL_FORMAT_R32G32B32A32_SFIXED
;
1077 case ISL_FORMAT_R8G8B8_UNORM
: return ISL_FORMAT_R8G8B8A8_UNORM
;
1078 case ISL_FORMAT_R8G8B8_SNORM
: return ISL_FORMAT_R8G8B8A8_SNORM
;
1079 case ISL_FORMAT_R8G8B8_SSCALED
: return ISL_FORMAT_R8G8B8A8_SSCALED
;
1080 case ISL_FORMAT_R8G8B8_USCALED
: return ISL_FORMAT_R8G8B8A8_USCALED
;
1081 case ISL_FORMAT_R16G16B16_FLOAT
: return ISL_FORMAT_R16G16B16A16_FLOAT
;
1082 case ISL_FORMAT_R16G16B16_UNORM
: return ISL_FORMAT_R16G16B16A16_UNORM
;
1083 case ISL_FORMAT_R16G16B16_SNORM
: return ISL_FORMAT_R16G16B16A16_SNORM
;
1084 case ISL_FORMAT_R16G16B16_SSCALED
: return ISL_FORMAT_R16G16B16A16_SSCALED
;
1085 case ISL_FORMAT_R16G16B16_USCALED
: return ISL_FORMAT_R16G16B16A16_USCALED
;
1086 case ISL_FORMAT_R8G8B8_UNORM_SRGB
: return ISL_FORMAT_R8G8B8A8_UNORM_SRGB
;
1087 case ISL_FORMAT_R16G16B16_UINT
: return ISL_FORMAT_R16G16B16A16_UINT
;
1088 case ISL_FORMAT_R16G16B16_SINT
: return ISL_FORMAT_R16G16B16A16_SINT
;
1089 case ISL_FORMAT_R8G8B8_UINT
: return ISL_FORMAT_R8G8B8A8_UINT
;
1090 case ISL_FORMAT_R8G8B8_SINT
: return ISL_FORMAT_R8G8B8A8_SINT
;
1092 return ISL_FORMAT_UNSUPPORTED
;
1097 isl_format_rgb_to_rgbx(enum isl_format rgb
)
1099 assert(isl_format_is_rgb(rgb
));
1102 case ISL_FORMAT_R32G32B32_FLOAT
:
1103 return ISL_FORMAT_R32G32B32X32_FLOAT
;
1104 case ISL_FORMAT_R16G16B16_UNORM
:
1105 return ISL_FORMAT_R16G16B16X16_UNORM
;
1106 case ISL_FORMAT_R16G16B16_FLOAT
:
1107 return ISL_FORMAT_R16G16B16X16_FLOAT
;
1108 case ISL_FORMAT_R8G8B8_UNORM
:
1109 return ISL_FORMAT_R8G8B8X8_UNORM
;
1110 case ISL_FORMAT_R8G8B8_UNORM_SRGB
:
1111 return ISL_FORMAT_R8G8B8X8_UNORM_SRGB
;
1113 return ISL_FORMAT_UNSUPPORTED
;
1118 isl_format_rgbx_to_rgba(enum isl_format rgbx
)
1120 assert(isl_format_is_rgbx(rgbx
));
1123 case ISL_FORMAT_R32G32B32X32_FLOAT
:
1124 return ISL_FORMAT_R32G32B32A32_FLOAT
;
1125 case ISL_FORMAT_R16G16B16X16_UNORM
:
1126 return ISL_FORMAT_R16G16B16A16_UNORM
;
1127 case ISL_FORMAT_R16G16B16X16_FLOAT
:
1128 return ISL_FORMAT_R16G16B16A16_FLOAT
;
1129 case ISL_FORMAT_B8G8R8X8_UNORM
:
1130 return ISL_FORMAT_B8G8R8A8_UNORM
;
1131 case ISL_FORMAT_B8G8R8X8_UNORM_SRGB
:
1132 return ISL_FORMAT_B8G8R8A8_UNORM_SRGB
;
1133 case ISL_FORMAT_R8G8B8X8_UNORM
:
1134 return ISL_FORMAT_R8G8B8A8_UNORM
;
1135 case ISL_FORMAT_R8G8B8X8_UNORM_SRGB
:
1136 return ISL_FORMAT_R8G8B8A8_UNORM_SRGB
;
1137 case ISL_FORMAT_B10G10R10X2_UNORM
:
1138 return ISL_FORMAT_B10G10R10A2_UNORM
;
1139 case ISL_FORMAT_B5G5R5X1_UNORM
:
1140 return ISL_FORMAT_B5G5R5A1_UNORM
;
1141 case ISL_FORMAT_B5G5R5X1_UNORM_SRGB
:
1142 return ISL_FORMAT_B5G5R5A1_UNORM_SRGB
;
1144 assert(!"Invalid RGBX format");
1150 pack_channel(const union isl_color_value
*value
, unsigned i
,
1151 const struct isl_channel_layout
*layout
,
1152 enum isl_colorspace colorspace
,
1153 uint32_t data_out
[4])
1155 if (layout
->type
== ISL_VOID
)
1158 if (colorspace
== ISL_COLORSPACE_SRGB
)
1159 assert(layout
->type
== ISL_UNORM
);
1162 switch (layout
->type
) {
1164 if (colorspace
== ISL_COLORSPACE_SRGB
) {
1165 if (layout
->bits
== 8) {
1166 packed
= util_format_linear_float_to_srgb_8unorm(value
->f32
[i
]);
1168 float srgb
= util_format_linear_to_srgb_float(value
->f32
[i
]);
1169 packed
= _mesa_float_to_unorm(srgb
, layout
->bits
);
1172 packed
= _mesa_float_to_unorm(value
->f32
[i
], layout
->bits
);
1176 packed
= _mesa_float_to_snorm(value
->f32
[i
], layout
->bits
);
1179 assert(layout
->bits
== 16 || layout
->bits
== 32);
1180 if (layout
->bits
== 16) {
1181 packed
= _mesa_float_to_half(value
->f32
[i
]);
1183 packed
= value
->u32
[i
];
1187 packed
= MIN(value
->u32
[i
], MAX_UINT(layout
->bits
));
1190 packed
= MIN(MAX(value
->u32
[i
], MIN_INT(layout
->bits
)),
1191 MAX_INT(layout
->bits
));
1195 unreachable("Invalid channel type");
1198 unsigned dword
= layout
->start_bit
/ 32;
1199 unsigned bit
= layout
->start_bit
% 32;
1200 assert(bit
+ layout
->bits
<= 32);
1201 data_out
[dword
] |= (packed
& MAX_UINT(layout
->bits
)) << bit
;
1205 * Take an isl_color_value and pack it into the actual bits as specified by
1206 * the isl_format. This function is very slow for a format conversion
1207 * function but should be fine for a single pixel worth of data.
1210 isl_color_value_pack(const union isl_color_value
*value
,
1211 enum isl_format format
,
1214 const struct isl_format_layout
*fmtl
= isl_format_get_layout(format
);
1215 assert(fmtl
->colorspace
== ISL_COLORSPACE_LINEAR
||
1216 fmtl
->colorspace
== ISL_COLORSPACE_SRGB
);
1217 assert(!isl_format_is_compressed(format
));
1219 memset(data_out
, 0, isl_align(fmtl
->bpb
, 32) / 8);
1221 if (format
== ISL_FORMAT_R9G9B9E5_SHAREDEXP
) {
1222 data_out
[0] = float3_to_rgb9e5(value
->f32
);
1224 } else if (format
== ISL_FORMAT_R11G11B10_FLOAT
) {
1225 data_out
[0] = float3_to_r11g11b10f(value
->f32
);
1229 pack_channel(value
, 0, &fmtl
->channels
.r
, fmtl
->colorspace
, data_out
);
1230 pack_channel(value
, 1, &fmtl
->channels
.g
, fmtl
->colorspace
, data_out
);
1231 pack_channel(value
, 2, &fmtl
->channels
.b
, fmtl
->colorspace
, data_out
);
1232 pack_channel(value
, 3, &fmtl
->channels
.a
, ISL_COLORSPACE_LINEAR
, data_out
);
1233 pack_channel(value
, 0, &fmtl
->channels
.l
, fmtl
->colorspace
, data_out
);
1234 pack_channel(value
, 0, &fmtl
->channels
.i
, ISL_COLORSPACE_LINEAR
, data_out
);
1235 assert(fmtl
->channels
.p
.bits
== 0);
1238 /** Extend an N-bit signed integer to 32 bits */
1239 static inline int32_t
1240 sign_extend(int32_t x
, unsigned bits
)
1243 unsigned shift
= 32 - bits
;
1244 return (x
<< shift
) >> shift
;
1251 unpack_channel(union isl_color_value
*value
,
1252 unsigned start
, unsigned count
,
1253 const struct isl_channel_layout
*layout
,
1254 enum isl_colorspace colorspace
,
1255 const uint32_t *data_in
)
1257 if (layout
->type
== ISL_VOID
)
1260 unsigned dword
= layout
->start_bit
/ 32;
1261 unsigned bit
= layout
->start_bit
% 32;
1262 assert(bit
+ layout
->bits
<= 32);
1263 uint32_t packed
= (data_in
[dword
] >> bit
) & MAX_UINT(layout
->bits
);
1270 if (colorspace
== ISL_COLORSPACE_SRGB
)
1271 assert(layout
->type
== ISL_UNORM
);
1273 switch (layout
->type
) {
1275 unpacked
.f32
= _mesa_unorm_to_float(packed
, layout
->bits
);
1276 if (colorspace
== ISL_COLORSPACE_SRGB
) {
1277 if (layout
->bits
== 8) {
1278 unpacked
.f32
= util_format_srgb_8unorm_to_linear_float(packed
);
1280 float srgb
= _mesa_unorm_to_float(packed
, layout
->bits
);
1281 unpacked
.f32
= util_format_srgb_to_linear_float(srgb
);
1284 unpacked
.f32
= _mesa_unorm_to_float(packed
, layout
->bits
);
1288 unpacked
.f32
= _mesa_snorm_to_float(sign_extend(packed
, layout
->bits
),
1292 assert(layout
->bits
== 16 || layout
->bits
== 32);
1293 if (layout
->bits
== 16) {
1294 unpacked
.f32
= _mesa_half_to_float(packed
);
1296 unpacked
.u32
= packed
;
1300 unpacked
.u32
= packed
;
1303 unpacked
.u32
= sign_extend(packed
, layout
->bits
);
1307 unreachable("Invalid channel type");
1310 for (unsigned i
= 0; i
< count
; i
++)
1311 value
->u32
[start
+ i
] = unpacked
.u32
;
1315 * Take unpack an isl_color_value from the actual bits as specified by
1316 * the isl_format. This function is very slow for a format conversion
1317 * function but should be fine for a single pixel worth of data.
1320 isl_color_value_unpack(union isl_color_value
*value
,
1321 enum isl_format format
,
1322 const uint32_t data_in
[4])
1324 const struct isl_format_layout
*fmtl
= isl_format_get_layout(format
);
1325 assert(fmtl
->colorspace
== ISL_COLORSPACE_LINEAR
||
1326 fmtl
->colorspace
== ISL_COLORSPACE_SRGB
);
1327 assert(!isl_format_is_compressed(format
));
1329 /* Default to opaque black. */
1330 memset(value
, 0, sizeof(*value
));
1331 if (isl_format_has_int_channel(format
)) {
1334 value
->f32
[3] = 1.0f
;
1337 if (format
== ISL_FORMAT_R9G9B9E5_SHAREDEXP
) {
1338 rgb9e5_to_float3(data_in
[0], value
->f32
);
1340 } else if (format
== ISL_FORMAT_R11G11B10_FLOAT
) {
1341 r11g11b10f_to_float3(data_in
[0], value
->f32
);
1345 unpack_channel(value
, 0, 1, &fmtl
->channels
.r
, fmtl
->colorspace
, data_in
);
1346 unpack_channel(value
, 1, 1, &fmtl
->channels
.g
, fmtl
->colorspace
, data_in
);
1347 unpack_channel(value
, 2, 1, &fmtl
->channels
.b
, fmtl
->colorspace
, data_in
);
1348 unpack_channel(value
, 3, 1, &fmtl
->channels
.a
, ISL_COLORSPACE_LINEAR
, data_in
);
1349 unpack_channel(value
, 0, 3, &fmtl
->channels
.l
, fmtl
->colorspace
, data_in
);
1350 unpack_channel(value
, 0, 4, &fmtl
->channels
.i
, ISL_COLORSPACE_LINEAR
, data_in
);
1351 assert(fmtl
->channels
.p
.bits
== 0);