diff options
author | Ian Romanick <ian.d.romanick@intel.com> | 2009-04-08 15:44:34 -0700 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2009-04-10 12:00:35 -0700 |
commit | aa2928325fe51d94a636dde9c090e8f54a311a12 (patch) | |
tree | 3b91091b2a9c7f67a09c2156ffeb613fe0fdaf0b /hw | |
parent | 808fd2c67f303cb721769375b11ce8b90ffc1909 (diff) |
DRI2: Add fake front-buffer to request list for windows
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 <ian.d.romanick@intel.com>
Diffstat (limited to 'hw')
-rw-r--r-- | 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 0f2e24b3f..351d02b7b 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; |