2010/3/30 Francisco Jerez <[email protected]>: > It wasn't a problem before the invalidate changes (fa5103a02 > specifically) because the SwapBuffers request was unconditionally > followed by a GetBuffers request (and GetBuffers updated the fake > front). On DRI2.3 the client is only required to re-sync buffers when > it gets an explicit invalidate event, so we cannot rely on this > behavior anymore. > > It was reported to make the following piglit/glean test cases regress: > texgen, coloredTexPerf2, coloredLitPerf2.
We need a link to https://bugs.freedesktop.org/show_bug.cgi?id=27305 in the commit message, and I'd prefer to see the get_drawable_region() cleanup in a separate patch. Otherwise the fix looks good - the extra DRI2CopyRegion in DRI2SwapComplete only kicks in when we have a fake front buffer, so it wont impact regular double buffered rendering. As for the cleanup part, I'd rather see a DRI2CopyDrawable() function that creates the drawable region and just calls DRI2CopyRegion. Should be ok to use that in DRI2SwapBuffers() as well, even if we end up looking up the buffers twice. Kristian > Signed-off-by: Francisco Jerez <[email protected]> > --- > hw/xfree86/dri2/dri2.c | 32 ++++++++++++++++++-------------- > 1 files changed, 18 insertions(+), 14 deletions(-) > > diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c > index 41006da..f05bb5e 100644 > --- a/hw/xfree86/dri2/dri2.c > +++ b/hw/xfree86/dri2/dri2.c > @@ -217,6 +217,14 @@ find_attachment(DRI2DrawablePtr pPriv, unsigned > attachment) > return -1; > } > > +static void > +get_drawable_region(DrawablePtr draw, RegionPtr region) > +{ > + BoxRec box = { 0, 0, draw->width, draw->height }; > + > + REGION_INIT(draw->pScreen, region, &box, 0); > +} > + > static Bool > allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds, > DRI2DrawablePtr pPriv, > @@ -344,15 +352,9 @@ do_get_buffers(DrawablePtr pDraw, int *width, int > *height, > * applications that call glXWaitX before calling glDrawBuffer. > */ > if (have_fake_front && buffers_changed) { > - 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); > - > + get_drawable_region(pDraw, ®ion); > DRI2CopyRegion(pDraw, ®ion, DRI2BufferFakeFrontLeft, > DRI2BufferFrontLeft); > } > @@ -605,6 +607,7 @@ DRI2SwapComplete(ClientPtr client, DrawablePtr pDraw, int > frame, > ScreenPtr pScreen = pDraw->pScreen; > DRI2DrawablePtr pPriv; > CARD64 ust = 0; > + RegionRec region; > > pPriv = DRI2GetDrawable(pDraw); > if (pPriv == NULL) { > @@ -620,6 +623,12 @@ DRI2SwapComplete(ClientPtr client, DrawablePtr pDraw, > int frame, > return; > } > > + /* If we're using a fake front, update it with the front buffer > + * contents. */ > + get_drawable_region(pDraw, ®ion); > + DRI2CopyRegion(pDraw, ®ion, DRI2BufferFakeFrontLeft, > + DRI2BufferFrontLeft); > + > ust = ((CARD64)tv_sec * 1000000) + tv_usec; > if (swap_complete) > swap_complete(client, swap_data, type, ust, frame, pPriv->swap_count); > @@ -682,18 +691,13 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, > CARD64 target_msc, > > /* Old DDX, just blit */ > if (!ds->ScheduleSwap) { > - BoxRec box; > RegionRec region; > > - box.x1 = 0; > - box.y1 = 0; > - box.x2 = pDraw->width; > - box.y2 = pDraw->height; > - REGION_INIT(pScreen, ®ion, &box, 0); > - > pPriv->swapsPending++; > > + get_drawable_region(pDraw, ®ion); > (*ds->CopyRegion)(pDraw, ®ion, pDestBuffer, pSrcBuffer); > + > DRI2SwapComplete(client, pDraw, target_msc, 0, 0, DRI2_BLIT_COMPLETE, > func, data); > return Success; > -- > 1.6.4.4 > > _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
