pixmap: fix reverse optimus support with multiple heads
For doing reverese optimus to multiple outputs on a secondary GPU the GPU can store the blits into a large screen pixmap, unfortunately this means we need a destination offset into the dirty code, so add a new API that just adds this interface. Signed-off-by: Dave Airlie <airlied@redhat.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
e1cc0d3df1
commit
da4bad620a
18
dix/pixmap.c
18
dix/pixmap.c
|
@ -164,9 +164,9 @@ PixmapPtr PixmapShareToSlave(PixmapPtr pixmap, ScreenPtr slave)
|
|||
}
|
||||
|
||||
Bool
|
||||
PixmapStartDirtyTracking(PixmapPtr src,
|
||||
PixmapPtr slave_dst,
|
||||
int x, int y)
|
||||
PixmapStartDirtyTracking2(PixmapPtr src,
|
||||
PixmapPtr slave_dst,
|
||||
int x, int y, int dst_x, int dst_y)
|
||||
{
|
||||
ScreenPtr screen = src->drawable.pScreen;
|
||||
PixmapDirtyUpdatePtr dirty_update;
|
||||
|
@ -179,6 +179,8 @@ PixmapStartDirtyTracking(PixmapPtr src,
|
|||
dirty_update->slave_dst = slave_dst;
|
||||
dirty_update->x = x;
|
||||
dirty_update->y = y;
|
||||
dirty_update->dst_x = dst_x;
|
||||
dirty_update->dst_y = dst_y;
|
||||
|
||||
dirty_update->damage = DamageCreate(NULL, NULL,
|
||||
DamageReportNone,
|
||||
|
@ -194,6 +196,14 @@ PixmapStartDirtyTracking(PixmapPtr src,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
Bool
|
||||
PixmapStartDirtyTracking(PixmapPtr src,
|
||||
PixmapPtr slave_dst,
|
||||
int x, int y)
|
||||
{
|
||||
return PixmapStartDirtyTracking2(src, slave_dst, x, y, 0, 0);
|
||||
}
|
||||
|
||||
Bool
|
||||
PixmapStopDirtyTracking(PixmapPtr src, PixmapPtr slave_dst)
|
||||
{
|
||||
|
@ -261,7 +271,7 @@ Bool PixmapSyncDirtyHelper(PixmapDirtyUpdatePtr dirty, RegionPtr dirty_region)
|
|||
h = dst_box.y2 - dst_box.y1;
|
||||
|
||||
pGC->ops->CopyArea(&dirty->src->drawable, &dst->drawable, pGC,
|
||||
dirty->x + dst_box.x1, dirty->y + dst_box.y1, w, h, dst_box.x1, dst_box.y1);
|
||||
dirty->x + dst_box.x1, dirty->y + dst_box.y1, w, h, dirty->dst_x + dst_box.x1, dirty->dst_y + dst_box.y1);
|
||||
b++;
|
||||
}
|
||||
FreeScratchGC(pGC);
|
||||
|
|
|
@ -120,6 +120,12 @@ PixmapStartDirtyTracking(PixmapPtr src,
|
|||
PixmapPtr slave_dst,
|
||||
int x, int y);
|
||||
|
||||
#define HAS_DIRTYTRACKING2 1
|
||||
extern _X_EXPORT Bool
|
||||
PixmapStartDirtyTracking2(PixmapPtr src,
|
||||
PixmapPtr slave_dst,
|
||||
int x, int y, int dst_x, int dst_y);
|
||||
|
||||
extern _X_EXPORT Bool
|
||||
PixmapStopDirtyTracking(PixmapPtr src, PixmapPtr slave_dst);
|
||||
|
||||
|
|
|
@ -90,6 +90,7 @@ typedef struct _PixmapDirtyUpdate {
|
|||
int x, y;
|
||||
DamagePtr damage;
|
||||
struct xorg_list ent;
|
||||
int dst_x, dst_y;
|
||||
} PixmapDirtyUpdateRec;
|
||||
|
||||
static inline void
|
||||
|
|
Loading…
Reference in New Issue
Block a user