Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/freedreno/vulkan/tu_formats.c
4565 views
1
2
/*
3
* Copyright © 2016 Red Hat.
4
* Copyright © 2016 Bas Nieuwenhuizen
5
*
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the "Software"),
8
* to deal in the Software without restriction, including without limitation
9
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
* and/or sell copies of the Software, and to permit persons to whom the
11
* Software is furnished to do so, subject to the following conditions:
12
*
13
* The above copyright notice and this permission notice (including the next
14
* paragraph) shall be included in all copies or substantial portions of the
15
* Software.
16
*
17
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23
* DEALINGS IN THE SOFTWARE.
24
*/
25
26
#include "tu_private.h"
27
28
#include "adreno_common.xml.h"
29
#include "a6xx.xml.h"
30
31
#include "vk_format.h"
32
#include "vk_util.h"
33
#include "drm-uapi/drm_fourcc.h"
34
35
#define TU6_FMT(vkfmt, hwfmt, swapfmt, valid) \
36
[VK_FORMAT_##vkfmt] = { \
37
.fmt = FMT6_##hwfmt, \
38
.swap = swapfmt, \
39
.supported = valid, \
40
}
41
42
#define TU6_VTC(vk, fmt, swap) TU6_FMT(vk, fmt, swap, FMT_VERTEX | FMT_TEXTURE | FMT_COLOR)
43
#define TU6_xTC(vk, fmt, swap) TU6_FMT(vk, fmt, swap, FMT_TEXTURE | FMT_COLOR)
44
#define TU6_Vxx(vk, fmt, swap) TU6_FMT(vk, fmt, swap, FMT_VERTEX)
45
#define TU6_xTx(vk, fmt, swap) TU6_FMT(vk, fmt, swap, FMT_TEXTURE)
46
#define TU6_xxx(vk, fmt, swap) TU6_FMT(vk, NONE, WZYX, 0)
47
48
static const struct tu_native_format tu6_format_table[] = {
49
TU6_xxx(UNDEFINED, x, x), /* 0 */
50
51
/* 8-bit packed */
52
TU6_xxx(R4G4_UNORM_PACK8, 4_4_UNORM, WZXY), /* 1 */
53
54
/* 16-bit packed */
55
TU6_xTC(R4G4B4A4_UNORM_PACK16, 4_4_4_4_UNORM, XYZW), /* 2 */
56
TU6_xTC(B4G4R4A4_UNORM_PACK16, 4_4_4_4_UNORM, ZYXW), /* 3 */
57
TU6_xTC(R5G6B5_UNORM_PACK16, 5_6_5_UNORM, WXYZ), /* 4 */
58
TU6_xTC(B5G6R5_UNORM_PACK16, 5_6_5_UNORM, WZYX), /* 5 */
59
TU6_xTC(R5G5B5A1_UNORM_PACK16, 5_5_5_1_UNORM, XYZW), /* 6 */
60
TU6_xTC(B5G5R5A1_UNORM_PACK16, 5_5_5_1_UNORM, ZYXW), /* 7 */
61
TU6_xTC(A1R5G5B5_UNORM_PACK16, 5_5_5_1_UNORM, WXYZ), /* 8 */
62
63
/* 8-bit R */
64
TU6_VTC(R8_UNORM, 8_UNORM, WZYX), /* 9 */
65
TU6_VTC(R8_SNORM, 8_SNORM, WZYX), /* 10 */
66
TU6_Vxx(R8_USCALED, 8_UINT, WZYX), /* 11 */
67
TU6_Vxx(R8_SSCALED, 8_SINT, WZYX), /* 12 */
68
TU6_VTC(R8_UINT, 8_UINT, WZYX), /* 13 */
69
TU6_VTC(R8_SINT, 8_SINT, WZYX), /* 14 */
70
TU6_xTC(R8_SRGB, 8_UNORM, WZYX), /* 15 */
71
72
/* 16-bit RG */
73
TU6_VTC(R8G8_UNORM, 8_8_UNORM, WZYX), /* 16 */
74
TU6_VTC(R8G8_SNORM, 8_8_SNORM, WZYX), /* 17 */
75
TU6_Vxx(R8G8_USCALED, 8_8_UINT, WZYX), /* 18 */
76
TU6_Vxx(R8G8_SSCALED, 8_8_SINT, WZYX), /* 19 */
77
TU6_VTC(R8G8_UINT, 8_8_UINT, WZYX), /* 20 */
78
TU6_VTC(R8G8_SINT, 8_8_SINT, WZYX), /* 21 */
79
TU6_xTC(R8G8_SRGB, 8_8_UNORM, WZYX), /* 22 */
80
81
/* 24-bit RGB */
82
TU6_Vxx(R8G8B8_UNORM, 8_8_8_UNORM, WZYX), /* 23 */
83
TU6_Vxx(R8G8B8_SNORM, 8_8_8_SNORM, WZYX), /* 24 */
84
TU6_Vxx(R8G8B8_USCALED, 8_8_8_UINT, WZYX), /* 25 */
85
TU6_Vxx(R8G8B8_SSCALED, 8_8_8_SINT, WZYX), /* 26 */
86
TU6_Vxx(R8G8B8_UINT, 8_8_8_UINT, WZYX), /* 27 */
87
TU6_Vxx(R8G8B8_SINT, 8_8_8_SINT, WZYX), /* 28 */
88
TU6_xxx(R8G8B8_SRGB, 8_8_8_UNORM, WZYX), /* 29 */
89
90
/* 24-bit BGR */
91
TU6_xxx(B8G8R8_UNORM, 8_8_8_UNORM, WXYZ), /* 30 */
92
TU6_xxx(B8G8R8_SNORM, 8_8_8_SNORM, WXYZ), /* 31 */
93
TU6_xxx(B8G8R8_USCALED, 8_8_8_UINT, WXYZ), /* 32 */
94
TU6_xxx(B8G8R8_SSCALED, 8_8_8_SINT, WXYZ), /* 33 */
95
TU6_xxx(B8G8R8_UINT, 8_8_8_UINT, WXYZ), /* 34 */
96
TU6_xxx(B8G8R8_SINT, 8_8_8_SINT, WXYZ), /* 35 */
97
TU6_xxx(B8G8R8_SRGB, 8_8_8_UNORM, WXYZ), /* 36 */
98
99
/* 32-bit RGBA */
100
TU6_VTC(R8G8B8A8_UNORM, 8_8_8_8_UNORM, WZYX), /* 37 */
101
TU6_VTC(R8G8B8A8_SNORM, 8_8_8_8_SNORM, WZYX), /* 38 */
102
TU6_Vxx(R8G8B8A8_USCALED, 8_8_8_8_UINT, WZYX), /* 39 */
103
TU6_Vxx(R8G8B8A8_SSCALED, 8_8_8_8_SINT, WZYX), /* 40 */
104
TU6_VTC(R8G8B8A8_UINT, 8_8_8_8_UINT, WZYX), /* 41 */
105
TU6_VTC(R8G8B8A8_SINT, 8_8_8_8_SINT, WZYX), /* 42 */
106
TU6_xTC(R8G8B8A8_SRGB, 8_8_8_8_UNORM, WZYX), /* 43 */
107
108
/* 32-bit BGRA */
109
TU6_VTC(B8G8R8A8_UNORM, 8_8_8_8_UNORM, WXYZ), /* 44 */
110
TU6_VTC(B8G8R8A8_SNORM, 8_8_8_8_SNORM, WXYZ), /* 45 */
111
TU6_Vxx(B8G8R8A8_USCALED, 8_8_8_8_UINT, WXYZ), /* 46 */
112
TU6_Vxx(B8G8R8A8_SSCALED, 8_8_8_8_SINT, WXYZ), /* 47 */
113
TU6_VTC(B8G8R8A8_UINT, 8_8_8_8_UINT, WXYZ), /* 48 */
114
TU6_VTC(B8G8R8A8_SINT, 8_8_8_8_SINT, WXYZ), /* 49 */
115
TU6_xTC(B8G8R8A8_SRGB, 8_8_8_8_UNORM, WXYZ), /* 50 */
116
117
/* 32-bit packed */
118
TU6_VTC(A8B8G8R8_UNORM_PACK32, 8_8_8_8_UNORM, WZYX), /* 51 */
119
TU6_VTC(A8B8G8R8_SNORM_PACK32, 8_8_8_8_SNORM, WZYX), /* 52 */
120
TU6_Vxx(A8B8G8R8_USCALED_PACK32, 8_8_8_8_UINT, WZYX), /* 53 */
121
TU6_Vxx(A8B8G8R8_SSCALED_PACK32, 8_8_8_8_SINT, WZYX), /* 54 */
122
TU6_VTC(A8B8G8R8_UINT_PACK32, 8_8_8_8_UINT, WZYX), /* 55 */
123
TU6_VTC(A8B8G8R8_SINT_PACK32, 8_8_8_8_SINT, WZYX), /* 56 */
124
TU6_xTC(A8B8G8R8_SRGB_PACK32, 8_8_8_8_UNORM, WZYX), /* 57 */
125
TU6_VTC(A2R10G10B10_UNORM_PACK32, 10_10_10_2_UNORM, WXYZ), /* 58 */
126
TU6_Vxx(A2R10G10B10_SNORM_PACK32, 10_10_10_2_SNORM, WXYZ), /* 59 */
127
TU6_Vxx(A2R10G10B10_USCALED_PACK32, 10_10_10_2_UINT, WXYZ), /* 60 */
128
TU6_Vxx(A2R10G10B10_SSCALED_PACK32, 10_10_10_2_SINT, WXYZ), /* 61 */
129
TU6_VTC(A2R10G10B10_UINT_PACK32, 10_10_10_2_UINT, WXYZ), /* 62 */
130
TU6_Vxx(A2R10G10B10_SINT_PACK32, 10_10_10_2_SINT, WXYZ), /* 63 */
131
TU6_VTC(A2B10G10R10_UNORM_PACK32, 10_10_10_2_UNORM, WZYX), /* 64 */
132
TU6_Vxx(A2B10G10R10_SNORM_PACK32, 10_10_10_2_SNORM, WZYX), /* 65 */
133
TU6_Vxx(A2B10G10R10_USCALED_PACK32, 10_10_10_2_UINT, WZYX), /* 66 */
134
TU6_Vxx(A2B10G10R10_SSCALED_PACK32, 10_10_10_2_SINT, WZYX), /* 67 */
135
TU6_VTC(A2B10G10R10_UINT_PACK32, 10_10_10_2_UINT, WZYX), /* 68 */
136
TU6_Vxx(A2B10G10R10_SINT_PACK32, 10_10_10_2_SINT, WZYX), /* 69 */
137
138
/* 16-bit R */
139
TU6_VTC(R16_UNORM, 16_UNORM, WZYX), /* 70 */
140
TU6_VTC(R16_SNORM, 16_SNORM, WZYX), /* 71 */
141
TU6_Vxx(R16_USCALED, 16_UINT, WZYX), /* 72 */
142
TU6_Vxx(R16_SSCALED, 16_SINT, WZYX), /* 73 */
143
TU6_VTC(R16_UINT, 16_UINT, WZYX), /* 74 */
144
TU6_VTC(R16_SINT, 16_SINT, WZYX), /* 75 */
145
TU6_VTC(R16_SFLOAT, 16_FLOAT, WZYX), /* 76 */
146
147
/* 32-bit RG */
148
TU6_VTC(R16G16_UNORM, 16_16_UNORM, WZYX), /* 77 */
149
TU6_VTC(R16G16_SNORM, 16_16_SNORM, WZYX), /* 78 */
150
TU6_Vxx(R16G16_USCALED, 16_16_UINT, WZYX), /* 79 */
151
TU6_Vxx(R16G16_SSCALED, 16_16_SINT, WZYX), /* 80 */
152
TU6_VTC(R16G16_UINT, 16_16_UINT, WZYX), /* 81 */
153
TU6_VTC(R16G16_SINT, 16_16_SINT, WZYX), /* 82 */
154
TU6_VTC(R16G16_SFLOAT, 16_16_FLOAT, WZYX), /* 83 */
155
156
/* 48-bit RGB */
157
TU6_Vxx(R16G16B16_UNORM, 16_16_16_UNORM, WZYX), /* 84 */
158
TU6_Vxx(R16G16B16_SNORM, 16_16_16_SNORM, WZYX), /* 85 */
159
TU6_Vxx(R16G16B16_USCALED, 16_16_16_UINT, WZYX), /* 86 */
160
TU6_Vxx(R16G16B16_SSCALED, 16_16_16_SINT, WZYX), /* 87 */
161
TU6_Vxx(R16G16B16_UINT, 16_16_16_UINT, WZYX), /* 88 */
162
TU6_Vxx(R16G16B16_SINT, 16_16_16_SINT, WZYX), /* 89 */
163
TU6_Vxx(R16G16B16_SFLOAT, 16_16_16_FLOAT, WZYX), /* 90 */
164
165
/* 64-bit RGBA */
166
TU6_VTC(R16G16B16A16_UNORM, 16_16_16_16_UNORM, WZYX), /* 91 */
167
TU6_VTC(R16G16B16A16_SNORM, 16_16_16_16_SNORM, WZYX), /* 92 */
168
TU6_Vxx(R16G16B16A16_USCALED, 16_16_16_16_UINT, WZYX), /* 93 */
169
TU6_Vxx(R16G16B16A16_SSCALED, 16_16_16_16_SINT, WZYX), /* 94 */
170
TU6_VTC(R16G16B16A16_UINT, 16_16_16_16_UINT, WZYX), /* 95 */
171
TU6_VTC(R16G16B16A16_SINT, 16_16_16_16_SINT, WZYX), /* 96 */
172
TU6_VTC(R16G16B16A16_SFLOAT, 16_16_16_16_FLOAT, WZYX), /* 97 */
173
174
/* 32-bit R */
175
TU6_VTC(R32_UINT, 32_UINT, WZYX), /* 98 */
176
TU6_VTC(R32_SINT, 32_SINT, WZYX), /* 99 */
177
TU6_VTC(R32_SFLOAT, 32_FLOAT, WZYX), /* 100 */
178
179
/* 64-bit RG */
180
TU6_VTC(R32G32_UINT, 32_32_UINT, WZYX), /* 101 */
181
TU6_VTC(R32G32_SINT, 32_32_SINT, WZYX), /* 102 */
182
TU6_VTC(R32G32_SFLOAT, 32_32_FLOAT, WZYX), /* 103 */
183
184
/* 96-bit RGB */
185
TU6_Vxx(R32G32B32_UINT, 32_32_32_UINT, WZYX), /* 104 */
186
TU6_Vxx(R32G32B32_SINT, 32_32_32_SINT, WZYX), /* 105 */
187
TU6_Vxx(R32G32B32_SFLOAT, 32_32_32_FLOAT, WZYX), /* 106 */
188
189
/* 128-bit RGBA */
190
TU6_VTC(R32G32B32A32_UINT, 32_32_32_32_UINT, WZYX), /* 107 */
191
TU6_VTC(R32G32B32A32_SINT, 32_32_32_32_SINT, WZYX), /* 108 */
192
TU6_VTC(R32G32B32A32_SFLOAT, 32_32_32_32_FLOAT, WZYX), /* 109 */
193
194
/* 64-bit R */
195
TU6_xxx(R64_UINT, 64_UINT, WZYX), /* 110 */
196
TU6_xxx(R64_SINT, 64_SINT, WZYX), /* 111 */
197
TU6_xxx(R64_SFLOAT, 64_FLOAT, WZYX), /* 112 */
198
199
/* 128-bit RG */
200
TU6_xxx(R64G64_UINT, 64_64_UINT, WZYX), /* 113 */
201
TU6_xxx(R64G64_SINT, 64_64_SINT, WZYX), /* 114 */
202
TU6_xxx(R64G64_SFLOAT, 64_64_FLOAT, WZYX), /* 115 */
203
204
/* 192-bit RGB */
205
TU6_xxx(R64G64B64_UINT, 64_64_64_UINT, WZYX), /* 116 */
206
TU6_xxx(R64G64B64_SINT, 64_64_64_SINT, WZYX), /* 117 */
207
TU6_xxx(R64G64B64_SFLOAT, 64_64_64_FLOAT, WZYX), /* 118 */
208
209
/* 256-bit RGBA */
210
TU6_xxx(R64G64B64A64_UINT, 64_64_64_64_UINT, WZYX), /* 119 */
211
TU6_xxx(R64G64B64A64_SINT, 64_64_64_64_SINT, WZYX), /* 120 */
212
TU6_xxx(R64G64B64A64_SFLOAT, 64_64_64_64_FLOAT, WZYX), /* 121 */
213
214
/* 32-bit packed float */
215
TU6_VTC(B10G11R11_UFLOAT_PACK32, 11_11_10_FLOAT, WZYX), /* 122 */
216
TU6_xTx(E5B9G9R9_UFLOAT_PACK32, 9_9_9_E5_FLOAT, WZYX), /* 123 */
217
218
/* depth/stencil
219
* X8_D24_UNORM/D24_UNORM_S8_UINT should be Z24_UNORM_S8_UINT_AS_R8G8B8A8
220
* but the format doesn't work on A630 when UBWC is disabled, so use
221
* 8_8_8_8_UNORM as the default and override it when UBWC is enabled
222
*/
223
TU6_xTC(D16_UNORM, 16_UNORM, WZYX), /* 124 */
224
TU6_xTC(X8_D24_UNORM_PACK32, 8_8_8_8_UNORM, WZYX), /* 125 */
225
TU6_xTC(D32_SFLOAT, 32_FLOAT, WZYX), /* 126 */
226
TU6_xTC(S8_UINT, 8_UINT, WZYX), /* 127 */
227
TU6_xxx(D16_UNORM_S8_UINT, X8Z16_UNORM, WZYX), /* 128 */
228
TU6_xTC(D24_UNORM_S8_UINT, 8_8_8_8_UNORM, WZYX), /* 129 */
229
TU6_xTC(D32_SFLOAT_S8_UINT, NONE, WZYX), /* 130 */
230
231
/* compressed */
232
TU6_xTx(BC1_RGB_UNORM_BLOCK, DXT1, WZYX), /* 131 */
233
TU6_xTx(BC1_RGB_SRGB_BLOCK, DXT1, WZYX), /* 132 */
234
TU6_xTx(BC1_RGBA_UNORM_BLOCK, DXT1, WZYX), /* 133 */
235
TU6_xTx(BC1_RGBA_SRGB_BLOCK, DXT1, WZYX), /* 134 */
236
TU6_xTx(BC2_UNORM_BLOCK, DXT3, WZYX), /* 135 */
237
TU6_xTx(BC2_SRGB_BLOCK, DXT3, WZYX), /* 136 */
238
TU6_xTx(BC3_UNORM_BLOCK, DXT5, WZYX), /* 137 */
239
TU6_xTx(BC3_SRGB_BLOCK, DXT5, WZYX), /* 138 */
240
TU6_xTx(BC4_UNORM_BLOCK, RGTC1_UNORM, WZYX), /* 139 */
241
TU6_xTx(BC4_SNORM_BLOCK, RGTC1_SNORM, WZYX), /* 140 */
242
TU6_xTx(BC5_UNORM_BLOCK, RGTC2_UNORM, WZYX), /* 141 */
243
TU6_xTx(BC5_SNORM_BLOCK, RGTC2_SNORM, WZYX), /* 142 */
244
TU6_xTx(BC6H_UFLOAT_BLOCK, BPTC_UFLOAT, WZYX), /* 143 */
245
TU6_xTx(BC6H_SFLOAT_BLOCK, BPTC_FLOAT, WZYX), /* 144 */
246
TU6_xTx(BC7_UNORM_BLOCK, BPTC, WZYX), /* 145 */
247
TU6_xTx(BC7_SRGB_BLOCK, BPTC, WZYX), /* 146 */
248
TU6_xTx(ETC2_R8G8B8_UNORM_BLOCK, ETC2_RGB8, WZYX), /* 147 */
249
TU6_xTx(ETC2_R8G8B8_SRGB_BLOCK, ETC2_RGB8, WZYX), /* 148 */
250
TU6_xTx(ETC2_R8G8B8A1_UNORM_BLOCK, ETC2_RGB8A1, WZYX), /* 149 */
251
TU6_xTx(ETC2_R8G8B8A1_SRGB_BLOCK, ETC2_RGB8A1, WZYX), /* 150 */
252
TU6_xTx(ETC2_R8G8B8A8_UNORM_BLOCK, ETC2_RGBA8, WZYX), /* 151 */
253
TU6_xTx(ETC2_R8G8B8A8_SRGB_BLOCK, ETC2_RGBA8, WZYX), /* 152 */
254
TU6_xTx(EAC_R11_UNORM_BLOCK, ETC2_R11_UNORM, WZYX), /* 153 */
255
TU6_xTx(EAC_R11_SNORM_BLOCK, ETC2_R11_SNORM, WZYX), /* 154 */
256
TU6_xTx(EAC_R11G11_UNORM_BLOCK, ETC2_RG11_UNORM, WZYX), /* 155 */
257
TU6_xTx(EAC_R11G11_SNORM_BLOCK, ETC2_RG11_SNORM, WZYX), /* 156 */
258
TU6_xTx(ASTC_4x4_UNORM_BLOCK, ASTC_4x4, WZYX), /* 157 */
259
TU6_xTx(ASTC_4x4_SRGB_BLOCK, ASTC_4x4, WZYX), /* 158 */
260
TU6_xTx(ASTC_5x4_UNORM_BLOCK, ASTC_5x4, WZYX), /* 159 */
261
TU6_xTx(ASTC_5x4_SRGB_BLOCK, ASTC_5x4, WZYX), /* 160 */
262
TU6_xTx(ASTC_5x5_UNORM_BLOCK, ASTC_5x5, WZYX), /* 161 */
263
TU6_xTx(ASTC_5x5_SRGB_BLOCK, ASTC_5x5, WZYX), /* 162 */
264
TU6_xTx(ASTC_6x5_UNORM_BLOCK, ASTC_6x5, WZYX), /* 163 */
265
TU6_xTx(ASTC_6x5_SRGB_BLOCK, ASTC_6x5, WZYX), /* 164 */
266
TU6_xTx(ASTC_6x6_UNORM_BLOCK, ASTC_6x6, WZYX), /* 165 */
267
TU6_xTx(ASTC_6x6_SRGB_BLOCK, ASTC_6x6, WZYX), /* 166 */
268
TU6_xTx(ASTC_8x5_UNORM_BLOCK, ASTC_8x5, WZYX), /* 167 */
269
TU6_xTx(ASTC_8x5_SRGB_BLOCK, ASTC_8x5, WZYX), /* 168 */
270
TU6_xTx(ASTC_8x6_UNORM_BLOCK, ASTC_8x6, WZYX), /* 169 */
271
TU6_xTx(ASTC_8x6_SRGB_BLOCK, ASTC_8x6, WZYX), /* 170 */
272
TU6_xTx(ASTC_8x8_UNORM_BLOCK, ASTC_8x8, WZYX), /* 171 */
273
TU6_xTx(ASTC_8x8_SRGB_BLOCK, ASTC_8x8, WZYX), /* 172 */
274
TU6_xTx(ASTC_10x5_UNORM_BLOCK, ASTC_10x5, WZYX), /* 173 */
275
TU6_xTx(ASTC_10x5_SRGB_BLOCK, ASTC_10x5, WZYX), /* 174 */
276
TU6_xTx(ASTC_10x6_UNORM_BLOCK, ASTC_10x6, WZYX), /* 175 */
277
TU6_xTx(ASTC_10x6_SRGB_BLOCK, ASTC_10x6, WZYX), /* 176 */
278
TU6_xTx(ASTC_10x8_UNORM_BLOCK, ASTC_10x8, WZYX), /* 177 */
279
TU6_xTx(ASTC_10x8_SRGB_BLOCK, ASTC_10x8, WZYX), /* 178 */
280
TU6_xTx(ASTC_10x10_UNORM_BLOCK, ASTC_10x10, WZYX), /* 179 */
281
TU6_xTx(ASTC_10x10_SRGB_BLOCK, ASTC_10x10, WZYX), /* 180 */
282
TU6_xTx(ASTC_12x10_UNORM_BLOCK, ASTC_12x10, WZYX), /* 181 */
283
TU6_xTx(ASTC_12x10_SRGB_BLOCK, ASTC_12x10, WZYX), /* 182 */
284
TU6_xTx(ASTC_12x12_UNORM_BLOCK, ASTC_12x12, WZYX), /* 183 */
285
TU6_xTx(ASTC_12x12_SRGB_BLOCK, ASTC_12x12, WZYX), /* 184 */
286
};
287
288
#undef TU6_FMT
289
#define TU6_FMT(vkfmt, hwfmt, swapfmt, valid) \
290
case VK_FORMAT_##vkfmt: \
291
fmt = (struct tu_native_format) { \
292
.fmt = FMT6_##hwfmt, \
293
.swap = swapfmt, \
294
.supported = valid, \
295
}; break;
296
297
static struct tu_native_format
298
tu6_get_native_format(VkFormat format)
299
{
300
struct tu_native_format fmt = {};
301
302
if (format < ARRAY_SIZE(tu6_format_table)) {
303
fmt = tu6_format_table[format];
304
} else {
305
switch (format) {
306
TU6_xTx(G8B8G8R8_422_UNORM, R8G8R8B8_422_UNORM, WZYX)
307
TU6_xTx(B8G8R8G8_422_UNORM, G8R8B8R8_422_UNORM, WZYX)
308
TU6_xTx(G8_B8_R8_3PLANE_420_UNORM, R8_G8_B8_3PLANE_420_UNORM, WZYX)
309
TU6_xTx(G8_B8R8_2PLANE_420_UNORM, R8_G8B8_2PLANE_420_UNORM, WZYX)
310
TU6_xTC(A4R4G4B4_UNORM_PACK16_EXT, 4_4_4_4_UNORM, WXYZ)
311
TU6_xTC(A4B4G4R4_UNORM_PACK16_EXT, 4_4_4_4_UNORM, WZYX)
312
default:
313
break;
314
}
315
}
316
317
if (fmt.supported && vk_format_to_pipe_format(format) == PIPE_FORMAT_NONE) {
318
tu_finishme("vk_format %d missing matching pipe format.\n", format);
319
fmt.supported = false;
320
}
321
322
return fmt;
323
}
324
325
struct tu_native_format
326
tu6_format_vtx(VkFormat format)
327
{
328
struct tu_native_format fmt = tu6_get_native_format(format);
329
assert(fmt.supported & FMT_VERTEX);
330
return fmt;
331
}
332
333
struct tu_native_format
334
tu6_format_color(VkFormat format, enum a6xx_tile_mode tile_mode)
335
{
336
struct tu_native_format fmt = tu6_get_native_format(format);
337
assert(fmt.supported & FMT_COLOR);
338
339
if (fmt.fmt == FMT6_10_10_10_2_UNORM)
340
fmt.fmt = FMT6_10_10_10_2_UNORM_DEST;
341
342
if (tile_mode)
343
fmt.swap = WZYX;
344
345
return fmt;
346
}
347
348
struct tu_native_format
349
tu6_format_texture(VkFormat format, enum a6xx_tile_mode tile_mode)
350
{
351
struct tu_native_format fmt = tu6_get_native_format(format);
352
assert(fmt.supported & FMT_TEXTURE);
353
354
if (!tile_mode) {
355
/* different from format table when used as linear src */
356
if (format == VK_FORMAT_R5G5B5A1_UNORM_PACK16)
357
fmt.fmt = FMT6_1_5_5_5_UNORM, fmt.swap = WXYZ;
358
if (format == VK_FORMAT_B5G5R5A1_UNORM_PACK16)
359
fmt.fmt = FMT6_1_5_5_5_UNORM, fmt.swap = WZYX;
360
} else {
361
fmt.swap = WZYX;
362
}
363
364
return fmt;
365
}
366
367
static void
368
tu_physical_device_get_format_properties(
369
struct tu_physical_device *physical_device,
370
VkFormat format,
371
VkFormatProperties *out_properties)
372
{
373
VkFormatFeatureFlags linear = 0, optimal = 0, buffer = 0;
374
const struct util_format_description *desc = vk_format_description(format);
375
const struct tu_native_format native_fmt = tu6_get_native_format(format);
376
if (!desc || !native_fmt.supported) {
377
goto end;
378
}
379
380
buffer |= VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
381
if (native_fmt.supported & FMT_VERTEX)
382
buffer |= VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT;
383
384
if (native_fmt.supported & FMT_TEXTURE) {
385
optimal |= VK_FORMAT_FEATURE_TRANSFER_SRC_BIT |
386
VK_FORMAT_FEATURE_TRANSFER_DST_BIT |
387
VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
388
VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT |
389
VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT |
390
VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT;
391
392
buffer |= VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT;
393
394
/* no blit src bit for YUYV/NV12/I420 formats */
395
if (desc->layout != UTIL_FORMAT_LAYOUT_SUBSAMPLED &&
396
desc->layout != UTIL_FORMAT_LAYOUT_PLANAR2 &&
397
desc->layout != UTIL_FORMAT_LAYOUT_PLANAR3)
398
optimal |= VK_FORMAT_FEATURE_BLIT_SRC_BIT;
399
400
if (desc->layout != UTIL_FORMAT_LAYOUT_SUBSAMPLED)
401
optimal |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT;
402
403
if (!vk_format_is_int(format)) {
404
optimal |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
405
406
if (physical_device->vk.supported_extensions.EXT_filter_cubic)
407
optimal |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT;
408
}
409
}
410
411
if (native_fmt.supported & FMT_COLOR) {
412
assert(native_fmt.supported & FMT_TEXTURE);
413
optimal |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
414
VK_FORMAT_FEATURE_BLIT_DST_BIT;
415
416
/* IBO's don't have a swap field at all, so swapped formats can't be
417
* supported, even with linear images.
418
*
419
* TODO: See if setting the swap field from the tex descriptor works,
420
* after we enable shaderStorageImageReadWithoutFormat and there are
421
* tests for these formats.
422
*/
423
if (native_fmt.swap == WZYX) {
424
optimal |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
425
buffer |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT;
426
}
427
428
/* TODO: The blob also exposes these for R16G16_UINT/R16G16_SINT, but we
429
* don't have any tests for those.
430
*/
431
if (format == VK_FORMAT_R32_UINT || format == VK_FORMAT_R32_SINT) {
432
optimal |= VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT;
433
buffer |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT;
434
}
435
436
if (!vk_format_is_int(format))
437
optimal |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
438
}
439
440
/* For the most part, we can do anything with a linear image that we could
441
* do with a tiled image. However, we can't support sysmem rendering with a
442
* linear depth texture, because we don't know if there's a bit to control
443
* the tiling of the depth buffer in BYPASS mode, and the blob also
444
* disables linear depth rendering, so there's no way to discover it. We
445
* also can't force GMEM mode, because there are other situations where we
446
* have to use sysmem rendering. So follow the blob here, and only enable
447
* DEPTH_STENCIL_ATTACHMENT_BIT for the optimal features.
448
*/
449
linear = optimal;
450
if (tu6_pipe2depth(format) != (enum a6xx_depth_format)~0)
451
optimal |= VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
452
453
if (format == VK_FORMAT_G8B8G8R8_422_UNORM ||
454
format == VK_FORMAT_B8G8R8G8_422_UNORM ||
455
format == VK_FORMAT_G8_B8R8_2PLANE_420_UNORM ||
456
format == VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM) {
457
/* no tiling for special UBWC formats
458
* TODO: NV12 can be UBWC but has a special UBWC format for accessing the Y plane aspect
459
* for 3plane, tiling/UBWC might be supported, but the blob doesn't use tiling
460
*/
461
optimal = 0;
462
463
/* Disable buffer texturing of subsampled (422) and planar YUV textures.
464
* The subsampling requirement comes from "If format is a block-compressed
465
* format, then bufferFeatures must not support any features for the
466
* format" plus the specification of subsampled as 2x1 compressed block
467
* format. I couldn't find the citation for planar, but 1D access of
468
* planar YUV would be really silly.
469
*/
470
buffer = 0;
471
}
472
473
/* D32_SFLOAT_S8_UINT is tiled as two images, so no linear format
474
* blob enables some linear features, but its not useful, so don't bother.
475
*/
476
if (format == VK_FORMAT_D32_SFLOAT_S8_UINT)
477
linear = 0;
478
479
end:
480
out_properties->linearTilingFeatures = linear;
481
out_properties->optimalTilingFeatures = optimal;
482
out_properties->bufferFeatures = buffer;
483
}
484
485
VKAPI_ATTR void VKAPI_CALL
486
tu_GetPhysicalDeviceFormatProperties2(
487
VkPhysicalDevice physicalDevice,
488
VkFormat format,
489
VkFormatProperties2 *pFormatProperties)
490
{
491
TU_FROM_HANDLE(tu_physical_device, physical_device, physicalDevice);
492
493
tu_physical_device_get_format_properties(
494
physical_device, format, &pFormatProperties->formatProperties);
495
496
VkDrmFormatModifierPropertiesListEXT *list =
497
vk_find_struct(pFormatProperties->pNext, DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT);
498
if (list) {
499
VK_OUTARRAY_MAKE(out, list->pDrmFormatModifierProperties,
500
&list->drmFormatModifierCount);
501
502
if (pFormatProperties->formatProperties.linearTilingFeatures) {
503
vk_outarray_append(&out, mod_props) {
504
mod_props->drmFormatModifier = DRM_FORMAT_MOD_LINEAR;
505
mod_props->drmFormatModifierPlaneCount = 1;
506
}
507
}
508
509
/* note: ubwc_possible() argument values to be ignored except for format */
510
if (pFormatProperties->formatProperties.optimalTilingFeatures &&
511
ubwc_possible(format, VK_IMAGE_TYPE_2D, 0, 0, physical_device->info, VK_SAMPLE_COUNT_1_BIT)) {
512
vk_outarray_append(&out, mod_props) {
513
mod_props->drmFormatModifier = DRM_FORMAT_MOD_QCOM_COMPRESSED;
514
mod_props->drmFormatModifierPlaneCount = 1;
515
}
516
}
517
}
518
}
519
520
static VkResult
521
tu_get_image_format_properties(
522
struct tu_physical_device *physical_device,
523
const VkPhysicalDeviceImageFormatInfo2 *info,
524
VkImageFormatProperties *pImageFormatProperties,
525
VkFormatFeatureFlags *p_feature_flags)
526
{
527
VkFormatProperties format_props;
528
VkFormatFeatureFlags format_feature_flags;
529
VkExtent3D maxExtent;
530
uint32_t maxMipLevels;
531
uint32_t maxArraySize;
532
VkSampleCountFlags sampleCounts = VK_SAMPLE_COUNT_1_BIT;
533
534
tu_physical_device_get_format_properties(physical_device, info->format,
535
&format_props);
536
537
switch (info->tiling) {
538
case VK_IMAGE_TILING_LINEAR:
539
format_feature_flags = format_props.linearTilingFeatures;
540
break;
541
542
case VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT: {
543
const VkPhysicalDeviceImageDrmFormatModifierInfoEXT *drm_info =
544
vk_find_struct_const(info->pNext, PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT);
545
546
switch (drm_info->drmFormatModifier) {
547
case DRM_FORMAT_MOD_QCOM_COMPRESSED:
548
/* falling back to linear/non-UBWC isn't possible with explicit modifier */
549
550
/* formats which don't support tiling */
551
if (!format_props.optimalTilingFeatures)
552
return VK_ERROR_FORMAT_NOT_SUPPORTED;
553
554
/* for mutable formats, its very unlikely to be possible to use UBWC */
555
if (info->flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT)
556
return VK_ERROR_FORMAT_NOT_SUPPORTED;
557
558
559
if (!ubwc_possible(info->format, info->type, info->usage, info->usage, physical_device->info, sampleCounts))
560
return VK_ERROR_FORMAT_NOT_SUPPORTED;
561
562
format_feature_flags = format_props.optimalTilingFeatures;
563
break;
564
case DRM_FORMAT_MOD_LINEAR:
565
format_feature_flags = format_props.linearTilingFeatures;
566
break;
567
default:
568
return VK_ERROR_FORMAT_NOT_SUPPORTED;
569
}
570
} break;
571
case VK_IMAGE_TILING_OPTIMAL:
572
format_feature_flags = format_props.optimalTilingFeatures;
573
break;
574
default:
575
unreachable("bad VkPhysicalDeviceImageFormatInfo2");
576
}
577
578
if (format_feature_flags == 0)
579
goto unsupported;
580
581
if (info->type != VK_IMAGE_TYPE_2D &&
582
vk_format_is_depth_or_stencil(info->format))
583
goto unsupported;
584
585
switch (info->type) {
586
default:
587
unreachable("bad vkimage type\n");
588
case VK_IMAGE_TYPE_1D:
589
maxExtent.width = 16384;
590
maxExtent.height = 1;
591
maxExtent.depth = 1;
592
maxMipLevels = 15; /* log2(maxWidth) + 1 */
593
maxArraySize = 2048;
594
break;
595
case VK_IMAGE_TYPE_2D:
596
maxExtent.width = 16384;
597
maxExtent.height = 16384;
598
maxExtent.depth = 1;
599
maxMipLevels = 15; /* log2(maxWidth) + 1 */
600
maxArraySize = 2048;
601
break;
602
case VK_IMAGE_TYPE_3D:
603
maxExtent.width = 2048;
604
maxExtent.height = 2048;
605
maxExtent.depth = 2048;
606
maxMipLevels = 12; /* log2(maxWidth) + 1 */
607
maxArraySize = 1;
608
break;
609
}
610
611
if (info->tiling == VK_IMAGE_TILING_OPTIMAL &&
612
info->type == VK_IMAGE_TYPE_2D &&
613
(format_feature_flags &
614
(VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
615
VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) &&
616
!(info->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
617
!(info->usage & VK_IMAGE_USAGE_STORAGE_BIT)) {
618
sampleCounts |= VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT;
619
/* note: most operations support 8 samples (GMEM render/resolve do at least)
620
* but some do not (which ones?), just disable 8 samples completely,
621
* (no 8x msaa matches the blob driver behavior)
622
*/
623
}
624
625
if (info->usage & VK_IMAGE_USAGE_SAMPLED_BIT) {
626
if (!(format_feature_flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
627
goto unsupported;
628
}
629
}
630
631
if (info->usage & VK_IMAGE_USAGE_STORAGE_BIT) {
632
if (!(format_feature_flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)) {
633
goto unsupported;
634
}
635
}
636
637
if (info->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
638
if (!(format_feature_flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)) {
639
goto unsupported;
640
}
641
}
642
643
if (info->usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
644
if (!(format_feature_flags &
645
VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
646
goto unsupported;
647
}
648
}
649
650
*pImageFormatProperties = (VkImageFormatProperties) {
651
.maxExtent = maxExtent,
652
.maxMipLevels = maxMipLevels,
653
.maxArrayLayers = maxArraySize,
654
.sampleCounts = sampleCounts,
655
656
/* FINISHME: Accurately calculate
657
* VkImageFormatProperties::maxResourceSize.
658
*/
659
.maxResourceSize = UINT32_MAX,
660
};
661
662
if (p_feature_flags)
663
*p_feature_flags = format_feature_flags;
664
665
return VK_SUCCESS;
666
unsupported:
667
*pImageFormatProperties = (VkImageFormatProperties) {
668
.maxExtent = { 0, 0, 0 },
669
.maxMipLevels = 0,
670
.maxArrayLayers = 0,
671
.sampleCounts = 0,
672
.maxResourceSize = 0,
673
};
674
675
return VK_ERROR_FORMAT_NOT_SUPPORTED;
676
}
677
678
static VkResult
679
tu_get_external_image_format_properties(
680
const struct tu_physical_device *physical_device,
681
const VkPhysicalDeviceImageFormatInfo2 *pImageFormatInfo,
682
VkExternalMemoryHandleTypeFlagBits handleType,
683
VkExternalMemoryProperties *external_properties)
684
{
685
VkExternalMemoryFeatureFlagBits flags = 0;
686
VkExternalMemoryHandleTypeFlags export_flags = 0;
687
VkExternalMemoryHandleTypeFlags compat_flags = 0;
688
689
/* From the Vulkan 1.1.98 spec:
690
*
691
* If handleType is not compatible with the format, type, tiling,
692
* usage, and flags specified in VkPhysicalDeviceImageFormatInfo2,
693
* then vkGetPhysicalDeviceImageFormatProperties2 returns
694
* VK_ERROR_FORMAT_NOT_SUPPORTED.
695
*/
696
697
switch (handleType) {
698
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
699
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT:
700
switch (pImageFormatInfo->type) {
701
case VK_IMAGE_TYPE_2D:
702
flags = VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT |
703
VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT |
704
VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
705
compat_flags = export_flags =
706
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT |
707
VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
708
break;
709
default:
710
return vk_errorf(physical_device->instance, VK_ERROR_FORMAT_NOT_SUPPORTED,
711
"VkExternalMemoryTypeFlagBits(0x%x) unsupported for VkImageType(%d)",
712
handleType, pImageFormatInfo->type);
713
}
714
break;
715
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
716
flags = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
717
compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT;
718
break;
719
default:
720
return vk_errorf(physical_device->instance, VK_ERROR_FORMAT_NOT_SUPPORTED,
721
"VkExternalMemoryTypeFlagBits(0x%x) unsupported",
722
handleType);
723
}
724
725
*external_properties = (VkExternalMemoryProperties) {
726
.externalMemoryFeatures = flags,
727
.exportFromImportedHandleTypes = export_flags,
728
.compatibleHandleTypes = compat_flags,
729
};
730
731
return VK_SUCCESS;
732
}
733
734
VKAPI_ATTR VkResult VKAPI_CALL
735
tu_GetPhysicalDeviceImageFormatProperties2(
736
VkPhysicalDevice physicalDevice,
737
const VkPhysicalDeviceImageFormatInfo2 *base_info,
738
VkImageFormatProperties2 *base_props)
739
{
740
TU_FROM_HANDLE(tu_physical_device, physical_device, physicalDevice);
741
const VkPhysicalDeviceExternalImageFormatInfo *external_info = NULL;
742
const VkPhysicalDeviceImageViewImageFormatInfoEXT *image_view_info = NULL;
743
VkExternalImageFormatProperties *external_props = NULL;
744
VkFilterCubicImageViewImageFormatPropertiesEXT *cubic_props = NULL;
745
VkFormatFeatureFlags format_feature_flags;
746
VkSamplerYcbcrConversionImageFormatProperties *ycbcr_props = NULL;
747
VkResult result;
748
749
result = tu_get_image_format_properties(physical_device,
750
base_info, &base_props->imageFormatProperties, &format_feature_flags);
751
if (result != VK_SUCCESS)
752
return result;
753
754
/* Extract input structs */
755
vk_foreach_struct_const(s, base_info->pNext)
756
{
757
switch (s->sType) {
758
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
759
external_info = (const void *) s;
760
break;
761
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
762
image_view_info = (const void *) s;
763
break;
764
default:
765
break;
766
}
767
}
768
769
/* Extract output structs */
770
vk_foreach_struct(s, base_props->pNext)
771
{
772
switch (s->sType) {
773
case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
774
external_props = (void *) s;
775
break;
776
case VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT:
777
cubic_props = (void *) s;
778
break;
779
case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
780
ycbcr_props = (void *) s;
781
break;
782
default:
783
break;
784
}
785
}
786
787
/* From the Vulkan 1.0.42 spec:
788
*
789
* If handleType is 0, vkGetPhysicalDeviceImageFormatProperties2 will
790
* behave as if VkPhysicalDeviceExternalImageFormatInfo was not
791
* present and VkExternalImageFormatProperties will be ignored.
792
*/
793
if (external_info && external_info->handleType != 0) {
794
result = tu_get_external_image_format_properties(
795
physical_device, base_info, external_info->handleType,
796
&external_props->externalMemoryProperties);
797
if (result != VK_SUCCESS)
798
goto fail;
799
}
800
801
if (cubic_props) {
802
/* note: blob only allows cubic filtering for 2D and 2D array views
803
* its likely we can enable it for 1D and CUBE, needs testing however
804
*/
805
if ((image_view_info->imageViewType == VK_IMAGE_VIEW_TYPE_2D ||
806
image_view_info->imageViewType == VK_IMAGE_VIEW_TYPE_2D_ARRAY) &&
807
(format_feature_flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT)) {
808
cubic_props->filterCubic = true;
809
cubic_props->filterCubicMinmax = true;
810
} else {
811
cubic_props->filterCubic = false;
812
cubic_props->filterCubicMinmax = false;
813
}
814
}
815
816
if (ycbcr_props)
817
ycbcr_props->combinedImageSamplerDescriptorCount = 1;
818
819
return VK_SUCCESS;
820
821
fail:
822
if (result == VK_ERROR_FORMAT_NOT_SUPPORTED) {
823
/* From the Vulkan 1.0.42 spec:
824
*
825
* If the combination of parameters to
826
* vkGetPhysicalDeviceImageFormatProperties2 is not supported by
827
* the implementation for use in vkCreateImage, then all members of
828
* imageFormatProperties will be filled with zero.
829
*/
830
base_props->imageFormatProperties = (VkImageFormatProperties) {};
831
}
832
833
return result;
834
}
835
836
VKAPI_ATTR void VKAPI_CALL
837
tu_GetPhysicalDeviceSparseImageFormatProperties2(
838
VkPhysicalDevice physicalDevice,
839
const VkPhysicalDeviceSparseImageFormatInfo2 *pFormatInfo,
840
uint32_t *pPropertyCount,
841
VkSparseImageFormatProperties2 *pProperties)
842
{
843
/* Sparse images are not yet supported. */
844
*pPropertyCount = 0;
845
}
846
847
VKAPI_ATTR void VKAPI_CALL
848
tu_GetPhysicalDeviceExternalBufferProperties(
849
VkPhysicalDevice physicalDevice,
850
const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo,
851
VkExternalBufferProperties *pExternalBufferProperties)
852
{
853
VkExternalMemoryFeatureFlagBits flags = 0;
854
VkExternalMemoryHandleTypeFlags export_flags = 0;
855
VkExternalMemoryHandleTypeFlags compat_flags = 0;
856
switch (pExternalBufferInfo->handleType) {
857
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
858
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT:
859
flags = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT |
860
VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
861
compat_flags = export_flags =
862
VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT |
863
VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
864
break;
865
case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
866
flags = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
867
compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT;
868
break;
869
default:
870
break;
871
}
872
pExternalBufferProperties->externalMemoryProperties =
873
(VkExternalMemoryProperties) {
874
.externalMemoryFeatures = flags,
875
.exportFromImportedHandleTypes = export_flags,
876
.compatibleHandleTypes = compat_flags,
877
};
878
}
879
880