In preparation to add reference counting of pipe_screen in the pipe-loader, pipe_loader_release needs to destroy the pipe_screen instead of state trackers.
Signed-off-by: Rob Herring <r...@kernel.org> Cc: Emil Velikov <emil.l.veli...@gmail.com> --- src/gallium/auxiliary/pipe-loader/pipe_loader.h | 1 + src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c | 9 ++++++++- src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c | 6 ++++++ src/gallium/auxiliary/vl/vl_winsys_dri.c | 1 - src/gallium/auxiliary/vl/vl_winsys_dri3.c | 1 - src/gallium/auxiliary/vl/vl_winsys_drm.c | 1 - src/gallium/state_trackers/clover/core/device.cpp | 4 +--- src/gallium/state_trackers/dri/dri_screen.c | 3 --- src/gallium/state_trackers/xa/xa_tracker.c | 2 -- src/gallium/tests/trivial/compute.c | 1 - src/gallium/tests/trivial/quad-tex.c | 1 - src/gallium/tests/trivial/tri.c | 1 - 12 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader.h b/src/gallium/auxiliary/pipe-loader/pipe_loader.h index 690d088..25cd4d1 100644 --- a/src/gallium/auxiliary/pipe-loader/pipe_loader.h +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader.h @@ -65,6 +65,7 @@ struct pipe_loader_device { char *driver_name; const struct pipe_loader_ops *ops; + struct pipe_screen *pscreen; }; /** diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c index 994a284..62f109f 100644 --- a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c @@ -39,6 +39,7 @@ #include "target-helpers/drm_helper_public.h" #include "state_tracker/drm_driver.h" #include "pipe_loader_priv.h" +#include "pipe/p_screen.h" #include "util/u_memory.h" #include "util/u_dl.h" @@ -269,6 +270,9 @@ static void pipe_loader_drm_release(struct pipe_loader_device **dev) { struct pipe_loader_drm_device *ddev = pipe_loader_drm_device(*dev); + struct pipe_screen *pscreen = ddev->base.pscreen; + + pscreen->destroy(pscreen); #ifndef GALLIUM_STATIC_TARGETS if (ddev->lib) @@ -297,8 +301,11 @@ static struct pipe_screen * pipe_loader_drm_create_screen(struct pipe_loader_device *dev) { struct pipe_loader_drm_device *ddev = pipe_loader_drm_device(dev); + struct pipe_screen *pscreen = NULL; - return ddev->dd->create_screen(ddev->fd); + pscreen = ddev->dd->create_screen(fd); + ddev->base.pscreen = pscreen; + return pscreen; } static const struct pipe_loader_ops pipe_loader_drm_ops = { diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c b/src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c index c8e1f13..25d1695 100644 --- a/src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_sw.c @@ -27,6 +27,7 @@ #include "pipe_loader_priv.h" +#include "pipe/p_screen.h" #include "util/u_memory.h" #include "util/u_dl.h" #include "sw/dri/dri_sw_winsys.h" @@ -267,6 +268,9 @@ static void pipe_loader_sw_release(struct pipe_loader_device **dev) { struct pipe_loader_sw_device *sdev = pipe_loader_sw_device(*dev); + struct pipe_screen *pscreen = sdev->base.pscreen; + + pscreen->destroy(pscreen); #ifndef GALLIUM_STATIC_TARGETS if (sdev->lib) @@ -294,6 +298,8 @@ pipe_loader_sw_create_screen(struct pipe_loader_device *dev) if (!screen) sdev->ws->destroy(sdev->ws); + sdev->base.pscreen = screen; + return screen; } diff --git a/src/gallium/auxiliary/vl/vl_winsys_dri.c b/src/gallium/auxiliary/vl/vl_winsys_dri.c index 9ecc216..db90c54 100644 --- a/src/gallium/auxiliary/vl/vl_winsys_dri.c +++ b/src/gallium/auxiliary/vl/vl_winsys_dri.c @@ -461,7 +461,6 @@ vl_dri2_screen_destroy(struct vl_screen *vscreen) } vl_dri2_destroy_drawable(scrn); - scrn->base.pscreen->destroy(scrn->base.pscreen); pipe_loader_release(&scrn->base.dev, 1); FREE(scrn); } diff --git a/src/gallium/auxiliary/vl/vl_winsys_dri3.c b/src/gallium/auxiliary/vl/vl_winsys_dri3.c index f7f572e..87ecd2e 100644 --- a/src/gallium/auxiliary/vl/vl_winsys_dri3.c +++ b/src/gallium/auxiliary/vl/vl_winsys_dri3.c @@ -610,7 +610,6 @@ vl_dri3_screen_destroy(struct vl_screen *vscreen) if (scrn->special_event) xcb_unregister_for_special_event(scrn->conn, scrn->special_event); - scrn->base.pscreen->destroy(scrn->base.pscreen); pipe_loader_release(&scrn->base.dev, 1); FREE(scrn); diff --git a/src/gallium/auxiliary/vl/vl_winsys_drm.c b/src/gallium/auxiliary/vl/vl_winsys_drm.c index 6a759ae..aa690a2 100644 --- a/src/gallium/auxiliary/vl/vl_winsys_drm.c +++ b/src/gallium/auxiliary/vl/vl_winsys_drm.c @@ -80,7 +80,6 @@ vl_drm_screen_destroy(struct vl_screen *vscreen) { assert(vscreen); - vscreen->pscreen->destroy(vscreen->pscreen); pipe_loader_release(&vscreen->dev, 1); FREE(vscreen); } diff --git a/src/gallium/state_trackers/clover/core/device.cpp b/src/gallium/state_trackers/clover/core/device.cpp index 39f39f4..74ed794 100644 --- a/src/gallium/state_trackers/clover/core/device.cpp +++ b/src/gallium/state_trackers/clover/core/device.cpp @@ -45,14 +45,12 @@ device::device(clover::platform &platform, pipe_loader_device *ldev) : pipe = pipe_loader_create_screen(ldev); if (!pipe || !pipe->get_param(pipe, PIPE_CAP_COMPUTE)) { if (pipe) - pipe->destroy(pipe); + pipe_loader_release(&ldev, 1); throw error(CL_INVALID_DEVICE); } } device::~device() { - if (pipe) - pipe->destroy(pipe); if (ldev) pipe_loader_release(&ldev, 1); } diff --git a/src/gallium/state_trackers/dri/dri_screen.c b/src/gallium/state_trackers/dri/dri_screen.c index 2856ec0..d38ab25 100644 --- a/src/gallium/state_trackers/dri/dri_screen.c +++ b/src/gallium/state_trackers/dri/dri_screen.c @@ -380,9 +380,6 @@ dri_destroy_screen_helper(struct dri_screen * screen) if (screen->st_api && screen->st_api->destroy) screen->st_api->destroy(screen->st_api); - if (screen->base.screen) - screen->base.screen->destroy(screen->base.screen); - dri_destroy_option_cache(screen); pipe_mutex_destroy(screen->opencl_func_mutex); } diff --git a/src/gallium/state_trackers/xa/xa_tracker.c b/src/gallium/state_trackers/xa/xa_tracker.c index e091b083..dea4205 100644 --- a/src/gallium/state_trackers/xa/xa_tracker.c +++ b/src/gallium/state_trackers/xa/xa_tracker.c @@ -208,7 +208,6 @@ xa_tracker_create(int drm_fd) out_sf_alloc_fail: xa_context_destroy(xa->default_ctx); out_no_pipe: - xa->screen->destroy(xa->screen); out_no_screen: if (xa->dev) pipe_loader_release(&xa->dev, 1); @@ -224,7 +223,6 @@ xa_tracker_destroy(struct xa_tracker *xa) { free(xa->supported_formats); xa_context_destroy(xa->default_ctx); - xa->screen->destroy(xa->screen); pipe_loader_release(&xa->dev, 1); free(xa); } diff --git a/src/gallium/tests/trivial/compute.c b/src/gallium/tests/trivial/compute.c index 443451e..d718906 100644 --- a/src/gallium/tests/trivial/compute.c +++ b/src/gallium/tests/trivial/compute.c @@ -90,7 +90,6 @@ static void init_ctx(struct context *ctx) static void destroy_ctx(struct context *ctx) { ctx->pipe->destroy(ctx->pipe); - ctx->screen->destroy(ctx->screen); pipe_loader_release(&ctx->dev, 1); FREE(ctx); } diff --git a/src/gallium/tests/trivial/quad-tex.c b/src/gallium/tests/trivial/quad-tex.c index ddee294..2f8b642 100644 --- a/src/gallium/tests/trivial/quad-tex.c +++ b/src/gallium/tests/trivial/quad-tex.c @@ -289,7 +289,6 @@ static void close_prog(struct program *p) pipe_resource_reference(&p->vbuf, NULL); p->pipe->destroy(p->pipe); - p->screen->destroy(p->screen); pipe_loader_release(&p->dev, 1); FREE(p); diff --git a/src/gallium/tests/trivial/tri.c b/src/gallium/tests/trivial/tri.c index 914f5e7..6ee0529 100644 --- a/src/gallium/tests/trivial/tri.c +++ b/src/gallium/tests/trivial/tri.c @@ -231,7 +231,6 @@ static void close_prog(struct program *p) pipe_resource_reference(&p->vbuf, NULL); p->pipe->destroy(p->pipe); - p->screen->destroy(p->screen); pipe_loader_release(&p->dev, 1); FREE(p); -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev