1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Red Hat.
3*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Bas Nieuwenhuizen
4*61046927SAndroid Build Coastguard Worker *
5*61046927SAndroid Build Coastguard Worker * based in part on anv driver which is:
6*61046927SAndroid Build Coastguard Worker * Copyright © 2015 Intel Corporation
7*61046927SAndroid Build Coastguard Worker *
8*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
9*61046927SAndroid Build Coastguard Worker */
10*61046927SAndroid Build Coastguard Worker
11*61046927SAndroid Build Coastguard Worker #ifndef RADV_IMAGE_H
12*61046927SAndroid Build Coastguard Worker #define RADV_IMAGE_H
13*61046927SAndroid Build Coastguard Worker
14*61046927SAndroid Build Coastguard Worker #include "ac_surface.h"
15*61046927SAndroid Build Coastguard Worker
16*61046927SAndroid Build Coastguard Worker #include "radv_device.h"
17*61046927SAndroid Build Coastguard Worker #include "radv_physical_device.h"
18*61046927SAndroid Build Coastguard Worker #include "radv_radeon_winsys.h"
19*61046927SAndroid Build Coastguard Worker
20*61046927SAndroid Build Coastguard Worker #include "vk_format.h"
21*61046927SAndroid Build Coastguard Worker #include "vk_image.h"
22*61046927SAndroid Build Coastguard Worker
23*61046927SAndroid Build Coastguard Worker static const VkImageUsageFlags RADV_IMAGE_USAGE_WRITE_BITS =
24*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
25*61046927SAndroid Build Coastguard Worker VK_IMAGE_USAGE_STORAGE_BIT;
26*61046927SAndroid Build Coastguard Worker
27*61046927SAndroid Build Coastguard Worker struct radv_image_plane {
28*61046927SAndroid Build Coastguard Worker VkFormat format;
29*61046927SAndroid Build Coastguard Worker struct radeon_surf surface;
30*61046927SAndroid Build Coastguard Worker };
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker struct radv_image_binding {
33*61046927SAndroid Build Coastguard Worker /* Set when bound */
34*61046927SAndroid Build Coastguard Worker struct radeon_winsys_bo *bo;
35*61046927SAndroid Build Coastguard Worker VkDeviceSize offset;
36*61046927SAndroid Build Coastguard Worker uint64_t bo_va;
37*61046927SAndroid Build Coastguard Worker uint64_t range;
38*61046927SAndroid Build Coastguard Worker };
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard Worker struct radv_image {
41*61046927SAndroid Build Coastguard Worker struct vk_image vk;
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker VkDeviceSize size;
44*61046927SAndroid Build Coastguard Worker uint32_t alignment;
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker unsigned queue_family_mask;
47*61046927SAndroid Build Coastguard Worker bool exclusive;
48*61046927SAndroid Build Coastguard Worker bool shareable;
49*61046927SAndroid Build Coastguard Worker bool l2_coherent;
50*61046927SAndroid Build Coastguard Worker bool dcc_sign_reinterpret;
51*61046927SAndroid Build Coastguard Worker bool support_comp_to_single;
52*61046927SAndroid Build Coastguard Worker
53*61046927SAndroid Build Coastguard Worker struct radv_image_binding bindings[3];
54*61046927SAndroid Build Coastguard Worker bool tc_compatible_cmask;
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker uint64_t clear_value_offset;
57*61046927SAndroid Build Coastguard Worker uint64_t fce_pred_offset;
58*61046927SAndroid Build Coastguard Worker uint64_t dcc_pred_offset;
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker /*
61*61046927SAndroid Build Coastguard Worker * Metadata for the TC-compat zrange workaround. If the 32-bit value
62*61046927SAndroid Build Coastguard Worker * stored at this offset is UINT_MAX, the driver will emit
63*61046927SAndroid Build Coastguard Worker * DB_Z_INFO.ZRANGE_PRECISION=0, otherwise it will skip the
64*61046927SAndroid Build Coastguard Worker * SET_CONTEXT_REG packet.
65*61046927SAndroid Build Coastguard Worker */
66*61046927SAndroid Build Coastguard Worker uint64_t tc_compat_zrange_offset;
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker /* For VK_ANDROID_native_buffer, the WSI image owns the memory, */
69*61046927SAndroid Build Coastguard Worker VkDeviceMemory owned_memory;
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Worker unsigned plane_count;
72*61046927SAndroid Build Coastguard Worker bool disjoint;
73*61046927SAndroid Build Coastguard Worker struct radv_image_plane planes[0];
74*61046927SAndroid Build Coastguard Worker };
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(radv_image, vk.base, VkImage, VK_OBJECT_TYPE_IMAGE)
77*61046927SAndroid Build Coastguard Worker
78*61046927SAndroid Build Coastguard Worker static inline uint64_t
radv_image_get_va(const struct radv_image * image,uint32_t bind_idx)79*61046927SAndroid Build Coastguard Worker radv_image_get_va(const struct radv_image *image, uint32_t bind_idx)
80*61046927SAndroid Build Coastguard Worker {
81*61046927SAndroid Build Coastguard Worker return radv_buffer_get_va(image->bindings[bind_idx].bo) + image->bindings[bind_idx].offset;
82*61046927SAndroid Build Coastguard Worker }
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker static inline bool
radv_image_extent_compare(const struct radv_image * image,const VkExtent3D * extent)85*61046927SAndroid Build Coastguard Worker radv_image_extent_compare(const struct radv_image *image, const VkExtent3D *extent)
86*61046927SAndroid Build Coastguard Worker {
87*61046927SAndroid Build Coastguard Worker if (extent->width != image->vk.extent.width || extent->height != image->vk.extent.height ||
88*61046927SAndroid Build Coastguard Worker extent->depth != image->vk.extent.depth)
89*61046927SAndroid Build Coastguard Worker return false;
90*61046927SAndroid Build Coastguard Worker return true;
91*61046927SAndroid Build Coastguard Worker }
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Worker /**
94*61046927SAndroid Build Coastguard Worker * Return whether the image has CMASK metadata for color surfaces.
95*61046927SAndroid Build Coastguard Worker */
96*61046927SAndroid Build Coastguard Worker static inline bool
radv_image_has_cmask(const struct radv_image * image)97*61046927SAndroid Build Coastguard Worker radv_image_has_cmask(const struct radv_image *image)
98*61046927SAndroid Build Coastguard Worker {
99*61046927SAndroid Build Coastguard Worker return image->planes[0].surface.cmask_offset;
100*61046927SAndroid Build Coastguard Worker }
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Worker /**
103*61046927SAndroid Build Coastguard Worker * Return whether the image has FMASK metadata for color surfaces.
104*61046927SAndroid Build Coastguard Worker */
105*61046927SAndroid Build Coastguard Worker static inline bool
radv_image_has_fmask(const struct radv_image * image)106*61046927SAndroid Build Coastguard Worker radv_image_has_fmask(const struct radv_image *image)
107*61046927SAndroid Build Coastguard Worker {
108*61046927SAndroid Build Coastguard Worker return image->planes[0].surface.fmask_offset;
109*61046927SAndroid Build Coastguard Worker }
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Worker /**
112*61046927SAndroid Build Coastguard Worker * Return whether the image has DCC metadata for color surfaces.
113*61046927SAndroid Build Coastguard Worker */
114*61046927SAndroid Build Coastguard Worker static inline bool
radv_image_has_dcc(const struct radv_image * image)115*61046927SAndroid Build Coastguard Worker radv_image_has_dcc(const struct radv_image *image)
116*61046927SAndroid Build Coastguard Worker {
117*61046927SAndroid Build Coastguard Worker return !(image->planes[0].surface.flags & RADEON_SURF_Z_OR_SBUFFER) && image->planes[0].surface.meta_offset;
118*61046927SAndroid Build Coastguard Worker }
119*61046927SAndroid Build Coastguard Worker
120*61046927SAndroid Build Coastguard Worker /**
121*61046927SAndroid Build Coastguard Worker * Return whether the image is TC-compatible CMASK.
122*61046927SAndroid Build Coastguard Worker */
123*61046927SAndroid Build Coastguard Worker static inline bool
radv_image_is_tc_compat_cmask(const struct radv_image * image)124*61046927SAndroid Build Coastguard Worker radv_image_is_tc_compat_cmask(const struct radv_image *image)
125*61046927SAndroid Build Coastguard Worker {
126*61046927SAndroid Build Coastguard Worker return radv_image_has_fmask(image) && image->tc_compatible_cmask;
127*61046927SAndroid Build Coastguard Worker }
128*61046927SAndroid Build Coastguard Worker
129*61046927SAndroid Build Coastguard Worker /**
130*61046927SAndroid Build Coastguard Worker * Return whether DCC metadata is enabled for a level.
131*61046927SAndroid Build Coastguard Worker */
132*61046927SAndroid Build Coastguard Worker static inline bool
radv_dcc_enabled(const struct radv_image * image,unsigned level)133*61046927SAndroid Build Coastguard Worker radv_dcc_enabled(const struct radv_image *image, unsigned level)
134*61046927SAndroid Build Coastguard Worker {
135*61046927SAndroid Build Coastguard Worker return radv_image_has_dcc(image) && level < image->planes[0].surface.num_meta_levels;
136*61046927SAndroid Build Coastguard Worker }
137*61046927SAndroid Build Coastguard Worker
138*61046927SAndroid Build Coastguard Worker /**
139*61046927SAndroid Build Coastguard Worker * Return whether the image has CB metadata.
140*61046927SAndroid Build Coastguard Worker */
141*61046927SAndroid Build Coastguard Worker static inline bool
radv_image_has_CB_metadata(const struct radv_image * image)142*61046927SAndroid Build Coastguard Worker radv_image_has_CB_metadata(const struct radv_image *image)
143*61046927SAndroid Build Coastguard Worker {
144*61046927SAndroid Build Coastguard Worker return radv_image_has_cmask(image) || radv_image_has_fmask(image) || radv_image_has_dcc(image);
145*61046927SAndroid Build Coastguard Worker }
146*61046927SAndroid Build Coastguard Worker
147*61046927SAndroid Build Coastguard Worker /**
148*61046927SAndroid Build Coastguard Worker * Return whether the image has HTILE metadata for depth surfaces.
149*61046927SAndroid Build Coastguard Worker */
150*61046927SAndroid Build Coastguard Worker static inline bool
radv_image_has_htile(const struct radv_image * image)151*61046927SAndroid Build Coastguard Worker radv_image_has_htile(const struct radv_image *image)
152*61046927SAndroid Build Coastguard Worker {
153*61046927SAndroid Build Coastguard Worker return image->planes[0].surface.flags & RADEON_SURF_Z_OR_SBUFFER && image->planes[0].surface.meta_size;
154*61046927SAndroid Build Coastguard Worker }
155*61046927SAndroid Build Coastguard Worker
156*61046927SAndroid Build Coastguard Worker /**
157*61046927SAndroid Build Coastguard Worker * Return whether the image has VRS HTILE metadata for depth surfaces
158*61046927SAndroid Build Coastguard Worker */
159*61046927SAndroid Build Coastguard Worker static inline bool
radv_image_has_vrs_htile(const struct radv_device * device,const struct radv_image * image)160*61046927SAndroid Build Coastguard Worker radv_image_has_vrs_htile(const struct radv_device *device, const struct radv_image *image)
161*61046927SAndroid Build Coastguard Worker {
162*61046927SAndroid Build Coastguard Worker const struct radv_physical_device *pdev = radv_device_physical(device);
163*61046927SAndroid Build Coastguard Worker const enum amd_gfx_level gfx_level = pdev->info.gfx_level;
164*61046927SAndroid Build Coastguard Worker
165*61046927SAndroid Build Coastguard Worker /* Any depth buffer can potentially use VRS on GFX10.3. */
166*61046927SAndroid Build Coastguard Worker return gfx_level == GFX10_3 && device->vk.enabled_features.attachmentFragmentShadingRate &&
167*61046927SAndroid Build Coastguard Worker radv_image_has_htile(image) && (image->vk.usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT);
168*61046927SAndroid Build Coastguard Worker }
169*61046927SAndroid Build Coastguard Worker
170*61046927SAndroid Build Coastguard Worker /**
171*61046927SAndroid Build Coastguard Worker * Return whether HTILE metadata is enabled for a level.
172*61046927SAndroid Build Coastguard Worker */
173*61046927SAndroid Build Coastguard Worker static inline bool
radv_htile_enabled(const struct radv_image * image,unsigned level)174*61046927SAndroid Build Coastguard Worker radv_htile_enabled(const struct radv_image *image, unsigned level)
175*61046927SAndroid Build Coastguard Worker {
176*61046927SAndroid Build Coastguard Worker return radv_image_has_htile(image) && level < image->planes[0].surface.num_meta_levels;
177*61046927SAndroid Build Coastguard Worker }
178*61046927SAndroid Build Coastguard Worker
179*61046927SAndroid Build Coastguard Worker /**
180*61046927SAndroid Build Coastguard Worker * Return whether the image is TC-compatible HTILE.
181*61046927SAndroid Build Coastguard Worker */
182*61046927SAndroid Build Coastguard Worker static inline bool
radv_image_is_tc_compat_htile(const struct radv_image * image)183*61046927SAndroid Build Coastguard Worker radv_image_is_tc_compat_htile(const struct radv_image *image)
184*61046927SAndroid Build Coastguard Worker {
185*61046927SAndroid Build Coastguard Worker return radv_image_has_htile(image) && (image->planes[0].surface.flags & RADEON_SURF_TC_COMPATIBLE_HTILE);
186*61046927SAndroid Build Coastguard Worker }
187*61046927SAndroid Build Coastguard Worker
188*61046927SAndroid Build Coastguard Worker /**
189*61046927SAndroid Build Coastguard Worker * Return whether the entire HTILE buffer can be used for depth in order to
190*61046927SAndroid Build Coastguard Worker * improve HiZ Z-Range precision.
191*61046927SAndroid Build Coastguard Worker */
192*61046927SAndroid Build Coastguard Worker static inline bool
radv_image_tile_stencil_disabled(const struct radv_device * device,const struct radv_image * image)193*61046927SAndroid Build Coastguard Worker radv_image_tile_stencil_disabled(const struct radv_device *device, const struct radv_image *image)
194*61046927SAndroid Build Coastguard Worker {
195*61046927SAndroid Build Coastguard Worker const struct radv_physical_device *pdev = radv_device_physical(device);
196*61046927SAndroid Build Coastguard Worker
197*61046927SAndroid Build Coastguard Worker if (pdev->info.gfx_level >= GFX9) {
198*61046927SAndroid Build Coastguard Worker return !vk_format_has_stencil(image->vk.format) && !radv_image_has_vrs_htile(device, image);
199*61046927SAndroid Build Coastguard Worker } else {
200*61046927SAndroid Build Coastguard Worker /* Due to a hw bug, TILE_STENCIL_DISABLE must be set to 0 for
201*61046927SAndroid Build Coastguard Worker * the TC-compat ZRANGE issue even if no stencil is used.
202*61046927SAndroid Build Coastguard Worker */
203*61046927SAndroid Build Coastguard Worker return !vk_format_has_stencil(image->vk.format) && !radv_image_is_tc_compat_htile(image);
204*61046927SAndroid Build Coastguard Worker }
205*61046927SAndroid Build Coastguard Worker }
206*61046927SAndroid Build Coastguard Worker
207*61046927SAndroid Build Coastguard Worker static inline bool
radv_image_has_clear_value(const struct radv_image * image)208*61046927SAndroid Build Coastguard Worker radv_image_has_clear_value(const struct radv_image *image)
209*61046927SAndroid Build Coastguard Worker {
210*61046927SAndroid Build Coastguard Worker return image->clear_value_offset != 0;
211*61046927SAndroid Build Coastguard Worker }
212*61046927SAndroid Build Coastguard Worker
213*61046927SAndroid Build Coastguard Worker static inline uint64_t
radv_image_get_fast_clear_va(const struct radv_image * image,uint32_t base_level)214*61046927SAndroid Build Coastguard Worker radv_image_get_fast_clear_va(const struct radv_image *image, uint32_t base_level)
215*61046927SAndroid Build Coastguard Worker {
216*61046927SAndroid Build Coastguard Worker assert(radv_image_has_clear_value(image));
217*61046927SAndroid Build Coastguard Worker
218*61046927SAndroid Build Coastguard Worker uint64_t va = radv_image_get_va(image, 0);
219*61046927SAndroid Build Coastguard Worker va += image->clear_value_offset + base_level * 8;
220*61046927SAndroid Build Coastguard Worker return va;
221*61046927SAndroid Build Coastguard Worker }
222*61046927SAndroid Build Coastguard Worker
223*61046927SAndroid Build Coastguard Worker static inline uint64_t
radv_image_get_fce_pred_va(const struct radv_image * image,uint32_t base_level)224*61046927SAndroid Build Coastguard Worker radv_image_get_fce_pred_va(const struct radv_image *image, uint32_t base_level)
225*61046927SAndroid Build Coastguard Worker {
226*61046927SAndroid Build Coastguard Worker assert(image->fce_pred_offset != 0);
227*61046927SAndroid Build Coastguard Worker
228*61046927SAndroid Build Coastguard Worker uint64_t va = radv_image_get_va(image, 0);
229*61046927SAndroid Build Coastguard Worker va += image->fce_pred_offset + base_level * 8;
230*61046927SAndroid Build Coastguard Worker return va;
231*61046927SAndroid Build Coastguard Worker }
232*61046927SAndroid Build Coastguard Worker
233*61046927SAndroid Build Coastguard Worker static inline uint64_t
radv_image_get_dcc_pred_va(const struct radv_image * image,uint32_t base_level)234*61046927SAndroid Build Coastguard Worker radv_image_get_dcc_pred_va(const struct radv_image *image, uint32_t base_level)
235*61046927SAndroid Build Coastguard Worker {
236*61046927SAndroid Build Coastguard Worker assert(image->dcc_pred_offset != 0);
237*61046927SAndroid Build Coastguard Worker
238*61046927SAndroid Build Coastguard Worker uint64_t va = radv_image_get_va(image, 0);
239*61046927SAndroid Build Coastguard Worker va += image->dcc_pred_offset + base_level * 8;
240*61046927SAndroid Build Coastguard Worker return va;
241*61046927SAndroid Build Coastguard Worker }
242*61046927SAndroid Build Coastguard Worker
243*61046927SAndroid Build Coastguard Worker static inline uint64_t
radv_get_tc_compat_zrange_va(const struct radv_image * image,uint32_t base_level)244*61046927SAndroid Build Coastguard Worker radv_get_tc_compat_zrange_va(const struct radv_image *image, uint32_t base_level)
245*61046927SAndroid Build Coastguard Worker {
246*61046927SAndroid Build Coastguard Worker assert(image->tc_compat_zrange_offset != 0);
247*61046927SAndroid Build Coastguard Worker
248*61046927SAndroid Build Coastguard Worker uint64_t va = radv_image_get_va(image, 0);
249*61046927SAndroid Build Coastguard Worker va += image->tc_compat_zrange_offset + base_level * 4;
250*61046927SAndroid Build Coastguard Worker return va;
251*61046927SAndroid Build Coastguard Worker }
252*61046927SAndroid Build Coastguard Worker
253*61046927SAndroid Build Coastguard Worker static inline uint64_t
radv_get_ds_clear_value_va(const struct radv_image * image,uint32_t base_level)254*61046927SAndroid Build Coastguard Worker radv_get_ds_clear_value_va(const struct radv_image *image, uint32_t base_level)
255*61046927SAndroid Build Coastguard Worker {
256*61046927SAndroid Build Coastguard Worker assert(radv_image_has_clear_value(image));
257*61046927SAndroid Build Coastguard Worker
258*61046927SAndroid Build Coastguard Worker uint64_t va = radv_image_get_va(image, 0);
259*61046927SAndroid Build Coastguard Worker va += image->clear_value_offset + base_level * 8;
260*61046927SAndroid Build Coastguard Worker return va;
261*61046927SAndroid Build Coastguard Worker }
262*61046927SAndroid Build Coastguard Worker
263*61046927SAndroid Build Coastguard Worker static inline uint32_t
radv_get_htile_initial_value(const struct radv_device * device,const struct radv_image * image)264*61046927SAndroid Build Coastguard Worker radv_get_htile_initial_value(const struct radv_device *device, const struct radv_image *image)
265*61046927SAndroid Build Coastguard Worker {
266*61046927SAndroid Build Coastguard Worker uint32_t initial_value;
267*61046927SAndroid Build Coastguard Worker
268*61046927SAndroid Build Coastguard Worker if (radv_image_tile_stencil_disabled(device, image)) {
269*61046927SAndroid Build Coastguard Worker /* Z only (no stencil):
270*61046927SAndroid Build Coastguard Worker *
271*61046927SAndroid Build Coastguard Worker * |31 18|17 4|3 0|
272*61046927SAndroid Build Coastguard Worker * +---------+---------+-------+
273*61046927SAndroid Build Coastguard Worker * | Max Z | Min Z | ZMask |
274*61046927SAndroid Build Coastguard Worker */
275*61046927SAndroid Build Coastguard Worker initial_value = 0xfffc000f;
276*61046927SAndroid Build Coastguard Worker } else {
277*61046927SAndroid Build Coastguard Worker /* Z and stencil:
278*61046927SAndroid Build Coastguard Worker *
279*61046927SAndroid Build Coastguard Worker * |31 12|11 10|9 8|7 6|5 4|3 0|
280*61046927SAndroid Build Coastguard Worker * +-----------+-----+------+-----+-----+-------+
281*61046927SAndroid Build Coastguard Worker * | Z Range | | SMem | SR1 | SR0 | ZMask |
282*61046927SAndroid Build Coastguard Worker *
283*61046927SAndroid Build Coastguard Worker * SR0/SR1 contains the stencil test results. Initializing
284*61046927SAndroid Build Coastguard Worker * SR0/SR1 to 0x3 means the stencil test result is unknown.
285*61046927SAndroid Build Coastguard Worker *
286*61046927SAndroid Build Coastguard Worker * Z, stencil and 4 bit VRS encoding:
287*61046927SAndroid Build Coastguard Worker * |31 12|11 10|9 8|7 6|5 4|3 0|
288*61046927SAndroid Build Coastguard Worker * +-----------+------------+------+------------+-----+-------+
289*61046927SAndroid Build Coastguard Worker * | Z Range | VRS y-rate | SMem | VRS x-rate | SR0 | ZMask |
290*61046927SAndroid Build Coastguard Worker */
291*61046927SAndroid Build Coastguard Worker if (radv_image_has_vrs_htile(device, image)) {
292*61046927SAndroid Build Coastguard Worker /* Initialize the VRS x-rate value at 0, so the hw interprets it as 1 sample. */
293*61046927SAndroid Build Coastguard Worker initial_value = 0xfffff33f;
294*61046927SAndroid Build Coastguard Worker } else {
295*61046927SAndroid Build Coastguard Worker initial_value = 0xfffff3ff;
296*61046927SAndroid Build Coastguard Worker }
297*61046927SAndroid Build Coastguard Worker }
298*61046927SAndroid Build Coastguard Worker
299*61046927SAndroid Build Coastguard Worker return initial_value;
300*61046927SAndroid Build Coastguard Worker }
301*61046927SAndroid Build Coastguard Worker
302*61046927SAndroid Build Coastguard Worker static inline bool
radv_image_get_iterate256(const struct radv_device * device,struct radv_image * image)303*61046927SAndroid Build Coastguard Worker radv_image_get_iterate256(const struct radv_device *device, struct radv_image *image)
304*61046927SAndroid Build Coastguard Worker {
305*61046927SAndroid Build Coastguard Worker const struct radv_physical_device *pdev = radv_device_physical(device);
306*61046927SAndroid Build Coastguard Worker
307*61046927SAndroid Build Coastguard Worker /* ITERATE_256 is required for depth or stencil MSAA images that are TC-compatible HTILE. */
308*61046927SAndroid Build Coastguard Worker return pdev->info.gfx_level >= GFX10 && radv_image_is_tc_compat_htile(image) && image->vk.samples > 1;
309*61046927SAndroid Build Coastguard Worker }
310*61046927SAndroid Build Coastguard Worker
311*61046927SAndroid Build Coastguard Worker bool radv_are_formats_dcc_compatible(const struct radv_physical_device *pdev, const void *pNext, VkFormat format,
312*61046927SAndroid Build Coastguard Worker VkImageCreateFlags flags, bool *sign_reinterpret);
313*61046927SAndroid Build Coastguard Worker
314*61046927SAndroid Build Coastguard Worker bool radv_image_use_dcc_image_stores(const struct radv_device *device, const struct radv_image *image);
315*61046927SAndroid Build Coastguard Worker
316*61046927SAndroid Build Coastguard Worker bool radv_image_use_dcc_predication(const struct radv_device *device, const struct radv_image *image);
317*61046927SAndroid Build Coastguard Worker
318*61046927SAndroid Build Coastguard Worker void radv_compose_swizzle(const struct util_format_description *desc, const VkComponentMapping *mapping,
319*61046927SAndroid Build Coastguard Worker enum pipe_swizzle swizzle[4]);
320*61046927SAndroid Build Coastguard Worker
321*61046927SAndroid Build Coastguard Worker void radv_init_metadata(struct radv_device *device, struct radv_image *image, struct radeon_bo_metadata *metadata);
322*61046927SAndroid Build Coastguard Worker
323*61046927SAndroid Build Coastguard Worker void radv_image_override_offset_stride(struct radv_device *device, struct radv_image *image, uint64_t offset,
324*61046927SAndroid Build Coastguard Worker uint32_t stride);
325*61046927SAndroid Build Coastguard Worker
326*61046927SAndroid Build Coastguard Worker bool radv_image_can_fast_clear(const struct radv_device *device, const struct radv_image *image);
327*61046927SAndroid Build Coastguard Worker
328*61046927SAndroid Build Coastguard Worker struct ac_surf_info radv_get_ac_surf_info(struct radv_device *device, const struct radv_image *image);
329*61046927SAndroid Build Coastguard Worker
330*61046927SAndroid Build Coastguard Worker struct radv_image_create_info {
331*61046927SAndroid Build Coastguard Worker const VkImageCreateInfo *vk_info;
332*61046927SAndroid Build Coastguard Worker bool scanout;
333*61046927SAndroid Build Coastguard Worker bool no_metadata_planes;
334*61046927SAndroid Build Coastguard Worker bool prime_blit_src;
335*61046927SAndroid Build Coastguard Worker const struct radeon_bo_metadata *bo_metadata;
336*61046927SAndroid Build Coastguard Worker };
337*61046927SAndroid Build Coastguard Worker
338*61046927SAndroid Build Coastguard Worker VkResult radv_image_create_layout(struct radv_device *device, struct radv_image_create_info create_info,
339*61046927SAndroid Build Coastguard Worker const struct VkImageDrmFormatModifierExplicitCreateInfoEXT *mod_info,
340*61046927SAndroid Build Coastguard Worker const struct VkVideoProfileListInfoKHR *profile_list, struct radv_image *image);
341*61046927SAndroid Build Coastguard Worker
342*61046927SAndroid Build Coastguard Worker VkResult radv_image_create(VkDevice _device, const struct radv_image_create_info *info,
343*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc, VkImage *pImage, bool is_internal);
344*61046927SAndroid Build Coastguard Worker
345*61046927SAndroid Build Coastguard Worker unsigned radv_plane_from_aspect(VkImageAspectFlags mask);
346*61046927SAndroid Build Coastguard Worker
347*61046927SAndroid Build Coastguard Worker VkFormat radv_get_aspect_format(struct radv_image *image, VkImageAspectFlags mask);
348*61046927SAndroid Build Coastguard Worker
349*61046927SAndroid Build Coastguard Worker /* Whether the image has a htile that is known consistent with the contents of
350*61046927SAndroid Build Coastguard Worker * the image and is allowed to be in compressed form.
351*61046927SAndroid Build Coastguard Worker *
352*61046927SAndroid Build Coastguard Worker * If this is false reads that don't use the htile should be able to return
353*61046927SAndroid Build Coastguard Worker * correct results.
354*61046927SAndroid Build Coastguard Worker */
355*61046927SAndroid Build Coastguard Worker bool radv_layout_is_htile_compressed(const struct radv_device *device, const struct radv_image *image,
356*61046927SAndroid Build Coastguard Worker VkImageLayout layout, unsigned queue_mask);
357*61046927SAndroid Build Coastguard Worker
358*61046927SAndroid Build Coastguard Worker bool radv_layout_can_fast_clear(const struct radv_device *device, const struct radv_image *image, unsigned level,
359*61046927SAndroid Build Coastguard Worker VkImageLayout layout, unsigned queue_mask);
360*61046927SAndroid Build Coastguard Worker
361*61046927SAndroid Build Coastguard Worker bool radv_layout_dcc_compressed(const struct radv_device *device, const struct radv_image *image, unsigned level,
362*61046927SAndroid Build Coastguard Worker VkImageLayout layout, unsigned queue_mask);
363*61046927SAndroid Build Coastguard Worker
364*61046927SAndroid Build Coastguard Worker enum radv_fmask_compression {
365*61046927SAndroid Build Coastguard Worker RADV_FMASK_COMPRESSION_NONE,
366*61046927SAndroid Build Coastguard Worker RADV_FMASK_COMPRESSION_PARTIAL,
367*61046927SAndroid Build Coastguard Worker RADV_FMASK_COMPRESSION_FULL,
368*61046927SAndroid Build Coastguard Worker };
369*61046927SAndroid Build Coastguard Worker
370*61046927SAndroid Build Coastguard Worker enum radv_fmask_compression radv_layout_fmask_compression(const struct radv_device *device,
371*61046927SAndroid Build Coastguard Worker const struct radv_image *image, VkImageLayout layout,
372*61046927SAndroid Build Coastguard Worker unsigned queue_mask);
373*61046927SAndroid Build Coastguard Worker
374*61046927SAndroid Build Coastguard Worker unsigned radv_image_queue_family_mask(const struct radv_image *image, enum radv_queue_family family,
375*61046927SAndroid Build Coastguard Worker enum radv_queue_family queue_family);
376*61046927SAndroid Build Coastguard Worker
377*61046927SAndroid Build Coastguard Worker bool radv_image_is_renderable(const struct radv_device *device, const struct radv_image *image);
378*61046927SAndroid Build Coastguard Worker
379*61046927SAndroid Build Coastguard Worker #endif /* RADV_IMAGE_H */
380