[Intel-gfx] [PATCH 16/18] i915 XvMC: kill pinned surface buffer in the ddx code

Daniel Vetter daniel.vetter at ffwll.ch
Tue Mar 2 21:53:26 CET 2010


Like with the per context stuff, also drop the now artificial limit
on surfaces. Again, with that gone, a lot of code can be deleted.
---
 src/i915_hwmc.c      |  234 --------------------------------------------------
 src/i915_hwmc.h      |    5 -
 src/xvmc/i915_xvmc.c |   17 +---
 3 files changed, 2 insertions(+), 254 deletions(-)

diff --git a/src/i915_hwmc.c b/src/i915_hwmc.c
index 6e5d553..6943a07 100644
--- a/src/i915_hwmc.c
+++ b/src/i915_hwmc.c
@@ -60,16 +60,7 @@
 #define I915_XVMC_MAX_CONTEXTS 4
 #define I915_XVMC_MAX_SURFACES 20
 
-typedef struct _I915XvMCSurfacePriv {
-	i830_memory *surface;
-	unsigned long offsets[I915_XVMC_MAX_BUFFERS];
-	drm_handle_t surface_handle;
-} I915XvMCSurfacePriv;
-
 typedef struct _I915XvMC {
-	XID surfaces[I915_XVMC_MAX_SURFACES];
-	I915XvMCSurfacePriv *sfprivs[I915_XVMC_MAX_SURFACES];
-	int nsurfaces;
 	PutImageFuncPtr savePutImage;
 } I915XvMC, *I915XvMCPtr;
 
