diff options
author | Russell King <rmk@armlinux.org.uk> | 2017-02-28 10:37:07 +0000 |
---|---|---|
committer | Russell King <rmk@armlinux.org.uk> | 2017-02-28 10:37:56 +0000 |
commit | 691087979d0a5031f9c2f380e5f2ddbf43903105 (patch) | |
tree | ee8275fd6c7bb28e9ae78ca357349fff6fbf3ed0 | |
parent | e88e6b76947d0720395a19e316c7013e9b61d439 (diff) |
src: Xv: free GPU port privates in success path as well
Free the GPU port privates in the success path as well as the failure
path.
Signed-off-by: Russell King <rmk@armlinux.org.uk>
-rw-r--r-- | src/armada_drm_xv.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/src/armada_drm_xv.c b/src/armada_drm_xv.c index 52c9c05..ccd0e4b 100644 --- a/src/armada_drm_xv.c +++ b/src/armada_drm_xv.c @@ -1221,10 +1221,10 @@ Bool armada_drm_XvInit(ScrnInfoPtr pScrn) ScreenPtr scrn = screenInfo.screens[pScrn->scrnIndex]; struct common_drm_info *drm = GET_DRM_INFO(pScrn); struct armada_drm_info *arm = GET_ARMADA_DRM_INFO(pScrn); - XF86VideoAdaptorPtr xv[2], plane, gpu_adap; + XF86VideoAdaptorPtr xv[2], ovl_adap = NULL, gpu_adap = NULL; struct drm_xv *drmxv; DevUnion priv[1]; - unsigned i, num, cap = 0; + unsigned num, cap = 0; Bool ret, prefer_overlay; if (!armada_drm_init_atoms(pScrn)) @@ -1233,8 +1233,6 @@ Bool armada_drm_XvInit(ScrnInfoPtr pScrn) /* Initialise the GPU textured adapter first. */ if (arm->accel_ops && arm->accel_ops->xv_init) gpu_adap = arm->accel_ops->xv_init(scrn, &cap); - else - gpu_adap = NULL; /* FIXME: we leak this */ drmxv = calloc(1, sizeof *drmxv); @@ -1259,6 +1257,14 @@ Bool armada_drm_XvInit(ScrnInfoPtr pScrn) if (!xf86ReturnOptValBool(arm->Options, OPTION_XV_DISPRIMARY, TRUE)) drmxv->has_primary = FALSE; + if (drmxv->mode_planes[0]) { + priv[0].ptr = drmxv; + ovl_adap = armada_drm_XvInitPlane(pScrn, priv, drmxv, + drmxv->mode_planes[0]); + if (!ovl_adap) + goto err_free; + } + prefer_overlay = xf86ReturnOptValBool(arm->Options, OPTION_XV_PREFEROVL, TRUE); @@ -1266,31 +1272,32 @@ Bool armada_drm_XvInit(ScrnInfoPtr pScrn) if (gpu_adap && !prefer_overlay) xv[num++] = gpu_adap; - if (drmxv->mode_planes[0]) { - priv[0].ptr = drmxv; - plane = armada_drm_XvInitPlane(pScrn, priv, drmxv, - drmxv->mode_planes[0]); - if (!plane) - goto err_free; - xv[num++] = plane; - } + if (ovl_adap) + xv[num++] = ovl_adap; if (gpu_adap && prefer_overlay) xv[num++] = gpu_adap; ret = xf86XVScreenInit(scrn, xv, num); - for (i = 0; i < num; i++) { - if (xv[i]) { - free(xv[i]->pImages); - free(xv[i]); - } + if (ovl_adap) { + free(ovl_adap->pImages); + free(ovl_adap); + } + if (gpu_adap) { + free(gpu_adap->pImages); + free(gpu_adap->pPortPrivates); + free(gpu_adap); } if (!ret) goto err_free; return TRUE; err_free: + if (ovl_adap) { + free(ovl_adap->pImages); + free(ovl_adap); + } if (gpu_adap) { free(gpu_adap->pImages); free(gpu_adap->pPortPrivates); |