summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk@armlinux.org.uk>2017-02-28 10:37:07 +0000
committerRussell King <rmk@armlinux.org.uk>2017-02-28 10:37:56 +0000
commit691087979d0a5031f9c2f380e5f2ddbf43903105 (patch)
treeee8275fd6c7bb28e9ae78ca357349fff6fbf3ed0
parente88e6b76947d0720395a19e316c7013e9b61d439 (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.c41
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);