diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2014-05-02 19:27:52 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2014-05-02 19:27:52 +0000 |
commit | b9676a49e5a29d619bcd8402e4541d7749197922 (patch) | |
tree | 67cdb12cda42de5facadc0a36125a32354b3bc29 /xserver/dix/dispatch.c | |
parent | fbf6414f58c54aab6ef37e4d066bb2699f118269 (diff) |
Update to xserver 1.15.1.
Tested by at least ajacoutot@, dcoppa@ & jasper@
Diffstat (limited to 'xserver/dix/dispatch.c')
-rw-r--r-- | xserver/dix/dispatch.c | 117 |
1 files changed, 50 insertions, 67 deletions
diff --git a/xserver/dix/dispatch.c b/xserver/dix/dispatch.c index 979ba48f0..8dcd9cbcf 100644 --- a/xserver/dix/dispatch.c +++ b/xserver/dix/dispatch.c @@ -220,8 +220,9 @@ UpdateCurrentTimeIf(void) #undef SMART_DEBUG -#define SMART_SCHEDULE_DEFAULT_INTERVAL 20 /* ms */ -#define SMART_SCHEDULE_MAX_SLICE 200 /* ms */ +/* in milliseconds */ +#define SMART_SCHEDULE_DEFAULT_INTERVAL 5 +#define SMART_SCHEDULE_MAX_SLICE 15 #if defined(WIN32) && !defined(__CYGWIN__) Bool SmartScheduleDisable = TRUE; @@ -465,6 +466,7 @@ Dispatch(void) free(clientReady); dispatchException &= ~DE_RESET; SmartScheduleLatencyLimited = 0; + ResetOsBuffers(); } static int VendorRelease = VENDOR_RELEASE; @@ -1973,7 +1975,7 @@ ProcPutImage(ClientPtr client) static int DoGetImage(ClientPtr client, int format, Drawable drawable, int x, int y, int width, int height, - Mask planemask, xGetImageReply ** im_return) + Mask planemask) { DrawablePtr pDraw, pBoundingDraw; int nlines, linesPerBuf, rc; @@ -2073,46 +2075,32 @@ DoGetImage(ClientPtr client, int format, Drawable drawable, xgi.length = length; - if (im_return) { - pBuf = calloc(1, sz_xGetImageReply + length); - if (!pBuf) - return BadAlloc; - if (widthBytesLine == 0) - linesPerBuf = 0; - else + xgi.length = bytes_to_int32(xgi.length); + if (widthBytesLine == 0 || height == 0) + linesPerBuf = 0; + else if (widthBytesLine >= IMAGE_BUFSIZE) + linesPerBuf = 1; + else { + linesPerBuf = IMAGE_BUFSIZE / widthBytesLine; + if (linesPerBuf > height) linesPerBuf = height; - *im_return = (xGetImageReply *) pBuf; - *(xGetImageReply *) pBuf = xgi; - pBuf += sz_xGetImageReply; } - else { - xgi.length = bytes_to_int32(xgi.length); - if (widthBytesLine == 0 || height == 0) - linesPerBuf = 0; - else if (widthBytesLine >= IMAGE_BUFSIZE) - linesPerBuf = 1; - else { - linesPerBuf = IMAGE_BUFSIZE / widthBytesLine; - if (linesPerBuf > height) - linesPerBuf = height; + length = linesPerBuf * widthBytesLine; + if (linesPerBuf < height) { + /* we have to make sure intermediate buffers don't need padding */ + while ((linesPerBuf > 1) && + (length & ((1L << LOG2_BYTES_PER_SCANLINE_PAD) - 1))) { + linesPerBuf--; + length -= widthBytesLine; } - length = linesPerBuf * widthBytesLine; - if (linesPerBuf < height) { - /* we have to make sure intermediate buffers don't need padding */ - while ((linesPerBuf > 1) && - (length & ((1L << LOG2_BYTES_PER_SCANLINE_PAD) - 1))) { - linesPerBuf--; - length -= widthBytesLine; - } - while (length & ((1L << LOG2_BYTES_PER_SCANLINE_PAD) - 1)) { - linesPerBuf++; - length += widthBytesLine; - } + while (length & ((1L << LOG2_BYTES_PER_SCANLINE_PAD) - 1)) { + linesPerBuf++; + length += widthBytesLine; } - if (!(pBuf = calloc(1, length))) - return BadAlloc; - WriteReplyToClient(client, sizeof(xGetImageReply), &xgi); } + if (!(pBuf = calloc(1, length))) + return BadAlloc; + WriteReplyToClient(client, sizeof(xGetImageReply), &xgi); if (pDraw->type == DRAWABLE_WINDOW) { pVisibleRegion = NotClippedByChildren((WindowPtr) pDraw); @@ -2141,13 +2129,10 @@ DoGetImage(ClientPtr client, int format, Drawable drawable, /* Note that this is NOT a call to WriteSwappedDataToClient, as we do NOT byte swap */ - if (!im_return) { - ReformatImage(pBuf, (int) (nlines * widthBytesLine), - BitsPerPixel(pDraw->depth), ClientOrder(client)); + ReformatImage(pBuf, (int) (nlines * widthBytesLine), + BitsPerPixel(pDraw->depth), ClientOrder(client)); -/* Don't split me, gcc pukes when you do */ - WriteToClient(client, (int) (nlines * widthBytesLine), pBuf); - } + WriteToClient(client, (int) (nlines * widthBytesLine), pBuf); linesDone += nlines; } } @@ -2172,18 +2157,10 @@ DoGetImage(ClientPtr client, int format, Drawable drawable, /* Note: NOT a call to WriteSwappedDataToClient, as we do NOT byte swap */ - if (im_return) { - pBuf += nlines * widthBytesLine; - } - else { - ReformatImage(pBuf, - (int) (nlines * widthBytesLine), - 1, ClientOrder(client)); - -/* Don't split me, gcc pukes when you do */ - WriteToClient(client, (int) (nlines * widthBytesLine), - pBuf); - } + ReformatImage(pBuf, (int) (nlines * widthBytesLine), + 1, ClientOrder(client)); + + WriteToClient(client, (int)(nlines * widthBytesLine), pBuf); linesDone += nlines; } } @@ -2191,8 +2168,7 @@ DoGetImage(ClientPtr client, int format, Drawable drawable, } if (pVisibleRegion) RegionDestroy(pVisibleRegion); - if (!im_return) - free(pBuf); + free(pBuf); return Success; } @@ -2206,7 +2182,7 @@ ProcGetImage(ClientPtr client) return DoGetImage(client, stuff->format, stuff->drawable, stuff->x, stuff->y, (int) stuff->width, (int) stuff->height, - stuff->planeMask, (xGetImageReply **) NULL); + stuff->planeMask); } int @@ -2863,18 +2839,25 @@ ProcCreateCursor(ClientPtr client) return rc; } - rc = dixLookupResourceByType((pointer *) &msk, stuff->mask, RT_PIXMAP, - client, DixReadAccess); - if (rc != Success) { - if (stuff->mask != None) { + if (src->drawable.depth != 1) + return (BadMatch); + + /* Find and validate cursor mask pixmap, if one is provided */ + if (stuff->mask != None) { + rc = dixLookupResourceByType((pointer *) &msk, stuff->mask, RT_PIXMAP, + client, DixReadAccess); + if (rc != Success) { client->errorValue = stuff->mask; return rc; } + + if (src->drawable.width != msk->drawable.width + || src->drawable.height != msk->drawable.height + || src->drawable.depth != 1 || msk->drawable.depth != 1) + return BadMatch; } - else if (src->drawable.width != msk->drawable.width - || src->drawable.height != msk->drawable.height - || src->drawable.depth != 1 || msk->drawable.depth != 1) - return BadMatch; + else + msk = NULL; width = src->drawable.width; height = src->drawable.height; |