xref: /aosp_15_r20/external/mesa3d/src/vulkan/runtime/vk_image.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2021 Intel Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker #ifndef VK_IMAGE_H
24*61046927SAndroid Build Coastguard Worker #define VK_IMAGE_H
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker #include "vk_object.h"
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker #include "util/detect_os.h"
29*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
32*61046927SAndroid Build Coastguard Worker enum android_buffer_type {
33*61046927SAndroid Build Coastguard Worker    ANDROID_BUFFER_NONE = 0,
34*61046927SAndroid Build Coastguard Worker    ANDROID_BUFFER_NATIVE,
35*61046927SAndroid Build Coastguard Worker    ANDROID_BUFFER_HARDWARE,
36*61046927SAndroid Build Coastguard Worker };
37*61046927SAndroid Build Coastguard Worker #endif
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
40*61046927SAndroid Build Coastguard Worker extern "C" {
41*61046927SAndroid Build Coastguard Worker #endif
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker struct vk_image {
44*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker    VkImageCreateFlags create_flags;
47*61046927SAndroid Build Coastguard Worker    VkImageType image_type;
48*61046927SAndroid Build Coastguard Worker 
49*61046927SAndroid Build Coastguard Worker    /* format is from VkImageCreateInfo::format or
50*61046927SAndroid Build Coastguard Worker     * VkExternalFormatANDROID::externalFormat.  This works because only one of
51*61046927SAndroid Build Coastguard Worker     * them can be defined and the runtime uses VkFormat for external formats.
52*61046927SAndroid Build Coastguard Worker     */
53*61046927SAndroid Build Coastguard Worker    VkFormat format;
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker    VkExtent3D extent;
56*61046927SAndroid Build Coastguard Worker    uint32_t mip_levels;
57*61046927SAndroid Build Coastguard Worker    uint32_t array_layers;
58*61046927SAndroid Build Coastguard Worker    VkSampleCountFlagBits samples;
59*61046927SAndroid Build Coastguard Worker    VkImageTiling tiling;
60*61046927SAndroid Build Coastguard Worker    VkImageUsageFlags usage;
61*61046927SAndroid Build Coastguard Worker    VkSharingMode sharing_mode;
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker    /* Derived from format */
64*61046927SAndroid Build Coastguard Worker    VkImageAspectFlags aspects;
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker    /* VK_EXT_separate_stencil_usage */
67*61046927SAndroid Build Coastguard Worker    VkImageUsageFlags stencil_usage;
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker    /* VK_KHR_external_memory */
70*61046927SAndroid Build Coastguard Worker    VkExternalMemoryHandleTypeFlags external_handle_types;
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker    /* VK_EXT_image_compression_control */
73*61046927SAndroid Build Coastguard Worker    VkImageCompressionFlagsEXT compr_flags;
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker    /* wsi_image_create_info::scanout */
76*61046927SAndroid Build Coastguard Worker    bool wsi_legacy_scanout;
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker #if DETECT_OS_LINUX || DETECT_OS_BSD
79*61046927SAndroid Build Coastguard Worker    /* VK_EXT_drm_format_modifier
80*61046927SAndroid Build Coastguard Worker     *
81*61046927SAndroid Build Coastguard Worker     * Initialized by vk_image_create/init() to DRM_FORMAT_MOD_INVALID.  It's
82*61046927SAndroid Build Coastguard Worker     * the job of the driver to parse the VK_EXT_drm_format_modifier extension
83*61046927SAndroid Build Coastguard Worker     * structs and choose the actual modifier.
84*61046927SAndroid Build Coastguard Worker     *
85*61046927SAndroid Build Coastguard Worker     * Must be DRM_FORMAT_MOD_INVALID unless tiling is
86*61046927SAndroid Build Coastguard Worker     * VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT.
87*61046927SAndroid Build Coastguard Worker     */
88*61046927SAndroid Build Coastguard Worker    uint64_t drm_format_mod;
89*61046927SAndroid Build Coastguard Worker #endif
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
92*61046927SAndroid Build Coastguard Worker    enum android_buffer_type android_buffer_type;
93*61046927SAndroid Build Coastguard Worker    VkDeviceMemory anb_memory;
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker    /* AHARDWAREBUFFER_FORMAT for this image or 0
96*61046927SAndroid Build Coastguard Worker     *
97*61046927SAndroid Build Coastguard Worker     * A default is provided by the Vulkan runtime code based on the VkFormat
98*61046927SAndroid Build Coastguard Worker     * but it may be overridden by the driver as needed.
99*61046927SAndroid Build Coastguard Worker     */
100*61046927SAndroid Build Coastguard Worker    uint32_t ahb_format;
101*61046927SAndroid Build Coastguard Worker #endif
102*61046927SAndroid Build Coastguard Worker };
103*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(vk_image, base, VkImage,
104*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_IMAGE);
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker void vk_image_init(struct vk_device *device,
107*61046927SAndroid Build Coastguard Worker                    struct vk_image *image,
108*61046927SAndroid Build Coastguard Worker                    const VkImageCreateInfo *pCreateInfo);
109*61046927SAndroid Build Coastguard Worker void vk_image_finish(struct vk_image *image);
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker void *vk_image_create(struct vk_device *device,
112*61046927SAndroid Build Coastguard Worker                       const VkImageCreateInfo *pCreateInfo,
113*61046927SAndroid Build Coastguard Worker                       const VkAllocationCallbacks *alloc,
114*61046927SAndroid Build Coastguard Worker                       size_t size);
115*61046927SAndroid Build Coastguard Worker void vk_image_destroy(struct vk_device *device,
116*61046927SAndroid Build Coastguard Worker                       const VkAllocationCallbacks *alloc,
117*61046927SAndroid Build Coastguard Worker                       struct vk_image *image);
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker VkResult
120*61046927SAndroid Build Coastguard Worker vk_image_create_get_format_list(struct vk_device *device,
121*61046927SAndroid Build Coastguard Worker                                 const VkImageCreateInfo *pCreateInfo,
122*61046927SAndroid Build Coastguard Worker                                 const VkAllocationCallbacks *pAllocator,
123*61046927SAndroid Build Coastguard Worker                                 VkFormat **formats,
124*61046927SAndroid Build Coastguard Worker                                 uint32_t *format_count);
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker void vk_image_set_format(struct vk_image *image, VkFormat format);
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker VkImageUsageFlags vk_image_usage(const struct vk_image *image,
129*61046927SAndroid Build Coastguard Worker                                  VkImageAspectFlags aspect_mask);
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker VkImageAspectFlags vk_image_expand_aspect_mask(const struct vk_image *image,
132*61046927SAndroid Build Coastguard Worker                                                VkImageAspectFlags aspect_mask);
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker static inline VkExtent3D
vk_image_mip_level_extent(const struct vk_image * image,uint32_t mip_level)135*61046927SAndroid Build Coastguard Worker vk_image_mip_level_extent(const struct vk_image *image,
136*61046927SAndroid Build Coastguard Worker                           uint32_t mip_level)
137*61046927SAndroid Build Coastguard Worker {
138*61046927SAndroid Build Coastguard Worker    const VkExtent3D extent = {
139*61046927SAndroid Build Coastguard Worker       u_minify(image->extent.width,  mip_level),
140*61046927SAndroid Build Coastguard Worker       u_minify(image->extent.height, mip_level),
141*61046927SAndroid Build Coastguard Worker       u_minify(image->extent.depth,  mip_level),
142*61046927SAndroid Build Coastguard Worker    };
143*61046927SAndroid Build Coastguard Worker    return extent;
144*61046927SAndroid Build Coastguard Worker }
145*61046927SAndroid Build Coastguard Worker 
146*61046927SAndroid Build Coastguard Worker /* This is defined as a macro so that it works for both
147*61046927SAndroid Build Coastguard Worker  * VkImageSubresourceRange and VkImageSubresourceLayers
148*61046927SAndroid Build Coastguard Worker  */
149*61046927SAndroid Build Coastguard Worker #define vk_image_subresource_layer_count(_image, _range) \
150*61046927SAndroid Build Coastguard Worker    ((_range)->layerCount == VK_REMAINING_ARRAY_LAYERS ? \
151*61046927SAndroid Build Coastguard Worker     (_image)->array_layers - (_range)->baseArrayLayer : (_range)->layerCount)
152*61046927SAndroid Build Coastguard Worker 
153*61046927SAndroid Build Coastguard Worker static inline uint32_t
vk_image_subresource_level_count(const struct vk_image * image,const VkImageSubresourceRange * range)154*61046927SAndroid Build Coastguard Worker vk_image_subresource_level_count(const struct vk_image *image,
155*61046927SAndroid Build Coastguard Worker                                  const VkImageSubresourceRange *range)
156*61046927SAndroid Build Coastguard Worker {
157*61046927SAndroid Build Coastguard Worker    return range->levelCount == VK_REMAINING_MIP_LEVELS ?
158*61046927SAndroid Build Coastguard Worker           image->mip_levels - range->baseMipLevel : range->levelCount;
159*61046927SAndroid Build Coastguard Worker }
160*61046927SAndroid Build Coastguard Worker 
161*61046927SAndroid Build Coastguard Worker static inline VkExtent3D
vk_image_sanitize_extent(const struct vk_image * image,const VkExtent3D imageExtent)162*61046927SAndroid Build Coastguard Worker vk_image_sanitize_extent(const struct vk_image *image,
163*61046927SAndroid Build Coastguard Worker                          const VkExtent3D imageExtent)
164*61046927SAndroid Build Coastguard Worker {
165*61046927SAndroid Build Coastguard Worker    switch (image->image_type) {
166*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_TYPE_1D:
167*61046927SAndroid Build Coastguard Worker       return (VkExtent3D) { imageExtent.width, 1, 1 };
168*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_TYPE_2D:
169*61046927SAndroid Build Coastguard Worker       return (VkExtent3D) { imageExtent.width, imageExtent.height, 1 };
170*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_TYPE_3D:
171*61046927SAndroid Build Coastguard Worker       return imageExtent;
172*61046927SAndroid Build Coastguard Worker    default:
173*61046927SAndroid Build Coastguard Worker       unreachable("invalid image type");
174*61046927SAndroid Build Coastguard Worker    }
175*61046927SAndroid Build Coastguard Worker }
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker VkExtent3D
178*61046927SAndroid Build Coastguard Worker vk_image_extent_to_elements(const struct vk_image *image, VkExtent3D extent);
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker static inline VkOffset3D
vk_image_sanitize_offset(const struct vk_image * image,const VkOffset3D imageOffset)181*61046927SAndroid Build Coastguard Worker vk_image_sanitize_offset(const struct vk_image *image,
182*61046927SAndroid Build Coastguard Worker                          const VkOffset3D imageOffset)
183*61046927SAndroid Build Coastguard Worker {
184*61046927SAndroid Build Coastguard Worker    switch (image->image_type) {
185*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_TYPE_1D:
186*61046927SAndroid Build Coastguard Worker       return (VkOffset3D) { imageOffset.x, 0, 0 };
187*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_TYPE_2D:
188*61046927SAndroid Build Coastguard Worker       return (VkOffset3D) { imageOffset.x, imageOffset.y, 0 };
189*61046927SAndroid Build Coastguard Worker    case VK_IMAGE_TYPE_3D:
190*61046927SAndroid Build Coastguard Worker       return imageOffset;
191*61046927SAndroid Build Coastguard Worker    default:
192*61046927SAndroid Build Coastguard Worker       unreachable("invalid image type");
193*61046927SAndroid Build Coastguard Worker    }
194*61046927SAndroid Build Coastguard Worker }
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker VkOffset3D
197*61046927SAndroid Build Coastguard Worker vk_image_offset_to_elements(const struct vk_image *image, VkOffset3D offset);
198*61046927SAndroid Build Coastguard Worker 
199*61046927SAndroid Build Coastguard Worker struct vk_image_buffer_layout {
200*61046927SAndroid Build Coastguard Worker    /**
201*61046927SAndroid Build Coastguard Worker     * VkBufferImageCopy2::bufferRowLength or
202*61046927SAndroid Build Coastguard Worker     * VkBufferImageCopy2::extent::width as needed.
203*61046927SAndroid Build Coastguard Worker     */
204*61046927SAndroid Build Coastguard Worker    uint32_t row_length;
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker    /**
207*61046927SAndroid Build Coastguard Worker     * VkBufferImageCopy2::bufferImageHeight or
208*61046927SAndroid Build Coastguard Worker     * VkBufferImageCopy2::extent::height as needed.
209*61046927SAndroid Build Coastguard Worker     */
210*61046927SAndroid Build Coastguard Worker    uint32_t image_height;
211*61046927SAndroid Build Coastguard Worker 
212*61046927SAndroid Build Coastguard Worker    /** Size of a single element (pixel or compressed block) in bytes */
213*61046927SAndroid Build Coastguard Worker    uint32_t element_size_B;
214*61046927SAndroid Build Coastguard Worker 
215*61046927SAndroid Build Coastguard Worker    /** Row stride in bytes */
216*61046927SAndroid Build Coastguard Worker    uint32_t row_stride_B;
217*61046927SAndroid Build Coastguard Worker 
218*61046927SAndroid Build Coastguard Worker    /** Image (or layer) stride in bytes
219*61046927SAndroid Build Coastguard Worker     *
220*61046927SAndroid Build Coastguard Worker     * For 1D or 2D array images, this is the stride in bytes between array
221*61046927SAndroid Build Coastguard Worker     * slices.  For 3D images, this is the stride in bytes between fixed-Z
222*61046927SAndroid Build Coastguard Worker     * slices.
223*61046927SAndroid Build Coastguard Worker     */
224*61046927SAndroid Build Coastguard Worker    uint64_t image_stride_B;
225*61046927SAndroid Build Coastguard Worker };
226*61046927SAndroid Build Coastguard Worker 
227*61046927SAndroid Build Coastguard Worker static inline VkDeviceSize
vk_image_buffer_range(const struct vk_image * image,const struct vk_image_buffer_layout * buf_layout,const VkExtent3D * elem_extent,const VkImageSubresourceLayers * subres)228*61046927SAndroid Build Coastguard Worker vk_image_buffer_range(const struct vk_image *image,
229*61046927SAndroid Build Coastguard Worker                       const struct vk_image_buffer_layout *buf_layout,
230*61046927SAndroid Build Coastguard Worker                       const VkExtent3D *elem_extent,
231*61046927SAndroid Build Coastguard Worker                       const VkImageSubresourceLayers *subres)
232*61046927SAndroid Build Coastguard Worker {
233*61046927SAndroid Build Coastguard Worker    uint32_t depth_or_layer_count =
234*61046927SAndroid Build Coastguard Worker       MAX2(elem_extent->depth, vk_image_subresource_layer_count(image, subres));
235*61046927SAndroid Build Coastguard Worker 
236*61046927SAndroid Build Coastguard Worker    /* Depth, layer_count and height must be at least one, and we rely on that
237*61046927SAndroid Build Coastguard Worker     * for the rest of the buffer range calculation. */
238*61046927SAndroid Build Coastguard Worker    assert(depth_or_layer_count > 0);
239*61046927SAndroid Build Coastguard Worker    assert(elem_extent->height > 0);
240*61046927SAndroid Build Coastguard Worker 
241*61046927SAndroid Build Coastguard Worker    return (VkDeviceSize)buf_layout->image_stride_B * (depth_or_layer_count - 1) +
242*61046927SAndroid Build Coastguard Worker           (VkDeviceSize)buf_layout->row_stride_B * (elem_extent->height - 1) +
243*61046927SAndroid Build Coastguard Worker           (VkDeviceSize)buf_layout->element_size_B * elem_extent->width;
244*61046927SAndroid Build Coastguard Worker }
245*61046927SAndroid Build Coastguard Worker 
246*61046927SAndroid Build Coastguard Worker struct vk_image_buffer_layout
247*61046927SAndroid Build Coastguard Worker vk_image_buffer_copy_layout(const struct vk_image *image,
248*61046927SAndroid Build Coastguard Worker                             const VkBufferImageCopy2* region);
249*61046927SAndroid Build Coastguard Worker 
250*61046927SAndroid Build Coastguard Worker struct vk_image_buffer_layout
251*61046927SAndroid Build Coastguard Worker vk_memory_to_image_copy_layout(const struct vk_image *image,
252*61046927SAndroid Build Coastguard Worker                                const VkMemoryToImageCopyEXT* region);
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker struct vk_image_buffer_layout
255*61046927SAndroid Build Coastguard Worker vk_image_to_memory_copy_layout(const struct vk_image *image,
256*61046927SAndroid Build Coastguard Worker                                const VkImageToMemoryCopyEXT* region);
257*61046927SAndroid Build Coastguard Worker 
258*61046927SAndroid Build Coastguard Worker struct vk_image_view {
259*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
260*61046927SAndroid Build Coastguard Worker 
261*61046927SAndroid Build Coastguard Worker    VkImageViewCreateFlags create_flags;
262*61046927SAndroid Build Coastguard Worker    struct vk_image *image;
263*61046927SAndroid Build Coastguard Worker    VkImageViewType view_type;
264*61046927SAndroid Build Coastguard Worker 
265*61046927SAndroid Build Coastguard Worker    /** VkImageViewCreateInfo::format or vk_image::format */
266*61046927SAndroid Build Coastguard Worker    VkFormat format;
267*61046927SAndroid Build Coastguard Worker 
268*61046927SAndroid Build Coastguard Worker    /** Image view format, relative to the selected aspects
269*61046927SAndroid Build Coastguard Worker     *
270*61046927SAndroid Build Coastguard Worker     * For a depth/stencil image:
271*61046927SAndroid Build Coastguard Worker     *
272*61046927SAndroid Build Coastguard Worker     *  - If vk_image_view::aspects contains both depth and stencil, this will
273*61046927SAndroid Build Coastguard Worker     *    be the full depth/stencil format of the image.
274*61046927SAndroid Build Coastguard Worker     *
275*61046927SAndroid Build Coastguard Worker     *  - If only one aspect is selected, this will be the depth-only or
276*61046927SAndroid Build Coastguard Worker     *    stencil-only format, as per the selected aspect.
277*61046927SAndroid Build Coastguard Worker     *
278*61046927SAndroid Build Coastguard Worker     * For color images, we have three cases:
279*61046927SAndroid Build Coastguard Worker     *
280*61046927SAndroid Build Coastguard Worker     *  1. It's a single-plane image in which case this is the unmodified
281*61046927SAndroid Build Coastguard Worker     *     format provided to VkImageViewCreateInfo::format or
282*61046927SAndroid Build Coastguard Worker     *     vk_image::format.
283*61046927SAndroid Build Coastguard Worker     *
284*61046927SAndroid Build Coastguard Worker     *  2. It's a YCbCr view of a multi-plane image in which case the
285*61046927SAndroid Build Coastguard Worker     *     client will have asked for VK_IMAGE_ASPECT_COLOR_BIT and the
286*61046927SAndroid Build Coastguard Worker     *     format provided will be the full planar format.  In this case,
287*61046927SAndroid Build Coastguard Worker     *     the format will be the full format containing all the planes.
288*61046927SAndroid Build Coastguard Worker     *
289*61046927SAndroid Build Coastguard Worker     *  3. It's a single-plane view of a multi-plane image in which case
290*61046927SAndroid Build Coastguard Worker     *     the client will have asked for VK_IMAGE_ASPECT_PLANE_N_BIT and
291*61046927SAndroid Build Coastguard Worker     *     will have provided a format compatible with that specific
292*61046927SAndroid Build Coastguard Worker     *     plane of the multi-planar format.  In this case, the format will be
293*61046927SAndroid Build Coastguard Worker     *     the plane-compatible format requested by the client.
294*61046927SAndroid Build Coastguard Worker     */
295*61046927SAndroid Build Coastguard Worker    VkFormat view_format;
296*61046927SAndroid Build Coastguard Worker 
297*61046927SAndroid Build Coastguard Worker    /* Component mapping, aka swizzle
298*61046927SAndroid Build Coastguard Worker     *
299*61046927SAndroid Build Coastguard Worker     * Unlike the swizzle provided via VkImageViewCreateInfo::components, this
300*61046927SAndroid Build Coastguard Worker     * will never contain VK_COMPONENT_SWIZZLE_IDENTITY.  It will be resolved
301*61046927SAndroid Build Coastguard Worker     * to VK_COMPONENT_SWIZZLE_R/G/B/A, as appropriate.
302*61046927SAndroid Build Coastguard Worker     */
303*61046927SAndroid Build Coastguard Worker    VkComponentMapping swizzle;
304*61046927SAndroid Build Coastguard Worker 
305*61046927SAndroid Build Coastguard Worker    /** Aspects from the image represented by this view
306*61046927SAndroid Build Coastguard Worker     *
307*61046927SAndroid Build Coastguard Worker     * For depth/stencil images, this is the aspectMask provided by
308*61046927SAndroid Build Coastguard Worker     * VkImageViewCreateinfo::subresourceRange::aspectMask.
309*61046927SAndroid Build Coastguard Worker     *
310*61046927SAndroid Build Coastguard Worker     * For color images, we have three cases:
311*61046927SAndroid Build Coastguard Worker     *
312*61046927SAndroid Build Coastguard Worker     *  1. It's a single-plane image in which case this only aspect is
313*61046927SAndroid Build Coastguard Worker     *     VK_IMAGE_ASPECT_COLOR_BIT.
314*61046927SAndroid Build Coastguard Worker     *
315*61046927SAndroid Build Coastguard Worker     *  2. It's a YCbCr view of a multi-plane image in which case the
316*61046927SAndroid Build Coastguard Worker     *     client will have asked for VK_IMAGE_ASPECT_COLOR_BIT and the
317*61046927SAndroid Build Coastguard Worker     *     format provided will be the full planar format.  In this case,
318*61046927SAndroid Build Coastguard Worker     *     aspects will be the full set of plane aspects in the image.
319*61046927SAndroid Build Coastguard Worker     *
320*61046927SAndroid Build Coastguard Worker     *  3. It's a single-plane view of a multi-plane image in which case
321*61046927SAndroid Build Coastguard Worker     *     the client will have asked for VK_IMAGE_ASPECT_PLANE_N_BIT and
322*61046927SAndroid Build Coastguard Worker     *     will have provided a format compatible with that specific
323*61046927SAndroid Build Coastguard Worker     *     plane of the multi-planar format.  In this case, aspects will be
324*61046927SAndroid Build Coastguard Worker     *     VK_IMAGE_ASPECT_PLANE_N_BIT where N is the selected plane.
325*61046927SAndroid Build Coastguard Worker     *
326*61046927SAndroid Build Coastguard Worker     * This seems almost backwards from the API but ensures that
327*61046927SAndroid Build Coastguard Worker     * vk_image_view::aspects is always a subset of vk_image::aspects.
328*61046927SAndroid Build Coastguard Worker     */
329*61046927SAndroid Build Coastguard Worker    VkImageAspectFlags aspects;
330*61046927SAndroid Build Coastguard Worker 
331*61046927SAndroid Build Coastguard Worker    uint32_t base_mip_level;
332*61046927SAndroid Build Coastguard Worker    uint32_t level_count;
333*61046927SAndroid Build Coastguard Worker    uint32_t base_array_layer;
334*61046927SAndroid Build Coastguard Worker    uint32_t layer_count;
335*61046927SAndroid Build Coastguard Worker 
336*61046927SAndroid Build Coastguard Worker    /* VK_EXT_sliced_view_of_3d */
337*61046927SAndroid Build Coastguard Worker    struct {
338*61046927SAndroid Build Coastguard Worker       /* VkImageViewSlicedCreateInfoEXT::sliceOffset
339*61046927SAndroid Build Coastguard Worker        *
340*61046927SAndroid Build Coastguard Worker        * This field will be 0 for 1D and 2D images, 2D views of 3D images, or
341*61046927SAndroid Build Coastguard Worker        * when no VkImageViewSlicedCreateInfoEXT is provided.
342*61046927SAndroid Build Coastguard Worker        */
343*61046927SAndroid Build Coastguard Worker       uint32_t z_slice_offset;
344*61046927SAndroid Build Coastguard Worker 
345*61046927SAndroid Build Coastguard Worker       /* VkImageViewSlicedCreateInfoEXT::sliceCount
346*61046927SAndroid Build Coastguard Worker        *
347*61046927SAndroid Build Coastguard Worker        * This field will be 1 for 1D and 2D images or 2D views of 3D images.
348*61046927SAndroid Build Coastguard Worker        * For 3D views, it will be VkImageViewSlicedCreateInfoEXT::sliceCount
349*61046927SAndroid Build Coastguard Worker        * or image view depth (see vk_image_view::extent) when no
350*61046927SAndroid Build Coastguard Worker        * VkImageViewSlicedCreateInfoEXT is provided.
351*61046927SAndroid Build Coastguard Worker        */
352*61046927SAndroid Build Coastguard Worker       uint32_t z_slice_count;
353*61046927SAndroid Build Coastguard Worker    } storage;
354*61046927SAndroid Build Coastguard Worker 
355*61046927SAndroid Build Coastguard Worker    /* VK_EXT_image_view_min_lod */
356*61046927SAndroid Build Coastguard Worker    float min_lod;
357*61046927SAndroid Build Coastguard Worker 
358*61046927SAndroid Build Coastguard Worker    /* Image extent at LOD 0 */
359*61046927SAndroid Build Coastguard Worker    VkExtent3D extent;
360*61046927SAndroid Build Coastguard Worker 
361*61046927SAndroid Build Coastguard Worker    /* VK_KHR_maintenance2 */
362*61046927SAndroid Build Coastguard Worker    VkImageUsageFlags usage;
363*61046927SAndroid Build Coastguard Worker };
364*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(vk_image_view, base, VkImageView,
365*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_IMAGE_VIEW);
366*61046927SAndroid Build Coastguard Worker 
367*61046927SAndroid Build Coastguard Worker void vk_image_view_init(struct vk_device *device,
368*61046927SAndroid Build Coastguard Worker                         struct vk_image_view *image_view,
369*61046927SAndroid Build Coastguard Worker                         bool driver_internal,
370*61046927SAndroid Build Coastguard Worker                         const VkImageViewCreateInfo *pCreateInfo);
371*61046927SAndroid Build Coastguard Worker void vk_image_view_finish(struct vk_image_view *image_view);
372*61046927SAndroid Build Coastguard Worker 
373*61046927SAndroid Build Coastguard Worker void *vk_image_view_create(struct vk_device *device,
374*61046927SAndroid Build Coastguard Worker                            bool driver_internal,
375*61046927SAndroid Build Coastguard Worker                            const VkImageViewCreateInfo *pCreateInfo,
376*61046927SAndroid Build Coastguard Worker                            const VkAllocationCallbacks *alloc,
377*61046927SAndroid Build Coastguard Worker                            size_t size);
378*61046927SAndroid Build Coastguard Worker void vk_image_view_destroy(struct vk_device *device,
379*61046927SAndroid Build Coastguard Worker                            const VkAllocationCallbacks *alloc,
380*61046927SAndroid Build Coastguard Worker                            struct vk_image_view *image_view);
381*61046927SAndroid Build Coastguard Worker 
382*61046927SAndroid Build Coastguard Worker static inline VkImageSubresourceRange
vk_image_view_subresource_range(const struct vk_image_view * view)383*61046927SAndroid Build Coastguard Worker vk_image_view_subresource_range(const struct vk_image_view *view)
384*61046927SAndroid Build Coastguard Worker {
385*61046927SAndroid Build Coastguard Worker    VkImageSubresourceRange range = {
386*61046927SAndroid Build Coastguard Worker       .aspectMask = view->aspects,
387*61046927SAndroid Build Coastguard Worker       .baseMipLevel = view->base_mip_level,
388*61046927SAndroid Build Coastguard Worker       .levelCount = view->level_count,
389*61046927SAndroid Build Coastguard Worker       .baseArrayLayer = view->base_array_layer,
390*61046927SAndroid Build Coastguard Worker       .layerCount = view->layer_count,
391*61046927SAndroid Build Coastguard Worker    };
392*61046927SAndroid Build Coastguard Worker 
393*61046927SAndroid Build Coastguard Worker    return range;
394*61046927SAndroid Build Coastguard Worker }
395*61046927SAndroid Build Coastguard Worker 
396*61046927SAndroid Build Coastguard Worker bool vk_image_layout_is_read_only(VkImageLayout layout,
397*61046927SAndroid Build Coastguard Worker                                   VkImageAspectFlagBits aspect);
398*61046927SAndroid Build Coastguard Worker bool vk_image_layout_is_depth_only(VkImageLayout layout);
399*61046927SAndroid Build Coastguard Worker 
400*61046927SAndroid Build Coastguard Worker VkImageUsageFlags vk_image_layout_to_usage_flags(VkImageLayout layout,
401*61046927SAndroid Build Coastguard Worker                                                  VkImageAspectFlagBits aspect);
402*61046927SAndroid Build Coastguard Worker 
403*61046927SAndroid Build Coastguard Worker VkImageLayout vk_att_ref_stencil_layout(const VkAttachmentReference2 *att_ref,
404*61046927SAndroid Build Coastguard Worker                                         const VkAttachmentDescription2 *attachments);
405*61046927SAndroid Build Coastguard Worker VkImageLayout vk_att_desc_stencil_layout(const VkAttachmentDescription2 *att_desc,
406*61046927SAndroid Build Coastguard Worker                                            bool final);
407*61046927SAndroid Build Coastguard Worker 
408*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
409*61046927SAndroid Build Coastguard Worker static inline bool
vk_image_is_android_native_buffer(struct vk_image * image)410*61046927SAndroid Build Coastguard Worker vk_image_is_android_native_buffer(struct vk_image *image)
411*61046927SAndroid Build Coastguard Worker {
412*61046927SAndroid Build Coastguard Worker    return image->android_buffer_type == ANDROID_BUFFER_NATIVE;
413*61046927SAndroid Build Coastguard Worker }
414*61046927SAndroid Build Coastguard Worker #else
415*61046927SAndroid Build Coastguard Worker static inline bool
vk_image_is_android_native_buffer(struct vk_image * image)416*61046927SAndroid Build Coastguard Worker vk_image_is_android_native_buffer(struct vk_image *image)
417*61046927SAndroid Build Coastguard Worker {
418*61046927SAndroid Build Coastguard Worker    return false;
419*61046927SAndroid Build Coastguard Worker }
420*61046927SAndroid Build Coastguard Worker #endif /* DETECT_OS_ANDROID */
421*61046927SAndroid Build Coastguard Worker 
422*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID && ANDROID_API_LEVEL >= 26
423*61046927SAndroid Build Coastguard Worker static inline bool
vk_image_is_android_hardware_buffer(struct vk_image * image)424*61046927SAndroid Build Coastguard Worker vk_image_is_android_hardware_buffer(struct vk_image *image)
425*61046927SAndroid Build Coastguard Worker {
426*61046927SAndroid Build Coastguard Worker    return image->android_buffer_type == ANDROID_BUFFER_HARDWARE;
427*61046927SAndroid Build Coastguard Worker }
428*61046927SAndroid Build Coastguard Worker #else
429*61046927SAndroid Build Coastguard Worker static inline bool
vk_image_is_android_hardware_buffer(struct vk_image * image)430*61046927SAndroid Build Coastguard Worker vk_image_is_android_hardware_buffer(struct vk_image *image)
431*61046927SAndroid Build Coastguard Worker {
432*61046927SAndroid Build Coastguard Worker    return false;
433*61046927SAndroid Build Coastguard Worker }
434*61046927SAndroid Build Coastguard Worker #endif
435*61046927SAndroid Build Coastguard Worker 
436*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
437*61046927SAndroid Build Coastguard Worker }
438*61046927SAndroid Build Coastguard Worker #endif
439*61046927SAndroid Build Coastguard Worker 
440*61046927SAndroid Build Coastguard Worker #endif /* VK_IMAGE_H */
441