check early if we have slot left for new context or surface

This commit is contained in:
Zhenyu Wang 2007-08-08 09:39:55 +08:00
parent fec6744b76
commit 87cc72ef50
1 changed files with 30 additions and 18 deletions

View File

@ -208,6 +208,8 @@ static void initI915XvMC(I915XvMCPtr xvmc)
xvmc->surfaces[i] = 0;
xvmc->sfprivs[i] = NULL;
}
xvmc->ncontexts = 0;
xvmc->nsurfaces = 0;
}
//XXX
@ -468,7 +470,13 @@ static int I915XvMCCreateContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext,
return BadAlloc;
}
if (pXvMC->ncontexts >= I915_XVMC_MAX_CONTEXTS) {
for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) {
if (!pXvMC->contexts[i])
break;
}
if (i == I915_XVMC_MAX_CONTEXTS ||
pXvMC->ncontexts >= I915_XVMC_MAX_CONTEXTS) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"[XvMC] I915XvMCCreateContext: Out of contexts.\n");
return BadAlloc;
@ -484,11 +492,6 @@ static int I915XvMCCreateContext (ScrnInfoPtr pScrn, XvMCContextPtr pContext,
*num_priv = sizeof(I915XvMCCreateContextRec) >> 2;
for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) {
if (!pXvMC->contexts[i])
break;
}
ctxpriv = (I915XvMCContextPriv *)xcalloc(1, sizeof(I915XvMCContextPriv));
if (!ctxpriv) {
@ -572,10 +575,22 @@ static int I915XvMCCreateSurface(ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf,
unsigned int srfno;
unsigned long bufsize;
if (!pI830->XvMCEnabled) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"[XvMC] I915XvMCCreateContext: Cannot use XvMC!\n");
return BadAlloc;
}
*priv = NULL;
*num_priv = 0;
if (pXvMC->nsurfaces >= I915_XVMC_MAX_SURFACES) {
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(pScrn->scrnIndex, X_ERROR,
"[XvMC] I915XvMCCreateSurface: Too many surfaces !\n");
return BadAlloc;
@ -631,10 +646,6 @@ static int I915XvMCCreateSurface(ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf,
return BadAlloc;
}
for (srfno = 0; srfno < I915_XVMC_MAX_SURFACES; ++srfno) {
if (!pXvMC->surfaces[srfno])
break;
}
surfaceRec->srfno = srfno;
surfaceRec->srf.handle = sfpriv->surface_handle;
surfaceRec->srf.offset = sfpriv->surface->offset;
@ -661,7 +672,13 @@ static int I915XvMCCreateSubpicture (ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp,
*priv = NULL;
*num_priv = 0;
if (pXvMC->nsurfaces >= I915_XVMC_MAX_SURFACES) {
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(pScrn->scrnIndex, X_ERROR,
"[XvMC] I915XvMCCreateSubpicture: Too many surfaces !\n");
return BadAlloc;
@ -717,11 +734,6 @@ static int I915XvMCCreateSubpicture (ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp,
return BadAlloc;
}
for (srfno = 0; srfno < I915_XVMC_MAX_SURFACES; ++srfno) {
if (!pXvMC->surfaces[srfno])
break;
}
surfaceRec->srfno = srfno;
surfaceRec->srf.handle = sfpriv->surface_handle;
surfaceRec->srf.offset = sfpriv->surface->offset;
@ -820,7 +832,7 @@ static int I915XvMCPutImage(ScrnInfoPtr pScrn, short src_x, short src_y,
"[XvMC] I915XvMCPutImage: Invalid parameters !\n");
return 1;
}
buf = pI830->FbBase + pXvMC->sfprivs[i915XvMCData->srfNo]->surface->offset;
id = i915XvMCData->real_id;
pI830->IsXvMCSurface = 1;