anv: Enable compression on CCS modifiers (xe2)

Don't report compressed memory type in the case of Xe2 modifiers
as the Vulkan spec requires identical memory types behind the
VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT.

Instead, we require dedicated allocation to get the right
compressed memory in allocation stage. The BMG modifier also
requires scanout flag to set. Refer to comments.

Thanks for the help from:
Nanley Chery <nanley.g.chery@intel.com>
Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Kenneth Graunke <kenneth@whitecape.org>
and other people not listed.

Signed-off-by: Jianxun Zhang <jianxun.zhang@intel.com>
Reviewed-by: Nanley Chery <nanley.g.chery@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34567>
This commit is contained in:
Jianxun Zhang
2024-07-30 16:45:39 -07:00
committed by Marge Bot
parent a45143e04c
commit a9aad4565f
2 changed files with 45 additions and 33 deletions
+28 -24
View File
@@ -1559,15 +1559,31 @@ VkResult anv_AllocateMemory(
if (wsi_info)
alloc_flags |= ANV_BO_ALLOC_SCANOUT;
struct anv_image *image = dedicated_info ?
anv_image_from_handle(dedicated_info->image) :
NULL;
if (device->info->ver >= 20 && image &&
image->vk.tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT &&
isl_drm_modifier_has_aux(image->vk.drm_format_mod)) {
/* ISL should skip compression modifiers when no_ccs is set. */
assert(!INTEL_DEBUG(DEBUG_NO_CCS));
/* Images created with the Xe2 modifiers should be allocated into
* compressed memory, but we won't get such info from the memory type,
* refer to anv_image_is_pat_compressible(). We have to check the
* modifiers and enable compression if we can here.
*/
alloc_flags |= ANV_BO_ALLOC_COMPRESSED;
} else if (mem_type->compressed && !INTEL_DEBUG(DEBUG_NO_CCS)) {
alloc_flags |= ANV_BO_ALLOC_COMPRESSED;
}
/* Anything imported or exported is EXTERNAL */
if (mem->vk.export_handle_types || mem->vk.import_handle_type) {
alloc_flags |= ANV_BO_ALLOC_EXTERNAL;
/* wsi has its own way of synchronizing with the compositor */
if (!wsi_info && dedicated_info &&
dedicated_info->image != VK_NULL_HANDLE) {
ANV_FROM_HANDLE(anv_image, image, dedicated_info->image);
if (!wsi_info && image) {
/* Apply implicit sync to be compatible with clients relying on
* implicit fencing. This matches the behavior in iris i915_batch
* submit. An example client is VA-API (iHD), so only dedicated
@@ -1585,14 +1601,6 @@ VkResult anv_AllocateMemory(
}
}
/* TODO: Disabling compression on external bos will cause problems once we
* have a modifier that supports compression (Xe2+).
*/
if (!(alloc_flags & ANV_BO_ALLOC_EXTERNAL) &&
mem_type->compressed &&
!INTEL_DEBUG(DEBUG_NO_CCS))
alloc_flags |= ANV_BO_ALLOC_COMPRESSED;
if (mem_type->dynamic_visible)
alloc_flags |= ANV_BO_ALLOC_DYNAMIC_VISIBLE_POOL;
@@ -1711,21 +1719,17 @@ VkResult anv_AllocateMemory(
if (result != VK_SUCCESS)
goto fail;
if (dedicated_info && dedicated_info->image != VK_NULL_HANDLE) {
ANV_FROM_HANDLE(anv_image, image, dedicated_info->image);
if (image && image->vk.wsi_legacy_scanout) {
/* Some legacy (non-modifiers) consumers need the tiling to be set on
* the BO. In this case, we have a dedicated allocation.
*/
if (image->vk.wsi_legacy_scanout) {
const struct isl_surf *surf = &image->planes[0].primary_surface.isl;
result = anv_device_set_bo_tiling(device, mem->bo,
surf->row_pitch_B,
surf->tiling);
if (result != VK_SUCCESS) {
anv_device_release_bo(device, mem->bo);
goto fail;
}
const struct isl_surf *surf = &image->planes[0].primary_surface.isl;
result = anv_device_set_bo_tiling(device, mem->bo,
surf->row_pitch_B,
surf->tiling);
if (result != VK_SUCCESS) {
anv_device_release_bo(device, mem->bo);
goto fail;
}
}
+17 -9
View File
@@ -2216,15 +2216,18 @@ anv_image_is_pat_compressible(struct anv_device *device, struct anv_image *image
* VkImageCreateInfo structure passed to vkCreateImage.
*/
/* There are no compression-enabled modifiers on Xe2, and all legacy
* modifiers are not defined with compression. We simply disable
* compression on all modifiers.
*
* We disable this in anv_AllocateMemory() as well.
/* Because we cannot report different memory types for uncompressed and
* compressed modifiers on the VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,
* We don't set the right compressed memory type set for Xe2 modifiers, in
* order to keep the memory types same as the uncompressed modifiers. The
* image will get compressed memory through a dedicated allocation later.
*/
if (image->vk.tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT)
return false;
if (image->vk.external_handle_types)
return false;
/* Host accessed images cannot be compressed. */
if (image->vk.usage & VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT)
return false;
@@ -2275,11 +2278,16 @@ anv_image_get_memory_requirements(struct anv_device *device,
if (image->vk.wsi_legacy_scanout ||
image->from_ahb ||
(isl_drm_modifier_has_aux(image->vk.drm_format_mod) &&
anv_image_uses_aux_map(device, image))) {
/* If we need to set the tiling for external consumers or the
* modifier involves AUX tables, we need a dedicated allocation.
(anv_image_uses_aux_map(device, image) ||
device->info->ver >= 20))) {
/* On pre-Xe2 platforms, if we need to set the tiling for external
* consumers or the modifier involves AUX tables, we need a
* dedicated allocation. On Xe2+ platforms, a dedicated allocation
* is still needed because we need to pass modifier information
* down to the allocation path. Refer to
* anv_image_is_pat_compressible().
*
* See also anv_AllocateMemory.
* See also anv_AllocateMemory().
*/
requirements->prefersDedicatedAllocation = true;
requirements->requiresDedicatedAllocation = true;