EXA: Try to minimize UploadToScreen calls for mixed pixmaps.
If there are several software fallbacks affecting the system memory copy of the same pixmap, only copy the results back to the driver pixmap when it's used for acceleration again, or in the BlockHandler, whichever happens first.
This commit is contained in:
parent
1818cbd70f
commit
0369eeeb6b
14
exa/exa.c
14
exa/exa.c
|
@ -774,10 +774,18 @@ ExaBlockHandler(int screenNum, pointer blockData, pointer pTimeout,
|
||||||
ScreenPtr pScreen = screenInfo.screens[screenNum];
|
ScreenPtr pScreen = screenInfo.screens[screenNum];
|
||||||
ExaScreenPriv(pScreen);
|
ExaScreenPriv(pScreen);
|
||||||
|
|
||||||
|
/* Move any deferred results from a software fallback to the driver pixmap */
|
||||||
|
if (pExaScr->deferred_mixed_pixmap)
|
||||||
|
exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap);
|
||||||
|
|
||||||
unwrap(pExaScr, pScreen, BlockHandler);
|
unwrap(pExaScr, pScreen, BlockHandler);
|
||||||
(*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask);
|
(*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask);
|
||||||
wrap(pExaScr, pScreen, BlockHandler, ExaBlockHandler);
|
wrap(pExaScr, pScreen, BlockHandler, ExaBlockHandler);
|
||||||
|
|
||||||
|
/* The rest only applies to classic EXA */
|
||||||
|
if (pExaScr->info->flags & EXA_HANDLES_PIXMAPS)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Try and keep the offscreen memory area tidy every now and then (at most
|
/* Try and keep the offscreen memory area tidy every now and then (at most
|
||||||
* once per second) when the server has been idle for at least 100ms.
|
* once per second) when the server has been idle for at least 100ms.
|
||||||
*/
|
*/
|
||||||
|
@ -991,10 +999,12 @@ exaDriverInit (ScreenPtr pScreen,
|
||||||
* Replace various fb screen functions
|
* Replace various fb screen functions
|
||||||
*/
|
*/
|
||||||
if ((pExaScr->info->flags & EXA_OFFSCREEN_PIXMAPS) &&
|
if ((pExaScr->info->flags & EXA_OFFSCREEN_PIXMAPS) &&
|
||||||
!(pExaScr->info->flags & EXA_HANDLES_PIXMAPS)) {
|
(!(pExaScr->info->flags & EXA_HANDLES_PIXMAPS) ||
|
||||||
|
(pExaScr->info->flags & EXA_MIXED_PIXMAPS)))
|
||||||
wrap(pExaScr, pScreen, BlockHandler, ExaBlockHandler);
|
wrap(pExaScr, pScreen, BlockHandler, ExaBlockHandler);
|
||||||
|
if ((pExaScr->info->flags & EXA_OFFSCREEN_PIXMAPS) &&
|
||||||
|
!(pExaScr->info->flags & EXA_HANDLES_PIXMAPS))
|
||||||
wrap(pExaScr, pScreen, WakeupHandler, ExaWakeupHandler);
|
wrap(pExaScr, pScreen, WakeupHandler, ExaWakeupHandler);
|
||||||
}
|
|
||||||
wrap(pExaScr, pScreen, CreateGC, exaCreateGC);
|
wrap(pExaScr, pScreen, CreateGC, exaCreateGC);
|
||||||
wrap(pExaScr, pScreen, CloseScreen, exaCloseScreen);
|
wrap(pExaScr, pScreen, CloseScreen, exaCloseScreen);
|
||||||
wrap(pExaScr, pScreen, GetImage, exaGetImage);
|
wrap(pExaScr, pScreen, GetImage, exaGetImage);
|
||||||
|
|
|
@ -99,8 +99,13 @@ exaDoMigration_mixed(ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel)
|
||||||
exaCreateDriverPixmap_mixed(pPixmap);
|
exaCreateDriverPixmap_mixed(pPixmap);
|
||||||
|
|
||||||
if (pExaPixmap->pDamage && exaPixmapIsOffscreen(pPixmap)) {
|
if (pExaPixmap->pDamage && exaPixmapIsOffscreen(pPixmap)) {
|
||||||
|
ExaScreenPriv(pPixmap->drawable.pScreen);
|
||||||
|
|
||||||
pPixmap->devKind = pExaPixmap->fb_pitch;
|
pPixmap->devKind = pExaPixmap->fb_pitch;
|
||||||
exaCopyDirtyToFb(pixmaps + i);
|
exaCopyDirtyToFb(pixmaps + i);
|
||||||
|
|
||||||
|
if (pExaScr->deferred_mixed_pixmap == pPixmap)
|
||||||
|
pExaScr->deferred_mixed_pixmap = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pExaPixmap->offscreen = exaPixmapIsOffscreen(pPixmap);
|
pExaPixmap->offscreen = exaPixmapIsOffscreen(pPixmap);
|
||||||
|
@ -197,6 +202,9 @@ exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg)
|
||||||
|
|
||||||
/* Move back results of software rendering on system memory copy of mixed driver
|
/* Move back results of software rendering on system memory copy of mixed driver
|
||||||
* pixmap (see exaPrepareAccessReg_mixed).
|
* pixmap (see exaPrepareAccessReg_mixed).
|
||||||
|
*
|
||||||
|
* Defer moving the destination back into the driver pixmap, to try and save
|
||||||
|
* overhead on multiple consequent software fallbacks.
|
||||||
*/
|
*/
|
||||||
void exaFinishAccess_mixed(PixmapPtr pPixmap, int index)
|
void exaFinishAccess_mixed(PixmapPtr pPixmap, int index)
|
||||||
{
|
{
|
||||||
|
@ -204,6 +212,16 @@ void exaFinishAccess_mixed(PixmapPtr pPixmap, int index)
|
||||||
|
|
||||||
if (pExaPixmap->pDamage && exaPixmapIsOffscreen(pPixmap)) {
|
if (pExaPixmap->pDamage && exaPixmapIsOffscreen(pPixmap)) {
|
||||||
DamageRegionProcessPending(&pPixmap->drawable);
|
DamageRegionProcessPending(&pPixmap->drawable);
|
||||||
exaMoveInPixmap_mixed(pPixmap);
|
|
||||||
|
if (index == EXA_PREPARE_DEST || index == EXA_PREPARE_AUX_DEST) {
|
||||||
|
ExaScreenPriv(pPixmap->drawable.pScreen);
|
||||||
|
|
||||||
|
if (pExaScr->deferred_mixed_pixmap &&
|
||||||
|
pExaScr->deferred_mixed_pixmap != pPixmap)
|
||||||
|
exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap);
|
||||||
|
pExaScr->deferred_mixed_pixmap = pPixmap;
|
||||||
|
pPixmap->devKind = pExaPixmap->fb_pitch;
|
||||||
|
} else
|
||||||
|
exaMoveInPixmap_mixed(pPixmap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -192,6 +192,9 @@ exaDestroyPixmap_mixed(PixmapPtr pPixmap)
|
||||||
{
|
{
|
||||||
ExaPixmapPriv (pPixmap);
|
ExaPixmapPriv (pPixmap);
|
||||||
|
|
||||||
|
if (pExaScr->deferred_mixed_pixmap == pPixmap)
|
||||||
|
pExaScr->deferred_mixed_pixmap = NULL;
|
||||||
|
|
||||||
if (pExaPixmap->driverPriv)
|
if (pExaPixmap->driverPriv)
|
||||||
pExaScr->info->DestroyPixmap(pScreen, pExaPixmap->driverPriv);
|
pExaScr->info->DestroyPixmap(pScreen, pExaPixmap->driverPriv);
|
||||||
pExaPixmap->driverPriv = NULL;
|
pExaPixmap->driverPriv = NULL;
|
||||||
|
|
|
@ -188,6 +188,7 @@ typedef struct {
|
||||||
unsigned numOffscreenAvailable;
|
unsigned numOffscreenAvailable;
|
||||||
CARD32 lastDefragment;
|
CARD32 lastDefragment;
|
||||||
CARD32 nextDefragment;
|
CARD32 nextDefragment;
|
||||||
|
PixmapPtr deferred_mixed_pixmap;
|
||||||
|
|
||||||
/* Reference counting for accessed pixmaps */
|
/* Reference counting for accessed pixmaps */
|
||||||
struct {
|
struct {
|
||||||
|
|
Loading…
Reference in New Issue