zink: check for error when binding memory
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Mon, 10 May 2021 13:31:18 +0000 (15:31 +0200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 10 May 2021 16:38:04 +0000 (16:38 +0000)
If binding fails, we don't really have a valid image. So let's make sure
we free up the memory sooner rather than later.

Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10689>

src/gallium/drivers/zink/zink_resource.c

index 80908a2..d0d9df5 100644 (file)
@@ -538,11 +538,17 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t
 
    if (templ->target == PIPE_BUFFER) {
       if (!(templ->flags & PIPE_RESOURCE_FLAG_SPARSE))
-         vkBindBufferMemory(screen->dev, obj->buffer, obj->mem, obj->offset);
-   } else
-      vkBindImageMemory(screen->dev, obj->image, obj->mem, obj->offset);
+         if (vkBindBufferMemory(screen->dev, obj->buffer, obj->mem, obj->offset) != VK_SUCCESS)
+            goto fail3;
+   } else {
+      if (vkBindImageMemory(screen->dev, obj->image, obj->mem, obj->offset) != VK_SUCCESS)
+         goto fail3;
+   }
    return obj;
 
+fail3:
+   vkFreeMemory(screen->dev, obj->mem, NULL);
+
 fail2:
    if (templ->target == PIPE_BUFFER)
       vkDestroyBuffer(screen->dev, obj->buffer, NULL);