return false;
/* TODO: Enable DCC for mipmaps on GFX9+. */
- if (pCreateInfo->mipLevels > 1 &&
+ if ((pCreateInfo->arrayLayers > 1 || pCreateInfo->mipLevels > 1) &&
device->physical_device->rad_info.chip_class >= GFX9)
return false;
- /* TODO: Enable DCC for array layers. */
- if (pCreateInfo->arrayLayers > 1)
- return false;
-
/* Do not enable DCC for mipmapped arrays because performance is worse. */
if (pCreateInfo->arrayLayers > 1 && pCreateInfo->mipLevels > 1)
return false;
}
static inline bool
-radv_image_can_enable_dcc(struct radv_image *image)
+radv_image_can_enable_dcc(struct radv_device *device, struct radv_image *image)
{
- return radv_image_can_enable_dcc_or_cmask(image) &&
- radv_image_has_dcc(image);
+ if (!radv_image_can_enable_dcc_or_cmask(image) ||
+ !radv_image_has_dcc(image))
+ return false;
+
+ /* On GFX8, DCC layers can be interleaved and it's currently only
+ * enabled if slice size is equal to the per slice fast clear size
+ * because the driver assumes that portions of multiple layers are
+ * contiguous during fast clears.
+ */
+ if (image->info.array_size > 1) {
+ const struct legacy_surf_level *surf_level =
+ &image->planes[0].surface.u.legacy.level[0];
+
+ assert(device->physical_device->rad_info.chip_class == GFX8);
+
+ if (image->planes[0].surface.dcc_slice_size != surf_level->dcc_fast_clear_size)
+ return false;
+ }
+
+ return true;
}
static inline bool
if (!create_info->no_metadata_planes) {
/* Try to enable DCC first. */
- if (radv_image_can_enable_dcc(image)) {
+ if (radv_image_can_enable_dcc(device, image)) {
radv_image_alloc_dcc(image);
if (image->info.samples > 1) {
/* CMASK should be enabled because DCC fast