@@ -149,33 +140,6 @@ static void i915_check_context_size(XvMCContextPtr ctx)
 }
 
 /*
- * Init and clean up the screen private parts of XvMC.
- */
-static void initI915XvMC(I915XvMCPtr xvmc)
-{
-	unsigned int i;
-
-	for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) {
-		xvmc->surfaces[i] = 0;
-		xvmc->sfprivs[i] = NULL;
-	}
-	xvmc->nsurfaces = 0;
-}
-
-static void cleanupI915XvMC(I915XvMCPtr xvmc)
-{
-	int i;
-
-	for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) {
-		xvmc->surfaces[i] = 0;
-		if (xvmc->sfprivs[i]) {
-			xfree(xvmc->sfprivs[i]);
-			xvmc->sfprivs[i] = NULL;
-		}
-	}
-}
-
-/*
  *  i915_xvmc_create_context
  *
  *  Some info about the private data:
@@ -226,12 +190,6 @@ static int i915_xvmc_create_surface(ScrnInfoPtr scrn, XvMCSurfacePtr pSurf,
 				    int *num_priv, long **priv)
 {
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-	I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
-	I915XvMCSurfacePriv *sfpriv = NULL;
-	I915XvMCCreateSurfaceRec *surfaceRec = NULL;
-	XvMCContextPtr ctx = NULL;
-	unsigned int srfno;
-	unsigned long bufsize;
 
 	if (!intel->XvMCEnabled) {
 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
@@ -242,167 +200,15 @@ static int i915_xvmc_create_surface(ScrnInfoPtr scrn, XvMCSurfacePtr pSurf,
 	*priv = NULL;
 	*num_priv = 0;
 
-	for (srfno = 0; srfno < I915_XVMC_MAX_SURFACES; ++srfno) {
-		if (!pXvMC->surfaces[srfno])
-			break;
-	}
-
-	if (srfno == I915_XVMC_MAX_SURFACES ||
-	    pXvMC->nsurfaces >= I915_XVMC_MAX_SURFACES) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[XvMC] i915: Too many surfaces !\n");
-		return BadAlloc;
-	}
-
-	*priv = xcalloc(1, sizeof(I915XvMCCreateSurfaceRec));
-	surfaceRec = (I915XvMCCreateSurfaceRec *) * priv;
-
-	if (!*priv) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[XvMC] i915:Unable to allocate surface priv ret memory!\n");
-		return BadAlloc;
-	}
-
-	*num_priv = sizeof(I915XvMCCreateSurfaceRec) >> 2;
-	sfpriv =
-	    (I915XvMCSurfacePriv *) xcalloc(1, sizeof(I915XvMCSurfacePriv));
-
-	if (!sfpriv) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[XvMC] i915: Unable to allocate surface priv memory!\n");
-		xfree(*priv);
-		*priv = NULL;
-		*num_priv = 0;
-		return BadAlloc;
-	}
-
-	ctx = pSurf->context;
-	bufsize = SIZE_YUV420(ctx->width, ctx->height);
-
-	if (!i830_allocate_xvmc_buffer(scrn, "XvMC surface",
-				       &(sfpriv->surface), bufsize,
-				       0)) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[XvMC] i915 : Failed to allocate XvMC surface space!\n");
-		xfree(sfpriv);
-		xfree(*priv);
-		*priv = NULL;
-		*num_priv = 0;
-		return BadAlloc;
-	}
-
-	if (drmAddMap(intel->drmSubFD,
-		      (drm_handle_t) (sfpriv->surface->bo->offset +
-				      intel->LinearAddr), sfpriv->surface->bo->size,
-		      DRM_AGP, 0, (drmAddress) & sfpriv->surface_handle) < 0) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[drm] drmAddMap(surface_handle) failed!\n");
-		i830_free_xvmc_buffer(scrn, sfpriv->surface);
-		xfree(sfpriv);
-		xfree(*priv);
-		*priv = NULL;
-		*num_priv = 0;
-		return BadAlloc;
-	}
-
-	surfaceRec->srfno = srfno;
-	surfaceRec->srf.handle = sfpriv->surface_handle;
-	surfaceRec->srf.offset = sfpriv->surface->bo->offset;
-	surfaceRec->srf.size = sfpriv->surface->bo->size;
-
-	pXvMC->surfaces[srfno] = pSurf->surface_id;
-	pXvMC->sfprivs[srfno] = sfpriv;
-	pXvMC->nsurfaces++;
-
 	return Success;
 }
 
 static int i915_xvmc_create_subpict(ScrnInfoPtr scrn, XvMCSubpicturePtr pSubp,
 				    int *num_priv, long **priv)
 {
-	intel_screen_private *intel = intel_get_screen_private(scrn);
-	I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
-	I915XvMCSurfacePriv *sfpriv = NULL;
-	I915XvMCCreateSurfaceRec *surfaceRec = NULL;
-	XvMCContextPtr ctx = NULL;
-	unsigned int srfno;
-	unsigned int bufsize;
-
 	*priv = NULL;
 	*num_priv = 0;
 
-	for (srfno = 0; srfno < I915_XVMC_MAX_SURFACES; ++srfno) {
-		if (!pXvMC->surfaces[srfno])
-			break;
-	}
-
-	if (srfno == I915_XVMC_MAX_SURFACES ||
-	    pXvMC->nsurfaces >= I915_XVMC_MAX_SURFACES) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[XvMC] i915: Too many surfaces !\n");
-		return BadAlloc;
-	}
-
-	*priv = xcalloc(1, sizeof(I915XvMCCreateSurfaceRec));
-	surfaceRec = (I915XvMCCreateSurfaceRec *) * priv;
-
-	if (!*priv) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[XvMC] i915: Unable to allocate memory!\n");
-		return BadAlloc;
-	}
-
-	*num_priv = sizeof(I915XvMCCreateSurfaceRec) >> 2;
-	sfpriv =
-	    (I915XvMCSurfacePriv *) xcalloc(1, sizeof(I915XvMCSurfacePriv));
-
-	if (!sfpriv) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[XvMC] i915: Unable to allocate memory!\n");
-		xfree(*priv);
-		*priv = NULL;
-		*num_priv = 0;
-		return BadAlloc;
-	}
-
-	ctx = pSubp->context;
-	bufsize = SIZE_XX44(ctx->width, ctx->height);
-
-	if (!i830_allocate_xvmc_buffer(scrn, "XvMC surface",
-				       &(sfpriv->surface), bufsize,
-				       0)) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[XvMC] I915XvMCCreateSurface: Failed to allocate XvMC surface space!\n");
-		xfree(sfpriv);
-		xfree(*priv);
-		*priv = NULL;
-		*num_priv = 0;
-		return BadAlloc;
-	}
-
-	if (drmAddMap(intel->drmSubFD,
-		      (drm_handle_t) (sfpriv->surface->bo->offset +
-				      intel->LinearAddr), sfpriv->surface->bo->size,
-		      DRM_AGP, 0, (drmAddress) & sfpriv->surface_handle) < 0) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[drm] drmAddMap(surface_handle) failed!\n");
-		i830_free_xvmc_buffer(scrn, sfpriv->surface);
-		xfree(sfpriv);
-		xfree(*priv);
-		*priv = NULL;
-		*num_priv = 0;
-		return BadAlloc;
-	}
-
-	surfaceRec->srfno = srfno;
-	surfaceRec->srf.handle = sfpriv->surface_handle;
-	surfaceRec->srf.offset = sfpriv->surface->bo->offset;
-	surfaceRec->srf.size = sfpriv->surface->bo->size;
-
-	pXvMC->sfprivs[srfno] = sfpriv;
-	pXvMC->surfaces[srfno] = pSubp->subpicture_id;
-	pXvMC->nsurfaces++;
-
 	return Success;
 }
 
@@ -414,48 +220,12 @@ static void i915_xvmc_destroy_context(ScrnInfoPtr scrn,
 
 static void i915_xvmc_destroy_surface(ScrnInfoPtr scrn, XvMCSurfacePtr pSurf)
 {
-	intel_screen_private *intel = intel_get_screen_private(scrn);
-	I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
-	int i;
-
-	for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) {
-		if (pXvMC->surfaces[i] == pSurf->surface_id) {
-			drmRmMap(intel->drmSubFD,
-				 pXvMC->sfprivs[i]->surface_handle);
-			i830_free_xvmc_buffer(scrn,
-					      pXvMC->sfprivs[i]->surface);
-			xfree(pXvMC->sfprivs[i]);
-			pXvMC->nsurfaces--;
-			pXvMC->sfprivs[i] = 0;
-			pXvMC->surfaces[i] = 0;
-			return;
-		}
-	}
-
 	return;
 }
 
 static void i915_xvmc_destroy_subpict(ScrnInfoPtr scrn,
 				      XvMCSubpicturePtr pSubp)
 {
-	intel_screen_private *intel = intel_get_screen_private(scrn);
-	I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
-	int i;
-
-	for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) {
-		if (pXvMC->surfaces[i] == pSubp->subpicture_id) {
-			drmRmMap(intel->drmSubFD,
-				 pXvMC->sfprivs[i]->surface_handle);
-			i830_free_xvmc_buffer(scrn,
-					      pXvMC->sfprivs[i]->surface);
-			xfree(pXvMC->sfprivs[i]);
-			pXvMC->nsurfaces--;
-			pXvMC->sfprivs[i] = 0;
-			pXvMC->surfaces[i] = 0;
-			return;
-		}
-	}
-
 	return;
 }
 
@@ -520,7 +290,6 @@ static Bool i915_xvmc_init(ScrnInfoPtr scrn, XF86VideoAdaptorPtr XvAdapt)
 		xfree(pXvMC);
 		return FALSE;
 	}
-	initI915XvMC(pXvMC);
 
 	/* set up wrappers */
 	pXvMC->savePutImage = XvAdapt->PutImage;
