DRI2: re-allocate DRI2 drawable if pixmap serial changes

If a pixmap header is modified or the drawable serial changes, some
aspects of the drawable are likely to have changed so we should
re-allocate the corresponding DRI2 drawable in that case.  This is one
way of catching when the root window pixmap changes through xrandr.

Fixes bug https://bugs.freedesktop.org/show_bug.cgi?id=28365.

Reviewed-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Jesse Barnes 2010-07-09 10:36:56 -07:00 committed by Keith Packard
parent 02b11509b2
commit 3209b094a3

View File

@ -82,6 +82,7 @@ typedef struct _DRI2Drawable {
CARD64 last_swap_msc; /* msc at completion of most recent swap */
CARD64 last_swap_ust; /* ust at completion of most recent swap */
int swap_limit; /* for N-buffering */
unsigned long serialNumber;
} DRI2DrawableRec, *DRI2DrawablePtr;
typedef struct _DRI2Screen {
@ -130,6 +131,19 @@ DRI2GetDrawable(DrawablePtr pDraw)
}
}
static unsigned long
DRI2DrawableSerial(DrawablePtr pDraw)
{
ScreenPtr pScreen = pDraw->pScreen;
PixmapPtr pPix;
if (pDraw->type != DRAWABLE_WINDOW)
return pDraw->serialNumber;
pPix = pScreen->GetWindowPixmap((WindowPtr)pDraw);
return pPix->drawable.serialNumber;
}
static DRI2DrawablePtr
DRI2AllocateDrawable(DrawablePtr pDraw)
{
@ -163,6 +177,7 @@ DRI2AllocateDrawable(DrawablePtr pDraw)
pPriv->last_swap_msc = 0;
pPriv->last_swap_ust = 0;
list_init(&pPriv->reference_list);
pPriv->serialNumber = DRI2DrawableSerial(pDraw);
if (pDraw->type == DRAWABLE_WINDOW) {
pWin = (WindowPtr) pDraw;
@ -326,6 +341,7 @@ allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds,
|| !dimensions_match
|| (pPriv->buffers[old_buf]->format != format)) {
*buffer = (*ds->CreateBuffer)(pDraw, attachment, format);
pPriv->serialNumber = DRI2DrawableSerial(pDraw);
return TRUE;
} else {
@ -384,7 +400,8 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
}
dimensions_match = (pDraw->width == pPriv->width)
&& (pDraw->height == pPriv->height);
&& (pDraw->height == pPriv->height)
&& (pPriv->serialNumber == DRI2DrawableSerial(pDraw));
buffers = malloc((count + 1) * sizeof(buffers[0]));