From: Francisco J. <cur...@ri...> - 2010-01-22 14:30:07
|
It can be quite an expensive operation, so we're better off not doing it unless it's totally required. Signed-off-by: Francisco Jerez <cur...@ri...> --- hw/xfree86/dri2/dri2.c | 42 +++++++++++++++++++++++------------------- 1 files changed, 23 insertions(+), 19 deletions(-) diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c index 3db826e..02a93ff 100644 --- a/hw/xfree86/dri2/dri2.c +++ b/hw/xfree86/dri2/dri2.c @@ -176,27 +176,25 @@ find_attachment(DRI2DrawablePtr pPriv, unsigned attachment) return -1; } -static DRI2BufferPtr +static Bool allocate_or_reuse_buffer(DrawablePtr pDraw, DRI2ScreenPtr ds, DRI2DrawablePtr pPriv, unsigned int attachment, unsigned int format, - int dimensions_match) + int dimensions_match, DRI2BufferPtr *buffer) { - DRI2BufferPtr buffer; - int old_buf; - - old_buf = find_attachment(pPriv, attachment); + int old_buf = find_attachment(pPriv, attachment); if ((old_buf < 0) || !dimensions_match || (pPriv->buffers[old_buf]->format != format)) { - buffer = (*ds->CreateBuffer)(pDraw, attachment, format); + *buffer = (*ds->CreateBuffer)(pDraw, attachment, format); + return TRUE; + } else { - buffer = pPriv->buffers[old_buf]; + *buffer = pPriv->buffers[old_buf]; pPriv->buffers[old_buf] = NULL; + return FALSE; } - - return buffer; } static DRI2BufferPtr * @@ -212,6 +210,7 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height, int have_fake_front = 0; int front_format = 0; int dimensions_match; + int buffers_changed = 0; int i; if (!pPriv) { @@ -230,8 +229,10 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height, const unsigned attachment = *(attachments++); const unsigned format = (has_format) ? *(attachments++) : 0; - buffers[i] = allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment, - format, dimensions_match); + if (allocate_or_reuse_buffer(pDraw, ds, pPriv, attachment, + format, dimensions_match, + &buffers[i])) + buffers_changed = 1; /* If the drawable is a window and the front-buffer is requested, * silently add the fake front-buffer to the list of requested @@ -261,15 +262,18 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height, } if (need_real_front > 0) { - buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv, - DRI2BufferFrontLeft, - front_format, dimensions_match); + if (allocate_or_reuse_buffer(pDraw, ds, pPriv, DRI2BufferFrontLeft, + front_format, dimensions_match, + &buffers[i++])) + buffers_changed = 1; } if (need_fake_front > 0) { - buffers[i++] = allocate_or_reuse_buffer(pDraw, ds, pPriv, - DRI2BufferFakeFrontLeft, - front_format, dimensions_match); + if (allocate_or_reuse_buffer(pDraw, ds, pPriv, DRI2BufferFakeFrontLeft, + front_format, dimensions_match, + &buffers[i++])) + buffers_changed = 1; + have_fake_front = 1; } @@ -298,7 +302,7 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height, * contents of the real front-buffer. This ensures correct operation of * applications that call glXWaitX before calling glDrawBuffer. */ - if (have_fake_front) { + if (have_fake_front && buffers_changed) { BoxRec box; RegionRec region; -- 1.6.4.4 |