• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 Intel Corporation
3  *
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:
10  *
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
13  *  Software.
14  *
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
21  *  IN THE SOFTWARE.
22  */
23 
24 #include <assert.h>
25 
26 #include "isl.h"
27 #include "common/gen_device_info.h"
28 
29 struct surface_format_info {
30    bool exists;
31    uint8_t sampling;
32    uint8_t filtering;
33    uint8_t shadow_compare;
34    uint8_t chroma_key;
35    uint8_t render_target;
36    uint8_t alpha_blend;
37    uint8_t input_vb;
38    uint8_t streamed_output_vb;
39    uint8_t color_processing;
40    uint8_t typed_write;
41    uint8_t typed_read;
42    uint8_t ccs_e;
43 };
44 
45 /* This macro allows us to write the table almost as it appears in the PRM,
46  * while restructuring it to turn it into the C code we want.
47  */
48 #define SF(sampl, filt, shad, ck, rt, ab, vb, so, color, tw, tr, ccs_e, sf) \
49    [ISL_FORMAT_##sf] = { true, sampl, filt, shad, ck, rt, ab, vb, so, color, tw, tr, ccs_e},
50 
51 #define Y 0
52 #define x 255
53 /**
54  * This is the table of support for surface (texture, renderbuffer, and vertex
55  * buffer, but not depthbuffer) formats across the various hardware generations.
56  *
57  * The table is formatted to match the documentation, except that the docs have
58  * this ridiculous mapping of Y[*+~^#&] for "supported on DevWhatever".  To put
59  * it in our table, here's the mapping:
60  *
61  * Y*: 45
62  * Y+: 45 (g45/gm45)
63  * Y~: 50 (gen5)
64  * Y^: 60 (gen6)
65  * Y#: 70 (gen7)
66  *
67  * The abbreviations in the header below are:
68  * smpl  - Sampling Engine
69  * filt  - Sampling Engine Filtering
70  * shad  - Sampling Engine Shadow Map
71  * CK    - Sampling Engine Chroma Key
72  * RT    - Render Target
73  * AB    - Alpha Blend Render Target
74  * VB    - Input Vertex Buffer
75  * SO    - Steamed Output Vertex Buffers (transform feedback)
76  * color - Color Processing
77  * ccs_e - Lossless Compression Support (gen9+ only)
78  * sf    - Surface Format
79  *
80  * See page 88 of the Sandybridge PRM VOL4_Part1 PDF.
81  *
82  * As of Ivybridge, the columns are no longer in that table and the
83  * information can be found spread across:
84  *
85  * - VOL2_Part1 section 2.5.11 Format Conversion (vertex fetch).
86  * - VOL4_Part1 section 2.12.2.1.2 Sampler Output Channel Mapping.
87  * - VOL4_Part1 section 3.9.11 Render Target Write.
88  * - Render Target Surface Types [SKL+]
89  */
90 static const struct surface_format_info format_info[] = {
91 /*    smpl filt  shad  CK   RT   AB   VB   SO color TW   TR  ccs_e */
92    SF(  Y,  50,   x,   x,   Y,   Y,   Y,   Y,   x,  70,  90,  90,   R32G32B32A32_FLOAT)
93    SF(  Y,   x,   x,   x,   Y,   x,   Y,   Y,   x,  70,  90,  90,   R32G32B32A32_SINT)
94    SF(  Y,   x,   x,   x,   Y,   x,   Y,   Y,   x,  70,  90,  90,   R32G32B32A32_UINT)
95    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32G32B32A32_UNORM)
96    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32G32B32A32_SNORM)
97    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R64G64_FLOAT)
98    SF(  Y,  50,   x,   x, 100, 100,   x,   x,   x,   x,   x, 100,   R32G32B32X32_FLOAT)
99    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32G32B32A32_SSCALED)
100    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32G32B32A32_USCALED)
101    SF(  x,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   R32G32B32A32_SFIXED)
102    SF(  x,   x,   x,   x,   x,   x,  80,   x,   x,   x,   x,   x,   R64G64_PASSTHRU)
103    SF(  Y,  50,   x,   x,   x,   x,   Y,   Y,   x,   x,   x,   x,   R32G32B32_FLOAT)
104    SF(  Y,   x,   x,   x,   x,   x,   Y,   Y,   x,   x,   x,   x,   R32G32B32_SINT)
105    SF(  Y,   x,   x,   x,   x,   x,   Y,   Y,   x,   x,   x,   x,   R32G32B32_UINT)
106    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32G32B32_UNORM)
107    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32G32B32_SNORM)
108    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32G32B32_SSCALED)
109    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32G32B32_USCALED)
110    SF(  x,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   R32G32B32_SFIXED)
111    SF(  Y,   Y,   x,   x,   Y,  45,   Y,   x,  60,  70,   x,  90,   R16G16B16A16_UNORM)
112    SF(  Y,   Y,   x,   x,   Y,  60,   Y,   x,   x,  70,   x,  90,   R16G16B16A16_SNORM)
113    SF(  Y,   x,   x,   x,   Y,   x,   Y,   x,   x,  70,  90,  90,   R16G16B16A16_SINT)
114    SF(  Y,   x,   x,   x,   Y,   x,   Y,   x,   x,  70,  75,  90,   R16G16B16A16_UINT)
115    SF(  Y,   Y,   x,   x,   Y,   Y,   Y,   x,   x,  70,  90,  90,   R16G16B16A16_FLOAT)
116    SF(  Y,  50,   x,   x,   Y,   Y,   Y,   Y,   x,  70,  90,  90,   R32G32_FLOAT)
117    SF(  Y,  70,   x,   x,   Y,   Y,   Y,   Y,   x,   x,   x,   x,   R32G32_FLOAT_LD)
118    SF(  Y,   x,   x,   x,   Y,   x,   Y,   Y,   x,  70,  90,  90,   R32G32_SINT)
119    SF(  Y,   x,   x,   x,   Y,   x,   Y,   Y,   x,  70,  90,  90,   R32G32_UINT)
120    SF(  Y,  50,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   R32_FLOAT_X8X24_TYPELESS)
121    SF(  Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   X32_TYPELESS_G8X24_UINT)
122    SF(  Y,  50,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   L32A32_FLOAT)
123    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32G32_UNORM)
124    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32G32_SNORM)
125    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R64_FLOAT)
126    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   R16G16B16X16_UNORM)
127    SF(  Y,   Y,   x,   x,  90,  90,   x,   x,   x,   x,   x,  90,   R16G16B16X16_FLOAT)
128    SF(  Y,  50,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   A32X32_FLOAT)
129    SF(  Y,  50,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   L32X32_FLOAT)
130    SF(  Y,  50,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   I32X32_FLOAT)
131    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R16G16B16A16_SSCALED)
132    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R16G16B16A16_USCALED)
133    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32G32_SSCALED)
134    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32G32_USCALED)
135    SF(  x,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   R32G32_SFIXED)
136    SF(  x,   x,   x,   x,   x,   x,  80,   x,   x,   x,   x,   x,   R64_PASSTHRU)
137    SF(  Y,   Y,   x,   Y,   Y,   Y,   Y,   x,  60,  70,   x,  90,   B8G8R8A8_UNORM)
138    SF(  Y,   Y,   x,   x,   Y,   Y,   x,   x,   x,   x,   x, 100,   B8G8R8A8_UNORM_SRGB)
139 /*    smpl filt  shad  CK   RT   AB   VB   SO color TW   TR  ccs_e */
140    SF(  Y,   Y,   x,   x,   Y,   Y,   Y,   x,  60,  70,   x, 100,   R10G10B10A2_UNORM)
141    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,  60,   x,   x,   x,   R10G10B10A2_UNORM_SRGB)
142    SF(  Y,   x,   x,   x,   Y,   x,   Y,   x,   x,  70,   x, 100,   R10G10B10A2_UINT)
143    SF(  Y,   Y,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R10G10B10_SNORM_A2_UNORM)
144    SF(  Y,   Y,   x,   x,   Y,   Y,   Y,   x,  60,  70,   x,  90,   R8G8B8A8_UNORM)
145    SF(  Y,   Y,   x,   x,   Y,   Y,   x,   x,  60,   x,   x, 100,   R8G8B8A8_UNORM_SRGB)
146    SF(  Y,   Y,   x,   x,   Y,  60,   Y,   x,   x,  70,   x,  90,   R8G8B8A8_SNORM)
147    SF(  Y,   x,   x,   x,   Y,   x,   Y,   x,   x,  70,  90,  90,   R8G8B8A8_SINT)
148    SF(  Y,   x,   x,   x,   Y,   x,   Y,   x,   x,  70,  75,  90,   R8G8B8A8_UINT)
149    SF(  Y,   Y,   x,   x,   Y,  45,   Y,   x,   x,  70,   x,  90,   R16G16_UNORM)
150    SF(  Y,   Y,   x,   x,   Y,  60,   Y,   x,   x,  70,   x,  90,   R16G16_SNORM)
151    SF(  Y,   x,   x,   x,   Y,   x,   Y,   x,   x,  70,  90,  90,   R16G16_SINT)
152    SF(  Y,   x,   x,   x,   Y,   x,   Y,   x,   x,  70,  75,  90,   R16G16_UINT)
153    SF(  Y,   Y,   x,   x,   Y,   Y,   Y,   x,   x,  70,  90,  90,   R16G16_FLOAT)
154    SF(  Y,   Y,   x,   x,   Y,   Y,  75,   x,  60,  70,   x, 100,   B10G10R10A2_UNORM)
155    SF(  Y,   Y,   x,   x,   Y,   Y,   x,   x,  60,   x,   x, 100,   B10G10R10A2_UNORM_SRGB)
156    SF(  Y,   Y,   x,   x,   Y,   Y,   Y,   x,   x,  70,   x, 100,   R11G11B10_FLOAT)
157    SF(  Y,   x,   x,   x,   Y,   x,   Y,   Y,   x,  70,  70,  90,   R32_SINT)
158    SF(  Y,   x,   x,   x,   Y,   x,   Y,   Y,   x,  70,  70,  90,   R32_UINT)
159    SF(  Y,  50,   Y,   x,   Y,   Y,   Y,   Y,   x,  70,  70,  90,   R32_FLOAT)
160    SF(  Y,  50,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   R24_UNORM_X8_TYPELESS)
161    SF(  Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   X24_TYPELESS_G8_UINT)
162    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   L16A16_UNORM)
163    SF(  Y,  50,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   I24X8_UNORM)
164    SF(  Y,  50,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   L24X8_UNORM)
165    SF(  Y,  50,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   A24X8_UNORM)
166    SF(  Y,  50,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   I32_FLOAT)
167    SF(  Y,  50,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   L32_FLOAT)
168    SF(  Y,  50,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   A32_FLOAT)
169    SF(  Y,   Y,   x,   Y,  80,  80,   x,   x,  60,   x,   x,  90,   B8G8R8X8_UNORM)
170    SF(  Y,   Y,   x,   x,  80,  80,   x,   x,   x,   x,   x, 100,   B8G8R8X8_UNORM_SRGB)
171    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   R8G8B8X8_UNORM)
172    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   R8G8B8X8_UNORM_SRGB)
173    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   R9G9B9E5_SHAREDEXP)
174    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   B10G10R10X2_UNORM)
175    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   L16A16_FLOAT)
176    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32_UNORM)
177    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32_SNORM)
178 /*    smpl filt  shad  CK   RT   AB   VB   SO color TW   TR  ccs_e */
179    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R10G10B10X2_USCALED)
180    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R8G8B8A8_SSCALED)
181    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R8G8B8A8_USCALED)
182    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R16G16_SSCALED)
183    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R16G16_USCALED)
184    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32_SSCALED)
185    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R32_USCALED)
186    SF(  Y,   Y,   x,   Y,   Y,   Y,   x,   x,   x,  70,   x,   x,   B5G6R5_UNORM)
187    SF(  Y,   Y,   x,   x,   Y,   Y,   x,   x,   x,   x,   x,   x,   B5G6R5_UNORM_SRGB)
188    SF(  Y,   Y,   x,   Y,   Y,   Y,   x,   x,   x,  70,   x,   x,   B5G5R5A1_UNORM)
189    SF(  Y,   Y,   x,   x,   Y,   Y,   x,   x,   x,   x,   x,   x,   B5G5R5A1_UNORM_SRGB)
190    SF(  Y,   Y,   x,   Y,   Y,   Y,   x,   x,   x,  70,   x,   x,   B4G4R4A4_UNORM)
191    SF(  Y,   Y,   x,   x,   Y,   Y,   x,   x,   x,   x,   x,   x,   B4G4R4A4_UNORM_SRGB)
192    SF(  Y,   Y,   x,   x,   Y,   Y,   Y,   x,   x,  70,   x,   x,   R8G8_UNORM)
193    SF(  Y,   Y,   x,   Y,   Y,  60,   Y,   x,   x,  70,   x,   x,   R8G8_SNORM)
194    SF(  Y,   x,   x,   x,   Y,   x,   Y,   x,   x,  70,  90,   x,   R8G8_SINT)
195    SF(  Y,   x,   x,   x,   Y,   x,   Y,   x,   x,  70,  75,   x,   R8G8_UINT)
196    SF(  Y,   Y,   Y,   x,   Y,  45,   Y,   x,  70,  70,   x,   x,   R16_UNORM)
197    SF(  Y,   Y,   x,   x,   Y,  60,   Y,   x,   x,  70,   x,   x,   R16_SNORM)
198    SF(  Y,   x,   x,   x,   Y,   x,   Y,   x,   x,  70,  90,   x,   R16_SINT)
199    SF(  Y,   x,   x,   x,   Y,   x,   Y,   x,   x,  70,  75,   x,   R16_UINT)
200    SF(  Y,   Y,   x,   x,   Y,   Y,   Y,   x,   x,  70,  90,   x,   R16_FLOAT)
201    SF( 50,  50,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   A8P8_UNORM_PALETTE0)
202    SF( 50,  50,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   A8P8_UNORM_PALETTE1)
203    SF(  Y,   Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   I16_UNORM)
204    SF(  Y,   Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   L16_UNORM)
205    SF(  Y,   Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   A16_UNORM)
206    SF(  Y,   Y,   x,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   L8A8_UNORM)
207    SF(  Y,   Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   I16_FLOAT)
208    SF(  Y,   Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   L16_FLOAT)
209    SF(  Y,   Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   A16_FLOAT)
210    SF( 45,  45,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   L8A8_UNORM_SRGB)
211    SF(  Y,   Y,   x,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   R5G5_SNORM_B6_UNORM)
212    SF(  x,   x,   x,   x,   Y,   Y,   x,   x,   x,  70,   x,   x,   B5G5R5X1_UNORM)
213    SF(  x,   x,   x,   x,   Y,   Y,   x,   x,   x,   x,   x,   x,   B5G5R5X1_UNORM_SRGB)
214    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R8G8_SSCALED)
215    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R8G8_USCALED)
216 /*    smpl filt  shad  CK   RT   AB   VB   SO color TW   TR  ccs_e */
217    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R16_SSCALED)
218    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R16_USCALED)
219    SF( 50,  50,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   P8A8_UNORM_PALETTE0)
220    SF( 50,  50,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   P8A8_UNORM_PALETTE1)
221    SF(  x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   A1B5G5R5_UNORM)
222    /* According to the PRM, A4B4G4R4_UNORM isn't supported until Sky Lake
223     * but empirical testing indicates that at least sampling works just fine
224     * on Broadwell.
225     */
226    SF( 80,  80,   x,   x,  90,   x,   x,   x,   x,   x,   x,   x,   A4B4G4R4_UNORM)
227    SF( 90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   L8A8_UINT)
228    SF( 90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   L8A8_SINT)
229    SF(  Y,   Y,   x,  45,   Y,   Y,   Y,   x,   x,  70,   x,   x,   R8_UNORM)
230    SF(  Y,   Y,   x,   x,   Y,  60,   Y,   x,   x,  70,   x,   x,   R8_SNORM)
231    SF(  Y,   x,   x,   x,   Y,   x,   Y,   x,   x,  70,  90,   x,   R8_SINT)
232    SF(  Y,   x,   x,   x,   Y,   x,   Y,   x,   x,  70,  75,   x,   R8_UINT)
233    SF(  Y,   Y,   x,   Y,   Y,   Y,   x,   x,   x,  70,   x,   x,   A8_UNORM)
234    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   I8_UNORM)
235    SF(  Y,   Y,   x,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   L8_UNORM)
236    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   P4A4_UNORM_PALETTE0)
237    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   A4P4_UNORM_PALETTE0)
238    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R8_SSCALED)
239    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R8_USCALED)
240    SF( 45,  45,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   P8_UNORM_PALETTE0)
241    SF( 45,  45,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   L8_UNORM_SRGB)
242    SF( 45,  45,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   P8_UNORM_PALETTE1)
243    SF( 45,  45,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   P4A4_UNORM_PALETTE1)
244    SF( 45,  45,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   A4P4_UNORM_PALETTE1)
245    SF(  x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   Y8_UNORM)
246    SF( 90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   L8_UINT)
247    SF( 90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   L8_SINT)
248    SF( 90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   I8_UINT)
249    SF( 90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   I8_SINT)
250    SF( 45,  45,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   DXT1_RGB_SRGB)
251    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   R1_UNORM)
252    SF(  Y,   Y,   x,   Y,   Y,   x,   x,   x,  60,   x,   x,   x,   YCRCB_NORMAL)
253    SF(  Y,   Y,   x,   Y,   Y,   x,   x,   x,  60,   x,   x,   x,   YCRCB_SWAPUVY)
254    SF( 45,  45,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   P2_UNORM_PALETTE0)
255    SF( 45,  45,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   P2_UNORM_PALETTE1)
256    SF(  Y,   Y,   x,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   BC1_UNORM)
257    SF(  Y,   Y,   x,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   BC2_UNORM)
258    SF(  Y,   Y,   x,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   BC3_UNORM)
259    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   BC4_UNORM)
260    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   BC5_UNORM)
261    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   BC1_UNORM_SRGB)
262    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   BC2_UNORM_SRGB)
263    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   BC3_UNORM_SRGB)
264    SF(  Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   MONO8)
265    SF(  Y,   Y,   x,   x,   Y,   x,   x,   x,  60,   x,   x,   x,   YCRCB_SWAPUV)
266    SF(  Y,   Y,   x,   x,   Y,   x,   x,   x,  60,   x,   x,   x,   YCRCB_SWAPY)
267    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   DXT1_RGB)
268 /*    smpl filt  shad  CK   RT   AB   VB   SO color TW   TR  ccs_e */
269    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   FXT1)
270    SF( 75,  75,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R8G8B8_UNORM)
271    SF( 75,  75,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R8G8B8_SNORM)
272    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R8G8B8_SSCALED)
273    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R8G8B8_USCALED)
274    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R64G64B64A64_FLOAT)
275    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R64G64B64_FLOAT)
276    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   BC4_SNORM)
277    SF(  Y,   Y,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   BC5_SNORM)
278    SF( 50,  50,   x,   x,   x,   x,  60,   x,   x,   x,   x,   x,   R16G16B16_FLOAT)
279    SF( 75,  75,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R16G16B16_UNORM)
280    SF( 75,  75,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R16G16B16_SNORM)
281    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R16G16B16_SSCALED)
282    SF(  x,   x,   x,   x,   x,   x,   Y,   x,   x,   x,   x,   x,   R16G16B16_USCALED)
283    SF( 70,  70,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   BC6H_SF16)
284    SF( 70,  70,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   BC7_UNORM)
285    SF( 70,  70,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   BC7_UNORM_SRGB)
286    SF( 70,  70,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   BC6H_UF16)
287    SF(  x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   PLANAR_420_8)
288    SF( 75,  75,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   R8G8B8_UNORM_SRGB)
289    SF( 80,  80,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ETC1_RGB8)
290    SF( 80,  80,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ETC2_RGB8)
291    SF( 80,  80,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   EAC_R11)
292    SF( 80,  80,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   EAC_RG11)
293    SF( 80,  80,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   EAC_SIGNED_R11)
294    SF( 80,  80,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   EAC_SIGNED_RG11)
295    SF( 80,  80,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ETC2_SRGB8)
296    SF( 90,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   R16G16B16_UINT)
297    SF( 90,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   R16G16B16_SINT)
298    SF(  x,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   R32_SFIXED)
299    SF(  x,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   R10G10B10A2_SNORM)
300    SF(  x,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   R10G10B10A2_USCALED)
301    SF(  x,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   R10G10B10A2_SSCALED)
302    SF(  x,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   R10G10B10A2_SINT)
303    SF(  x,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   B10G10R10A2_SNORM)
304    SF(  x,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   B10G10R10A2_USCALED)
305    SF(  x,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   B10G10R10A2_SSCALED)
306    SF(  x,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   B10G10R10A2_UINT)
307    SF(  x,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   B10G10R10A2_SINT)
308    SF(  x,   x,   x,   x,   x,   x,  80,   x,   x,   x,   x,   x,   R64G64B64A64_PASSTHRU)
309    SF(  x,   x,   x,   x,   x,   x,  80,   x,   x,   x,   x,   x,   R64G64B64_PASSTHRU)
310    SF( 80,  80,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ETC2_RGB8_PTA)
311    SF( 80,  80,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ETC2_SRGB8_PTA)
312    SF( 80,  80,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ETC2_EAC_RGBA8)
313    SF( 80,  80,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ETC2_EAC_SRGB8_A8)
314    SF( 90,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   R8G8B8_UINT)
315    SF( 90,   x,   x,   x,   x,   x,  75,   x,   x,   x,   x,   x,   R8G8B8_SINT)
316    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_4X4_FLT16)
317    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_5X4_FLT16)
318    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_5X5_FLT16)
319    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_6X5_FLT16)
320    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_6X6_FLT16)
321    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_8X5_FLT16)
322    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_8X6_FLT16)
323    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_8X8_FLT16)
324    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_10X5_FLT16)
325    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_10X6_FLT16)
326    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_10X8_FLT16)
327    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_10X10_FLT16)
328    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_12X10_FLT16)
329    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_12X12_FLT16)
330    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_4X4_U8SRGB)
331    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_5X4_U8SRGB)
332    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_5X5_U8SRGB)
333    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_6X5_U8SRGB)
334    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_6X6_U8SRGB)
335    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_8X5_U8SRGB)
336    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_8X6_U8SRGB)
337    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_8X8_U8SRGB)
338    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_10X5_U8SRGB)
339    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_10X6_U8SRGB)
340    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_10X8_U8SRGB)
341    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_10X10_U8SRGB)
342    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_12X10_U8SRGB)
343    SF( 90,  90,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_LDR_2D_12X12_U8SRGB)
344    SF(100, 100,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_HDR_2D_4X4_FLT16)
345    SF(100, 100,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_HDR_2D_5X4_FLT16)
346    SF(100, 100,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_HDR_2D_5X5_FLT16)
347    SF(100, 100,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_HDR_2D_6X5_FLT16)
348    SF(100, 100,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_HDR_2D_6X6_FLT16)
349    SF(100, 100,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_HDR_2D_8X5_FLT16)
350    SF(100, 100,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_HDR_2D_8X6_FLT16)
351    SF(100, 100,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_HDR_2D_8X8_FLT16)
352    SF(100, 100,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_HDR_2D_10X5_FLT16)
353    SF(100, 100,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_HDR_2D_10X6_FLT16)
354    SF(100, 100,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_HDR_2D_10X8_FLT16)
355    SF(100, 100,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_HDR_2D_10X10_FLT16)
356    SF(100, 100,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_HDR_2D_12X10_FLT16)
357    SF(100, 100,   x,   x,   x,   x,   x,   x,   x,   x,   x,   x,   ASTC_HDR_2D_12X12_FLT16)
358 };
359 #undef x
360 #undef Y
361 
362 static unsigned
format_gen(const struct gen_device_info * devinfo)363 format_gen(const struct gen_device_info *devinfo)
364 {
365    return devinfo->gen * 10 + (devinfo->is_g4x || devinfo->is_haswell) * 5;
366 }
367 
368 bool
isl_format_supports_rendering(const struct gen_device_info * devinfo,enum isl_format format)369 isl_format_supports_rendering(const struct gen_device_info *devinfo,
370                               enum isl_format format)
371 {
372    if (!format_info[format].exists)
373       return false;
374 
375    return format_gen(devinfo) >= format_info[format].render_target;
376 }
377 
378 bool
isl_format_supports_alpha_blending(const struct gen_device_info * devinfo,enum isl_format format)379 isl_format_supports_alpha_blending(const struct gen_device_info *devinfo,
380                                    enum isl_format format)
381 {
382    if (!format_info[format].exists)
383       return false;
384 
385    return format_gen(devinfo) >= format_info[format].alpha_blend;
386 }
387 
388 bool
isl_format_supports_sampling(const struct gen_device_info * devinfo,enum isl_format format)389 isl_format_supports_sampling(const struct gen_device_info *devinfo,
390                              enum isl_format format)
391 {
392    if (!format_info[format].exists)
393       return false;
394 
395    if (devinfo->is_baytrail) {
396       const struct isl_format_layout *fmtl = isl_format_get_layout(format);
397       /* Support for ETC1 and ETC2 exists on Bay Trail even though big-core
398        * GPUs didn't get it until Broadwell.
399        */
400       if (fmtl->txc == ISL_TXC_ETC1 || fmtl->txc == ISL_TXC_ETC2)
401          return true;
402    } else if (devinfo->is_cherryview) {
403       const struct isl_format_layout *fmtl = isl_format_get_layout(format);
404       /* Support for ASTC LDR exists on Cherry View even though big-core
405        * GPUs didn't get it until Skylake.
406        */
407       if (fmtl->txc == ISL_TXC_ASTC)
408          return format < ISL_FORMAT_ASTC_HDR_2D_4X4_FLT16;
409    } else if (gen_device_info_is_9lp(devinfo)) {
410       const struct isl_format_layout *fmtl = isl_format_get_layout(format);
411       /* Support for ASTC HDR exists on Broxton even though big-core
412        * GPUs didn't get it until Cannonlake.
413        */
414       if (fmtl->txc == ISL_TXC_ASTC)
415          return true;
416    }
417 
418    return format_gen(devinfo) >= format_info[format].sampling;
419 }
420 
421 bool
isl_format_supports_filtering(const struct gen_device_info * devinfo,enum isl_format format)422 isl_format_supports_filtering(const struct gen_device_info *devinfo,
423                               enum isl_format format)
424 {
425    if (!format_info[format].exists)
426       return false;
427 
428    if (devinfo->is_baytrail) {
429       const struct isl_format_layout *fmtl = isl_format_get_layout(format);
430       /* Support for ETC1 and ETC2 exists on Bay Trail even though big-core
431        * GPUs didn't get it until Broadwell.
432        */
433       if (fmtl->txc == ISL_TXC_ETC1 || fmtl->txc == ISL_TXC_ETC2)
434          return true;
435    } else if (devinfo->is_cherryview) {
436       const struct isl_format_layout *fmtl = isl_format_get_layout(format);
437       /* Support for ASTC LDR exists on Cherry View even though big-core
438        * GPUs didn't get it until Skylake.
439        */
440       if (fmtl->txc == ISL_TXC_ASTC)
441          return format < ISL_FORMAT_ASTC_HDR_2D_4X4_FLT16;
442    } else if (gen_device_info_is_9lp(devinfo)) {
443       const struct isl_format_layout *fmtl = isl_format_get_layout(format);
444       /* Support for ASTC HDR exists on Broxton even though big-core
445        * GPUs didn't get it until Cannonlake.
446        */
447       if (fmtl->txc == ISL_TXC_ASTC)
448          return true;
449    }
450 
451    return format_gen(devinfo) >= format_info[format].filtering;
452 }
453 
454 bool
isl_format_supports_vertex_fetch(const struct gen_device_info * devinfo,enum isl_format format)455 isl_format_supports_vertex_fetch(const struct gen_device_info *devinfo,
456                                  enum isl_format format)
457 {
458    if (!format_info[format].exists)
459       return false;
460 
461    /* For vertex fetch, Bay Trail supports the same set of formats as Haswell
462     * but is a superset of Ivy Bridge.
463     */
464    if (devinfo->is_baytrail)
465       return 75 >= format_info[format].input_vb;
466 
467    return format_gen(devinfo) >= format_info[format].input_vb;
468 }
469 
470 /**
471  * Returns true if the given format can support typed writes.
472  */
473 bool
isl_format_supports_typed_writes(const struct gen_device_info * devinfo,enum isl_format format)474 isl_format_supports_typed_writes(const struct gen_device_info *devinfo,
475                                  enum isl_format format)
476 {
477    if (!format_info[format].exists)
478       return false;
479 
480    return format_gen(devinfo) >= format_info[format].typed_write;
481 }
482 
483 
484 /**
485  * Returns true if the given format can support typed reads with format
486  * conversion fully handled by hardware.  On Sky Lake, all formats which are
487  * supported for typed writes also support typed reads but some of them return
488  * the raw image data and don't provide format conversion.
489  *
490  * For anyone looking to find this data in the PRM, the easiest way to find
491  * format tables is to search for R11G11B10.  There are only a few
492  * occurrences.
493  */
494 bool
isl_format_supports_typed_reads(const struct gen_device_info * devinfo,enum isl_format format)495 isl_format_supports_typed_reads(const struct gen_device_info *devinfo,
496                                 enum isl_format format)
497 {
498    if (!format_info[format].exists)
499       return false;
500 
501    return format_gen(devinfo) >= format_info[format].typed_read;
502 }
503 
504 /**
505  * Returns true if the given format can support single-sample fast clears.
506  * This function only checks the format.  In order to determine if a surface
507  * supports CCS_E, several other factors need to be considered such as tiling
508  * and sample count.  See isl_surf_get_ccs_surf for details.
509  */
510 bool
isl_format_supports_ccs_d(const struct gen_device_info * devinfo,enum isl_format format)511 isl_format_supports_ccs_d(const struct gen_device_info *devinfo,
512                           enum isl_format format)
513 {
514    /* Fast clears were first added on Ivy Bridge */
515    if (devinfo->gen < 7)
516       return false;
517 
518    if (!isl_format_supports_rendering(devinfo, format))
519       return false;
520 
521    const struct isl_format_layout *fmtl = isl_format_get_layout(format);
522 
523    return fmtl->bpb == 32 || fmtl->bpb == 64 || fmtl->bpb == 128;
524 }
525 
526 /**
527  * Returns true if the given format can support single-sample color
528  * compression.  This function only checks the format.  In order to determine
529  * if a surface supports CCS_E, several other factors need to be considered
530  * such as tiling and sample count.  See isl_surf_get_ccs_surf for details.
531  */
532 bool
isl_format_supports_ccs_e(const struct gen_device_info * devinfo,enum isl_format format)533 isl_format_supports_ccs_e(const struct gen_device_info *devinfo,
534                           enum isl_format format)
535 {
536    if (!format_info[format].exists)
537       return false;
538 
539    /* For simplicity, only report that a format supports CCS_E if blorp can
540     * perform bit-for-bit copies with an image of that format while compressed.
541     * This allows ISL users to avoid having to resolve the image before
542     * performing such a copy. We may want to change this behavior in the
543     * future.
544     *
545     * R11G11B10_FLOAT has no equivalent UINT format. Given how blorp_copy
546     * currently works, bit-for-bit copy operations are not possible without an
547     * intermediate resolve.
548     */
549    if (format == ISL_FORMAT_R11G11B10_FLOAT)
550       return false;
551 
552    /* blorp_copy currently doesn't support formats with different bit-widths
553     * per-channel. Until that support is added, report that these formats don't
554     * support CCS_E. FIXME: Add support for these formats.
555     */
556    if (format == ISL_FORMAT_B10G10R10A2_UNORM ||
557        format == ISL_FORMAT_B10G10R10A2_UNORM_SRGB ||
558        format == ISL_FORMAT_R10G10B10A2_UNORM ||
559        format == ISL_FORMAT_R10G10B10A2_UINT) {
560       return false;
561    }
562 
563    return format_gen(devinfo) >= format_info[format].ccs_e;
564 }
565 
566 bool
isl_format_supports_multisampling(const struct gen_device_info * devinfo,enum isl_format format)567 isl_format_supports_multisampling(const struct gen_device_info *devinfo,
568                                   enum isl_format format)
569 {
570    /* From the Sandybridge PRM, Volume 4 Part 1 p72, SURFACE_STATE, Surface
571     * Format:
572     *
573     *    If Number of Multisamples is set to a value other than
574     *    MULTISAMPLECOUNT_1, this field cannot be set to the following
575     *    formats:
576     *
577     *       - any format with greater than 64 bits per element
578     *       - any compressed texture format (BC*)
579     *       - any YCRCB* format
580     *
581     * The restriction on the format's size is removed on Broadwell. Moreover,
582     * empirically it looks that even IvyBridge can handle multisampled surfaces
583     * with format sizes all the way to 128-bits (RGBA32F, RGBA32I, RGBA32UI).
584     *
585     * Also, there is an exception for HiZ which we treat as a compressed
586     * format and is allowed to be multisampled on Broadwell and earlier.
587     */
588    if (format == ISL_FORMAT_HIZ) {
589       /* On SKL+, HiZ is always single-sampled even when the primary surface
590        * is multisampled.  See also isl_surf_get_hiz_surf().
591        */
592       return devinfo->gen <= 8;
593    } else if (devinfo->gen < 7 && isl_format_get_layout(format)->bpb > 64) {
594       return false;
595    } else if (isl_format_is_compressed(format)) {
596       return false;
597    } else if (isl_format_is_yuv(format)) {
598       return false;
599    } else {
600       return true;
601    }
602 }
603 
604 /**
605  * Returns true if the two formats are "CCS_E compatible" meaning that you can
606  * render in one format with CCS_E enabled and then texture using the other
607  * format without needing a resolve.
608  *
609  * Note: Even if the formats are compatible, special care must be taken if a
610  * clear color is involved because the encoding of the clear color is heavily
611  * format-dependent.
612  */
613 bool
isl_formats_are_ccs_e_compatible(const struct gen_device_info * devinfo,enum isl_format format1,enum isl_format format2)614 isl_formats_are_ccs_e_compatible(const struct gen_device_info *devinfo,
615                                  enum isl_format format1,
616                                  enum isl_format format2)
617 {
618    /* They must support CCS_E */
619    if (!isl_format_supports_ccs_e(devinfo, format1) ||
620        !isl_format_supports_ccs_e(devinfo, format2))
621       return false;
622 
623    const struct isl_format_layout *fmtl1 = isl_format_get_layout(format1);
624    const struct isl_format_layout *fmtl2 = isl_format_get_layout(format2);
625 
626    /* The compression used by CCS is not dependent on the actual data encoding
627     * of the format but only depends on the bit-layout of the channels.
628     */
629    return fmtl1->channels.r.bits == fmtl2->channels.r.bits &&
630           fmtl1->channels.g.bits == fmtl2->channels.g.bits &&
631           fmtl1->channels.b.bits == fmtl2->channels.b.bits &&
632           fmtl1->channels.a.bits == fmtl2->channels.a.bits;
633 }
634 
635 static bool
isl_format_has_channel_type(enum isl_format fmt,enum isl_base_type type)636 isl_format_has_channel_type(enum isl_format fmt, enum isl_base_type type)
637 {
638    const struct isl_format_layout *fmtl = isl_format_get_layout(fmt);
639 
640    return fmtl->channels.r.type == type ||
641           fmtl->channels.g.type == type ||
642           fmtl->channels.b.type == type ||
643           fmtl->channels.a.type == type ||
644           fmtl->channels.l.type == type ||
645           fmtl->channels.i.type == type ||
646           fmtl->channels.p.type == type;
647 }
648 
649 bool
isl_format_has_unorm_channel(enum isl_format fmt)650 isl_format_has_unorm_channel(enum isl_format fmt)
651 {
652    return isl_format_has_channel_type(fmt, ISL_UNORM);
653 }
654 
655 bool
isl_format_has_snorm_channel(enum isl_format fmt)656 isl_format_has_snorm_channel(enum isl_format fmt)
657 {
658    return isl_format_has_channel_type(fmt, ISL_SNORM);
659 }
660 
661 bool
isl_format_has_ufloat_channel(enum isl_format fmt)662 isl_format_has_ufloat_channel(enum isl_format fmt)
663 {
664    return isl_format_has_channel_type(fmt, ISL_UFLOAT);
665 }
666 
667 bool
isl_format_has_sfloat_channel(enum isl_format fmt)668 isl_format_has_sfloat_channel(enum isl_format fmt)
669 {
670    return isl_format_has_channel_type(fmt, ISL_SFLOAT);
671 }
672 
673 bool
isl_format_has_uint_channel(enum isl_format fmt)674 isl_format_has_uint_channel(enum isl_format fmt)
675 {
676    return isl_format_has_channel_type(fmt, ISL_UINT);
677 }
678 
679 bool
isl_format_has_sint_channel(enum isl_format fmt)680 isl_format_has_sint_channel(enum isl_format fmt)
681 {
682    return isl_format_has_channel_type(fmt, ISL_SINT);
683 }
684 
685 unsigned
isl_format_get_num_channels(enum isl_format fmt)686 isl_format_get_num_channels(enum isl_format fmt)
687 {
688    const struct isl_format_layout *fmtl = isl_format_get_layout(fmt);
689 
690    assert(fmtl->channels.p.bits == 0);
691 
692    return (fmtl->channels.r.bits > 0) +
693           (fmtl->channels.g.bits > 0) +
694           (fmtl->channels.b.bits > 0) +
695           (fmtl->channels.a.bits > 0) +
696           (fmtl->channels.l.bits > 0) +
697           (fmtl->channels.i.bits > 0);
698 }
699 
700 uint32_t
isl_format_get_depth_format(enum isl_format fmt,bool has_stencil)701 isl_format_get_depth_format(enum isl_format fmt, bool has_stencil)
702 {
703    switch (fmt) {
704    default:
705       unreachable("bad isl depth format");
706    case ISL_FORMAT_R32_FLOAT_X8X24_TYPELESS:
707       assert(has_stencil);
708       return 0; /* D32_FLOAT_S8X24_UINT */
709    case ISL_FORMAT_R32_FLOAT:
710       assert(!has_stencil);
711       return 1; /* D32_FLOAT */
712    case ISL_FORMAT_R24_UNORM_X8_TYPELESS:
713       if (has_stencil) {
714          return 2; /* D24_UNORM_S8_UINT */
715       } else {
716          return 3; /* D24_UNORM_X8_UINT */
717       }
718    case ISL_FORMAT_R16_UNORM:
719       assert(!has_stencil);
720       return 5; /* D16_UNORM */
721    }
722 }
723 
724 enum isl_format
isl_format_rgb_to_rgba(enum isl_format rgb)725 isl_format_rgb_to_rgba(enum isl_format rgb)
726 {
727    assert(isl_format_is_rgb(rgb));
728 
729    switch (rgb) {
730    case ISL_FORMAT_R32G32B32_FLOAT:    return ISL_FORMAT_R32G32B32A32_FLOAT;
731    case ISL_FORMAT_R32G32B32_SINT:     return ISL_FORMAT_R32G32B32A32_SINT;
732    case ISL_FORMAT_R32G32B32_UINT:     return ISL_FORMAT_R32G32B32A32_UINT;
733    case ISL_FORMAT_R32G32B32_UNORM:    return ISL_FORMAT_R32G32B32A32_UNORM;
734    case ISL_FORMAT_R32G32B32_SNORM:    return ISL_FORMAT_R32G32B32A32_SNORM;
735    case ISL_FORMAT_R32G32B32_SSCALED:  return ISL_FORMAT_R32G32B32A32_SSCALED;
736    case ISL_FORMAT_R32G32B32_USCALED:  return ISL_FORMAT_R32G32B32A32_USCALED;
737    case ISL_FORMAT_R32G32B32_SFIXED:   return ISL_FORMAT_R32G32B32A32_SFIXED;
738    case ISL_FORMAT_R8G8B8_UNORM:       return ISL_FORMAT_R8G8B8A8_UNORM;
739    case ISL_FORMAT_R8G8B8_SNORM:       return ISL_FORMAT_R8G8B8A8_SNORM;
740    case ISL_FORMAT_R8G8B8_SSCALED:     return ISL_FORMAT_R8G8B8A8_SSCALED;
741    case ISL_FORMAT_R8G8B8_USCALED:     return ISL_FORMAT_R8G8B8A8_USCALED;
742    case ISL_FORMAT_R16G16B16_FLOAT:    return ISL_FORMAT_R16G16B16A16_FLOAT;
743    case ISL_FORMAT_R16G16B16_UNORM:    return ISL_FORMAT_R16G16B16A16_UNORM;
744    case ISL_FORMAT_R16G16B16_SNORM:    return ISL_FORMAT_R16G16B16A16_SNORM;
745    case ISL_FORMAT_R16G16B16_SSCALED:  return ISL_FORMAT_R16G16B16A16_SSCALED;
746    case ISL_FORMAT_R16G16B16_USCALED:  return ISL_FORMAT_R16G16B16A16_USCALED;
747    case ISL_FORMAT_R8G8B8_UNORM_SRGB:  return ISL_FORMAT_R8G8B8A8_UNORM_SRGB;
748    case ISL_FORMAT_R16G16B16_UINT:     return ISL_FORMAT_R16G16B16A16_UINT;
749    case ISL_FORMAT_R16G16B16_SINT:     return ISL_FORMAT_R16G16B16A16_SINT;
750    case ISL_FORMAT_R8G8B8_UINT:        return ISL_FORMAT_R8G8B8A8_UINT;
751    case ISL_FORMAT_R8G8B8_SINT:        return ISL_FORMAT_R8G8B8A8_SINT;
752    default:
753       return ISL_FORMAT_UNSUPPORTED;
754    }
755 }
756 
757 enum isl_format
isl_format_rgb_to_rgbx(enum isl_format rgb)758 isl_format_rgb_to_rgbx(enum isl_format rgb)
759 {
760    assert(isl_format_is_rgb(rgb));
761 
762    switch (rgb) {
763    case ISL_FORMAT_R32G32B32_FLOAT:
764       return ISL_FORMAT_R32G32B32X32_FLOAT;
765    case ISL_FORMAT_R16G16B16_UNORM:
766       return ISL_FORMAT_R16G16B16X16_UNORM;
767    case ISL_FORMAT_R16G16B16_FLOAT:
768       return ISL_FORMAT_R16G16B16X16_FLOAT;
769    case ISL_FORMAT_R8G8B8_UNORM:
770       return ISL_FORMAT_R8G8B8X8_UNORM;
771    case ISL_FORMAT_R8G8B8_UNORM_SRGB:
772       return ISL_FORMAT_R8G8B8X8_UNORM_SRGB;
773    default:
774       return ISL_FORMAT_UNSUPPORTED;
775    }
776 }
777