Mesa (master): iris: Don't leak resources in iris_create_surface for incomplete FBOs

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 28 08:13:32 UTC 2019


Module: Mesa
Branch: master
Commit: 847ef8ee4f0889be651f12ad5bbc7e43a177431a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=847ef8ee4f0889be651f12ad5bbc7e43a177431a

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Thu Jun 27 17:16:20 2019 -0700

iris: Don't leak resources in iris_create_surface for incomplete FBOs

We were failing to pipe_resource_unreference on the failure path due
to a non-renderable format.  Instead of fixing this, just move the
checks earlier, before we even bother with refcounting or calloc.

---

 src/gallium/drivers/iris/iris_state.c | 38 +++++++++++++++++------------------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c
index e09a3ddbcc9..cc59fdacde0 100644
--- a/src/gallium/drivers/iris/iris_state.c
+++ b/src/gallium/drivers/iris/iris_state.c
@@ -1874,23 +1874,6 @@ iris_create_surface(struct pipe_context *ctx,
    struct iris_context *ice = (struct iris_context *) ctx;
    struct iris_screen *screen = (struct iris_screen *)ctx->screen;
    const struct gen_device_info *devinfo = &screen->devinfo;
-   struct iris_surface *surf = calloc(1, sizeof(struct iris_surface));
-   struct pipe_surface *psurf = &surf->base;
-   struct iris_resource *res = (struct iris_resource *) tex;
-
-   if (!surf)
-      return NULL;
-
-   pipe_reference_init(&psurf->reference, 1);
-   pipe_resource_reference(&psurf->texture, tex);
-   psurf->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;
 
    isl_surf_usage_flags_t usage = 0;
    if (tmpl->writable)
@@ -1901,7 +1884,7 @@ iris_create_surface(struct pipe_context *ctx,
       usage = ISL_SURF_USAGE_RENDER_TARGET_BIT;
 
    const struct iris_format_info fmt =
-      iris_format_for_usage(devinfo, psurf->format, usage);
+      iris_format_for_usage(devinfo, tmpl->format, usage);
 
    if ((usage & ISL_SURF_USAGE_RENDER_TARGET_BIT) &&
        !isl_format_supports_rendering(devinfo, fmt.fmt)) {
@@ -1909,10 +1892,27 @@ iris_create_surface(struct pipe_context *ctx,
        * hasn't had the opportunity yet.  In the meantime, we need to
        * avoid hitting ISL asserts about unsupported formats below.
        */
-      free(surf);
       return NULL;
    }
 
+   struct iris_surface *surf = calloc(1, sizeof(struct iris_surface));
+   struct pipe_surface *psurf = &surf->base;
+   struct iris_resource *res = (struct iris_resource *) tex;
+
+   if (!surf)
+      return NULL;
+
+   pipe_reference_init(&psurf->reference, 1);
+   pipe_resource_reference(&psurf->texture, tex);
+   psurf->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;
+
    struct isl_view *view = &surf->view;
    *view = (struct isl_view) {
       .format = fmt.fmt,




More information about the mesa-commit mailing list