crocus: fix refcnt imbalance related to crocus_create_surface()
authorPatrick Lerda <patrick9876@free.fr>
Tue, 25 Apr 2023 23:47:43 +0000 (01:47 +0200)
committerMarge Bot <emma+marge@anholt.net>
Tue, 2 May 2023 22:18:49 +0000 (22:18 +0000)
Indeed, the objects are not freed when the function returns NULL.

"psurf->texture = tex;" is redundant with
"pipe_resource_reference(&psurf->texture, tex);".

For instance, this issue is triggered with
"piglit/bin/ext_texture_array-compressed teximage pbo -fbo -auto"
while setting GALLIUM_REFCNT_LOG=refcnt.log.

Fixes: f3630548f1da ("crocus: initial gallium driver for Intel gfx 4-7")
Signed-off-by: Patrick Lerda <patrick9876@free.fr>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22799>

src/gallium/drivers/crocus/crocus_state.c

index 79509ab..28fa9e3 100644 (file)
@@ -2866,7 +2866,6 @@ crocus_create_surface(struct pipe_context *ctx,
    psurf->format = tmpl->format;
    psurf->width = tex->width0;
    psurf->height = tex->height0;
-   psurf->texture = tex;
    psurf->u.tex.first_layer = tmpl->u.tex.first_layer;
    psurf->u.tex.last_layer = tmpl->u.tex.last_layer;
    psurf->u.tex.level = tmpl->u.tex.level;
@@ -2954,6 +2953,7 @@ crocus_create_surface(struct pipe_context *ctx,
    assert(view->levels == 1);
 
    /* TODO: compressed pbo uploads aren't working here */
+   pipe_surface_reference(&psurf, NULL);
    return NULL;
 
    uint64_t offset_B = 0;
@@ -2974,8 +2974,10 @@ crocus_create_surface(struct pipe_context *ctx,
        * Return NULL to force the state tracker to take fallback paths.
        */
       // TODO: check if the gen7 check is right, originally gen8
-      if (view->array_len > 1 || GFX_VER == 7)
+      if (view->array_len > 1 || GFX_VER == 7) {
+         pipe_surface_reference(&psurf, NULL);
          return NULL;
+      }
 
       const bool is_3d = res->surf.dim == ISL_SURF_DIM_3D;
       isl_surf_get_image_surf(&screen->isl_dev, &res->surf,