From b9133e48a6c8ee151649a97d44f1f36c54d62de6 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Mon, 1 Feb 2021 04:42:18 -0800 Subject: [PATCH] iris: Pin surface state buffers after possibly updating the clear color MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On Gen8, updating the clear color will end up allocating new SURFACE_STATE entries. These might end up living in a different BO than the original copies, which means that we have to pin _after_ updating the clear color, not before. Found by inspection. Reviewed-by: Zoltán Böszörményi Reviewed-by: Nanley Chery Part-of: --- src/gallium/drivers/iris/iris_state.c | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index f7cc7ed38fa..03c366bd537 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -4819,16 +4819,6 @@ use_surface(struct iris_context *ice, struct iris_resource *res = (void *) p_surf->texture; uint32_t offset = 0; - iris_use_pinned_bo(batch, iris_resource_bo(p_surf->texture), - writeable, access); - if (GEN_GEN == 8 && is_read_surface) { - iris_use_pinned_bo(batch, iris_resource_bo(surf->surface_state_read.ref.res), false, - IRIS_DOMAIN_NONE); - } else { - iris_use_pinned_bo(batch, iris_resource_bo(surf->surface_state.ref.res), false, - IRIS_DOMAIN_NONE); - } - if (res->aux.bo) { iris_use_pinned_bo(batch, res->aux.bo, writeable, access); if (res->aux.clear_color_bo) @@ -4846,6 +4836,16 @@ use_surface(struct iris_context *ice, } } + iris_use_pinned_bo(batch, iris_resource_bo(p_surf->texture), + writeable, access); + if (GEN_GEN == 8 && is_read_surface) { + iris_use_pinned_bo(batch, iris_resource_bo(surf->surface_state_read.ref.res), false, + IRIS_DOMAIN_NONE); + } else { + iris_use_pinned_bo(batch, iris_resource_bo(surf->surface_state.ref.res), false, + IRIS_DOMAIN_NONE); + } + offset = (GEN_GEN == 8 && is_read_surface) ? surf->surface_state_read.ref.offset : surf->surface_state.ref.offset; @@ -4862,10 +4862,6 @@ use_sampler_view(struct iris_context *ice, enum isl_aux_usage aux_usage = iris_resource_texture_aux_usage(ice, isv->res, isv->view.format); - iris_use_pinned_bo(batch, isv->res->bo, false, IRIS_DOMAIN_OTHER_READ); - iris_use_pinned_bo(batch, iris_resource_bo(isv->surface_state.ref.res), false, - IRIS_DOMAIN_NONE); - if (isv->res->aux.bo) { iris_use_pinned_bo(batch, isv->res->aux.bo, false, IRIS_DOMAIN_OTHER_READ); @@ -4880,6 +4876,10 @@ use_sampler_view(struct iris_context *ice, } } + iris_use_pinned_bo(batch, isv->res->bo, false, IRIS_DOMAIN_OTHER_READ); + iris_use_pinned_bo(batch, iris_resource_bo(isv->surface_state.ref.res), false, + IRIS_DOMAIN_NONE); + return isv->surface_state.ref.offset + surf_state_offset_for_aux(isv->res, isv->res->aux.sampler_usages, aux_usage);