[PATCH 1/2] Xv: Only stop the adaptors when the Pixmap is finally destroyed

Ville Syrjälä ville.syrjala at linux.intel.com
Thu Aug 13 05:58:39 PDT 2015


On Sun, Apr 05, 2015 at 10:32:03AM +0100, Chris Wilson wrote:
> 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 at chris-wilson.co.uk>
> Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>

Hmm. found this old nugget in my inbox. Looks sane enough, and
eliminates duplicated code.

Reviewed-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

BTW as sna doesn't use xf86xv it doesn't appear to check the drawable
type at all. Does that mean it allows even overlay/sprite adaptors to
be used with pixmaps?

> ---
>  Xext/xvmain.c | 82 +++++++++++++++++------------------------------------------
>  1 file changed, 24 insertions(+), 58 deletions(-)
> 
> diff --git a/Xext/xvmain.c b/Xext/xvmain.c
> index 0abf190..ad1b39d 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;
> -- 
> 2.1.4

-- 
Ville Syrjälä
Intel OTC


More information about the xorg-devel mailing list