anv: track & unbind image aux-tt binding
This solves a problem when you have a big memory chunk of which some regions are bound to images. If the image is destroyed, currently the aux-tt mapping stays and prevent any new image aux-tt mapping within that region, until the memory is freed. This maps & unmaps the aux-tt region at respectively bind & destroy time, so that the memory chunks can be map through aux-tt. If there is aliasing of memory to 2 different images, then the first one "wins" the aux mapping and gets compression support. The second one doesn´t. Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Fixes:ee6e2bc4a3
("anv: Place images into the aux-map when safe to do so") Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> Reviewed-by: José Roberto de Souza <jose.souza@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26335> (cherry picked from commit7b87e1afbc
)
This commit is contained in:

committed by
Eric Engestrom

parent
d0993405a4
commit
58e5c89265
@@ -1744,7 +1744,7 @@
|
||||
"description": "anv: track & unbind image aux-tt binding",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": "ee6e2bc4a31345e50b3c674cdae233a5de5179d1",
|
||||
"notes": null
|
||||
|
@@ -1704,6 +1704,25 @@ anv_image_finish(struct anv_image *image)
|
||||
if (anv_image_is_sparse(image))
|
||||
anv_image_finish_sparse_bindings(image);
|
||||
|
||||
/* Unmap a CCS so that if the bound region of the image is rebound to
|
||||
* another image, the AUX tables will be cleared to allow for a new
|
||||
* mapping.
|
||||
*/
|
||||
for (int p = 0; p < image->n_planes; ++p) {
|
||||
if (!image->planes[p].aux_ccs_mapped)
|
||||
continue;
|
||||
|
||||
const struct anv_address main_addr =
|
||||
anv_image_address(image,
|
||||
&image->planes[p].primary_surface.memory_range);
|
||||
const struct isl_surf *surf =
|
||||
&image->planes[p].primary_surface.isl;
|
||||
|
||||
intel_aux_map_del_mapping(device->aux_map_ctx,
|
||||
anv_address_physical(main_addr),
|
||||
surf->size_B);
|
||||
}
|
||||
|
||||
if (image->from_gralloc) {
|
||||
assert(!image->disjoint);
|
||||
assert(image->n_planes == 1);
|
||||
@@ -2312,12 +2331,12 @@ VkResult anv_BindImageMemory2(
|
||||
&image->planes[p].primary_surface.isl;
|
||||
const uint64_t format_bits =
|
||||
intel_aux_map_format_bits_for_isl_surf(surf);
|
||||
const bool mapped =
|
||||
image->planes[p].aux_ccs_mapped =
|
||||
intel_aux_map_add_mapping(device->aux_map_ctx,
|
||||
anv_address_physical(main_addr),
|
||||
anv_address_physical(aux_addr),
|
||||
surf->size_B, format_bits);
|
||||
if (mapped)
|
||||
if (image->planes[p].aux_ccs_mapped)
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@@ -4686,6 +4686,8 @@ struct anv_image {
|
||||
* boolean will prevent the usage of CC_ONE.
|
||||
*/
|
||||
bool can_non_zero_fast_clear;
|
||||
|
||||
bool aux_ccs_mapped;
|
||||
} planes[3];
|
||||
|
||||
struct anv_image_memory_range vid_dmv_top_surface;
|
||||
|
Reference in New Issue
Block a user