summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2015-04-05 10:32:03 +0100
committerAdam Jackson <ajax@redhat.com>2015-10-21 15:13:41 -0400
commit912f1fe2bb1b640d55fc44fcf636b6ca40d7f40b (patch)
tree97871576714831cc05b8a99bd6eeba3c4d142646
parent413cb2ff1d754b5f19d77ff19cddf40793989c03 (diff)
Xv: Only stop the adaptors when the Pixmap is finally destroyed
Pixmaps are reference counted and DestroyPixmap is called for the removal of every reference. However, we only want to stop the adaptors writing into the Pixmap just before the Pixmap is finally destroyed, similar to how Windows are handled. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
-rw-r--r--Xext/xvmain.c82
1 files changed, 24 insertions, 58 deletions
diff --git a/Xext/xvmain.c b/Xext/xvmain.c
index 93e5f0cd3..0c6f25b5a 100644
--- a/Xext/xvmain.c
+++ b/Xext/xvmain.c
@@ -327,36 +327,24 @@ XvGetRTPort(void)
return XvRTPort;
}
-static Bool
-XvDestroyPixmap(PixmapPtr pPix)
+static void
+XvStopAdaptors(DrawablePtr pDrawable)
{
- Bool status;
- ScreenPtr pScreen;
- XvScreenPtr pxvs;
- XvAdaptorPtr pa;
- int na;
- XvPortPtr pp;
- int np;
-
- pScreen = pPix->drawable.pScreen;
-
- SCREEN_PROLOGUE(pScreen, DestroyPixmap);
-
- pxvs = (XvScreenPtr) dixLookupPrivate(&pScreen->devPrivates, XvScreenKey);
+ ScreenPtr pScreen = pDrawable->pScreen;
+ XvScreenPtr pxvs = dixLookupPrivate(&pScreen->devPrivates, XvScreenKey);
+ XvAdaptorPtr pa = pxvs->pAdaptors;
+ int na = pxvs->nAdaptors;
/* CHECK TO SEE IF THIS PORT IS IN USE */
-
- pa = pxvs->pAdaptors;
- na = pxvs->nAdaptors;
while (na--) {
- np = pa->nPorts;
- pp = pa->pPorts;
+ XvPortPtr pp = pa->pPorts;
+ int np = pa->nPorts;
while (np--) {
- if (pp->pDraw == (DrawablePtr) pPix) {
- XvdiSendVideoNotify(pp, pp->pDraw, XvPreempted);
+ if (pp->pDraw == pDrawable) {
+ XvdiSendVideoNotify(pp, pDrawable, XvPreempted);
- (void) (*pp->pAdaptor->ddStopVideo) (pp, pp->pDraw);
+ (void) (*pp->pAdaptor->ddStopVideo) (pp, pDrawable);
pp->pDraw = NULL;
pp->client = NULL;
@@ -366,9 +354,19 @@ XvDestroyPixmap(PixmapPtr pPix)
}
pa++;
}
+}
- status = (*pScreen->DestroyPixmap) (pPix);
+static Bool
+XvDestroyPixmap(PixmapPtr pPix)
+{
+ ScreenPtr pScreen = pPix->drawable.pScreen;
+ Bool status;
+
+ if (pPix->refcnt == 1)
+ XvStopAdaptors(&pPix->drawable);
+ SCREEN_PROLOGUE(pScreen, DestroyPixmap);
+ status = (*pScreen->DestroyPixmap) (pPix);
SCREEN_EPILOGUE(pScreen, DestroyPixmap, XvDestroyPixmap);
return status;
@@ -378,45 +376,13 @@ XvDestroyPixmap(PixmapPtr pPix)
static Bool
XvDestroyWindow(WindowPtr pWin)
{
+ ScreenPtr pScreen = pWin->drawable.pScreen;
Bool status;
- ScreenPtr pScreen;
- XvScreenPtr pxvs;
- XvAdaptorPtr pa;
- int na;
- XvPortPtr pp;
- int np;
- pScreen = pWin->drawable.pScreen;
+ XvStopAdaptors(&pWin->drawable);
SCREEN_PROLOGUE(pScreen, DestroyWindow);
-
- pxvs = (XvScreenPtr) dixLookupPrivate(&pScreen->devPrivates, XvScreenKey);
-
- /* CHECK TO SEE IF THIS PORT IS IN USE */
-
- pa = pxvs->pAdaptors;
- na = pxvs->nAdaptors;
- while (na--) {
- np = pa->nPorts;
- pp = pa->pPorts;
-
- while (np--) {
- if (pp->pDraw == (DrawablePtr) pWin) {
- XvdiSendVideoNotify(pp, pp->pDraw, XvPreempted);
-
- (void) (*pp->pAdaptor->ddStopVideo) (pp, pp->pDraw);
-
- pp->pDraw = NULL;
- pp->client = NULL;
- pp->time = currentTime;
- }
- pp++;
- }
- pa++;
- }
-
status = (*pScreen->DestroyWindow) (pWin);
-
SCREEN_EPILOGUE(pScreen, DestroyWindow, XvDestroyWindow);
return status;