port damage tracking code from st/xorg
This commit is contained in:
parent
4d3aadb22f
commit
7847321138
|
@ -307,6 +307,58 @@ GetRec(ScrnInfoPtr pScrn)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dispatch_dirty(ScreenPtr pScreen)
|
||||||
|
{
|
||||||
|
ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
|
||||||
|
modesettingPtr ms = modesettingPTR(scrn);
|
||||||
|
RegionPtr dirty = DamageRegion(ms->damage);
|
||||||
|
unsigned num_cliprects = REGION_NUM_RECTS(dirty);
|
||||||
|
|
||||||
|
if (num_cliprects) {
|
||||||
|
drmModeClip *clip = alloca(num_cliprects * sizeof(drmModeClip));
|
||||||
|
BoxPtr rect = REGION_RECTS(dirty);
|
||||||
|
int i, ret;
|
||||||
|
|
||||||
|
/* XXX no need for copy? */
|
||||||
|
for (i = 0; i < num_cliprects; i++, rect++) {
|
||||||
|
clip[i].x1 = rect->x1;
|
||||||
|
clip[i].y1 = rect->y1;
|
||||||
|
clip[i].x2 = rect->x2;
|
||||||
|
clip[i].y2 = rect->y2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO query connector property to see if this is needed */
|
||||||
|
ret = drmModeDirtyFB(ms->fd, ms->fb_id, clip, num_cliprects);
|
||||||
|
if (ret) {
|
||||||
|
if (ret == -EINVAL) {
|
||||||
|
ms->dirty_enabled = FALSE;
|
||||||
|
DamageUnregister(&pScreen->GetScreenPixmap(pScreen)->drawable, ms->damage);
|
||||||
|
DamageDestroy(ms->damage);
|
||||||
|
ms->damage = NULL;
|
||||||
|
xf86DrvMsg(scrn->scrnIndex, X_INFO, "Disabling kernel dirty updates, not required.\n");
|
||||||
|
return;
|
||||||
|
} else
|
||||||
|
ErrorF("%s: failed to send dirty (%i, %s)\n",
|
||||||
|
__func__, ret, strerror(-ret));
|
||||||
|
}
|
||||||
|
|
||||||
|
DamageEmpty(ms->damage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void msBlockHandler(int i, pointer blockData, pointer pTimeout,
|
||||||
|
pointer pReadmask)
|
||||||
|
{
|
||||||
|
ScreenPtr pScreen = screenInfo.screens[i];
|
||||||
|
modesettingPtr ms = modesettingPTR(xf86Screens[pScreen->myNum]);
|
||||||
|
|
||||||
|
pScreen->BlockHandler = ms->BlockHandler;
|
||||||
|
pScreen->BlockHandler(i, blockData, pTimeout, pReadmask);
|
||||||
|
pScreen->BlockHandler = msBlockHandler;
|
||||||
|
if (ms->dirty_enabled)
|
||||||
|
dispatch_dirty(pScreen);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
FreeRec(ScrnInfoPtr pScrn)
|
FreeRec(ScrnInfoPtr pScrn)
|
||||||
{
|
{
|
||||||
|
@ -494,6 +546,18 @@ CreateScreenResources(ScreenPtr pScreen)
|
||||||
if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, pixels))
|
if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, pixels))
|
||||||
FatalError("Couldn't adjust screen pixmap\n");
|
FatalError("Couldn't adjust screen pixmap\n");
|
||||||
|
|
||||||
|
ms->damage = DamageCreate(NULL, NULL, DamageReportNone, TRUE,
|
||||||
|
pScreen, rootPixmap);
|
||||||
|
|
||||||
|
if (ms->damage) {
|
||||||
|
DamageRegister(&rootPixmap->drawable, ms->damage);
|
||||||
|
ms->dirty_enabled = TRUE;
|
||||||
|
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Damage tracking initialized\n");
|
||||||
|
} else {
|
||||||
|
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
|
||||||
|
"Failed to create screen damage record\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -596,6 +660,9 @@ ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
|
||||||
ms->CloseScreen = pScreen->CloseScreen;
|
ms->CloseScreen = pScreen->CloseScreen;
|
||||||
pScreen->CloseScreen = CloseScreen;
|
pScreen->CloseScreen = CloseScreen;
|
||||||
|
|
||||||
|
ms->BlockHandler = pScreen->BlockHandler;
|
||||||
|
pScreen->BlockHandler = msBlockHandler;
|
||||||
|
|
||||||
if (!xf86CrtcScreenInit(pScreen))
|
if (!xf86CrtcScreenInit(pScreen))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -669,6 +736,12 @@ CloseScreen(int scrnIndex, ScreenPtr pScreen)
|
||||||
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
|
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
|
||||||
modesettingPtr ms = modesettingPTR(pScrn);
|
modesettingPtr ms = modesettingPTR(pScrn);
|
||||||
|
|
||||||
|
if (ms->damage) {
|
||||||
|
DamageUnregister(&pScreen->GetScreenPixmap(pScreen)->drawable, ms->damage);
|
||||||
|
DamageDestroy(ms->damage);
|
||||||
|
ms->damage = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
drmmode_uevent_fini(pScrn, &ms->drmmode);
|
drmmode_uevent_fini(pScrn, &ms->drmmode);
|
||||||
|
|
||||||
drmmode_free_bos(pScrn, &ms->drmmode);
|
drmmode_free_bos(pScrn, &ms->drmmode);
|
||||||
|
@ -678,7 +751,7 @@ CloseScreen(int scrnIndex, ScreenPtr pScreen)
|
||||||
}
|
}
|
||||||
|
|
||||||
pScreen->CreateScreenResources = ms->createScreenResources;
|
pScreen->CreateScreenResources = ms->createScreenResources;
|
||||||
|
pScreen->BlockHandler = ms->BlockHandler;
|
||||||
drmClose(ms->fd);
|
drmClose(ms->fd);
|
||||||
ms->fd = -1;
|
ms->fd = -1;
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <drm.h>
|
#include <drm.h>
|
||||||
#include <xf86drm.h>
|
#include <xf86drm.h>
|
||||||
|
#include <damage.h>
|
||||||
|
|
||||||
#include "drmmode_display.h"
|
#include "drmmode_display.h"
|
||||||
#define DRV_ERROR(msg) xf86DrvMsg(pScrn->scrnIndex, X_ERROR, msg);
|
#define DRV_ERROR(msg) xf86DrvMsg(pScrn->scrnIndex, X_ERROR, msg);
|
||||||
|
@ -68,10 +69,13 @@ typedef struct _modesettingRec
|
||||||
unsigned int SaveGeneration;
|
unsigned int SaveGeneration;
|
||||||
|
|
||||||
CreateScreenResourcesProcPtr createScreenResources;
|
CreateScreenResourcesProcPtr createScreenResources;
|
||||||
|
ScreenBlockHandlerProcPtr BlockHandler;
|
||||||
void *driver;
|
void *driver;
|
||||||
|
|
||||||
drmmode_rec drmmode;
|
drmmode_rec drmmode;
|
||||||
|
|
||||||
|
DamagePtr damage;
|
||||||
|
Bool dirty_enabled;
|
||||||
} modesettingRec, *modesettingPtr;
|
} modesettingRec, *modesettingPtr;
|
||||||
|
|
||||||
#define modesettingPTR(p) ((modesettingPtr)((p)->driverPrivate))
|
#define modesettingPTR(p) ((modesettingPtr)((p)->driverPrivate))
|
||||||
|
|
Loading…
Reference in New Issue