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 #ifndef VK_IMAGE_H
24 #define VK_IMAGE_H
25
26 #include "vk_object.h"
27
28 #include "util/u_math.h"
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 struct vk_image {
35 struct vk_object_base base;
36
37 VkImageCreateFlags create_flags;
38 VkImageType image_type;
39 VkFormat format;
40 VkExtent3D extent;
41 uint32_t mip_levels;
42 uint32_t array_layers;
43 VkSampleCountFlagBits samples;
44 VkImageTiling tiling;
45 VkImageUsageFlags usage;
46
47 /* Derived from format */
48 VkImageAspectFlags aspects;
49
50 /* VK_EXT_separate_stencil_usage */
51 VkImageUsageFlags stencil_usage;
52
53 /* VK_KHR_external_memory */
54 VkExternalMemoryHandleTypeFlags external_handle_types;
55
56 /* wsi_image_create_info::scanout */
57 bool wsi_legacy_scanout;
58
59 #ifndef _WIN32
60 /* VK_EXT_drm_format_modifier
61 *
62 * Initialized by vk_image_create/init() to DRM_FORMAT_MOD_INVALID. It's
63 * the job of the driver to parse the VK_EXT_drm_format_modifier extension
64 * structs and choose the actual modifier.
65 *
66 * Must be DRM_FORMAT_MOD_INVALID unless tiling is
67 * VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT.
68 */
69 uint64_t drm_format_mod;
70 #endif
71
72 #ifdef ANDROID
73 /* VK_ANDROID_external_memory_android_hardware_buffer */
74 uint64_t android_external_format;
75 #endif
76 };
77 VK_DEFINE_NONDISP_HANDLE_CASTS(vk_image, base, VkImage,
78 VK_OBJECT_TYPE_IMAGE);
79
80 void vk_image_init(struct vk_device *device,
81 struct vk_image *image,
82 const VkImageCreateInfo *pCreateInfo);
83 void vk_image_finish(struct vk_image *image);
84
85 void *vk_image_create(struct vk_device *device,
86 const VkImageCreateInfo *pCreateInfo,
87 const VkAllocationCallbacks *alloc,
88 size_t size);
89 void vk_image_destroy(struct vk_device *device,
90 const VkAllocationCallbacks *alloc,
91 struct vk_image *image);
92
93 void vk_image_set_format(struct vk_image *image, VkFormat format);
94
95 VkImageUsageFlags vk_image_usage(const struct vk_image *image,
96 VkImageAspectFlags aspect_mask);
97
98 VkImageAspectFlags vk_image_expand_aspect_mask(const struct vk_image *image,
99 VkImageAspectFlags aspect_mask);
100
101 static inline VkExtent3D
vk_image_mip_level_extent(const struct vk_image * image,uint32_t mip_level)102 vk_image_mip_level_extent(const struct vk_image *image,
103 uint32_t mip_level)
104 {
105 const VkExtent3D extent = {
106 u_minify(image->extent.width, mip_level),
107 u_minify(image->extent.height, mip_level),
108 u_minify(image->extent.depth, mip_level),
109 };
110 return extent;
111 }
112
113 /* This is defined as a macro so that it works for both
114 * VkImageSubresourceRange and VkImageSubresourceLayers
115 */
116 #define vk_image_subresource_layer_count(_image, _range) \
117 ((_range)->layerCount == VK_REMAINING_ARRAY_LAYERS ? \
118 (_image)->array_layers - (_range)->baseArrayLayer : (_range)->layerCount)
119
120 static inline uint32_t
vk_image_subresource_level_count(const struct vk_image * image,const VkImageSubresourceRange * range)121 vk_image_subresource_level_count(const struct vk_image *image,
122 const VkImageSubresourceRange *range)
123 {
124 return range->levelCount == VK_REMAINING_MIP_LEVELS ?
125 image->mip_levels - range->baseMipLevel : range->levelCount;
126 }
127
128 struct vk_image_view {
129 struct vk_object_base base;
130
131 VkImageViewCreateFlags create_flags;
132 struct vk_image *image;
133 VkImageViewType view_type;
134
135 /** Image view format, relative to the selected aspects
136 *
137 * For a depth/stencil image:
138 *
139 * - If vk_image_view::aspects contains both depth and stencil, this will
140 * be the full depth/stencil format of the image.
141 *
142 * - If only one aspect is selected, this will be the depth-only or
143 * stencil-only format, as per the selected aspect.
144 *
145 * For color images, we have three cases:
146 *
147 * 1. It's a single-plane image in which case this is the unmodified
148 * format provided to VkImageViewCreateInfo::format.
149 *
150 * 2. It's a YCbCr view of a multi-plane image in which case the
151 * client will have asked for VK_IMAGE_ASPECT_COLOR_BIT and the
152 * format provided will be the full planar format. In this case,
153 * the format will be the full format containing all the planes.
154 *
155 * 3. It's a single-plane view of a multi-plane image in which case
156 * the client will have asked for VK_IMAGE_ASPECT_PLANE_N_BIT and
157 * will have provided a format compatible with that specific
158 * plane of the multi-planar format. In this case, the format will be
159 * the plane-compatible format requested by the client.
160 */
161 VkFormat format;
162
163 /* Component mapping, aka swizzle
164 *
165 * Unlike the swizzle provided via VkImageViewCreateInfo::components, this
166 * will never contain VK_COMPONENT_SWIZZLE_IDENTITY. It will be resolved
167 * to VK_COMPONENT_SWIZZLE_R/G/B/A, as appropriate.
168 */
169 VkComponentMapping swizzle;
170
171 /** Aspects from the image represented by this view
172 *
173 * For depth/stencil images, this is the aspectMask provided by
174 * VkImageViewCreateinfo::subresourceRange::aspectMask.
175 *
176 * For color images, we have three cases:
177 *
178 * 1. It's a single-plane image in which case this only aspect is
179 * VK_IMAGE_ASPECT_COLOR_BIT.
180 *
181 * 2. It's a YCbCr view of a multi-plane image in which case the
182 * client will have asked for VK_IMAGE_ASPECT_COLOR_BIT and the
183 * format provided will be the full planar format. In this case,
184 * aspects will be the full set of plane aspects in the image.
185 *
186 * 3. It's a single-plane view of a multi-plane image in which case
187 * the client will have asked for VK_IMAGE_ASPECT_PLANE_N_BIT and
188 * will have provided a format compatible with that specific
189 * plane of the multi-planar format. In this case, aspects will be
190 * VK_IMAGE_ASPECT_PLANE_N_BIT where N is the selected plane.
191 *
192 * This seems almost backwards from the API but ensures that
193 * vk_image_view::aspects is always a subset of vk_image::aspects.
194 */
195 VkImageAspectFlags aspects;
196
197 uint32_t base_mip_level;
198 uint32_t level_count;
199 uint32_t base_array_layer;
200 uint32_t layer_count;
201
202 /* Image extent at LOD 0 */
203 VkExtent3D extent;
204
205 /* VK_KHR_maintenance2 */
206 VkImageUsageFlags usage;
207 };
208
209 void vk_image_view_init(struct vk_device *device,
210 struct vk_image_view *image_view,
211 const VkImageViewCreateInfo *pCreateInfo);
212 void vk_image_view_finish(struct vk_image_view *image_view);
213
214 void *vk_image_view_create(struct vk_device *device,
215 const VkImageViewCreateInfo *pCreateInfo,
216 const VkAllocationCallbacks *alloc,
217 size_t size);
218 void vk_image_view_destroy(struct vk_device *device,
219 const VkAllocationCallbacks *alloc,
220 struct vk_image_view *image_view);
221
222 bool vk_image_layout_is_read_only(VkImageLayout layout,
223 VkImageAspectFlagBits aspect);
224 VkImageUsageFlags vk_image_layout_to_usage_flags(VkImageLayout layout,
225 VkImageAspectFlagBits aspect);
226
227 #ifdef __cplusplus
228 }
229 #endif
230
231 #endif /* VK_IMAGE_H */
232