1 /*
2  * Copyright © 2021 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  */
23 
24 #include "vk_image.h"
25 
26 #include <vulkan/vulkan_android.h>
27 
28 #ifndef _WIN32
29 #include <drm-uapi/drm_fourcc.h>
30 #endif
31 
32 #include "vk_alloc.h"
33 #include "vk_common_entrypoints.h"
34 #include "vk_device.h"
35 #include "vk_format.h"
36 #include "vk_util.h"
37 #include "vulkan/wsi/wsi_common.h"
38 
39 static VkExtent3D
sanitize_image_extent(const VkImageType imageType,const VkExtent3D imageExtent)40 sanitize_image_extent(const VkImageType imageType,
41                       const VkExtent3D imageExtent)
42 {
43    switch (imageType) {
44    case VK_IMAGE_TYPE_1D:
45       return (VkExtent3D) { imageExtent.width, 1, 1 };
46    case VK_IMAGE_TYPE_2D:
47       return (VkExtent3D) { imageExtent.width, imageExtent.height, 1 };
48    case VK_IMAGE_TYPE_3D:
49       return imageExtent;
50    default:
51       unreachable("invalid image type");
52    }
53 }
54 
55 void
vk_image_init(struct vk_device * device,struct vk_image * image,const VkImageCreateInfo * pCreateInfo)56 vk_image_init(struct vk_device *device,
57               struct vk_image *image,
58               const VkImageCreateInfo *pCreateInfo)
59 {
60    vk_object_base_init(device, &image->base, VK_OBJECT_TYPE_IMAGE);
61 
62    assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO);
63    assert(pCreateInfo->mipLevels > 0);
64    assert(pCreateInfo->arrayLayers > 0);
65    assert(pCreateInfo->samples > 0);
66    assert(pCreateInfo->extent.width > 0);
67    assert(pCreateInfo->extent.height > 0);
68    assert(pCreateInfo->extent.depth > 0);
69 
70    if (pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT)
71       assert(pCreateInfo->imageType == VK_IMAGE_TYPE_2D);
72    if (pCreateInfo->flags & VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT)
73       assert(pCreateInfo->imageType == VK_IMAGE_TYPE_3D);
74 
75    image->create_flags = pCreateInfo->flags;
76    image->image_type = pCreateInfo->imageType;
77    vk_image_set_format(image, pCreateInfo->format);
78    image->extent = sanitize_image_extent(pCreateInfo->imageType,
79                                          pCreateInfo->extent);
80    image->mip_levels = pCreateInfo->mipLevels;
81    image->array_layers = pCreateInfo->arrayLayers;
82    image->samples = pCreateInfo->samples;
83    image->tiling = pCreateInfo->tiling;
84    image->usage = pCreateInfo->usage;
85 
86    if (image->aspects & VK_IMAGE_ASPECT_STENCIL_BIT) {
87       const VkImageStencilUsageCreateInfoEXT *stencil_usage_info =
88          vk_find_struct_const(pCreateInfo->pNext,
89                               IMAGE_STENCIL_USAGE_CREATE_INFO_EXT);
90       image->stencil_usage =
91          stencil_usage_info ? stencil_usage_info->stencilUsage :
92                               pCreateInfo->usage;
93    } else {
94       image->stencil_usage = 0;
95    }
96 
97    const VkExternalMemoryImageCreateInfo *ext_mem_info =
98       vk_find_struct_const(pCreateInfo->pNext, EXTERNAL_MEMORY_IMAGE_CREATE_INFO);
99    if (ext_mem_info)
100       image->external_handle_types = ext_mem_info->handleTypes;
101    else
102       image->external_handle_types = 0;
103 
104    const struct wsi_image_create_info *wsi_info =
105       vk_find_struct_const(pCreateInfo->pNext, WSI_IMAGE_CREATE_INFO_MESA);
106    image->wsi_legacy_scanout = wsi_info && wsi_info->scanout;
107 
108 #ifndef _WIN32
109    image->drm_format_mod = ((1ULL << 56) - 1) /* DRM_FORMAT_MOD_INVALID */;
110 #endif
111 
112 #ifdef ANDROID
113    const VkExternalFormatANDROID *ext_format =
114       vk_find_struct_const(pCreateInfo->pNext, EXTERNAL_FORMAT_ANDROID);
115    if (ext_format && ext_format->externalFormat != 0) {
116       assert(image->format == VK_FORMAT_UNDEFINED);
117       assert(image->external_handle_types &
118              VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID);
119       image->android_external_format = ext_format->externalFormat;
120    } else {
121       image->android_external_format = 0;
122    }
123 #endif
124 }
125 
126 void *
vk_image_create(struct vk_device * device,const VkImageCreateInfo * pCreateInfo,const VkAllocationCallbacks * alloc,size_t size)127 vk_image_create(struct vk_device *device,
128                 const VkImageCreateInfo *pCreateInfo,
129                 const VkAllocationCallbacks *alloc,
130                 size_t size)
131 {
132    struct vk_image *image =
133       vk_zalloc2(&device->alloc, alloc, size, 8,
134                  VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
135    if (image == NULL)
136       return NULL;
137 
138    vk_image_init(device, image, pCreateInfo);
139 
140    return image;
141 }
142 
143 void
vk_image_finish(struct vk_image * image)144 vk_image_finish(struct vk_image *image)
145 {
146    vk_object_base_finish(&image->base);
147 }
148 
149 void
vk_image_destroy(struct vk_device * device,const VkAllocationCallbacks * alloc,struct vk_image * image)150 vk_image_destroy(struct vk_device *device,
151                  const VkAllocationCallbacks *alloc,
152                  struct vk_image *image)
153 {
154    vk_object_free(device, alloc, image);
155 }
156 
157 #ifndef _WIN32
158 VKAPI_ATTR VkResult VKAPI_CALL
vk_common_GetImageDrmFormatModifierPropertiesEXT(UNUSED VkDevice device,VkImage _image,VkImageDrmFormatModifierPropertiesEXT * pProperties)159 vk_common_GetImageDrmFormatModifierPropertiesEXT(UNUSED VkDevice device,
160                                                  VkImage _image,
161                                                  VkImageDrmFormatModifierPropertiesEXT *pProperties)
162 {
163    VK_FROM_HANDLE(vk_image, image, _image);
164 
165    assert(pProperties->sType ==
166           VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT);
167 
168    assert(image->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT);
169    pProperties->drmFormatModifier = image->drm_format_mod;
170 
171    return VK_SUCCESS;
172 }
173 #endif
174 
175 void
vk_image_set_format(struct vk_image * image,VkFormat format)176 vk_image_set_format(struct vk_image *image, VkFormat format)
177 {
178    image->format = format;
179    image->aspects = vk_format_aspects(format);
180 }
181 
182 VkImageUsageFlags
vk_image_usage(const struct vk_image * image,VkImageAspectFlags aspect_mask)183 vk_image_usage(const struct vk_image *image,
184                VkImageAspectFlags aspect_mask)
185 {
186    assert(!(aspect_mask & ~image->aspects));
187 
188    /* From the Vulkan 1.2.131 spec:
189     *
190     *    "If the image was has a depth-stencil format and was created with
191     *    a VkImageStencilUsageCreateInfo structure included in the pNext
192     *    chain of VkImageCreateInfo, the usage is calculated based on the
193     *    subresource.aspectMask provided:
194     *
195     *     - If aspectMask includes only VK_IMAGE_ASPECT_STENCIL_BIT, the
196     *       implicit usage is equal to
197     *       VkImageStencilUsageCreateInfo::stencilUsage.
198     *
199     *     - If aspectMask includes only VK_IMAGE_ASPECT_DEPTH_BIT, the
200     *       implicit usage is equal to VkImageCreateInfo::usage.
201     *
202     *     - If both aspects are included in aspectMask, the implicit usage
203     *       is equal to the intersection of VkImageCreateInfo::usage and
204     *       VkImageStencilUsageCreateInfo::stencilUsage.
205     */
206    if (aspect_mask == VK_IMAGE_ASPECT_STENCIL_BIT) {
207       return image->stencil_usage;
208    } else if (aspect_mask == (VK_IMAGE_ASPECT_DEPTH_BIT |
209                               VK_IMAGE_ASPECT_STENCIL_BIT)) {
210       return image->usage & image->stencil_usage;
211    } else {
212       /* This also handles the color case */
213       return image->usage;
214    }
215 }
216 
217 #define VK_IMAGE_ASPECT_ANY_COLOR_MASK_MESA ( \
218    VK_IMAGE_ASPECT_COLOR_BIT | \
219    VK_IMAGE_ASPECT_PLANE_0_BIT | \
220    VK_IMAGE_ASPECT_PLANE_1_BIT | \
221    VK_IMAGE_ASPECT_PLANE_2_BIT)
222 
223 /** Expands the given aspect mask relative to the image
224  *
225  * If the image has color plane aspects VK_IMAGE_ASPECT_COLOR_BIT has been
226  * requested, this returns the aspects of the underlying image.
227  *
228  * For example,
229  *
230  *    VK_IMAGE_ASPECT_COLOR_BIT
231  *
232  * will be converted to
233  *
234  *    VK_IMAGE_ASPECT_PLANE_0_BIT |
235  *    VK_IMAGE_ASPECT_PLANE_1_BIT |
236  *    VK_IMAGE_ASPECT_PLANE_2_BIT
237  *
238  * for an image of format VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM.
239  */
240 VkImageAspectFlags
vk_image_expand_aspect_mask(const struct vk_image * image,VkImageAspectFlags aspect_mask)241 vk_image_expand_aspect_mask(const struct vk_image *image,
242                             VkImageAspectFlags aspect_mask)
243 {
244    if (aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT) {
245       assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_MASK_MESA);
246       return image->aspects;
247    } else {
248       assert(aspect_mask && !(aspect_mask & ~image->aspects));
249       return aspect_mask;
250    }
251 }
252 
253 static VkComponentSwizzle
remap_swizzle(VkComponentSwizzle swizzle,VkComponentSwizzle component)254 remap_swizzle(VkComponentSwizzle swizzle, VkComponentSwizzle component)
255 {
256    return swizzle == VK_COMPONENT_SWIZZLE_IDENTITY ? component : swizzle;
257 }
258 
259 void
vk_image_view_init(struct vk_device * device,struct vk_image_view * image_view,const VkImageViewCreateInfo * pCreateInfo)260 vk_image_view_init(struct vk_device *device,
261                    struct vk_image_view *image_view,
262                    const VkImageViewCreateInfo *pCreateInfo)
263 {
264    vk_object_base_init(device, &image_view->base, VK_OBJECT_TYPE_IMAGE_VIEW);
265 
266    assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO);
267    VK_FROM_HANDLE(vk_image, image, pCreateInfo->image);
268 
269    image_view->create_flags = pCreateInfo->flags;
270    image_view->image = image;
271    image_view->view_type = pCreateInfo->viewType;
272 
273    switch (image_view->view_type) {
274    case VK_IMAGE_VIEW_TYPE_1D:
275    case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
276       assert(image->image_type == VK_IMAGE_TYPE_1D);
277       break;
278    case VK_IMAGE_VIEW_TYPE_2D:
279    case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
280       if (image->create_flags & VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT)
281          assert(image->image_type == VK_IMAGE_TYPE_3D);
282       else
283          assert(image->image_type == VK_IMAGE_TYPE_2D);
284       break;
285    case VK_IMAGE_VIEW_TYPE_3D:
286       assert(image->image_type == VK_IMAGE_TYPE_3D);
287       break;
288    case VK_IMAGE_VIEW_TYPE_CUBE:
289    case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
290       assert(image->image_type == VK_IMAGE_TYPE_2D);
291       assert(image->create_flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT);
292       break;
293    default:
294       unreachable("Invalid image view type");
295    }
296 
297    const VkImageSubresourceRange *range = &pCreateInfo->subresourceRange;
298 
299    /* Some drivers may want to create color views of depth/stencil images
300     * to implement certain operations, which is not strictly allowed by the
301     * Vulkan spec, so handle this case separately.
302     */
303    bool is_color_view_of_depth_stencil =
304       vk_format_is_depth_or_stencil(image->format) &&
305       vk_format_is_color(pCreateInfo->format);
306    if (is_color_view_of_depth_stencil) {
307       assert(range->aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
308       assert(util_format_get_blocksize(vk_format_to_pipe_format(image->format)) ==
309              util_format_get_blocksize(vk_format_to_pipe_format(pCreateInfo->format)));
310       image_view->aspects = range->aspectMask;
311    } else {
312       image_view->aspects =
313          vk_image_expand_aspect_mask(image, range->aspectMask);
314 
315       /* From the Vulkan 1.2.184 spec:
316        *
317        *    "If the image has a multi-planar format and
318        *    subresourceRange.aspectMask is VK_IMAGE_ASPECT_COLOR_BIT, and image
319        *    has been created with a usage value not containing any of the
320        *    VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR,
321        *    VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR,
322        *    VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR,
323        *    VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR,
324        *    VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR, and
325        *    VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR flags, then the format must
326        *    be identical to the image format, and the sampler to be used with the
327        *    image view must enable sampler Y′CBCR conversion."
328        *
329        * Since no one implements video yet, we can ignore the bits about video
330        * create flags and assume YCbCr formats match.
331        */
332       if ((image->aspects & VK_IMAGE_ASPECT_PLANE_1_BIT) &&
333           (range->aspectMask == VK_IMAGE_ASPECT_COLOR_BIT))
334          assert(pCreateInfo->format == image->format);
335 
336       /* From the Vulkan 1.2.184 spec:
337        *
338        *    "Each depth/stencil format is only compatible with itself."
339        */
340       if (image_view->aspects & (VK_IMAGE_ASPECT_DEPTH_BIT |
341                                  VK_IMAGE_ASPECT_STENCIL_BIT))
342          assert(pCreateInfo->format == image->format);
343 
344       if (!(image->create_flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT))
345          assert(pCreateInfo->format == image->format);
346    }
347 
348    /* Restrict the format to only the planes chosen.
349     *
350     * For combined depth and stencil images, this means the depth-only or
351     * stencil-only format if only one aspect is chosen and the full combined
352     * format if both aspects are chosen.
353     *
354     * For single-plane color images, we just take the format as-is.  For
355     * multi-plane views of multi-plane images, this means we want the full
356     * multi-plane format.  For single-plane views of multi-plane images, we
357     * want a format compatible with the one plane.  Fortunately, this is
358     * already what the client gives us.  The Vulkan 1.2.184 spec says:
359     *
360     *    "If image was created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT and
361     *    the image has a multi-planar format, and if
362     *    subresourceRange.aspectMask is VK_IMAGE_ASPECT_PLANE_0_BIT,
363     *    VK_IMAGE_ASPECT_PLANE_1_BIT, or VK_IMAGE_ASPECT_PLANE_2_BIT, format
364     *    must be compatible with the corresponding plane of the image, and the
365     *    sampler to be used with the image view must not enable sampler Y′CBCR
366     *    conversion."
367     */
368    if (image_view->aspects == VK_IMAGE_ASPECT_STENCIL_BIT) {
369       image_view->format = vk_format_stencil_only(pCreateInfo->format);
370    } else if (image_view->aspects == VK_IMAGE_ASPECT_DEPTH_BIT) {
371       image_view->format = vk_format_depth_only(pCreateInfo->format);
372    } else {
373       image_view->format = pCreateInfo->format;
374    }
375 
376    image_view->swizzle = (VkComponentMapping) {
377       .r = remap_swizzle(pCreateInfo->components.r, VK_COMPONENT_SWIZZLE_R),
378       .g = remap_swizzle(pCreateInfo->components.g, VK_COMPONENT_SWIZZLE_G),
379       .b = remap_swizzle(pCreateInfo->components.b, VK_COMPONENT_SWIZZLE_B),
380       .a = remap_swizzle(pCreateInfo->components.a, VK_COMPONENT_SWIZZLE_A),
381    };
382 
383    assert(range->layerCount > 0);
384    assert(range->baseMipLevel < image->mip_levels);
385 
386    image_view->base_mip_level = range->baseMipLevel;
387    image_view->level_count = vk_image_subresource_level_count(image, range);
388    image_view->base_array_layer = range->baseArrayLayer;
389    image_view->layer_count = vk_image_subresource_layer_count(image, range);
390 
391    image_view->extent =
392       vk_image_mip_level_extent(image, image_view->base_mip_level);
393 
394    assert(image_view->base_mip_level + image_view->level_count
395           <= image->mip_levels);
396    switch (image->image_type) {
397    default:
398       unreachable("bad VkImageType");
399    case VK_IMAGE_TYPE_1D:
400    case VK_IMAGE_TYPE_2D:
401       assert(image_view->base_array_layer + image_view->layer_count
402              <= image->array_layers);
403       break;
404    case VK_IMAGE_TYPE_3D:
405       assert(image_view->base_array_layer + image_view->layer_count
406              <= image_view->extent.depth);
407       break;
408    }
409 
410    /* If we are creating a color view from a depth/stencil image we compute
411     * usage from the underlying depth/stencil aspects.
412     */
413    const VkImageUsageFlags image_usage = is_color_view_of_depth_stencil ?
414       vk_image_usage(image, image->aspects) :
415       vk_image_usage(image, image_view->aspects);
416    const VkImageViewUsageCreateInfo *usage_info =
417       vk_find_struct_const(pCreateInfo, IMAGE_VIEW_USAGE_CREATE_INFO);
418    image_view->usage = usage_info ? usage_info->usage : image_usage;
419    assert(!(image_view->usage & ~image_usage));
420 }
421 
422 void
vk_image_view_finish(struct vk_image_view * image_view)423 vk_image_view_finish(struct vk_image_view *image_view)
424 {
425    vk_object_base_finish(&image_view->base);
426 }
427 
428 void *
vk_image_view_create(struct vk_device * device,const VkImageViewCreateInfo * pCreateInfo,const VkAllocationCallbacks * alloc,size_t size)429 vk_image_view_create(struct vk_device *device,
430                      const VkImageViewCreateInfo *pCreateInfo,
431                      const VkAllocationCallbacks *alloc,
432                      size_t size)
433 {
434    struct vk_image_view *image_view =
435       vk_zalloc2(&device->alloc, alloc, size, 8,
436                  VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
437    if (image_view == NULL)
438       return NULL;
439 
440    vk_image_view_init(device, image_view, pCreateInfo);
441 
442    return image_view;
443 }
444 
445 void
vk_image_view_destroy(struct vk_device * device,const VkAllocationCallbacks * alloc,struct vk_image_view * image_view)446 vk_image_view_destroy(struct vk_device *device,
447                       const VkAllocationCallbacks *alloc,
448                       struct vk_image_view *image_view)
449 {
450    vk_object_free(device, alloc, image_view);
451 }
452 
453 bool
vk_image_layout_is_read_only(VkImageLayout layout,VkImageAspectFlagBits aspect)454 vk_image_layout_is_read_only(VkImageLayout layout,
455                              VkImageAspectFlagBits aspect)
456 {
457    assert(util_bitcount(aspect) == 1);
458 
459    switch (layout) {
460    case VK_IMAGE_LAYOUT_UNDEFINED:
461    case VK_IMAGE_LAYOUT_PREINITIALIZED:
462       return true; /* These are only used for layout transitions */
463 
464    case VK_IMAGE_LAYOUT_GENERAL:
465    case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
466    case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
467    case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
468    case VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR:
469    case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL:
470    case VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL:
471    case VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR:
472       return false;
473 
474    case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
475    case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
476    case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
477    case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
478    case VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV:
479    case VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT:
480    case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL:
481    case VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL:
482    case VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR:
483       return true;
484 
485    case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL:
486       return aspect == VK_IMAGE_ASPECT_DEPTH_BIT;
487 
488    case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL:
489       return aspect == VK_IMAGE_ASPECT_STENCIL_BIT;
490 
491    case VK_IMAGE_LAYOUT_MAX_ENUM:
492       unreachable("Invalid image layout.");
493    }
494 
495    unreachable("Invalid image layout.");
496 }
497 
498 VkImageUsageFlags
vk_image_layout_to_usage_flags(VkImageLayout layout,VkImageAspectFlagBits aspect)499 vk_image_layout_to_usage_flags(VkImageLayout layout,
500                                VkImageAspectFlagBits aspect)
501 {
502    assert(util_bitcount(aspect) == 1);
503 
504    switch (layout) {
505    case VK_IMAGE_LAYOUT_UNDEFINED:
506    case VK_IMAGE_LAYOUT_PREINITIALIZED:
507       return 0u;
508 
509    case VK_IMAGE_LAYOUT_GENERAL:
510       return ~0u;
511 
512    case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
513       assert(aspect & VK_IMAGE_ASPECT_ANY_COLOR_MASK_MESA);
514       return VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
515 
516    case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
517       assert(aspect & (VK_IMAGE_ASPECT_DEPTH_BIT |
518                        VK_IMAGE_ASPECT_STENCIL_BIT));
519       return VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
520 
521    case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL:
522       assert(aspect & VK_IMAGE_ASPECT_DEPTH_BIT);
523       return vk_image_layout_to_usage_flags(
524          VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, aspect);
525 
526    case VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL:
527       assert(aspect & VK_IMAGE_ASPECT_STENCIL_BIT);
528       return vk_image_layout_to_usage_flags(
529          VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, aspect);
530 
531    case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
532       assert(aspect & (VK_IMAGE_ASPECT_DEPTH_BIT |
533                        VK_IMAGE_ASPECT_STENCIL_BIT));
534       return VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
535              VK_IMAGE_USAGE_SAMPLED_BIT |
536              VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
537 
538    case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL:
539       assert(aspect & VK_IMAGE_ASPECT_DEPTH_BIT);
540       return vk_image_layout_to_usage_flags(
541          VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, aspect);
542 
543    case VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL:
544       assert(aspect & VK_IMAGE_ASPECT_STENCIL_BIT);
545       return vk_image_layout_to_usage_flags(
546          VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, aspect);
547 
548    case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
549       return VK_IMAGE_USAGE_SAMPLED_BIT |
550              VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
551 
552    case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
553       return VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
554 
555    case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
556       return VK_IMAGE_USAGE_TRANSFER_DST_BIT;
557 
558    case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL:
559       if (aspect == VK_IMAGE_ASPECT_DEPTH_BIT) {
560          return vk_image_layout_to_usage_flags(
561             VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, aspect);
562       } else if (aspect == VK_IMAGE_ASPECT_STENCIL_BIT) {
563          return vk_image_layout_to_usage_flags(
564             VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, aspect);
565       } else {
566          assert(!"Must be a depth/stencil aspect");
567          return 0;
568       }
569 
570    case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL:
571       if (aspect == VK_IMAGE_ASPECT_DEPTH_BIT) {
572          return vk_image_layout_to_usage_flags(
573             VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, aspect);
574       } else if (aspect == VK_IMAGE_ASPECT_STENCIL_BIT) {
575          return vk_image_layout_to_usage_flags(
576             VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, aspect);
577       } else {
578          assert(!"Must be a depth/stencil aspect");
579          return 0;
580       }
581 
582    case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
583       assert(aspect == VK_IMAGE_ASPECT_COLOR_BIT);
584       /* This needs to be handled specially by the caller */
585       return 0;
586 
587    case VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR:
588       assert(aspect == VK_IMAGE_ASPECT_COLOR_BIT);
589       return vk_image_layout_to_usage_flags(VK_IMAGE_LAYOUT_GENERAL, aspect);
590 
591    case VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV:
592       assert(aspect == VK_IMAGE_ASPECT_COLOR_BIT);
593       return VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV;
594 
595    case VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT:
596       assert(aspect == VK_IMAGE_ASPECT_COLOR_BIT);
597       return VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT;
598 
599    case VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR:
600       if (aspect == VK_IMAGE_ASPECT_DEPTH_BIT ||
601           aspect == VK_IMAGE_ASPECT_STENCIL_BIT) {
602          return VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
603       } else {
604          assert(aspect == VK_IMAGE_ASPECT_COLOR_BIT);
605          return VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
606       }
607 
608    case VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR:
609       return VK_IMAGE_USAGE_SAMPLED_BIT |
610              VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
611 
612    case VK_IMAGE_LAYOUT_MAX_ENUM:
613       unreachable("Invalid image layout.");
614    }
615 
616    unreachable("Invalid image layout.");
617 }
618