mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 17:40:11 +01:00
anv: Meet CCS alignment reqs with dedicated allocs
At image bind time, we require BOs to meet aux-map alignment requirements in order to enable CCS on images. This is a heuristic controlled by anv_bo_allows_aux_map(). To improve the chances of getting a properly aligned BO, we make use of the dedicated allocation extension. Firstly, we report to applications a preference for dedicated memory if an image would like to use the aux map. Secondly, we align the VMA for dedicated allocations to meet aux-map requirements. To make enabling modifiers much easier on integrated gfx12, report dedicated allocations as a requirement for modifiers which specify CCS. Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> (v1) Reviewed-by: Jianxun Zhang <jianxun.zhang@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25003>
This commit is contained in:
parent
2cbec81041
commit
4cdd3178fb
4 changed files with 36 additions and 1 deletions
|
|
@ -1375,7 +1375,7 @@ anv_bo_vma_alloc_or_close(struct anv_device *device,
|
||||||
/* If we're using the AUX map, make sure we follow the required
|
/* If we're using the AUX map, make sure we follow the required
|
||||||
* alignment.
|
* alignment.
|
||||||
*/
|
*/
|
||||||
if (device->info->has_aux_map && (alloc_flags & ANV_BO_ALLOC_IMPLICIT_CCS))
|
if (device->info->has_aux_map && (alloc_flags & ANV_BO_ALLOC_DEDICATED))
|
||||||
align = MAX2(intel_aux_map_get_alignment(device->aux_map_ctx), align);
|
align = MAX2(intel_aux_map_get_alignment(device->aux_map_ctx), align);
|
||||||
|
|
||||||
/* Opportunistically align addresses to 2Mb when above 1Mb. We do this
|
/* Opportunistically align addresses to 2Mb when above 1Mb. We do this
|
||||||
|
|
@ -1563,6 +1563,7 @@ anv_device_import_bo_from_host_ptr(struct anv_device *device,
|
||||||
{
|
{
|
||||||
assert(!(alloc_flags & (ANV_BO_ALLOC_MAPPED |
|
assert(!(alloc_flags & (ANV_BO_ALLOC_MAPPED |
|
||||||
ANV_BO_ALLOC_SNOOPED |
|
ANV_BO_ALLOC_SNOOPED |
|
||||||
|
ANV_BO_ALLOC_DEDICATED |
|
||||||
ANV_BO_ALLOC_FIXED_ADDRESS)));
|
ANV_BO_ALLOC_FIXED_ADDRESS)));
|
||||||
|
|
||||||
assert(!(alloc_flags & ANV_BO_ALLOC_IMPLICIT_CCS) ||
|
assert(!(alloc_flags & ANV_BO_ALLOC_IMPLICIT_CCS) ||
|
||||||
|
|
|
||||||
|
|
@ -3942,6 +3942,7 @@ VkResult anv_AllocateMemory(
|
||||||
|
|
||||||
case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
|
case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
|
||||||
dedicated_info = (void *)ext;
|
dedicated_info = (void *)ext;
|
||||||
|
alloc_flags |= ANV_BO_ALLOC_DEDICATED;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: {
|
case VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO: {
|
||||||
|
|
|
||||||
|
|
@ -1898,6 +1898,24 @@ anv_image_get_memory_requirements(struct anv_device *device,
|
||||||
*/
|
*/
|
||||||
requirements->prefersDedicatedAllocation = true;
|
requirements->prefersDedicatedAllocation = true;
|
||||||
requirements->requiresDedicatedAllocation = true;
|
requirements->requiresDedicatedAllocation = true;
|
||||||
|
} else if (anv_image_uses_aux_map(device, image)) {
|
||||||
|
/* We request a dedicated allocation to guarantee that the BO will
|
||||||
|
* be aux-map compatible (see anv_bo_vma_alloc_or_close and
|
||||||
|
* anv_bo_allows_aux_map).
|
||||||
|
*
|
||||||
|
* TODO: This is an untested heuristic. It's not known if this
|
||||||
|
* guarantee is worth losing suballocation.
|
||||||
|
*
|
||||||
|
* If we don't have an aux-map compatible BO at the time we bind
|
||||||
|
* this image to device memory, we'll change the aux usage.
|
||||||
|
*
|
||||||
|
* It may be possible to handle an image using a modifier in the
|
||||||
|
* same way. However, we choose to keep things simple and require
|
||||||
|
* a dedicated allocation for that case.
|
||||||
|
*/
|
||||||
|
requirements->prefersDedicatedAllocation = true;
|
||||||
|
requirements->requiresDedicatedAllocation =
|
||||||
|
isl_drm_modifier_has_aux(image->vk.drm_format_mod);
|
||||||
} else {
|
} else {
|
||||||
requirements->prefersDedicatedAllocation = false;
|
requirements->prefersDedicatedAllocation = false;
|
||||||
requirements->requiresDedicatedAllocation = false;
|
requirements->requiresDedicatedAllocation = false;
|
||||||
|
|
|
||||||
|
|
@ -400,6 +400,9 @@ enum anv_bo_alloc_flags {
|
||||||
|
|
||||||
/** For descriptor pools */
|
/** For descriptor pools */
|
||||||
ANV_BO_ALLOC_DESCRIPTOR_POOL = (1 << 13),
|
ANV_BO_ALLOC_DESCRIPTOR_POOL = (1 << 13),
|
||||||
|
|
||||||
|
/** This BO will be dedicated to a buffer or an image */
|
||||||
|
ANV_BO_ALLOC_DEDICATED = (1 << 14),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct anv_bo {
|
struct anv_bo {
|
||||||
|
|
@ -4919,6 +4922,18 @@ anv_image_plane_uses_aux_map(const struct anv_device *device,
|
||||||
isl_aux_usage_has_ccs(image->planes[plane].aux_usage);
|
isl_aux_usage_has_ccs(image->planes[plane].aux_usage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
anv_image_uses_aux_map(const struct anv_device *device,
|
||||||
|
const struct anv_image *image)
|
||||||
|
{
|
||||||
|
for (uint32_t p = 0; p < image->n_planes; ++p) {
|
||||||
|
if (anv_image_plane_uses_aux_map(device, image, p))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
anv_bo_allows_aux_map(const struct anv_device *device,
|
anv_bo_allows_aux_map(const struct anv_device *device,
|
||||||
const struct anv_bo *bo)
|
const struct anv_bo *bo)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue