radv_formats.c revision 7ec681f3
1/*
2 * Copyright © 2016 Red Hat.
3 * Copyright © 2016 Bas Nieuwenhuizen
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22 * IN THE SOFTWARE.
23 */
24
25#include "radv_debug.h"
26#include "radv_private.h"
27
28#include "sid.h"
29#include "vk_format.h"
30
31#include "vk_util.h"
32
33#include "ac_drm_fourcc.h"
34#include "util/format_r11g11b10f.h"
35#include "util/format_rgb9e5.h"
36#include "util/format_srgb.h"
37#include "util/half_float.h"
38#include "vulkan/util/vk_format.h"
39#include "vulkan/util/vk_enum_defines.h"
40
41uint32_t
42radv_translate_buffer_dataformat(const struct util_format_description *desc, int first_non_void)
43{
44   unsigned type;
45   int i;
46
47   assert(util_format_get_num_planes(desc->format) == 1);
48
49   if (desc->format == PIPE_FORMAT_R11G11B10_FLOAT)
50      return V_008F0C_BUF_DATA_FORMAT_10_11_11;
51
52   if (first_non_void < 0)
53      return V_008F0C_BUF_DATA_FORMAT_INVALID;
54   type = desc->channel[first_non_void].type;
55
56   if (type == UTIL_FORMAT_TYPE_FIXED)
57      return V_008F0C_BUF_DATA_FORMAT_INVALID;
58   if (desc->nr_channels == 4 && desc->channel[0].size == 10 && desc->channel[1].size == 10 &&
59       desc->channel[2].size == 10 && desc->channel[3].size == 2)
60      return V_008F0C_BUF_DATA_FORMAT_2_10_10_10;
61
62   /* See whether the components are of the same size. */
63   for (i = 0; i < desc->nr_channels; i++) {
64      if (desc->channel[first_non_void].size != desc->channel[i].size)
65         return V_008F0C_BUF_DATA_FORMAT_INVALID;
66   }
67
68   switch (desc->channel[first_non_void].size) {
69   case 8:
70      switch (desc->nr_channels) {
71      case 1:
72         return V_008F0C_BUF_DATA_FORMAT_8;
73      case 2:
74         return V_008F0C_BUF_DATA_FORMAT_8_8;
75      case 4:
76         return V_008F0C_BUF_DATA_FORMAT_8_8_8_8;
77      }
78      break;
79   case 16:
80      switch (desc->nr_channels) {
81      case 1:
82         return V_008F0C_BUF_DATA_FORMAT_16;
83      case 2:
84         return V_008F0C_BUF_DATA_FORMAT_16_16;
85      case 4:
86         return V_008F0C_BUF_DATA_FORMAT_16_16_16_16;
87      }
88      break;
89   case 32:
90      /* From the Southern Islands ISA documentation about MTBUF:
91       * 'Memory reads of data in memory that is 32 or 64 bits do not
92       * undergo any format conversion.'
93       */
94      if (type != UTIL_FORMAT_TYPE_FLOAT && !desc->channel[first_non_void].pure_integer)
95         return V_008F0C_BUF_DATA_FORMAT_INVALID;
96
97      switch (desc->nr_channels) {
98      case 1:
99         return V_008F0C_BUF_DATA_FORMAT_32;
100      case 2:
101         return V_008F0C_BUF_DATA_FORMAT_32_32;
102      case 3:
103         return V_008F0C_BUF_DATA_FORMAT_32_32_32;
104      case 4:
105         return V_008F0C_BUF_DATA_FORMAT_32_32_32_32;
106      }
107      break;
108   case 64:
109      if (type != UTIL_FORMAT_TYPE_FLOAT && desc->nr_channels == 1)
110         return V_008F0C_BUF_DATA_FORMAT_32_32;
111   }
112
113   return V_008F0C_BUF_DATA_FORMAT_INVALID;
114}
115
116uint32_t
117radv_translate_buffer_numformat(const struct util_format_description *desc, int first_non_void)
118{
119   assert(util_format_get_num_planes(desc->format) == 1);
120
121   if (desc->format == PIPE_FORMAT_R11G11B10_FLOAT)
122      return V_008F0C_BUF_NUM_FORMAT_FLOAT;
123
124   if (first_non_void < 0)
125      return ~0;
126
127   switch (desc->channel[first_non_void].type) {
128   case UTIL_FORMAT_TYPE_SIGNED:
129      if (desc->channel[first_non_void].normalized)
130         return V_008F0C_BUF_NUM_FORMAT_SNORM;
131      else if (desc->channel[first_non_void].pure_integer)
132         return V_008F0C_BUF_NUM_FORMAT_SINT;
133      else
134         return V_008F0C_BUF_NUM_FORMAT_SSCALED;
135      break;
136   case UTIL_FORMAT_TYPE_UNSIGNED:
137      if (desc->channel[first_non_void].normalized)
138         return V_008F0C_BUF_NUM_FORMAT_UNORM;
139      else if (desc->channel[first_non_void].pure_integer)
140         return V_008F0C_BUF_NUM_FORMAT_UINT;
141      else
142         return V_008F0C_BUF_NUM_FORMAT_USCALED;
143      break;
144   case UTIL_FORMAT_TYPE_FLOAT:
145   default:
146      return V_008F0C_BUF_NUM_FORMAT_FLOAT;
147   }
148}
149
150void
151radv_translate_vertex_format(const struct radv_physical_device *pdevice, VkFormat format,
152                             const struct util_format_description *desc, unsigned *dfmt,
153                             unsigned *nfmt, bool *post_shuffle,
154                             enum radv_vs_input_alpha_adjust *alpha_adjust)
155{
156   assert(desc->channel[0].type != UTIL_FORMAT_TYPE_VOID);
157   *nfmt = radv_translate_buffer_numformat(desc, 0);
158   *dfmt = radv_translate_buffer_dataformat(desc, 0);
159
160   *alpha_adjust = ALPHA_ADJUST_NONE;
161   if (pdevice->rad_info.chip_class <= GFX8 && pdevice->rad_info.family != CHIP_STONEY) {
162      switch (format) {
163      case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
164      case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
165         *alpha_adjust = ALPHA_ADJUST_SNORM;
166         break;
167      case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
168      case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
169         *alpha_adjust = ALPHA_ADJUST_SSCALED;
170         break;
171      case VK_FORMAT_A2R10G10B10_SINT_PACK32:
172      case VK_FORMAT_A2B10G10R10_SINT_PACK32:
173         *alpha_adjust = ALPHA_ADJUST_SINT;
174         break;
175      default:
176         break;
177      }
178   }
179
180   switch (format) {
181   case VK_FORMAT_B8G8R8A8_UNORM:
182   case VK_FORMAT_B8G8R8A8_SNORM:
183   case VK_FORMAT_B8G8R8A8_USCALED:
184   case VK_FORMAT_B8G8R8A8_SSCALED:
185   case VK_FORMAT_B8G8R8A8_UINT:
186   case VK_FORMAT_B8G8R8A8_SINT:
187   case VK_FORMAT_B8G8R8A8_SRGB:
188   case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
189   case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
190   case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
191   case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
192   case VK_FORMAT_A2R10G10B10_UINT_PACK32:
193   case VK_FORMAT_A2R10G10B10_SINT_PACK32:
194      *post_shuffle = true;
195      break;
196   default:
197      *post_shuffle = false;
198      break;
199   }
200}
201
202uint32_t
203radv_translate_tex_dataformat(VkFormat format, const struct util_format_description *desc,
204                              int first_non_void)
205{
206   bool uniform = true;
207   int i;
208
209   assert(vk_format_get_plane_count(format) == 1);
210
211   if (!desc)
212      return ~0;
213   /* Colorspace (return non-RGB formats directly). */
214   switch (desc->colorspace) {
215      /* Depth stencil formats */
216   case UTIL_FORMAT_COLORSPACE_ZS:
217      switch (format) {
218      case VK_FORMAT_D16_UNORM:
219         return V_008F14_IMG_DATA_FORMAT_16;
220      case VK_FORMAT_D24_UNORM_S8_UINT:
221      case VK_FORMAT_X8_D24_UNORM_PACK32:
222         return V_008F14_IMG_DATA_FORMAT_8_24;
223      case VK_FORMAT_S8_UINT:
224         return V_008F14_IMG_DATA_FORMAT_8;
225      case VK_FORMAT_D32_SFLOAT:
226         return V_008F14_IMG_DATA_FORMAT_32;
227      case VK_FORMAT_D32_SFLOAT_S8_UINT:
228         return V_008F14_IMG_DATA_FORMAT_X24_8_32;
229      default:
230         goto out_unknown;
231      }
232
233   case UTIL_FORMAT_COLORSPACE_YUV:
234      goto out_unknown; /* TODO */
235
236   default:
237      break;
238   }
239
240   if (desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED) {
241      switch (format) {
242      /* Don't ask me why this looks inverted. PAL does the same. */
243      case VK_FORMAT_G8B8G8R8_422_UNORM:
244         return V_008F14_IMG_DATA_FORMAT_BG_RG;
245      case VK_FORMAT_B8G8R8G8_422_UNORM:
246         return V_008F14_IMG_DATA_FORMAT_GB_GR;
247      default:
248         goto out_unknown;
249      }
250   }
251
252   if (desc->layout == UTIL_FORMAT_LAYOUT_RGTC) {
253      switch (format) {
254      case VK_FORMAT_BC4_UNORM_BLOCK:
255      case VK_FORMAT_BC4_SNORM_BLOCK:
256         return V_008F14_IMG_DATA_FORMAT_BC4;
257      case VK_FORMAT_BC5_UNORM_BLOCK:
258      case VK_FORMAT_BC5_SNORM_BLOCK:
259         return V_008F14_IMG_DATA_FORMAT_BC5;
260      default:
261         break;
262      }
263   }
264
265   if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
266      switch (format) {
267      case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
268      case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
269      case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
270      case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
271         return V_008F14_IMG_DATA_FORMAT_BC1;
272      case VK_FORMAT_BC2_UNORM_BLOCK:
273      case VK_FORMAT_BC2_SRGB_BLOCK:
274         return V_008F14_IMG_DATA_FORMAT_BC2;
275      case VK_FORMAT_BC3_UNORM_BLOCK:
276      case VK_FORMAT_BC3_SRGB_BLOCK:
277         return V_008F14_IMG_DATA_FORMAT_BC3;
278      default:
279         break;
280      }
281   }
282
283   if (desc->layout == UTIL_FORMAT_LAYOUT_BPTC) {
284      switch (format) {
285      case VK_FORMAT_BC6H_UFLOAT_BLOCK:
286      case VK_FORMAT_BC6H_SFLOAT_BLOCK:
287         return V_008F14_IMG_DATA_FORMAT_BC6;
288      case VK_FORMAT_BC7_UNORM_BLOCK:
289      case VK_FORMAT_BC7_SRGB_BLOCK:
290         return V_008F14_IMG_DATA_FORMAT_BC7;
291      default:
292         break;
293      }
294   }
295
296   if (desc->layout == UTIL_FORMAT_LAYOUT_ETC) {
297      switch (format) {
298      case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
299      case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
300         return V_008F14_IMG_DATA_FORMAT_ETC2_RGB;
301      case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
302      case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
303         return V_008F14_IMG_DATA_FORMAT_ETC2_RGBA1;
304      case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
305      case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
306         return V_008F14_IMG_DATA_FORMAT_ETC2_RGBA;
307      case VK_FORMAT_EAC_R11_UNORM_BLOCK:
308      case VK_FORMAT_EAC_R11_SNORM_BLOCK:
309         return V_008F14_IMG_DATA_FORMAT_ETC2_R;
310      case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
311      case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
312         return V_008F14_IMG_DATA_FORMAT_ETC2_RG;
313      default:
314         break;
315      }
316   }
317
318   if (format == VK_FORMAT_E5B9G9R9_UFLOAT_PACK32) {
319      return V_008F14_IMG_DATA_FORMAT_5_9_9_9;
320   } else if (format == VK_FORMAT_B10G11R11_UFLOAT_PACK32) {
321      return V_008F14_IMG_DATA_FORMAT_10_11_11;
322   }
323
324   /* R8G8Bx_SNORM - TODO CxV8U8 */
325
326   /* hw cannot support mixed formats (except depth/stencil, since only
327    * depth is read).*/
328   if (desc->is_mixed && desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS)
329      goto out_unknown;
330
331   /* See whether the components are of the same size. */
332   for (i = 1; i < desc->nr_channels; i++) {
333      uniform = uniform && desc->channel[0].size == desc->channel[i].size;
334   }
335
336   /* Non-uniform formats. */
337   if (!uniform) {
338      switch (desc->nr_channels) {
339      case 3:
340         if (desc->channel[0].size == 5 && desc->channel[1].size == 6 &&
341             desc->channel[2].size == 5) {
342            return V_008F14_IMG_DATA_FORMAT_5_6_5;
343         }
344         goto out_unknown;
345      case 4:
346         if (desc->channel[0].size == 5 && desc->channel[1].size == 5 &&
347             desc->channel[2].size == 5 && desc->channel[3].size == 1) {
348            return V_008F14_IMG_DATA_FORMAT_1_5_5_5;
349         }
350         if (desc->channel[0].size == 1 && desc->channel[1].size == 5 &&
351             desc->channel[2].size == 5 && desc->channel[3].size == 5) {
352            return V_008F14_IMG_DATA_FORMAT_5_5_5_1;
353         }
354         if (desc->channel[0].size == 10 && desc->channel[1].size == 10 &&
355             desc->channel[2].size == 10 && desc->channel[3].size == 2) {
356            /* Closed VK driver does this also no 2/10/10/10 snorm */
357            if (desc->channel[0].type == UTIL_FORMAT_TYPE_SIGNED && desc->channel[0].normalized)
358               goto out_unknown;
359            return V_008F14_IMG_DATA_FORMAT_2_10_10_10;
360         }
361         goto out_unknown;
362      }
363      goto out_unknown;
364   }
365
366   if (first_non_void < 0 || first_non_void > 3)
367      goto out_unknown;
368
369   /* uniform formats */
370   switch (desc->channel[first_non_void].size) {
371   case 4:
372      switch (desc->nr_channels) {
373#if 0 /* Not supported for render targets */
374		case 2:
375			return V_008F14_IMG_DATA_FORMAT_4_4;
376#endif
377      case 4:
378         return V_008F14_IMG_DATA_FORMAT_4_4_4_4;
379      }
380      break;
381   case 8:
382      switch (desc->nr_channels) {
383      case 1:
384         return V_008F14_IMG_DATA_FORMAT_8;
385      case 2:
386         return V_008F14_IMG_DATA_FORMAT_8_8;
387      case 4:
388         return V_008F14_IMG_DATA_FORMAT_8_8_8_8;
389      }
390      break;
391   case 16:
392      switch (desc->nr_channels) {
393      case 1:
394         return V_008F14_IMG_DATA_FORMAT_16;
395      case 2:
396         return V_008F14_IMG_DATA_FORMAT_16_16;
397      case 4:
398         return V_008F14_IMG_DATA_FORMAT_16_16_16_16;
399      }
400      break;
401   case 32:
402      switch (desc->nr_channels) {
403      case 1:
404         return V_008F14_IMG_DATA_FORMAT_32;
405      case 2:
406         return V_008F14_IMG_DATA_FORMAT_32_32;
407      case 3:
408         return V_008F14_IMG_DATA_FORMAT_32_32_32;
409      case 4:
410         return V_008F14_IMG_DATA_FORMAT_32_32_32_32;
411      }
412      break;
413   case 64:
414      if (desc->channel[0].type != UTIL_FORMAT_TYPE_FLOAT && desc->nr_channels == 1)
415         return V_008F14_IMG_DATA_FORMAT_32_32;
416      break;
417   }
418
419out_unknown:
420   /* R600_ERR("Unable to handle texformat %d %s\n", format, vk_format_name(format)); */
421   return ~0;
422}
423
424uint32_t
425radv_translate_tex_numformat(VkFormat format, const struct util_format_description *desc,
426                             int first_non_void)
427{
428   assert(vk_format_get_plane_count(format) == 1);
429
430   switch (format) {
431   case VK_FORMAT_D24_UNORM_S8_UINT:
432      return V_008F14_IMG_NUM_FORMAT_UNORM;
433   default:
434      if (first_non_void < 0) {
435         if (vk_format_is_compressed(format)) {
436            switch (format) {
437            case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
438            case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
439            case VK_FORMAT_BC2_SRGB_BLOCK:
440            case VK_FORMAT_BC3_SRGB_BLOCK:
441            case VK_FORMAT_BC7_SRGB_BLOCK:
442            case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
443            case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
444            case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
445               return V_008F14_IMG_NUM_FORMAT_SRGB;
446            case VK_FORMAT_BC4_SNORM_BLOCK:
447            case VK_FORMAT_BC5_SNORM_BLOCK:
448            case VK_FORMAT_BC6H_SFLOAT_BLOCK:
449            case VK_FORMAT_EAC_R11_SNORM_BLOCK:
450            case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
451               return V_008F14_IMG_NUM_FORMAT_SNORM;
452            default:
453               return V_008F14_IMG_NUM_FORMAT_UNORM;
454            }
455         } else if (desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED) {
456            return V_008F14_IMG_NUM_FORMAT_UNORM;
457         } else {
458            return V_008F14_IMG_NUM_FORMAT_FLOAT;
459         }
460      } else if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
461         return V_008F14_IMG_NUM_FORMAT_SRGB;
462      } else {
463         switch (desc->channel[first_non_void].type) {
464         case UTIL_FORMAT_TYPE_FLOAT:
465            return V_008F14_IMG_NUM_FORMAT_FLOAT;
466         case UTIL_FORMAT_TYPE_SIGNED:
467            if (desc->channel[first_non_void].normalized)
468               return V_008F14_IMG_NUM_FORMAT_SNORM;
469            else if (desc->channel[first_non_void].pure_integer)
470               return V_008F14_IMG_NUM_FORMAT_SINT;
471            else
472               return V_008F14_IMG_NUM_FORMAT_SSCALED;
473         case UTIL_FORMAT_TYPE_UNSIGNED:
474            if (desc->channel[first_non_void].normalized)
475               return V_008F14_IMG_NUM_FORMAT_UNORM;
476            else if (desc->channel[first_non_void].pure_integer)
477               return V_008F14_IMG_NUM_FORMAT_UINT;
478            else
479               return V_008F14_IMG_NUM_FORMAT_USCALED;
480         default:
481            return V_008F14_IMG_NUM_FORMAT_UNORM;
482         }
483      }
484   }
485}
486
487uint32_t
488radv_translate_color_numformat(VkFormat format, const struct util_format_description *desc,
489                               int first_non_void)
490{
491   unsigned ntype;
492
493   assert(vk_format_get_plane_count(format) == 1);
494
495   if (first_non_void == -1 || desc->channel[first_non_void].type == UTIL_FORMAT_TYPE_FLOAT)
496      ntype = V_028C70_NUMBER_FLOAT;
497   else {
498      ntype = V_028C70_NUMBER_UNORM;
499      if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
500         ntype = V_028C70_NUMBER_SRGB;
501      else if (desc->channel[first_non_void].type == UTIL_FORMAT_TYPE_SIGNED) {
502         if (desc->channel[first_non_void].pure_integer) {
503            ntype = V_028C70_NUMBER_SINT;
504         } else if (desc->channel[first_non_void].normalized) {
505            ntype = V_028C70_NUMBER_SNORM;
506         } else
507            ntype = ~0u;
508      } else if (desc->channel[first_non_void].type == UTIL_FORMAT_TYPE_UNSIGNED) {
509         if (desc->channel[first_non_void].pure_integer) {
510            ntype = V_028C70_NUMBER_UINT;
511         } else if (desc->channel[first_non_void].normalized) {
512            ntype = V_028C70_NUMBER_UNORM;
513         } else
514            ntype = ~0u;
515      }
516   }
517   return ntype;
518}
519
520static bool
521radv_is_sampler_format_supported(VkFormat format, bool *linear_sampling)
522{
523   const struct util_format_description *desc = vk_format_description(format);
524   uint32_t num_format;
525   if (!desc || format == VK_FORMAT_UNDEFINED || format == VK_FORMAT_R64_UINT ||
526       format == VK_FORMAT_R64_SINT)
527      return false;
528   num_format =
529      radv_translate_tex_numformat(format, desc, vk_format_get_first_non_void_channel(format));
530
531   if (num_format == V_008F14_IMG_NUM_FORMAT_USCALED ||
532       num_format == V_008F14_IMG_NUM_FORMAT_SSCALED)
533      return false;
534
535   if (num_format == V_008F14_IMG_NUM_FORMAT_UNORM || num_format == V_008F14_IMG_NUM_FORMAT_SNORM ||
536       num_format == V_008F14_IMG_NUM_FORMAT_FLOAT || num_format == V_008F14_IMG_NUM_FORMAT_SRGB)
537      *linear_sampling = true;
538   else
539      *linear_sampling = false;
540   return radv_translate_tex_dataformat(format, vk_format_description(format),
541                                        vk_format_get_first_non_void_channel(format)) != ~0U;
542}
543
544bool
545radv_is_atomic_format_supported(VkFormat format)
546{
547   return format == VK_FORMAT_R32_UINT || format == VK_FORMAT_R32_SINT ||
548          format == VK_FORMAT_R32_SFLOAT || format == VK_FORMAT_R64_UINT ||
549          format == VK_FORMAT_R64_SINT;
550}
551
552bool
553radv_is_storage_image_format_supported(struct radv_physical_device *physical_device,
554                                       VkFormat format)
555{
556   const struct util_format_description *desc = vk_format_description(format);
557   unsigned data_format, num_format;
558   if (!desc || format == VK_FORMAT_UNDEFINED)
559      return false;
560
561   data_format =
562      radv_translate_tex_dataformat(format, desc, vk_format_get_first_non_void_channel(format));
563   num_format =
564      radv_translate_tex_numformat(format, desc, vk_format_get_first_non_void_channel(format));
565
566   if (data_format == ~0 || num_format == ~0)
567      return false;
568
569   /* Extracted from the GCN3 ISA document. */
570   switch (num_format) {
571   case V_008F14_IMG_NUM_FORMAT_UNORM:
572   case V_008F14_IMG_NUM_FORMAT_SNORM:
573   case V_008F14_IMG_NUM_FORMAT_UINT:
574   case V_008F14_IMG_NUM_FORMAT_SINT:
575   case V_008F14_IMG_NUM_FORMAT_FLOAT:
576      break;
577   default:
578      return false;
579   }
580
581   switch (data_format) {
582   case V_008F14_IMG_DATA_FORMAT_8:
583   case V_008F14_IMG_DATA_FORMAT_16:
584   case V_008F14_IMG_DATA_FORMAT_8_8:
585   case V_008F14_IMG_DATA_FORMAT_32:
586   case V_008F14_IMG_DATA_FORMAT_16_16:
587   case V_008F14_IMG_DATA_FORMAT_10_11_11:
588   case V_008F14_IMG_DATA_FORMAT_11_11_10:
589   case V_008F14_IMG_DATA_FORMAT_10_10_10_2:
590   case V_008F14_IMG_DATA_FORMAT_2_10_10_10:
591   case V_008F14_IMG_DATA_FORMAT_8_8_8_8:
592   case V_008F14_IMG_DATA_FORMAT_32_32:
593   case V_008F14_IMG_DATA_FORMAT_16_16_16_16:
594   case V_008F14_IMG_DATA_FORMAT_32_32_32_32:
595   case V_008F14_IMG_DATA_FORMAT_5_6_5:
596   case V_008F14_IMG_DATA_FORMAT_1_5_5_5:
597   case V_008F14_IMG_DATA_FORMAT_5_5_5_1:
598   case V_008F14_IMG_DATA_FORMAT_4_4_4_4:
599      /* TODO: FMASK formats. */
600      return true;
601   case V_008F14_IMG_DATA_FORMAT_5_9_9_9:
602      return physical_device->rad_info.chip_class >= GFX10_3;
603   default:
604      return false;
605   }
606}
607
608bool
609radv_is_buffer_format_supported(VkFormat format, bool *scaled)
610{
611   const struct util_format_description *desc = vk_format_description(format);
612   unsigned data_format, num_format;
613   if (!desc || format == VK_FORMAT_UNDEFINED)
614      return false;
615
616   data_format =
617      radv_translate_buffer_dataformat(desc, vk_format_get_first_non_void_channel(format));
618   num_format = radv_translate_buffer_numformat(desc, vk_format_get_first_non_void_channel(format));
619
620   if (scaled)
621      *scaled = (num_format == V_008F0C_BUF_NUM_FORMAT_SSCALED) ||
622                (num_format == V_008F0C_BUF_NUM_FORMAT_USCALED);
623   return data_format != V_008F0C_BUF_DATA_FORMAT_INVALID && num_format != ~0;
624}
625
626bool
627radv_is_colorbuffer_format_supported(const struct radv_physical_device *pdevice, VkFormat format,
628                                     bool *blendable)
629{
630   const struct util_format_description *desc = vk_format_description(format);
631   uint32_t color_format = radv_translate_colorformat(format);
632   uint32_t color_swap = radv_translate_colorswap(format, false);
633   uint32_t color_num_format =
634      radv_translate_color_numformat(format, desc, vk_format_get_first_non_void_channel(format));
635
636   if (color_num_format == V_028C70_NUMBER_UINT || color_num_format == V_028C70_NUMBER_SINT ||
637       color_format == V_028C70_COLOR_8_24 || color_format == V_028C70_COLOR_24_8 ||
638       color_format == V_028C70_COLOR_X24_8_32_FLOAT) {
639      *blendable = false;
640   } else
641      *blendable = true;
642
643   if (format == VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 && pdevice->rad_info.chip_class < GFX10_3)
644      return false;
645
646   return color_format != V_028C70_COLOR_INVALID && color_swap != ~0U && color_num_format != ~0;
647}
648
649static bool
650radv_is_zs_format_supported(VkFormat format)
651{
652   return radv_translate_dbformat(format) != V_028040_Z_INVALID || format == VK_FORMAT_S8_UINT;
653}
654
655static bool
656radv_is_filter_minmax_format_supported(VkFormat format)
657{
658   /* From the Vulkan spec 1.1.71:
659    *
660    * "The following formats must support the
661    *  VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT_KHR feature with
662    *  VK_IMAGE_TILING_OPTIMAL, if they support
663    *  VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR."
664    */
665   /* TODO: enable more formats. */
666   switch (format) {
667   case VK_FORMAT_R8_UNORM:
668   case VK_FORMAT_R8_SNORM:
669   case VK_FORMAT_R16_UNORM:
670   case VK_FORMAT_R16_SNORM:
671   case VK_FORMAT_R16_SFLOAT:
672   case VK_FORMAT_R32_SFLOAT:
673   case VK_FORMAT_D16_UNORM:
674   case VK_FORMAT_X8_D24_UNORM_PACK32:
675   case VK_FORMAT_D32_SFLOAT:
676   case VK_FORMAT_D16_UNORM_S8_UINT:
677   case VK_FORMAT_D24_UNORM_S8_UINT:
678   case VK_FORMAT_D32_SFLOAT_S8_UINT:
679      return true;
680   default:
681      return false;
682   }
683}
684
685bool
686radv_device_supports_etc(struct radv_physical_device *physical_device)
687{
688   return physical_device->rad_info.family == CHIP_VEGA10 ||
689          physical_device->rad_info.family == CHIP_RAVEN ||
690          physical_device->rad_info.family == CHIP_RAVEN2 ||
691          physical_device->rad_info.family == CHIP_STONEY;
692}
693
694static void
695radv_physical_device_get_format_properties(struct radv_physical_device *physical_device,
696                                           VkFormat format, VkFormatProperties3KHR *out_properties)
697{
698   VkFormatFeatureFlags2KHR linear = 0, tiled = 0, buffer = 0;
699   const struct util_format_description *desc = vk_format_description(format);
700   bool blendable;
701   bool scaled = false;
702   /* TODO: implement some software emulation of SUBSAMPLED formats. */
703   if (!desc || vk_format_to_pipe_format(format) == PIPE_FORMAT_NONE ||
704       desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED) {
705      out_properties->linearTilingFeatures = linear;
706      out_properties->optimalTilingFeatures = tiled;
707      out_properties->bufferFeatures = buffer;
708      return;
709   }
710
711   if (desc->layout == UTIL_FORMAT_LAYOUT_ETC && !radv_device_supports_etc(physical_device)) {
712      out_properties->linearTilingFeatures = linear;
713      out_properties->optimalTilingFeatures = tiled;
714      out_properties->bufferFeatures = buffer;
715      return;
716   }
717
718   if (vk_format_get_plane_count(format) > 1 || desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED) {
719      uint64_t tiling = VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR |
720                        VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR |
721                        VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR |
722                        VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT_KHR |
723                        VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT_KHR;
724
725      /* The subsampled formats have no support for linear filters. */
726      if (desc->layout != UTIL_FORMAT_LAYOUT_SUBSAMPLED) {
727         tiling |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR;
728      }
729
730      /* Fails for unknown reasons with linear tiling & subsampled formats. */
731      out_properties->linearTilingFeatures =
732         desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED ? 0 : tiling;
733      out_properties->optimalTilingFeatures = tiling;
734      out_properties->bufferFeatures = 0;
735      return;
736   }
737
738   if (radv_is_storage_image_format_supported(physical_device, format)) {
739      tiled |= VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR |
740               VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR |
741               VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR;
742      linear |= VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR |
743                VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR |
744                VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR;
745   }
746
747   if (radv_is_buffer_format_supported(format, &scaled)) {
748      if (format != VK_FORMAT_R64_UINT && format != VK_FORMAT_R64_SINT) {
749         buffer |= VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT_KHR;
750         if (!scaled)
751            buffer |= VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR;
752      }
753      buffer |= VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT_KHR;
754   }
755
756   if (vk_format_is_depth_or_stencil(format)) {
757      if (radv_is_zs_format_supported(format)) {
758         tiled |= VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR;
759         tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR;
760         tiled |= VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR | VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR;
761         tiled |= VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR | VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR;
762
763         if (radv_is_filter_minmax_format_supported(format))
764            tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT_KHR;
765
766         if (vk_format_has_depth(format)) {
767            tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT_KHR |
768                     VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR;
769         }
770
771         /* Don't support blitting surfaces with depth/stencil. */
772         if (vk_format_has_depth(format) && vk_format_has_stencil(format))
773            tiled &= ~VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR;
774
775         /* Don't support linear depth surfaces */
776         linear = 0;
777      }
778   } else {
779      bool linear_sampling;
780      if (radv_is_sampler_format_supported(format, &linear_sampling)) {
781         linear |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR | VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR;
782         tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR | VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR;
783
784         if (radv_is_filter_minmax_format_supported(format))
785            tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT_KHR;
786
787         if (linear_sampling) {
788            linear |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT_KHR;
789            tiled |= VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT_KHR;
790         }
791
792         /* Don't support blitting for R32G32B32 formats. */
793         if (format == VK_FORMAT_R32G32B32_SFLOAT || format == VK_FORMAT_R32G32B32_UINT ||
794             format == VK_FORMAT_R32G32B32_SINT) {
795            linear &= ~VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR;
796         }
797      }
798      if (radv_is_colorbuffer_format_supported(physical_device, format, &blendable)) {
799         linear |= VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR | VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR;
800         tiled |= VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR | VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR;
801         if (blendable) {
802            linear |= VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT_KHR;
803            tiled |= VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT_KHR;
804         }
805      }
806      if (tiled && !scaled) {
807         tiled |= VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR | VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR;
808      }
809
810      /* Tiled formatting does not support NPOT pixel sizes */
811      if (!util_is_power_of_two_or_zero(vk_format_get_blocksize(format)))
812         tiled = 0;
813   }
814
815   if (linear && !scaled) {
816      linear |= VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR | VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR;
817   }
818
819   if (radv_is_atomic_format_supported(format)) {
820      buffer |= VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT_KHR;
821      linear |= VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT_KHR;
822      tiled |= VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT_KHR;
823   }
824
825   switch (format) {
826   case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
827   case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
828   case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
829   case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
830   case VK_FORMAT_A2R10G10B10_SINT_PACK32:
831   case VK_FORMAT_A2B10G10R10_SINT_PACK32:
832      buffer &=
833         ~(VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR | VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT_KHR);
834      linear = 0;
835      tiled = 0;
836      break;
837   default:
838      break;
839   }
840
841   switch (format) {
842   case VK_FORMAT_R32G32_SFLOAT:
843   case VK_FORMAT_R32G32B32_SFLOAT:
844   case VK_FORMAT_R32G32B32A32_SFLOAT:
845   case VK_FORMAT_R16G16_SFLOAT:
846   case VK_FORMAT_R16G16B16_SFLOAT:
847   case VK_FORMAT_R16G16B16A16_SFLOAT:
848   case VK_FORMAT_R16G16_SNORM:
849   case VK_FORMAT_R16G16B16A16_SNORM:
850   case VK_FORMAT_R16G16B16A16_UNORM:
851      buffer |= VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR;
852      break;
853   default:
854      break;
855   }
856   /* addrlib does not support linear compressed textures. */
857   if (vk_format_is_compressed(format))
858      linear = 0;
859
860   /* From the Vulkan spec 1.2.163:
861    *
862    * "VK_FORMAT_FEATURE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR must be supported for the
863    *  following formats if the attachmentFragmentShadingRate feature is supported:"
864    *
865    * - VK_FORMAT_R8_UINT
866    */
867   if (format == VK_FORMAT_R8_UINT) {
868      tiled |= VK_FORMAT_FEATURE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR;
869   }
870
871   /* It's invalid to expose buffer features with depth/stencil formats. */
872   if (vk_format_is_depth_or_stencil(format)) {
873      buffer = 0;
874   }
875
876   out_properties->linearTilingFeatures = linear;
877   out_properties->optimalTilingFeatures = tiled;
878   out_properties->bufferFeatures = buffer;
879}
880
881uint32_t
882radv_translate_colorformat(VkFormat format)
883{
884   const struct util_format_description *desc = vk_format_description(format);
885
886#define HAS_SIZE(x, y, z, w)                                                                       \
887   (desc->channel[0].size == (x) && desc->channel[1].size == (y) &&                                \
888    desc->channel[2].size == (z) && desc->channel[3].size == (w))
889
890   if (format == VK_FORMAT_B10G11R11_UFLOAT_PACK32) /* isn't plain */
891      return V_028C70_COLOR_10_11_11;
892
893   if (format == VK_FORMAT_E5B9G9R9_UFLOAT_PACK32)
894      return V_028C70_COLOR_5_9_9_9;
895
896   if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN)
897      return V_028C70_COLOR_INVALID;
898
899   /* hw cannot support mixed formats (except depth/stencil, since
900    * stencil is not written to). */
901   if (desc->is_mixed && desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS)
902      return V_028C70_COLOR_INVALID;
903
904   switch (desc->nr_channels) {
905   case 1:
906      switch (desc->channel[0].size) {
907      case 8:
908         return V_028C70_COLOR_8;
909      case 16:
910         return V_028C70_COLOR_16;
911      case 32:
912         return V_028C70_COLOR_32;
913      }
914      break;
915   case 2:
916      if (desc->channel[0].size == desc->channel[1].size) {
917         switch (desc->channel[0].size) {
918         case 8:
919            return V_028C70_COLOR_8_8;
920         case 16:
921            return V_028C70_COLOR_16_16;
922         case 32:
923            return V_028C70_COLOR_32_32;
924         }
925      } else if (HAS_SIZE(8, 24, 0, 0)) {
926         return V_028C70_COLOR_24_8;
927      } else if (HAS_SIZE(24, 8, 0, 0)) {
928         return V_028C70_COLOR_8_24;
929      }
930      break;
931   case 3:
932      if (HAS_SIZE(5, 6, 5, 0)) {
933         return V_028C70_COLOR_5_6_5;
934      } else if (HAS_SIZE(32, 8, 24, 0)) {
935         return V_028C70_COLOR_X24_8_32_FLOAT;
936      }
937      break;
938   case 4:
939      if (desc->channel[0].size == desc->channel[1].size &&
940          desc->channel[0].size == desc->channel[2].size &&
941          desc->channel[0].size == desc->channel[3].size) {
942         switch (desc->channel[0].size) {
943         case 4:
944            return V_028C70_COLOR_4_4_4_4;
945         case 8:
946            return V_028C70_COLOR_8_8_8_8;
947         case 16:
948            return V_028C70_COLOR_16_16_16_16;
949         case 32:
950            return V_028C70_COLOR_32_32_32_32;
951         }
952      } else if (HAS_SIZE(5, 5, 5, 1)) {
953         return V_028C70_COLOR_1_5_5_5;
954      } else if (HAS_SIZE(1, 5, 5, 5)) {
955         return V_028C70_COLOR_5_5_5_1;
956      } else if (HAS_SIZE(10, 10, 10, 2)) {
957         return V_028C70_COLOR_2_10_10_10;
958      }
959      break;
960   }
961   return V_028C70_COLOR_INVALID;
962}
963
964uint32_t
965radv_colorformat_endian_swap(uint32_t colorformat)
966{
967   if (0 /*SI_BIG_ENDIAN*/) {
968      switch (colorformat) {
969         /* 8-bit buffers. */
970      case V_028C70_COLOR_8:
971         return V_028C70_ENDIAN_NONE;
972
973         /* 16-bit buffers. */
974      case V_028C70_COLOR_5_6_5:
975      case V_028C70_COLOR_1_5_5_5:
976      case V_028C70_COLOR_4_4_4_4:
977      case V_028C70_COLOR_16:
978      case V_028C70_COLOR_8_8:
979         return V_028C70_ENDIAN_8IN16;
980
981         /* 32-bit buffers. */
982      case V_028C70_COLOR_8_8_8_8:
983      case V_028C70_COLOR_2_10_10_10:
984      case V_028C70_COLOR_8_24:
985      case V_028C70_COLOR_24_8:
986      case V_028C70_COLOR_16_16:
987         return V_028C70_ENDIAN_8IN32;
988
989         /* 64-bit buffers. */
990      case V_028C70_COLOR_16_16_16_16:
991         return V_028C70_ENDIAN_8IN16;
992
993      case V_028C70_COLOR_32_32:
994         return V_028C70_ENDIAN_8IN32;
995
996         /* 128-bit buffers. */
997      case V_028C70_COLOR_32_32_32_32:
998         return V_028C70_ENDIAN_8IN32;
999      default:
1000         return V_028C70_ENDIAN_NONE; /* Unsupported. */
1001      }
1002   } else {
1003      return V_028C70_ENDIAN_NONE;
1004   }
1005}
1006
1007uint32_t
1008radv_translate_dbformat(VkFormat format)
1009{
1010   switch (format) {
1011   case VK_FORMAT_D16_UNORM:
1012   case VK_FORMAT_D16_UNORM_S8_UINT:
1013      return V_028040_Z_16;
1014   case VK_FORMAT_D32_SFLOAT:
1015   case VK_FORMAT_D32_SFLOAT_S8_UINT:
1016      return V_028040_Z_32_FLOAT;
1017   default:
1018      return V_028040_Z_INVALID;
1019   }
1020}
1021
1022unsigned
1023radv_translate_colorswap(VkFormat format, bool do_endian_swap)
1024{
1025   const struct util_format_description *desc = vk_format_description(format);
1026
1027#define HAS_SWIZZLE(chan, swz) (desc->swizzle[chan] == PIPE_SWIZZLE_##swz)
1028
1029   if (format == VK_FORMAT_B10G11R11_UFLOAT_PACK32)
1030      return V_028C70_SWAP_STD;
1031
1032   if (format == VK_FORMAT_E5B9G9R9_UFLOAT_PACK32)
1033      return V_028C70_SWAP_STD;
1034
1035   if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN)
1036      return ~0U;
1037
1038   switch (desc->nr_channels) {
1039   case 1:
1040      if (HAS_SWIZZLE(0, X))
1041         return V_028C70_SWAP_STD; /* X___ */
1042      else if (HAS_SWIZZLE(3, X))
1043         return V_028C70_SWAP_ALT_REV; /* ___X */
1044      break;
1045   case 2:
1046      if ((HAS_SWIZZLE(0, X) && HAS_SWIZZLE(1, Y)) || (HAS_SWIZZLE(0, X) && HAS_SWIZZLE(1, NONE)) ||
1047          (HAS_SWIZZLE(0, NONE) && HAS_SWIZZLE(1, Y)))
1048         return V_028C70_SWAP_STD; /* XY__ */
1049      else if ((HAS_SWIZZLE(0, Y) && HAS_SWIZZLE(1, X)) ||
1050               (HAS_SWIZZLE(0, Y) && HAS_SWIZZLE(1, NONE)) ||
1051               (HAS_SWIZZLE(0, NONE) && HAS_SWIZZLE(1, X)))
1052         /* YX__ */
1053         return (do_endian_swap ? V_028C70_SWAP_STD : V_028C70_SWAP_STD_REV);
1054      else if (HAS_SWIZZLE(0, X) && HAS_SWIZZLE(3, Y))
1055         return V_028C70_SWAP_ALT; /* X__Y */
1056      else if (HAS_SWIZZLE(0, Y) && HAS_SWIZZLE(3, X))
1057         return V_028C70_SWAP_ALT_REV; /* Y__X */
1058      break;
1059   case 3:
1060      if (HAS_SWIZZLE(0, X))
1061         return (do_endian_swap ? V_028C70_SWAP_STD_REV : V_028C70_SWAP_STD);
1062      else if (HAS_SWIZZLE(0, Z))
1063         return V_028C70_SWAP_STD_REV; /* ZYX */
1064      break;
1065   case 4:
1066      /* check the middle channels, the 1st and 4th channel can be NONE */
1067      if (HAS_SWIZZLE(1, Y) && HAS_SWIZZLE(2, Z)) {
1068         return V_028C70_SWAP_STD; /* XYZW */
1069      } else if (HAS_SWIZZLE(1, Z) && HAS_SWIZZLE(2, Y)) {
1070         return V_028C70_SWAP_STD_REV; /* WZYX */
1071      } else if (HAS_SWIZZLE(1, Y) && HAS_SWIZZLE(2, X)) {
1072         return V_028C70_SWAP_ALT; /* ZYXW */
1073      } else if (HAS_SWIZZLE(1, Z) && HAS_SWIZZLE(2, W)) {
1074         /* YZWX */
1075         if (desc->is_array)
1076            return V_028C70_SWAP_ALT_REV;
1077         else
1078            return (do_endian_swap ? V_028C70_SWAP_ALT : V_028C70_SWAP_ALT_REV);
1079      }
1080      break;
1081   }
1082   return ~0U;
1083}
1084
1085bool
1086radv_format_pack_clear_color(VkFormat format, uint32_t clear_vals[2], VkClearColorValue *value)
1087{
1088   const struct util_format_description *desc = vk_format_description(format);
1089
1090   if (format == VK_FORMAT_B10G11R11_UFLOAT_PACK32) {
1091      clear_vals[0] = float3_to_r11g11b10f(value->float32);
1092      clear_vals[1] = 0;
1093      return true;
1094   } else if (format == VK_FORMAT_E5B9G9R9_UFLOAT_PACK32) {
1095      clear_vals[0] = float3_to_rgb9e5(value->float32);
1096      clear_vals[1] = 0;
1097      return true;
1098   }
1099
1100   if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) {
1101      fprintf(stderr, "failed to fast clear for non-plain format %d\n", format);
1102      return false;
1103   }
1104
1105   if (!util_is_power_of_two_or_zero(desc->block.bits)) {
1106      fprintf(stderr, "failed to fast clear for NPOT format %d\n", format);
1107      return false;
1108   }
1109
1110   if (desc->block.bits > 64) {
1111      /*
1112       * We have a 128 bits format, check if the first 3 components are the same.
1113       * Every elements has to be 32 bits since we don't support 64-bit formats,
1114       * and we can skip swizzling checks as alpha always comes last for these and
1115       * we do not care about the rest as they have to be the same.
1116       */
1117      if (desc->channel[0].type == UTIL_FORMAT_TYPE_FLOAT) {
1118         if (value->float32[0] != value->float32[1] || value->float32[0] != value->float32[2])
1119            return false;
1120      } else {
1121         if (value->uint32[0] != value->uint32[1] || value->uint32[0] != value->uint32[2])
1122            return false;
1123      }
1124      clear_vals[0] = value->uint32[0];
1125      clear_vals[1] = value->uint32[3];
1126      return true;
1127   }
1128   uint64_t clear_val = 0;
1129
1130   for (unsigned c = 0; c < 4; ++c) {
1131      if (desc->swizzle[c] >= 4)
1132         continue;
1133
1134      const struct util_format_channel_description *channel = &desc->channel[desc->swizzle[c]];
1135      assert(channel->size);
1136
1137      uint64_t v = 0;
1138      if (channel->pure_integer) {
1139         v = value->uint32[c] & ((1ULL << channel->size) - 1);
1140      } else if (channel->normalized) {
1141         if (channel->type == UTIL_FORMAT_TYPE_UNSIGNED && desc->swizzle[c] < 3 &&
1142             desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
1143            assert(channel->size == 8);
1144
1145            v = util_format_linear_float_to_srgb_8unorm(value->float32[c]);
1146         } else {
1147            float f = MIN2(value->float32[c], 1.0f);
1148
1149            if (channel->type == UTIL_FORMAT_TYPE_UNSIGNED) {
1150               f = MAX2(f, 0.0f) * ((1ULL << channel->size) - 1);
1151            } else {
1152               f = MAX2(f, -1.0f) * ((1ULL << (channel->size - 1)) - 1);
1153            }
1154
1155            /* The hardware rounds before conversion. */
1156            if (f > 0)
1157               f += 0.5f;
1158            else
1159               f -= 0.5f;
1160
1161            v = (uint64_t)f;
1162         }
1163      } else if (channel->type == UTIL_FORMAT_TYPE_FLOAT) {
1164         if (channel->size == 32) {
1165            memcpy(&v, &value->float32[c], 4);
1166         } else if (channel->size == 16) {
1167            v = _mesa_float_to_float16_rtz(value->float32[c]);
1168         } else {
1169            fprintf(stderr, "failed to fast clear for unhandled float size in format %d\n", format);
1170            return false;
1171         }
1172      } else {
1173         fprintf(stderr, "failed to fast clear for unhandled component type in format %d\n",
1174                 format);
1175         return false;
1176      }
1177      clear_val |= (v & ((1ULL << channel->size) - 1)) << channel->shift;
1178   }
1179
1180   clear_vals[0] = clear_val;
1181   clear_vals[1] = clear_val >> 32;
1182
1183   return true;
1184}
1185
1186static const struct ac_modifier_options radv_modifier_options = {
1187   .dcc = true,
1188   .dcc_retile = true,
1189};
1190
1191static VkFormatFeatureFlags2KHR
1192radv_get_modifier_flags(struct radv_physical_device *dev, VkFormat format, uint64_t modifier,
1193                        const VkFormatProperties3KHR *props)
1194{
1195   VkFormatFeatureFlags2KHR features;
1196
1197   if (vk_format_is_compressed(format) || vk_format_is_depth_or_stencil(format))
1198      return 0;
1199
1200   if (modifier == DRM_FORMAT_MOD_LINEAR)
1201      features = props->linearTilingFeatures;
1202   else
1203      features = props->optimalTilingFeatures;
1204
1205   if (ac_modifier_has_dcc(modifier)) {
1206      /* Only disable support for STORAGE_IMAGE on modifiers that
1207       * do not support DCC image stores.
1208       */
1209      if (!ac_modifier_supports_dcc_image_stores(modifier) || radv_is_atomic_format_supported(format))
1210         features &= ~VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR;
1211
1212      if (dev->instance->debug_flags & (RADV_DEBUG_NO_DCC | RADV_DEBUG_NO_DISPLAY_DCC))
1213         return 0;
1214   }
1215
1216   return features;
1217}
1218
1219static VkFormatFeatureFlags
1220features2_to_features(VkFormatFeatureFlags2KHR features2)
1221{
1222   return features2 & VK_ALL_FORMAT_FEATURE_FLAG_BITS;
1223}
1224
1225static void
1226radv_list_drm_format_modifiers(struct radv_physical_device *dev, VkFormat format,
1227                               const VkFormatProperties3KHR *format_props,
1228                               VkDrmFormatModifierPropertiesListEXT *mod_list)
1229{
1230   unsigned mod_count;
1231
1232   if (!mod_list)
1233      return;
1234
1235   if (vk_format_is_compressed(format) || vk_format_is_depth_or_stencil(format)) {
1236      mod_list->drmFormatModifierCount = 0;
1237      return;
1238   }
1239
1240   ac_get_supported_modifiers(&dev->rad_info, &radv_modifier_options,
1241                              vk_format_to_pipe_format(format), &mod_count, NULL);
1242   if (!mod_list->pDrmFormatModifierProperties) {
1243      mod_list->drmFormatModifierCount = mod_count;
1244      return;
1245   }
1246
1247   mod_count = MIN2(mod_count, mod_list->drmFormatModifierCount);
1248
1249   uint64_t *mods = malloc(mod_count * sizeof(uint64_t));
1250   if (!mods) {
1251      /* We can't return an error here ... */
1252      mod_list->drmFormatModifierCount = 0;
1253      return;
1254   }
1255   ac_get_supported_modifiers(&dev->rad_info, &radv_modifier_options,
1256                              vk_format_to_pipe_format(format), &mod_count, mods);
1257
1258   mod_list->drmFormatModifierCount = 0;
1259   for (unsigned i = 0; i < mod_count; ++i) {
1260      VkFormatFeatureFlags2KHR features =
1261         radv_get_modifier_flags(dev, format, mods[i], format_props);
1262      unsigned planes = vk_format_get_plane_count(format);
1263      if (planes == 1) {
1264         if (ac_modifier_has_dcc_retile(mods[i]))
1265            planes = 3;
1266         else if (ac_modifier_has_dcc(mods[i]))
1267            planes = 2;
1268      }
1269
1270      if (!features)
1271         continue;
1272
1273      mod_list->pDrmFormatModifierProperties[mod_list->drmFormatModifierCount].drmFormatModifier =
1274         mods[i];
1275      mod_list->pDrmFormatModifierProperties[mod_list->drmFormatModifierCount]
1276         .drmFormatModifierPlaneCount = planes;
1277      mod_list->pDrmFormatModifierProperties[mod_list->drmFormatModifierCount]
1278         .drmFormatModifierTilingFeatures = features2_to_features(features);
1279
1280      ++mod_list->drmFormatModifierCount;
1281   }
1282
1283   free(mods);
1284}
1285
1286static void
1287radv_list_drm_format_modifiers_2(struct radv_physical_device *dev, VkFormat format,
1288                                 const VkFormatProperties3KHR *format_props,
1289                                 VkDrmFormatModifierPropertiesList2EXT *mod_list)
1290{
1291   unsigned mod_count;
1292
1293   if (!mod_list)
1294      return;
1295
1296   if (vk_format_is_compressed(format) || vk_format_is_depth_or_stencil(format)) {
1297      mod_list->drmFormatModifierCount = 0;
1298      return;
1299   }
1300
1301   ac_get_supported_modifiers(&dev->rad_info, &radv_modifier_options,
1302                              vk_format_to_pipe_format(format), &mod_count, NULL);
1303   if (!mod_list->pDrmFormatModifierProperties) {
1304      mod_list->drmFormatModifierCount = mod_count;
1305      return;
1306   }
1307
1308   mod_count = MIN2(mod_count, mod_list->drmFormatModifierCount);
1309
1310   uint64_t *mods = malloc(mod_count * sizeof(uint64_t));
1311   if (!mods) {
1312      /* We can't return an error here ... */
1313      mod_list->drmFormatModifierCount = 0;
1314      return;
1315   }
1316   ac_get_supported_modifiers(&dev->rad_info, &radv_modifier_options,
1317                              vk_format_to_pipe_format(format), &mod_count, mods);
1318
1319   mod_list->drmFormatModifierCount = 0;
1320   for (unsigned i = 0; i < mod_count; ++i) {
1321      VkFormatFeatureFlags2KHR features =
1322         radv_get_modifier_flags(dev, format, mods[i], format_props);
1323      unsigned planes = vk_format_get_plane_count(format);
1324      if (planes == 1) {
1325         if (ac_modifier_has_dcc_retile(mods[i]))
1326            planes = 3;
1327         else if (ac_modifier_has_dcc(mods[i]))
1328            planes = 2;
1329      }
1330
1331      if (!features)
1332         continue;
1333
1334      mod_list->pDrmFormatModifierProperties[mod_list->drmFormatModifierCount].drmFormatModifier =
1335         mods[i];
1336      mod_list->pDrmFormatModifierProperties[mod_list->drmFormatModifierCount]
1337         .drmFormatModifierPlaneCount = planes;
1338      mod_list->pDrmFormatModifierProperties[mod_list->drmFormatModifierCount]
1339         .drmFormatModifierTilingFeatures = features;
1340
1341      ++mod_list->drmFormatModifierCount;
1342   }
1343
1344   free(mods);
1345}
1346
1347static VkResult
1348radv_check_modifier_support(struct radv_physical_device *dev,
1349                            const VkPhysicalDeviceImageFormatInfo2 *info,
1350                            VkImageFormatProperties *props, VkFormat format, uint64_t modifier)
1351{
1352   uint32_t max_width, max_height;
1353
1354   if (info->type != VK_IMAGE_TYPE_2D)
1355      return VK_ERROR_FORMAT_NOT_SUPPORTED;
1356
1357   /* We did not add modifiers for sparse textures. */
1358   if (info->flags & (VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT |
1359                      VK_IMAGE_CREATE_SPARSE_ALIASED_BIT))
1360      return VK_ERROR_FORMAT_NOT_SUPPORTED;
1361
1362   /*
1363    * Need to check the modifier is supported in general:
1364    * "If the drmFormatModifier is incompatible with the parameters specified
1365    * in VkPhysicalDeviceImageFormatInfo2 and its pNext chain, then
1366    * vkGetPhysicalDeviceImageFormatProperties2 returns VK_ERROR_FORMAT_NOT_SUPPORTED.
1367    * The implementation must support the query of any drmFormatModifier,
1368    * including unknown and invalid modifier values."
1369    */
1370   VkDrmFormatModifierPropertiesListEXT mod_list = {
1371      .sType = VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
1372   };
1373
1374   VkFormatProperties2 format_props2 = {.sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,
1375                                        .pNext = &mod_list};
1376
1377   radv_GetPhysicalDeviceFormatProperties2(radv_physical_device_to_handle(dev), format,
1378                                           &format_props2);
1379
1380   if (!mod_list.drmFormatModifierCount)
1381      return VK_ERROR_FORMAT_NOT_SUPPORTED;
1382
1383   mod_list.pDrmFormatModifierProperties =
1384      calloc(mod_list.drmFormatModifierCount, sizeof(*mod_list.pDrmFormatModifierProperties));
1385   if (!mod_list.pDrmFormatModifierProperties)
1386      return VK_ERROR_OUT_OF_HOST_MEMORY;
1387
1388   radv_GetPhysicalDeviceFormatProperties2(radv_physical_device_to_handle(dev), format,
1389                                           &format_props2);
1390
1391   bool found = false;
1392   for (uint32_t i = 0; i < mod_list.drmFormatModifierCount && !found; ++i)
1393      if (mod_list.pDrmFormatModifierProperties[i].drmFormatModifier == modifier)
1394         found = true;
1395
1396   free(mod_list.pDrmFormatModifierProperties);
1397
1398   if (!found)
1399      return VK_ERROR_FORMAT_NOT_SUPPORTED;
1400
1401   bool need_dcc_sign_reinterpret = false;
1402   if (ac_modifier_has_dcc(modifier) &&
1403       !radv_are_formats_dcc_compatible(dev, info->pNext, format, info->flags,
1404                                        &need_dcc_sign_reinterpret) &&
1405       !need_dcc_sign_reinterpret)
1406      return VK_ERROR_FORMAT_NOT_SUPPORTED;
1407
1408   /* We can expand this as needed and implemented but there is not much demand
1409    * for more. */
1410   if (ac_modifier_has_dcc(modifier)) {
1411      props->maxMipLevels = 1;
1412      props->maxArrayLayers = 1;
1413   }
1414
1415   ac_modifier_max_extent(&dev->rad_info, modifier, &max_width, &max_height);
1416   props->maxExtent.width = MIN2(props->maxExtent.width, max_width);
1417   props->maxExtent.height = MIN2(props->maxExtent.width, max_height);
1418
1419   /* We don't support MSAA for modifiers */
1420   props->sampleCounts &= VK_SAMPLE_COUNT_1_BIT;
1421   return VK_SUCCESS;
1422}
1423
1424void
1425radv_GetPhysicalDeviceFormatProperties2(VkPhysicalDevice physicalDevice, VkFormat format,
1426                                        VkFormatProperties2 *pFormatProperties)
1427{
1428   RADV_FROM_HANDLE(radv_physical_device, physical_device, physicalDevice);
1429   VkFormatProperties3KHR format_props;
1430
1431   radv_physical_device_get_format_properties(physical_device, format, &format_props);
1432
1433   pFormatProperties->formatProperties.linearTilingFeatures =
1434      features2_to_features(format_props.linearTilingFeatures);
1435   pFormatProperties->formatProperties.optimalTilingFeatures =
1436      features2_to_features(format_props.optimalTilingFeatures);
1437   pFormatProperties->formatProperties.bufferFeatures =
1438      features2_to_features(format_props.bufferFeatures);
1439
1440   VkFormatProperties3KHR *format_props_extended =
1441      vk_find_struct(pFormatProperties, FORMAT_PROPERTIES_3_KHR);
1442   if (format_props_extended) {
1443      format_props_extended->linearTilingFeatures = format_props.linearTilingFeatures;
1444      format_props_extended->optimalTilingFeatures = format_props.optimalTilingFeatures;
1445      format_props_extended->bufferFeatures = format_props.bufferFeatures;
1446   }
1447
1448   radv_list_drm_format_modifiers(
1449      physical_device, format, &format_props,
1450      vk_find_struct(pFormatProperties, DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT));
1451   radv_list_drm_format_modifiers_2(
1452      physical_device, format, &format_props,
1453      vk_find_struct(pFormatProperties, DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT));
1454}
1455
1456static VkResult
1457radv_get_image_format_properties(struct radv_physical_device *physical_device,
1458                                 const VkPhysicalDeviceImageFormatInfo2 *info, VkFormat format,
1459                                 VkImageFormatProperties *pImageFormatProperties)
1460
1461{
1462   VkFormatProperties3KHR format_props;
1463   VkFormatFeatureFlags2KHR format_feature_flags;
1464   VkExtent3D maxExtent;
1465   uint32_t maxMipLevels;
1466   uint32_t maxArraySize;
1467   VkSampleCountFlags sampleCounts = VK_SAMPLE_COUNT_1_BIT;
1468   const struct util_format_description *desc = vk_format_description(format);
1469   enum chip_class chip_class = physical_device->rad_info.chip_class;
1470   VkImageTiling tiling = info->tiling;
1471   const VkPhysicalDeviceImageDrmFormatModifierInfoEXT *mod_info =
1472      vk_find_struct_const(info->pNext, PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT);
1473   VkResult result = VK_ERROR_FORMAT_NOT_SUPPORTED;
1474
1475   radv_physical_device_get_format_properties(physical_device, format, &format_props);
1476   if (tiling == VK_IMAGE_TILING_LINEAR) {
1477      format_feature_flags = format_props.linearTilingFeatures;
1478   } else if (tiling == VK_IMAGE_TILING_OPTIMAL) {
1479      format_feature_flags = format_props.optimalTilingFeatures;
1480   } else if (tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
1481      format_feature_flags = radv_get_modifier_flags(physical_device, format,
1482                                                     mod_info->drmFormatModifier, &format_props);
1483   } else {
1484      unreachable("bad VkImageTiling");
1485   }
1486
1487   if (format_feature_flags == 0)
1488      goto unsupported;
1489
1490   if (info->type != VK_IMAGE_TYPE_2D && vk_format_is_depth_or_stencil(format))
1491      goto unsupported;
1492
1493   switch (info->type) {
1494   default:
1495      unreachable("bad vkimage type\n");
1496   case VK_IMAGE_TYPE_1D:
1497      maxExtent.width = 16384;
1498      maxExtent.height = 1;
1499      maxExtent.depth = 1;
1500      maxMipLevels = 15; /* log2(maxWidth) + 1 */
1501      maxArraySize = chip_class >= GFX10 ? 8192 : 2048;
1502      break;
1503   case VK_IMAGE_TYPE_2D:
1504      maxExtent.width = 16384;
1505      maxExtent.height = 16384;
1506      maxExtent.depth = 1;
1507      maxMipLevels = 15; /* log2(maxWidth) + 1 */
1508      maxArraySize = chip_class >= GFX10 ? 8192 : 2048;
1509      break;
1510   case VK_IMAGE_TYPE_3D:
1511      if (chip_class >= GFX10) {
1512         maxExtent.width = 8192;
1513         maxExtent.height = 8192;
1514         maxExtent.depth = 8192;
1515      } else {
1516         maxExtent.width = 2048;
1517         maxExtent.height = 2048;
1518         maxExtent.depth = 2048;
1519      }
1520      maxMipLevels = util_logbase2(maxExtent.width) + 1;
1521      maxArraySize = 1;
1522      break;
1523   }
1524
1525   if (desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED) {
1526      /* Might be able to support but the entire format support is
1527       * messy, so taking the lazy way out. */
1528      maxArraySize = 1;
1529   }
1530
1531   if (tiling == VK_IMAGE_TILING_OPTIMAL && info->type == VK_IMAGE_TYPE_2D &&
1532       (format_feature_flags & (VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR |
1533                                VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR)) &&
1534       !(info->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) &&
1535       !(info->usage & VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR)) {
1536      sampleCounts |= VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT | VK_SAMPLE_COUNT_8_BIT;
1537   }
1538
1539   if (tiling == VK_IMAGE_TILING_LINEAR &&
1540       (format == VK_FORMAT_R32G32B32_SFLOAT || format == VK_FORMAT_R32G32B32_SINT ||
1541        format == VK_FORMAT_R32G32B32_UINT)) {
1542      /* R32G32B32 is a weird format and the driver currently only
1543       * supports the barely minimum.
1544       * TODO: Implement more if we really need to.
1545       */
1546      if (info->type == VK_IMAGE_TYPE_3D)
1547         goto unsupported;
1548      maxArraySize = 1;
1549      maxMipLevels = 1;
1550   }
1551
1552   /* We can't create 3d compressed 128bpp images that can be rendered to on GFX9 */
1553   if (physical_device->rad_info.chip_class >= GFX9 && info->type == VK_IMAGE_TYPE_3D &&
1554       vk_format_get_blocksizebits(format) == 128 && vk_format_is_compressed(format) &&
1555       (info->flags & VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT) &&
1556       ((info->flags & VK_IMAGE_CREATE_EXTENDED_USAGE_BIT) ||
1557        (info->usage & VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR))) {
1558      goto unsupported;
1559   }
1560
1561   if (info->usage & VK_IMAGE_USAGE_SAMPLED_BIT) {
1562      if (!(format_feature_flags & VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR)) {
1563         goto unsupported;
1564      }
1565   }
1566
1567   if (info->usage & VK_IMAGE_USAGE_STORAGE_BIT) {
1568      if (!(format_feature_flags & VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR)) {
1569         goto unsupported;
1570      }
1571   }
1572
1573   if (info->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
1574      if (!(format_feature_flags & VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR)) {
1575         goto unsupported;
1576      }
1577   }
1578
1579   if (info->usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
1580      if (!(format_feature_flags & VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR)) {
1581         goto unsupported;
1582      }
1583   }
1584
1585   if (info->usage & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) {
1586      if (!(format_feature_flags & VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR)) {
1587         goto unsupported;
1588      }
1589   }
1590
1591   if (info->usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT) {
1592      if (!(format_feature_flags & VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR)) {
1593         goto unsupported;
1594      }
1595   }
1596
1597   if (info->usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) {
1598      if (!(format_feature_flags & (VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR |
1599                                    VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR))) {
1600         goto unsupported;
1601      }
1602   }
1603
1604   /* Sparse resources with multi-planar formats are unsupported. */
1605   if (info->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
1606      if (vk_format_get_plane_count(format) > 1)
1607         goto unsupported;
1608   }
1609
1610   if (info->flags & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) {
1611      /* Sparse textures are only supported on GFX8+. */
1612      if (physical_device->rad_info.chip_class < GFX8)
1613         goto unsupported;
1614
1615      if (vk_format_get_plane_count(format) > 1 || info->type != VK_IMAGE_TYPE_2D ||
1616          info->tiling != VK_IMAGE_TILING_OPTIMAL || vk_format_is_depth_or_stencil(format))
1617         goto unsupported;
1618   }
1619
1620   *pImageFormatProperties = (VkImageFormatProperties){
1621      .maxExtent = maxExtent,
1622      .maxMipLevels = maxMipLevels,
1623      .maxArrayLayers = maxArraySize,
1624      .sampleCounts = sampleCounts,
1625
1626      /* FINISHME: Accurately calculate
1627       * VkImageFormatProperties::maxResourceSize.
1628       */
1629      .maxResourceSize = UINT32_MAX,
1630   };
1631
1632   if (mod_info) {
1633      result = radv_check_modifier_support(physical_device, info, pImageFormatProperties, format,
1634                                           mod_info->drmFormatModifier);
1635      if (result != VK_SUCCESS)
1636         goto unsupported;
1637   }
1638
1639   return VK_SUCCESS;
1640unsupported:
1641   *pImageFormatProperties = (VkImageFormatProperties){
1642      .maxExtent = {0, 0, 0},
1643      .maxMipLevels = 0,
1644      .maxArrayLayers = 0,
1645      .sampleCounts = 0,
1646      .maxResourceSize = 0,
1647   };
1648
1649   return result;
1650}
1651
1652static void
1653get_external_image_format_properties(struct radv_physical_device *physical_device,
1654                                     const VkPhysicalDeviceImageFormatInfo2 *pImageFormatInfo,
1655                                     VkExternalMemoryHandleTypeFlagBits handleType,
1656                                     VkExternalMemoryProperties *external_properties,
1657                                     VkImageFormatProperties *format_properties)
1658{
1659   VkExternalMemoryFeatureFlagBits flags = 0;
1660   VkExternalMemoryHandleTypeFlags export_flags = 0;
1661   VkExternalMemoryHandleTypeFlags compat_flags = 0;
1662
1663   if (pImageFormatInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT)
1664      return;
1665
1666   switch (handleType) {
1667   case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT:
1668      if (pImageFormatInfo->tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT)
1669         break;
1670
1671      switch (pImageFormatInfo->type) {
1672      case VK_IMAGE_TYPE_2D:
1673         flags =
1674            VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
1675
1676         compat_flags = export_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
1677         break;
1678      default:
1679         break;
1680      }
1681      break;
1682   case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
1683      switch (pImageFormatInfo->type) {
1684      case VK_IMAGE_TYPE_2D:
1685         flags =
1686            VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
1687         if (pImageFormatInfo->tiling != VK_IMAGE_TILING_LINEAR)
1688            flags |= VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT;
1689
1690         compat_flags = export_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
1691         break;
1692      default:
1693         break;
1694      }
1695      break;
1696   case VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID:
1697      if (!physical_device->vk.supported_extensions.ANDROID_external_memory_android_hardware_buffer)
1698         break;
1699
1700      if (!radv_android_gralloc_supports_format(pImageFormatInfo->format, pImageFormatInfo->usage))
1701         break;
1702
1703      if (pImageFormatInfo->type != VK_IMAGE_TYPE_2D)
1704         break;
1705
1706      format_properties->maxMipLevels = MIN2(1, format_properties->maxMipLevels);
1707      format_properties->maxArrayLayers = MIN2(1, format_properties->maxArrayLayers);
1708      format_properties->sampleCounts &= VK_SAMPLE_COUNT_1_BIT;
1709
1710      flags = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
1711      if (pImageFormatInfo->tiling != VK_IMAGE_TILING_LINEAR)
1712         flags |= VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT;
1713
1714      compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
1715      break;
1716   case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
1717      flags = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
1718      compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT;
1719      break;
1720   default:
1721      break;
1722   }
1723
1724   *external_properties = (VkExternalMemoryProperties){
1725      .externalMemoryFeatures = flags,
1726      .exportFromImportedHandleTypes = export_flags,
1727      .compatibleHandleTypes = compat_flags,
1728   };
1729}
1730
1731VkResult
1732radv_GetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice,
1733                                             const VkPhysicalDeviceImageFormatInfo2 *base_info,
1734                                             VkImageFormatProperties2 *base_props)
1735{
1736   RADV_FROM_HANDLE(radv_physical_device, physical_device, physicalDevice);
1737   const VkPhysicalDeviceExternalImageFormatInfo *external_info = NULL;
1738   VkExternalImageFormatProperties *external_props = NULL;
1739   struct VkAndroidHardwareBufferUsageANDROID *android_usage = NULL;
1740   VkSamplerYcbcrConversionImageFormatProperties *ycbcr_props = NULL;
1741   VkTextureLODGatherFormatPropertiesAMD *texture_lod_props = NULL;
1742   VkResult result;
1743   VkFormat format = radv_select_android_external_format(base_info->pNext, base_info->format);
1744
1745   result = radv_get_image_format_properties(physical_device, base_info, format,
1746                                             &base_props->imageFormatProperties);
1747   if (result != VK_SUCCESS)
1748      return result;
1749
1750   /* Extract input structs */
1751   vk_foreach_struct_const(s, base_info->pNext)
1752   {
1753      switch (s->sType) {
1754      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
1755         external_info = (const void *)s;
1756         break;
1757      default:
1758         break;
1759      }
1760   }
1761
1762   /* Extract output structs */
1763   vk_foreach_struct(s, base_props->pNext)
1764   {
1765      switch (s->sType) {
1766      case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
1767         external_props = (void *)s;
1768         break;
1769      case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
1770         ycbcr_props = (void *)s;
1771         break;
1772      case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
1773         android_usage = (void *)s;
1774         break;
1775      case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
1776         texture_lod_props = (void *)s;
1777         break;
1778      default:
1779         break;
1780      }
1781   }
1782
1783   bool ahb_supported =
1784      physical_device->vk.supported_extensions.ANDROID_external_memory_android_hardware_buffer;
1785   if (android_usage && ahb_supported) {
1786#if RADV_SUPPORT_ANDROID_HARDWARE_BUFFER
1787      android_usage->androidHardwareBufferUsage =
1788         radv_ahb_usage_from_vk_usage(base_info->flags, base_info->usage);
1789#endif
1790   }
1791
1792   /* From the Vulkan 1.0.97 spec:
1793    *
1794    *    If handleType is 0, vkGetPhysicalDeviceImageFormatProperties2 will
1795    *    behave as if VkPhysicalDeviceExternalImageFormatInfo was not
1796    *    present and VkExternalImageFormatProperties will be ignored.
1797    */
1798   if (external_info && external_info->handleType != 0) {
1799      get_external_image_format_properties(physical_device, base_info, external_info->handleType,
1800                                           &external_props->externalMemoryProperties,
1801                                           &base_props->imageFormatProperties);
1802      if (!external_props->externalMemoryProperties.externalMemoryFeatures) {
1803         /* From the Vulkan 1.0.97 spec:
1804          *
1805          *    If handleType is not compatible with the [parameters] specified
1806          *    in VkPhysicalDeviceImageFormatInfo2, then
1807          *    vkGetPhysicalDeviceImageFormatProperties2 returns
1808          *    VK_ERROR_FORMAT_NOT_SUPPORTED.
1809          */
1810         result = vk_errorf(physical_device, VK_ERROR_FORMAT_NOT_SUPPORTED,
1811                            "unsupported VkExternalMemoryTypeFlagBitsKHR 0x%x",
1812                            external_info->handleType);
1813         goto fail;
1814      }
1815   }
1816
1817   if (ycbcr_props) {
1818      ycbcr_props->combinedImageSamplerDescriptorCount = vk_format_get_plane_count(format);
1819   }
1820
1821   if (texture_lod_props) {
1822      if (physical_device->rad_info.chip_class >= GFX9) {
1823         texture_lod_props->supportsTextureGatherLODBiasAMD = true;
1824      } else {
1825         texture_lod_props->supportsTextureGatherLODBiasAMD = !vk_format_is_int(format);
1826      }
1827   }
1828
1829   return VK_SUCCESS;
1830
1831fail:
1832   if (result == VK_ERROR_FORMAT_NOT_SUPPORTED) {
1833      /* From the Vulkan 1.0.97 spec:
1834       *
1835       *    If the combination of parameters to
1836       *    vkGetPhysicalDeviceImageFormatProperties2 is not supported by
1837       *    the implementation for use in vkCreateImage, then all members of
1838       *    imageFormatProperties will be filled with zero.
1839       */
1840      base_props->imageFormatProperties = (VkImageFormatProperties){0};
1841   }
1842
1843   return result;
1844}
1845
1846static void
1847fill_sparse_image_format_properties(struct radv_physical_device *pdev, VkFormat format,
1848                                    VkSparseImageFormatProperties *prop)
1849{
1850   prop->aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1851   prop->flags = 0;
1852
1853   /* On GFX8 we first subdivide by level and then layer, leading to a single
1854    * miptail. On GFX9+ we first subdivide by layer and then level which results
1855    * in a miptail per layer. */
1856   if (pdev->rad_info.chip_class < GFX9)
1857      prop->flags |= VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT;
1858
1859   /* This assumes the sparse image tile size is always 64 KiB (1 << 16) */
1860   unsigned l2_size = 16 - util_logbase2(vk_format_get_blocksize(format));
1861   unsigned w = (1u << ((l2_size + 1) / 2)) * vk_format_get_blockwidth(format);
1862   unsigned h = (1u << (l2_size / 2)) * vk_format_get_blockheight(format);
1863
1864   prop->imageGranularity = (VkExtent3D){w, h, 1};
1865}
1866
1867void
1868radv_GetPhysicalDeviceSparseImageFormatProperties2(
1869   VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2 *pFormatInfo,
1870   uint32_t *pPropertyCount, VkSparseImageFormatProperties2 *pProperties)
1871{
1872   RADV_FROM_HANDLE(radv_physical_device, pdev, physicalDevice);
1873   VkResult result;
1874
1875   if (pFormatInfo->samples > VK_SAMPLE_COUNT_1_BIT) {
1876      *pPropertyCount = 0;
1877      return;
1878   }
1879
1880   const VkPhysicalDeviceImageFormatInfo2 fmt_info = {
1881      .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2,
1882      .format = pFormatInfo->format,
1883      .type = pFormatInfo->type,
1884      .tiling = pFormatInfo->tiling,
1885      .usage = pFormatInfo->usage,
1886      .flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT};
1887
1888   VkImageFormatProperties fmt_props;
1889   result = radv_get_image_format_properties(pdev, &fmt_info, pFormatInfo->format, &fmt_props);
1890   if (result != VK_SUCCESS) {
1891      *pPropertyCount = 0;
1892      return;
1893   }
1894
1895   VK_OUTARRAY_MAKE_TYPED(VkSparseImageFormatProperties2, out, pProperties, pPropertyCount);
1896
1897   vk_outarray_append_typed(VkSparseImageFormatProperties2, &out, prop)
1898   {
1899      fill_sparse_image_format_properties(pdev, pFormatInfo->format, &prop->properties);
1900   };
1901}
1902
1903void
1904radv_GetImageSparseMemoryRequirements2(VkDevice _device,
1905                                       const VkImageSparseMemoryRequirementsInfo2 *pInfo,
1906                                       uint32_t *pSparseMemoryRequirementCount,
1907                                       VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements)
1908{
1909   RADV_FROM_HANDLE(radv_device, device, _device);
1910   RADV_FROM_HANDLE(radv_image, image, pInfo->image);
1911
1912   if (!(image->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
1913      *pSparseMemoryRequirementCount = 0;
1914      return;
1915   }
1916
1917   VK_OUTARRAY_MAKE_TYPED(VkSparseImageMemoryRequirements2, out, pSparseMemoryRequirements,
1918                          pSparseMemoryRequirementCount);
1919
1920   vk_outarray_append_typed(VkSparseImageMemoryRequirements2, &out, req)
1921   {
1922      fill_sparse_image_format_properties(device->physical_device, image->vk_format,
1923                                          &req->memoryRequirements.formatProperties);
1924      req->memoryRequirements.imageMipTailFirstLod = image->planes[0].surface.first_mip_tail_level;
1925
1926      if (req->memoryRequirements.imageMipTailFirstLod < image->info.levels) {
1927         if (device->physical_device->rad_info.chip_class >= GFX9) {
1928            /* The tail is always a single tile per layer. */
1929            req->memoryRequirements.imageMipTailSize = 65536;
1930            req->memoryRequirements.imageMipTailOffset =
1931               image->planes[0]
1932                  .surface.u.gfx9.prt_level_offset[req->memoryRequirements.imageMipTailFirstLod] &
1933               ~65535;
1934            req->memoryRequirements.imageMipTailStride =
1935               image->planes[0].surface.u.gfx9.surf_slice_size;
1936         } else {
1937            req->memoryRequirements.imageMipTailOffset =
1938               (uint64_t)image->planes[0]
1939                  .surface.u.legacy.level[req->memoryRequirements.imageMipTailFirstLod]
1940                  .offset_256B * 256;
1941            req->memoryRequirements.imageMipTailSize =
1942               image->size - req->memoryRequirements.imageMipTailOffset;
1943            req->memoryRequirements.imageMipTailStride = 0;
1944         }
1945      } else {
1946         req->memoryRequirements.imageMipTailSize = 0;
1947         req->memoryRequirements.imageMipTailOffset = 0;
1948         req->memoryRequirements.imageMipTailStride = 0;
1949      }
1950   };
1951}
1952
1953void
1954radv_GetDeviceImageSparseMemoryRequirementsKHR(VkDevice device,
1955                                               const VkDeviceImageMemoryRequirementsKHR* pInfo,
1956                                               uint32_t *pSparseMemoryRequirementCount,
1957                                               VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements)
1958{
1959   UNUSED VkResult result;
1960   VkImage image;
1961
1962   /* Determining the image size/alignment require to create a surface, which is complicated without
1963    * creating an image.
1964    * TODO: Avoid creating an image.
1965    */
1966   result = radv_CreateImage(device, pInfo->pCreateInfo, NULL, &image);
1967   assert(result == VK_SUCCESS);
1968
1969   VkImageSparseMemoryRequirementsInfo2 info2 = {
1970      .sType = VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2,
1971      .image = image,
1972   };
1973
1974   radv_GetImageSparseMemoryRequirements2(device, &info2, pSparseMemoryRequirementCount,
1975                                          pSparseMemoryRequirements);
1976
1977   radv_DestroyImage(device, image, NULL);
1978}
1979
1980void
1981radv_GetPhysicalDeviceExternalBufferProperties(
1982   VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo,
1983   VkExternalBufferProperties *pExternalBufferProperties)
1984{
1985   VkExternalMemoryFeatureFlagBits flags = 0;
1986   VkExternalMemoryHandleTypeFlags export_flags = 0;
1987   VkExternalMemoryHandleTypeFlags compat_flags = 0;
1988   switch (pExternalBufferInfo->handleType) {
1989   case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
1990   case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT:
1991      flags = VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
1992      compat_flags = export_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT |
1993                                    VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
1994      break;
1995   case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
1996      flags = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
1997      compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT;
1998      break;
1999   default:
2000      break;
2001   }
2002   pExternalBufferProperties->externalMemoryProperties = (VkExternalMemoryProperties){
2003      .externalMemoryFeatures = flags,
2004      .exportFromImportedHandleTypes = export_flags,
2005      .compatibleHandleTypes = compat_flags,
2006   };
2007}
2008
2009/* DCC channel type categories within which formats can be reinterpreted
2010 * while keeping the same DCC encoding. The swizzle must also match. */
2011enum dcc_channel_type {
2012   dcc_channel_float,
2013   dcc_channel_uint,
2014   dcc_channel_sint,
2015   dcc_channel_incompatible,
2016};
2017
2018/* Return the type of DCC encoding. */
2019static void
2020radv_get_dcc_channel_type(const struct util_format_description *desc, enum dcc_channel_type *type,
2021                          unsigned *size)
2022{
2023   int i;
2024
2025   /* Find the first non-void channel. */
2026   for (i = 0; i < desc->nr_channels; i++)
2027      if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID)
2028         break;
2029   if (i == desc->nr_channels) {
2030      *type = dcc_channel_incompatible;
2031      return;
2032   }
2033
2034   switch (desc->channel[i].size) {
2035   case 32:
2036   case 16:
2037   case 10:
2038   case 8:
2039      *size = desc->channel[i].size;
2040      if (desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT)
2041         *type = dcc_channel_float;
2042      else if (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED)
2043         *type = dcc_channel_uint;
2044      else
2045         *type = dcc_channel_sint;
2046      break;
2047   default:
2048      *type = dcc_channel_incompatible;
2049      break;
2050   }
2051}
2052
2053/* Return if it's allowed to reinterpret one format as another with DCC enabled. */
2054bool
2055radv_dcc_formats_compatible(VkFormat format1, VkFormat format2, bool *sign_reinterpret)
2056{
2057   const struct util_format_description *desc1, *desc2;
2058   enum dcc_channel_type type1, type2;
2059   unsigned size1, size2;
2060   int i;
2061
2062   if (format1 == format2)
2063      return true;
2064
2065   desc1 = vk_format_description(format1);
2066   desc2 = vk_format_description(format2);
2067
2068   if (desc1->nr_channels != desc2->nr_channels)
2069      return false;
2070
2071   /* Swizzles must be the same. */
2072   for (i = 0; i < desc1->nr_channels; i++)
2073      if (desc1->swizzle[i] <= PIPE_SWIZZLE_W && desc2->swizzle[i] <= PIPE_SWIZZLE_W &&
2074          desc1->swizzle[i] != desc2->swizzle[i])
2075         return false;
2076
2077   radv_get_dcc_channel_type(desc1, &type1, &size1);
2078   radv_get_dcc_channel_type(desc2, &type2, &size2);
2079
2080   if (type1 == dcc_channel_incompatible || type2 == dcc_channel_incompatible ||
2081       (type1 == dcc_channel_float) != (type2 == dcc_channel_float) || size1 != size2)
2082      return false;
2083
2084   if (type1 != type2)
2085      *sign_reinterpret = true;
2086
2087   return true;
2088}
2089