xfree86: always render first cursor in HW, all others in SW.
This commit is contained in:
		
							parent
							
								
									48ba58feac
								
							
						
					
					
						commit
						f611719edc
					
				| 
						 | 
					@ -20,8 +20,6 @@ extern InputInfo inputInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DevPrivateKey xf86CursorScreenKey = &xf86CursorScreenKey;
 | 
					DevPrivateKey xf86CursorScreenKey = &xf86CursorScreenKey;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define XF86_FORCE_SW_CURSOR (1 << 7)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* sprite functions */
 | 
					/* sprite functions */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Bool xf86CursorRealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
 | 
					static Bool xf86CursorRealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
 | 
				
			||||||
| 
						 | 
					@ -304,7 +302,7 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pCurs == NullCursor) {	/* means we're supposed to remove the cursor */
 | 
					    if (pCurs == NullCursor) {	/* means we're supposed to remove the cursor */
 | 
				
			||||||
        if (ScreenPriv->SWCursor)
 | 
					        if (ScreenPriv->SWCursor || pDev != inputInfo.pointer)
 | 
				
			||||||
            (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor,
 | 
					            (*ScreenPriv->spriteFuncs->SetCursor)(pDev, pScreen, NullCursor,
 | 
				
			||||||
                                                  x, y);
 | 
					                                                  x, y);
 | 
				
			||||||
        else if (ScreenPriv->isUp) {
 | 
					        else if (ScreenPriv->isUp) {
 | 
				
			||||||
| 
						 | 
					@ -324,13 +322,10 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
 | 
				
			||||||
	ScreenPriv->CursorToRestore = NULL;
 | 
						ScreenPriv->CursorToRestore = NULL;
 | 
				
			||||||
	ScreenPriv->HotX = pCurs->bits->xhot;
 | 
						ScreenPriv->HotX = pCurs->bits->xhot;
 | 
				
			||||||
	ScreenPriv->HotY = pCurs->bits->yhot;
 | 
						ScreenPriv->HotY = pCurs->bits->yhot;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!infoPtr->pScrn->vtSema)
 | 
					        if (!infoPtr->pScrn->vtSema)
 | 
				
			||||||
            ScreenPriv->SavedCursor = pCurs;
 | 
					            ScreenPriv->SavedCursor = pCurs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!(ScreenPriv->SWCursor & XF86_FORCE_SW_CURSOR))
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	if (infoPtr->pScrn->vtSema && (ScreenPriv->ForceHWCursorCount || ((
 | 
						if (infoPtr->pScrn->vtSema && (ScreenPriv->ForceHWCursorCount || ((
 | 
				
			||||||
#ifdef ARGB_CURSOR
 | 
					#ifdef ARGB_CURSOR
 | 
				
			||||||
			    pCurs->bits->argb && infoPtr->UseHWCursorARGB &&
 | 
								    pCurs->bits->argb && infoPtr->UseHWCursorARGB &&
 | 
				
			||||||
| 
						 | 
					@ -352,8 +347,6 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
 | 
				
			||||||
	    return;
 | 
						    return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        PointPriv->waitForUpdate = TRUE;
 | 
					        PointPriv->waitForUpdate = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (ScreenPriv->isUp) {
 | 
					        if (ScreenPriv->isUp) {
 | 
				
			||||||
| 
						 | 
					@ -369,6 +362,8 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
 | 
				
			||||||
        if (!ScreenPriv->SWCursor)
 | 
					        if (!ScreenPriv->SWCursor)
 | 
				
			||||||
            ScreenPriv->SWCursor = TRUE;
 | 
					            ScreenPriv->SWCursor = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pCurs->bits->emptyMask && !ScreenPriv->showTransparent)
 | 
					    if (pCurs->bits->emptyMask && !ScreenPriv->showTransparent)
 | 
				
			||||||
	pCurs = NullCursor;
 | 
						pCurs = NullCursor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -384,11 +379,10 @@ xf86CursorMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
 | 
				
			||||||
    /* only update coordinate state for first sprite, otherwise we get jumps
 | 
					    /* only update coordinate state for first sprite, otherwise we get jumps
 | 
				
			||||||
       when removing a sprite. The second sprite is never HW rendered anyway */
 | 
					       when removing a sprite. The second sprite is never HW rendered anyway */
 | 
				
			||||||
    if (pDev == inputInfo.pointer ||
 | 
					    if (pDev == inputInfo.pointer ||
 | 
				
			||||||
            (!pDev->isMaster && pDev->u.master == inputInfo.pointer))
 | 
					            !pDev->isMaster && pDev->u.master == inputInfo.pointer)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
	ScreenPriv->x = x;
 | 
						ScreenPriv->x = x;
 | 
				
			||||||
	ScreenPriv->y = y;
 | 
						ScreenPriv->y = y;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (ScreenPriv->CursorToRestore)
 | 
					        if (ScreenPriv->CursorToRestore)
 | 
				
			||||||
            xf86CursorSetCursor(pDev, pScreen, ScreenPriv->CursorToRestore, x, y);
 | 
					            xf86CursorSetCursor(pDev, pScreen, ScreenPriv->CursorToRestore, x, y);
 | 
				
			||||||
| 
						 | 
					@ -396,6 +390,8 @@ xf86CursorMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
 | 
				
			||||||
            (*ScreenPriv->spriteFuncs->MoveCursor)(pDev, pScreen, x, y);
 | 
					            (*ScreenPriv->spriteFuncs->MoveCursor)(pDev, pScreen, x, y);
 | 
				
			||||||
        else if (ScreenPriv->isUp)
 | 
					        else if (ScreenPriv->isUp)
 | 
				
			||||||
            xf86MoveCursor(pScreen, x, y);
 | 
					            xf86MoveCursor(pScreen, x, y);
 | 
				
			||||||
 | 
					    } else
 | 
				
			||||||
 | 
					        (*ScreenPriv->spriteFuncs->MoveCursor)(pDev, pScreen, x, y);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
| 
						 | 
					@ -455,13 +451,6 @@ xf86DeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
 | 
				
			||||||
    /* Init SW cursor */
 | 
					    /* Init SW cursor */
 | 
				
			||||||
    ret = (*ScreenPriv->spriteFuncs->DeviceCursorInitialize)(pDev, pScreen);
 | 
					    ret = (*ScreenPriv->spriteFuncs->DeviceCursorInitialize)(pDev, pScreen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pDev != inputInfo.pointer)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	    ScreenPriv->spriteFuncs->SetCursor(inputInfo.pointer, pScreen,
 | 
					 | 
				
			||||||
		    ScreenPriv->CurrentCursor, ScreenPriv->x, ScreenPriv->y);
 | 
					 | 
				
			||||||
        ScreenPriv->SWCursor = TRUE | XF86_FORCE_SW_CURSOR;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -475,20 +464,6 @@ xf86DeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
 | 
				
			||||||
    xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
 | 
					    xf86CursorScreenPtr ScreenPriv = (xf86CursorScreenPtr)dixLookupPrivate(
 | 
				
			||||||
            &pScreen->devPrivates, xf86CursorScreenKey);
 | 
					            &pScreen->devPrivates, xf86CursorScreenKey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (it = inputInfo.devices; it; it = it->next)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        if (it->isMaster && it != inputInfo.pointer && it !=
 | 
					 | 
				
			||||||
                inputInfo.keyboard)
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!it) /* no other sprites except VCP. restore HW rendering */
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
	ScreenPriv->SWCursor = TRUE;
 | 
					 | 
				
			||||||
	xf86CursorSetCursor(inputInfo.pointer, pScreen,
 | 
					 | 
				
			||||||
		ScreenPriv->CurrentCursor, ScreenPriv->x, ScreenPriv->y);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /* Clean up SW cursor */
 | 
					   /* Clean up SW cursor */
 | 
				
			||||||
    (*ScreenPriv->spriteFuncs->DeviceCursorCleanup)(pDev, pScreen);
 | 
					    (*ScreenPriv->spriteFuncs->DeviceCursorCleanup)(pDev, pScreen);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue