With Nicolai's comment addressed, patches 1-2 are: Reviewed-by: Marek Olšák <marek.ol...@amd.com>
Marek On Wed, Aug 9, 2017 at 6:47 PM, Nicolai Hähnle <nhaeh...@gmail.com> wrote: > On 08.08.2017 00:58, Rob Herring wrote: >> >> 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. > > > Did you miss Nine? > > Cheers, > Nicolai > > >> >> Signed-off-by: Rob Herring <r...@kernel.org> >> Cc: Emil Velikov <emil.l.veli...@gmail.com> >> --- >> src/gallium/auxiliary/pipe-loader/pipe_loader.c | 14 ++++++++++++-- >> src/gallium/auxiliary/pipe-loader/pipe_loader.h | 1 + >> 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 - >> 11 files changed, 14 insertions(+), 16 deletions(-) >> >> diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader.c >> b/src/gallium/auxiliary/pipe-loader/pipe_loader.c >> index 926db49fd24b..61e5786a2528 100644 >> --- a/src/gallium/auxiliary/pipe-loader/pipe_loader.c >> +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader.c >> @@ -67,13 +67,20 @@ pipe_loader_probe(struct pipe_loader_device **devs, >> int ndev) >> return n; >> } >> +static void >> +pipe_loader_release_dev(struct pipe_loader_device *dev) >> +{ >> + dev->pscreen->destroy(dev->pscreen); >> + dev->ops->release(&dev); >> +} >> + >> void >> pipe_loader_release(struct pipe_loader_device **devs, int ndev) >> { >> int i; >> for (i = 0; i < ndev; i++) >> - devs[i]->ops->release(&devs[i]); >> + pipe_loader_release_dev(devs[i]); >> } >> void >> @@ -125,12 +132,15 @@ pipe_loader_get_driinfo_xml(const char *driver_name) >> struct pipe_screen * >> pipe_loader_create_screen(struct pipe_loader_device *dev) >> { >> + struct pipe_screen *pscreen; >> struct pipe_screen_config config; >> pipe_loader_load_options(dev); >> config.options = &dev->option_cache; >> - return dev->ops->create_screen(dev, &config); >> + pscreen = dev->ops->create_screen(dev, &config); >> + dev->pscreen = pscreen; >> + return pscreen; >> } >> struct util_dl_library * >> diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader.h >> b/src/gallium/auxiliary/pipe-loader/pipe_loader.h >> index b50114310b4a..25cf5616f785 100644 >> --- a/src/gallium/auxiliary/pipe-loader/pipe_loader.h >> +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader.h >> @@ -66,6 +66,7 @@ struct pipe_loader_device { >> char *driver_name; >> const struct pipe_loader_ops *ops; >> + struct pipe_screen *pscreen; >> driOptionCache option_cache; >> driOptionCache option_info; >> diff --git a/src/gallium/auxiliary/vl/vl_winsys_dri.c >> b/src/gallium/auxiliary/vl/vl_winsys_dri.c >> index b4fb47ea8e46..444fff321eae 100644 >> --- a/src/gallium/auxiliary/vl/vl_winsys_dri.c >> +++ b/src/gallium/auxiliary/vl/vl_winsys_dri.c >> @@ -463,7 +463,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 8251087f3f90..4ed7ef0eacad 100644 >> --- a/src/gallium/auxiliary/vl/vl_winsys_dri3.c >> +++ b/src/gallium/auxiliary/vl/vl_winsys_dri3.c >> @@ -732,7 +732,6 @@ vl_dri3_screen_destroy(struct vl_screen *vscreen) >> xcb_unregister_for_special_event(scrn->conn, scrn->special_event); >> } >> scrn->pipe->destroy(scrn->pipe); >> - 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 df8809c501cb..6bbc87635c78 100644 >> --- a/src/gallium/auxiliary/vl/vl_winsys_drm.c >> +++ b/src/gallium/auxiliary/vl/vl_winsys_drm.c >> @@ -81,7 +81,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 8dfba1ad9fd9..bfdd32c794a1 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 406e97dc2429..01ca2202b4c8 100644 >> --- a/src/gallium/state_trackers/dri/dri_screen.c >> +++ b/src/gallium/state_trackers/dri/dri_screen.c >> @@ -428,9 +428,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); >> - >> mtx_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 03a3abf6835a..fee83afcc66e 100644 >> --- a/src/gallium/state_trackers/xa/xa_tracker.c >> +++ b/src/gallium/state_trackers/xa/xa_tracker.c >> @@ -209,7 +209,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); >> @@ -225,7 +224,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 443451e13d24..d718906eb7c8 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 2ee544a41294..8b8352d5c535 100644 >> --- a/src/gallium/tests/trivial/quad-tex.c >> +++ b/src/gallium/tests/trivial/quad-tex.c >> @@ -291,7 +291,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 a2031696f029..bb053e761b75 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); >> > > > -- > Lerne, wie die Welt wirklich ist, > Aber vergiss niemals, wie sie sein sollte. > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev