DRI2: Synchronize the contents of the real and fake front-buffers
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
parent
f1a995d149
commit
567cf67959
|
@ -141,6 +141,7 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
|
||||||
DRI2BufferPtr buffers;
|
DRI2BufferPtr buffers;
|
||||||
unsigned int temp_buf[32];
|
unsigned int temp_buf[32];
|
||||||
unsigned int *temp = temp_buf;
|
unsigned int *temp = temp_buf;
|
||||||
|
int have_fake_front = 0;
|
||||||
|
|
||||||
|
|
||||||
/* If the drawable is a window and the front-buffer is requested, silently
|
/* If the drawable is a window and the front-buffer is requested, silently
|
||||||
|
@ -163,6 +164,7 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
|
||||||
|
|
||||||
if (attachments[i] == DRI2BufferFakeFrontLeft) {
|
if (attachments[i] == DRI2BufferFakeFrontLeft) {
|
||||||
need_fake_front--;
|
need_fake_front--;
|
||||||
|
have_fake_front = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
temp[i] = attachments[i];
|
temp[i] = attachments[i];
|
||||||
|
@ -171,6 +173,7 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
|
||||||
if (need_fake_front > 0) {
|
if (need_fake_front > 0) {
|
||||||
temp[i] = DRI2BufferFakeFrontLeft;
|
temp[i] = DRI2BufferFakeFrontLeft;
|
||||||
count++;
|
count++;
|
||||||
|
have_fake_front = 1;
|
||||||
attachments = temp;
|
attachments = temp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -195,6 +198,25 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
|
||||||
*height = pPriv->height;
|
*height = pPriv->height;
|
||||||
*out_count = pPriv->bufferCount;
|
*out_count = pPriv->bufferCount;
|
||||||
|
|
||||||
|
|
||||||
|
/* If the client is getting a fake front-buffer, pre-fill it with the
|
||||||
|
* contents of the real front-buffer. This ensures correct operation of
|
||||||
|
* applications that call glXWaitX before calling glDrawBuffer.
|
||||||
|
*/
|
||||||
|
if (have_fake_front) {
|
||||||
|
BoxRec box;
|
||||||
|
RegionRec region;
|
||||||
|
|
||||||
|
box.x1 = 0;
|
||||||
|
box.y1 = 0;
|
||||||
|
box.x2 = pPriv->width;
|
||||||
|
box.y2 = pPriv->height;
|
||||||
|
REGION_INIT(pDraw->pScreen, ®ion, &box, 0);
|
||||||
|
|
||||||
|
DRI2CopyRegion(pDraw, ®ion, DRI2BufferFakeFrontLeft,
|
||||||
|
DRI2BufferFrontLeft);
|
||||||
|
}
|
||||||
|
|
||||||
return pPriv->buffers;
|
return pPriv->buffers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue