[PATCH] hw/xfree86: Fix block handler wrapping in xf86Rotate

Eric Anholt eric at anholt.net
Wed Apr 16 16:56:14 PDT 2014


Keith Packard <keithp at keithp.com> writes:

> xf86Rotate, it was delaying unwrapping the BlockHandler until after
> calling xf86RotateRedisplay. If there was a software cursor on the
> screen, the redisplay operation would cause cursor to be removed from
> the frame buffer and the misprite block handler to be inserted into
> the block handler chain with the misprite screen private saved block
> handler now set to xf86RotateBlockHandler.
>
> When xf86RotateRedisplay returned, xf86RotateBlockHandler would then
> set screen->BlockHandler to its saved value, call down and then reset
> screen->BlockHandler to xf86RotateBlockHandler. miSpriteBlockHandler
> would never be called after that, which meant that the software cursor
> will now disappear from the screen whenever rendering overlapped and
> would only reappear when the cursor was moved.
>
> To correct this, all that is needed is to move the restoration of
> screen->BlockHandler to the top of xf86RotateBlockHandler, before the
> call to xf86RotateRedisplay.
>
> I've also added to this patch a check to see if the rotate block
> handler is still required and only re-insert itself if that is the
> case.
>
> There's also an enormous comment added to scrnintstr.h which details
> the required conventions for screen function wrapping.

I'm uncomfortable with you mashing these 3 changes together,
particularly the reinsertion change in what was supposed to be just a
bugfix commit.  It didn't take much grepping for me to find more code
that wasn't rewrapping the blockhandler according to these rules:

hw/xfree86/common/xf86VGAarbiterPriv.h:#define SCREEN_EPILOG(x,y) pScreen->x = y;

static void
VGAarbiterBlockHandler(ScreenPtr pScreen,
                       void *pTimeout, void *pReadmask)
{
    SCREEN_PROLOG(BlockHandler);
    VGAGet(pScreen);
    pScreen->BlockHandler(pScreen, pTimeout, pReadmask);
    VGAPut();
    SCREEN_EPILOG(BlockHandler, VGAarbiterBlockHandler);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 818 bytes
Desc: not available
URL: <http://lists.x.org/archives/xorg-devel/attachments/20140416/168c187a/attachment.sig>


More information about the xorg-devel mailing list