[PATCH] midispcur: Construct Picture objects lazily in case Render is disabled.

Pierre-Loup A. Griffais pgriffais at nvidia.com
Mon May 24 16:49:12 PDT 2010



On 05/24/2010 09:34 AM, Jamey Sharp wrote:
> Reverts part of the effects of 518f3b189b6c8aa28b62837d14309fd06163ccbb,
> "mi: don't thrash resources when displaying the software cursor across
> screens". The per-screen cache is preserved, and the GCs are still
> allocated eagerly, but now it doesn't construct pRootPicture until
> somebody attempts to draw an ARGB cursor.
>
> I noticed crashes in Xnest, which doesn't support the RENDER extension,
> but I suspect other DDXes that support disabling that extension would
> have had issues as well.
>
> Signed-off-by: Jamey Sharp<jamey at minilop.net>
> ---
> These Pictures are not freed in miDCDeviceCleanup. Before the "don't
> thrash resources" patch, there was a comment suggesting that
> pRootPicture was already freed for some reason, but it did free
> pTempPicture.

See http://lists.x.org/archives/xorg-devel/2010-April/007699.html

The patch itself looks good to me.

Thanks,
  - Pierre-Loup

>
> Is there some reason not to free them, like that freeing the pixmaps
> they're bound to automatically frees the pictures too, or something?
>
>   mi/midispcur.c |   13 ++++++-------
>   1 files changed, 6 insertions(+), 7 deletions(-)
>
> diff --git a/mi/midispcur.c b/mi/midispcur.c
> index 16495e4..f2b2229 100644
> --- a/mi/midispcur.c
> +++ b/mi/midispcur.c
> @@ -141,6 +141,7 @@ miDCRealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
>   }
>
>   #ifdef ARGB_CURSOR
> +#define EnsurePicture(picture,draw,win) (picture || miDCMakePicture(&picture,draw,win))
>
>   static VisualPtr
>   miDCGetWindowVisual (WindowPtr pWin)
> @@ -413,6 +414,8 @@ miDCPutUpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
>   #ifdef ARGB_CURSOR
>       if (pPriv->pPicture)
>       {
> +	if (!EnsurePicture(pBuffer->pRootPicture,&pWin->drawable, pWin))
> +	    return FALSE;
>   	CompositePicture (PictOpOver,
>   			  pPriv->pPicture,
>   			  NULL,
> @@ -695,9 +698,8 @@ miDCMoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
>   #ifdef ARGB_CURSOR
>       if (pPriv->pPicture)
>       {
> -	if (!pBuffer->pTempPicture)
> -            miDCMakePicture(&pBuffer->pTempPicture,&pTemp->drawable, pWin);
> -
> +	if (!EnsurePicture(pBuffer->pTempPicture,&pTemp->drawable, pWin))
> +	    return FALSE;
>   	CompositePicture (PictOpOver,
>   			  pPriv->pPicture,
>   			  NULL,
> @@ -781,10 +783,7 @@ miDCDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
>               goto failure;
>
>   #ifdef ARGB_CURSOR
> -        miDCMakePicture(&pBuffer->pRootPicture,&pWin->drawable, pWin);
> -        if (!pBuffer->pRootPicture)
> -            goto failure;
> -
> +        pBuffer->pRootPicture = NULL;
>           pBuffer->pTempPicture = NULL;
>   #endif
>


More information about the xorg-devel mailing list