Module: Mesa Branch: staging/22.1 Commit: c2760516821fe4761a7d9a98e8dbd4c5b1f3341e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c2760516821fe4761a7d9a98e8dbd4c5b1f3341e
Author: Nanley Chery <[email protected]> Date: Fri Jul 15 11:51:55 2022 -0400 iris: Don't leak surface states for compressed resources Before this patch, we were leaking surface states in iris_create_surface. Specifically, when we failed to create an uncompressed ISL surface and view for a compressed resource, we didn't free surface states we allocated for it. Fix this by attempting to create the uncompressed surface and view before we allocate the surface states. Cc: 22.1 <mesa-stable> Reviewed-by: Tapani Pälli <[email protected]> Reviewed-by: Lionel Landwerlin <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17598> (cherry picked from commit bca601ffe92be0933bb706e4ad320676a0da8477) --- .pick_status.json | 2 +- src/gallium/drivers/iris/iris_state.c | 50 ++++++++++++++++++----------------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index dda123585e8..5db006b6d41 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2038,7 +2038,7 @@ "description": "iris: Don't leak surface states for compressed resources", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index 22001db446c..5c769ddfef6 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -2710,6 +2710,32 @@ iris_create_surface(struct pipe_context *ctx, } #endif + struct isl_surf isl_surf; + uint64_t offset_B = 0; + uint32_t tile_x_el = 0, tile_y_el = 0; + if (isl_format_is_compressed(res->surf.format)) { + /* The resource has a compressed format, which is not renderable, but we + * have a renderable view format. We must be attempting to upload + * blocks of compressed data via an uncompressed view. + * + * In this case, we can assume there are no auxiliary buffers, a single + * miplevel, and that the resource is single-sampled. Gallium may try + * and create an uncompressed view with multiple layers, however. + */ + assert(res->aux.usage == ISL_AUX_USAGE_NONE); + assert(res->surf.samples == 1); + assert(view->levels == 1); + + bool ok = isl_surf_get_uncompressed_surf(&screen->isl_dev, + &res->surf, view, + &isl_surf, view, &offset_B, + &tile_x_el, &tile_y_el); + if (!ok) { + free(surf); + return NULL; + } + } + surf->clear_color = res->aux.clear_color; /* Bail early for depth/stencil - we don't want SURFACE_STATE for them. */ @@ -2750,30 +2776,6 @@ iris_create_surface(struct pipe_context *ctx, return psurf; } - /* The resource has a compressed format, which is not renderable, but we - * have a renderable view format. We must be attempting to upload blocks - * of compressed data via an uncompressed view. - * - * In this case, we can assume there are no auxiliary buffers, a single - * miplevel, and that the resource is single-sampled. Gallium may try - * and create an uncompressed view with multiple layers, however. - */ - assert(!isl_format_is_compressed(fmt.fmt)); - assert(res->aux.usage == ISL_AUX_USAGE_NONE); - assert(res->surf.samples == 1); - assert(view->levels == 1); - - struct isl_surf isl_surf; - uint64_t offset_B = 0; - uint32_t tile_x_el = 0, tile_y_el = 0; - bool ok = isl_surf_get_uncompressed_surf(&screen->isl_dev, &res->surf, - view, &isl_surf, view, - &offset_B, &tile_x_el, &tile_y_el); - if (!ok) { - free(surf); - return NULL; - } - psurf->width = isl_surf.logical_level0_px.width; psurf->height = isl_surf.logical_level0_px.height;
