[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