If a front-buffer is requested for a window, add the fake front-buffer
to the list of requested buffers.

Signed-off-by: Ian Romanick <[email protected]>
---
 hw/xfree86/dri2/dri2.c |   40 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index 0f2e24b..5d56d9c 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -139,6 +139,42 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
     DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
     DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
     DRI2BufferPtr   buffers;
+    unsigned int temp_buf[32];
+    unsigned int *temp = temp_buf;
+
+
+    /* If the drawable is a window and the front-buffer is requested, silently
+     * add the fake front-buffer to the list of requested attachments.  The
+     * counting logic in the loop accounts for the case where the client
+     * requests both the fake and real front-buffer.
+     */
+    if (pDraw->type == DRAWABLE_WINDOW) {
+       int need_fake_front = 0;
+       int i;
+
+       if ((count + 1) > 32) {
+           temp = xalloc((count + 1) * sizeof(temp[0]));
+       }
+
+       for (i = 0; i < count; i++) {
+           if (attachments[i] == DRI2BufferFrontLeft) {
+               need_fake_front++;
+           }
+
+           if (attachments[i] == DRI2BufferFakeFrontLeft) {
+               need_fake_front--;
+           }
+
+           temp[i] = attachments[i];
+       }
+       
+       if (need_fake_front > 0) {
+           temp[i] = DRI2BufferFakeFrontLeft;
+           count++;
+           attachments = temp;
+       }
+    }
+
 
     if (pPriv->buffers == NULL ||
        pDraw->width != pPriv->width || pDraw->height != pPriv->height)
@@ -151,6 +187,10 @@ DRI2GetBuffers(DrawablePtr pDraw, int *width, int *height,
        pPriv->height = pDraw->height;
     }
 
+    if (temp != temp_buf) {
+       xfree(temp);
+    }
+
     *width = pPriv->width;
     *height = pPriv->height;
     *out_count = pPriv->bufferCount;
-- 
1.6.0.6


------------------------------------------------------------------------------
This SF.net email is sponsored by:
High Quality Requirements in a Collaborative Environment.
Download a free trial of Rational Requirements Composer Now!
http://p.sf.net/sfu/www-ibm-com
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to