@@ -530,9 +299,6 @@ static Bool i915_xvmc_init(ScrnInfoPtr scrn, XF86VideoAdaptorPtr XvAdapt)
 
 static void i915_xvmc_fini(ScrnInfoPtr scrn)
 {
-	I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
-
-	cleanupI915XvMC(pXvMC);
 	intel_xvmc_fini_batch(scrn);
 	xfree(xvmc_driver->devPrivate);
 }
diff --git a/src/i915_hwmc.h b/src/i915_hwmc.h
index 52c8b3d..c036b63 100644
--- a/src/i915_hwmc.h
+++ b/src/i915_hwmc.h
@@ -44,9 +44,4 @@ typedef struct {
 	int deviceID;
 } I915XvMCCreateContextRec;
 
-typedef struct {
-	unsigned int srfno;
-	struct hwmc_buffer srf;
-} I915XvMCCreateSurfaceRec;
-
 #endif /* _I915_HWMC_H */
diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 3ae612a..190b736 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -975,24 +975,12 @@ static Status i915_xvmc_mc_create_surface(Display * display,
 {
 	i915XvMCContext *pI915XvMC;
 	i915XvMCSurface *pI915Surface;
-	I915XvMCCreateSurfaceRec *tmpComm = NULL;
 
 	if (!(pI915XvMC = context->privData))
 		return XvMCBadContext;
 
 	XVMC_DBG("%s\n", __FUNCTION__);
 
-	if (priv_count != (sizeof(I915XvMCCreateSurfaceRec) >> 2)) {
-		XVMC_ERR
-		    ("_xvmc_create_surface() returned incorrect data size!");
-		XVMC_INFO("\tExpected %d, got %d",
-			  (int)(sizeof(I915XvMCCreateSurfaceRec) >> 2),
-			  priv_count);
-		_xvmc_destroy_surface(display, surface);
-		XFree(priv_data);
-		return BadAlloc;
-	}
-
 	PPTHREAD_MUTEX_LOCK();
 	surface->privData = (i915XvMCSurface *) malloc(sizeof(i915XvMCSurface));
 
@@ -1009,11 +997,10 @@ static Status i915_xvmc_mc_create_surface(Display * display,
 	pI915Surface->privContext = pI915XvMC;
 	pI915Surface->privSubPic = NULL;
 
-	tmpComm = (I915XvMCCreateSurfaceRec *) priv_data;
-
 	pI915Surface->bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
 					      "surface",
-					      tmpComm->srf.size,
+					      SIZE_YUV420(context->width,
+						          context->height),
 					      GTT_PAGE_SIZE);
 
 	/* X may still use this buffer when XVMC is already done with it. */
-- 
1.6.6.1




More information about the Intel-gfx mailing list