From cd8ee259c8e9b1c16b5c3214595b91eb31e7de19 Mon Sep 17 00:00:00 2001 From: Philipp Zabel Date: Thu, 27 Apr 2017 18:44:02 +0200 Subject: [PATCH] renderonly: drop resources on destroy The renderonly_scanout holds a reference on its prime pipe resource, which should be released when it is destroyed. If it was created by renderonly_create_kms_dumb_buffer_for_resource, the dumb BO also has to be destroyed. Fixes: 848b49b288f ("gallium: add renderonly library") CC: Signed-off-by: Philipp Zabel Reviewed-by: Emil Velikov Reviewed-by: Christian Gmeiner --- src/gallium/auxiliary/renderonly/renderonly.c | 11 ++++++++++- src/gallium/auxiliary/renderonly/renderonly.h | 3 ++- src/gallium/drivers/etnaviv/etnaviv_resource.c | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/gallium/auxiliary/renderonly/renderonly.c b/src/gallium/auxiliary/renderonly/renderonly.c index e17c32886d2..f377c368e57 100644 --- a/src/gallium/auxiliary/renderonly/renderonly.c +++ b/src/gallium/auxiliary/renderonly/renderonly.c @@ -34,6 +34,7 @@ #include "state_tracker/drm_driver.h" #include "pipe/p_screen.h" +#include "util/u_inlines.h" #include "util/u_memory.h" struct renderonly * @@ -65,8 +66,16 @@ renderonly_scanout_for_prime(struct pipe_resource *rsc, struct renderonly *ro) } void -renderonly_scanout_destroy(struct renderonly_scanout *scanout) +renderonly_scanout_destroy(struct renderonly_scanout *scanout, + struct renderonly *ro) { + struct drm_mode_destroy_dumb destroy_dumb = { }; + + pipe_resource_reference(&scanout->prime, NULL); + if (ro->kms_fd != -1) { + destroy_dumb.handle = scanout->handle; + ioctl(ro->kms_fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_dumb); + } FREE(scanout); } diff --git a/src/gallium/auxiliary/renderonly/renderonly.h b/src/gallium/auxiliary/renderonly/renderonly.h index 28989f202d9..d5430732982 100644 --- a/src/gallium/auxiliary/renderonly/renderonly.h +++ b/src/gallium/auxiliary/renderonly/renderonly.h @@ -77,7 +77,8 @@ struct renderonly_scanout * renderonly_scanout_for_prime(struct pipe_resource *rsc, struct renderonly *ro); void -renderonly_scanout_destroy(struct renderonly_scanout *scanout); +renderonly_scanout_destroy(struct renderonly_scanout *scanout, + struct renderonly *ro); static inline boolean renderonly_get_handle(struct renderonly_scanout *scanout, diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.c b/src/gallium/drivers/etnaviv/etnaviv_resource.c index 2c5e9298e55..0e37345c0c0 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_resource.c +++ b/src/gallium/drivers/etnaviv/etnaviv_resource.c @@ -305,7 +305,7 @@ etna_resource_destroy(struct pipe_screen *pscreen, struct pipe_resource *prsc) etna_bo_del(rsc->ts_bo); if (rsc->scanout) - renderonly_scanout_destroy(rsc->scanout); + renderonly_scanout_destroy(rsc->scanout, etna_screen(pscreen)->ro); list_delinit(&rsc->list); -- 2.30.2