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>
This commit is contained in:

committed by
Marge Bot

parent
b09db9d823
commit
7b87e1afbc
@@ -1704,6 +1704,25 @@ anv_image_finish(struct anv_image *image)
|
|||||||
if (anv_image_is_sparse(image))
|
if (anv_image_is_sparse(image))
|
||||||
anv_image_finish_sparse_bindings(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) {
|
if (image->from_gralloc) {
|
||||||
assert(!image->disjoint);
|
assert(!image->disjoint);
|
||||||
assert(image->n_planes == 1);
|
assert(image->n_planes == 1);
|
||||||
@@ -2321,12 +2340,12 @@ VkResult anv_BindImageMemory2(
|
|||||||
&image->planes[p].primary_surface.isl;
|
&image->planes[p].primary_surface.isl;
|
||||||
const uint64_t format_bits =
|
const uint64_t format_bits =
|
||||||
intel_aux_map_format_bits_for_isl_surf(surf);
|
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,
|
intel_aux_map_add_mapping(device->aux_map_ctx,
|
||||||
anv_address_physical(main_addr),
|
anv_address_physical(main_addr),
|
||||||
anv_address_physical(aux_addr),
|
anv_address_physical(aux_addr),
|
||||||
surf->size_B, format_bits);
|
surf->size_B, format_bits);
|
||||||
if (mapped)
|
if (image->planes[p].aux_ccs_mapped)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -4895,6 +4895,8 @@ struct anv_image {
|
|||||||
* boolean will prevent the usage of CC_ONE.
|
* boolean will prevent the usage of CC_ONE.
|
||||||
*/
|
*/
|
||||||
bool can_non_zero_fast_clear;
|
bool can_non_zero_fast_clear;
|
||||||
|
|
||||||
|
bool aux_ccs_mapped;
|
||||||
} planes[3];
|
} planes[3];
|
||||||
|
|
||||||
struct anv_image_memory_range vid_dmv_top_surface;
|
struct anv_image_memory_range vid_dmv_top_surface;
|
||||||
|
Reference in New Issue
Block a user