diff options
Diffstat (limited to 'xc/lib/GL/dri/XF86dri.c')
-rw-r--r-- | xc/lib/GL/dri/XF86dri.c | 82 |
1 files changed, 71 insertions, 11 deletions
diff --git a/xc/lib/GL/dri/XF86dri.c b/xc/lib/GL/dri/XF86dri.c index ea3160cd5..e99320db5 100644 --- a/xc/lib/GL/dri/XF86dri.c +++ b/xc/lib/GL/dri/XF86dri.c @@ -83,17 +83,27 @@ static XEXT_GENERATE_CLOSE_DISPLAY (close_display, xf86dri_info) * * *****************************************************************************/ +#if 0 +#define TRACE(msg) printf("XF86DRI%s\n", msg); +#else +#define TRACE(msg) +#endif + + Bool XF86DRIQueryExtension (dpy, event_basep, error_basep) Display *dpy; int *event_basep, *error_basep; { XExtDisplayInfo *info = find_display (dpy); + TRACE("QueryExtension..."); if (XextHasExtension(info)) { *event_basep = info->codes->first_event; *error_basep = info->codes->first_error; + TRACE("QueryExtension... return True"); return True; } else { + TRACE("QueryExtension... return False"); return False; } } @@ -108,6 +118,7 @@ Bool XF86DRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion) xXF86DRIQueryVersionReply rep; xXF86DRIQueryVersionReq *req; + TRACE("QueryVersion..."); XF86DRICheckExtension (dpy, info, False); LockDisplay(dpy); @@ -117,6 +128,7 @@ Bool XF86DRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion) if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); + TRACE("QueryVersion... return False"); return False; } *majorVersion = rep.majorVersion; @@ -124,6 +136,7 @@ Bool XF86DRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion) *patchVersion = rep.patchVersion; UnlockDisplay(dpy); SyncHandle(); + TRACE("QueryVersion... return True"); return True; } @@ -136,6 +149,7 @@ Bool XF86DRIQueryDirectRenderingCapable(dpy, screen, isCapable) xXF86DRIQueryDirectRenderingCapableReply rep; xXF86DRIQueryDirectRenderingCapableReq *req; + TRACE("QueryDirectRenderingCapable..."); XF86DRICheckExtension (dpy, info, False); LockDisplay(dpy); @@ -146,11 +160,13 @@ Bool XF86DRIQueryDirectRenderingCapable(dpy, screen, isCapable) if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); + TRACE("QueryDirectRenderingCapable... return False"); return False; } *isCapable = rep.isCapable; UnlockDisplay(dpy); SyncHandle(); + TRACE("QueryDirectRenderingCapable... return True"); return True; } @@ -164,6 +180,7 @@ Bool XF86DRIOpenConnection(dpy, screen, hSAREA, busIdString) xXF86DRIOpenConnectionReply rep; xXF86DRIOpenConnectionReq *req; + TRACE("OpenConnection..."); XF86DRICheckExtension (dpy, info, False); LockDisplay(dpy); @@ -174,6 +191,7 @@ Bool XF86DRIOpenConnection(dpy, screen, hSAREA, busIdString) if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); + TRACE("OpenConnection... return False"); return False; } @@ -187,6 +205,7 @@ Bool XF86DRIOpenConnection(dpy, screen, hSAREA, busIdString) _XEatData(dpy, ((rep.busIdStringLength+3) & ~3)); UnlockDisplay(dpy); SyncHandle(); + TRACE("OpenConnection... return False"); return False; } _XReadPad(dpy, *busIdString, rep.busIdStringLength); @@ -195,6 +214,7 @@ Bool XF86DRIOpenConnection(dpy, screen, hSAREA, busIdString) } UnlockDisplay(dpy); SyncHandle(); + TRACE("OpenConnection... return True"); return True; } @@ -207,6 +227,7 @@ Bool XF86DRIAuthConnection(dpy, screen, magic) xXF86DRIAuthConnectionReq *req; xXF86DRIAuthConnectionReply rep; + TRACE("AuthConnection..."); XF86DRICheckExtension (dpy, info, False); LockDisplay(dpy); @@ -219,10 +240,12 @@ Bool XF86DRIAuthConnection(dpy, screen, magic) if (!_XReply(dpy, (xReply *)&rep, 0, xFalse) || !rep.authenticated) { UnlockDisplay(dpy); SyncHandle(); + TRACE("AuthConnection... return False"); return False; } UnlockDisplay(dpy); SyncHandle(); + TRACE("AuthConnection... return True"); return True; } @@ -233,6 +256,8 @@ Bool XF86DRICloseConnection(dpy, screen) XExtDisplayInfo *info = find_display (dpy); xXF86DRICloseConnectionReq *req; + TRACE("CloseConnection..."); + XF86DRICheckExtension (dpy, info, False); LockDisplay(dpy); @@ -242,6 +267,7 @@ Bool XF86DRICloseConnection(dpy, screen) req->screen = screen; UnlockDisplay(dpy); SyncHandle(); + TRACE("CloseConnection... return True"); return True; } @@ -258,6 +284,7 @@ Bool XF86DRIGetClientDriverName(dpy, screen, ddxDriverMajorVersion, xXF86DRIGetClientDriverNameReply rep; xXF86DRIGetClientDriverNameReq *req; + TRACE("GetClientDriverName..."); XF86DRICheckExtension (dpy, info, False); LockDisplay(dpy); @@ -268,6 +295,7 @@ Bool XF86DRIGetClientDriverName(dpy, screen, ddxDriverMajorVersion, if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); + TRACE("GetClientDriverName... return False"); return False; } @@ -278,6 +306,9 @@ Bool XF86DRIGetClientDriverName(dpy, screen, ddxDriverMajorVersion, if (rep.length) { if (!(*clientDriverName = (char *)Xcalloc(rep.clientDriverNameLength + 1, 1))) { _XEatData(dpy, ((rep.clientDriverNameLength+3) & ~3)); + UnlockDisplay(dpy); + SyncHandle(); + TRACE("GetClientDriverName... return False"); return False; } _XReadPad(dpy, *clientDriverName, rep.clientDriverNameLength); @@ -286,6 +317,7 @@ Bool XF86DRIGetClientDriverName(dpy, screen, ddxDriverMajorVersion, } UnlockDisplay(dpy); SyncHandle(); + TRACE("GetClientDriverName... return True"); return True; } @@ -300,6 +332,7 @@ Bool XF86DRICreateContext(dpy, screen, visual, context, hHWContext) xXF86DRICreateContextReply rep; xXF86DRICreateContextReq *req; + TRACE("CreateContext..."); XF86DRICheckExtension (dpy, info, False); LockDisplay(dpy); @@ -313,11 +346,13 @@ Bool XF86DRICreateContext(dpy, screen, visual, context, hHWContext) if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); + TRACE("CreateContext... return False"); return False; } *hHWContext = rep.hHWContext; UnlockDisplay(dpy); SyncHandle(); + TRACE("CreateContext... return True"); return True; } @@ -329,6 +364,7 @@ Bool XF86DRIDestroyContext(dpy, screen, context) XExtDisplayInfo *info = find_display (dpy); xXF86DRIDestroyContextReq *req; + TRACE("DestroyContext..."); XF86DRICheckExtension (dpy, info, False); LockDisplay(dpy); @@ -339,6 +375,7 @@ Bool XF86DRIDestroyContext(dpy, screen, context) req->context = context; UnlockDisplay(dpy); SyncHandle(); + TRACE("DestroyContext... return True"); return True; } @@ -352,6 +389,7 @@ Bool XF86DRICreateDrawable(dpy, screen, drawable, hHWDrawable) xXF86DRICreateDrawableReply rep; xXF86DRICreateDrawableReq *req; + TRACE("CreateDrawable..."); XF86DRICheckExtension (dpy, info, False); LockDisplay(dpy); @@ -363,11 +401,13 @@ Bool XF86DRICreateDrawable(dpy, screen, drawable, hHWDrawable) if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); + TRACE("CreateDrawable... return False"); return False; } *hHWDrawable = rep.hHWDrawable; UnlockDisplay(dpy); SyncHandle(); + TRACE("CreateDrawable... return True"); return True; } @@ -379,6 +419,7 @@ Bool XF86DRIDestroyDrawable(dpy, screen, drawable) XExtDisplayInfo *info = find_display (dpy); xXF86DRIDestroyDrawableReq *req; + TRACE("DestroyDrawable..."); XF86DRICheckExtension (dpy, info, False); LockDisplay(dpy); @@ -389,6 +430,7 @@ Bool XF86DRIDestroyDrawable(dpy, screen, drawable) req->drawable = drawable; UnlockDisplay(dpy); SyncHandle(); + TRACE("DestroyDrawable... return True"); return True; } @@ -419,6 +461,7 @@ Bool XF86DRIGetDrawableInfo(dpy, screen, drawable, xXF86DRIGetDrawableInfoReq *req; int total_rects; + TRACE("GetDrawableInfo..."); XF86DRICheckExtension (dpy, info, False); LockDisplay(dpy); @@ -432,6 +475,7 @@ Bool XF86DRIGetDrawableInfo(dpy, screen, drawable, { UnlockDisplay(dpy); SyncHandle(); + TRACE("GetDrawableInfo... return False"); return False; } *index = rep.drawableTableIndex; @@ -448,20 +492,28 @@ Bool XF86DRIGetDrawableInfo(dpy, screen, drawable, *numBackClipRects = rep.numBackClipRects; total_rects += *numBackClipRects; - if (rep.length != (SIZEOF(xXF86DRIGetDrawableInfoReply) - +#if 0 + /* Because of the fix in Xserver/GL/dri/xf86dri.c, this check breaks + * backwards compatibility (Because of the >> 2 shift) but the fix + * enables multi-threaded apps to work. + */ + if (rep.length != ((((SIZEOF(xXF86DRIGetDrawableInfoReply) - SIZEOF(xGenericReply) + - total_rects * sizeof(XF86DRIClipRectRec))) { - _XEatData(dpy, rep.length); - return False; + total_rects * sizeof(XF86DRIClipRectRec)) + 3) & ~3) >> 2)) { + _XEatData(dpy, rep.length); + UnlockDisplay(dpy); + SyncHandle(); + TRACE("GetDrawableInfo... return False"); + return False; } - +#endif if (*numClipRects) { int len = sizeof(XF86DRIClipRectRec) * (*numClipRects); *pClipRects = (XF86DRIClipRectPtr)Xcalloc(len, 1); if (*pClipRects) - _XRead32(dpy, *pClipRects, len); + _XRead(dpy, (char*)*pClipRects, len); } else { *pClipRects = NULL; } @@ -471,13 +523,14 @@ Bool XF86DRIGetDrawableInfo(dpy, screen, drawable, *pBackClipRects = (XF86DRIClipRectPtr)Xcalloc(len, 1); if (*pBackClipRects) - _XRead32(dpy, *pBackClipRects, len); + _XRead(dpy, (char*)*pBackClipRects, len); } else { *pBackClipRects = NULL; } UnlockDisplay(dpy); SyncHandle(); + TRACE("GetDrawableInfo... return True"); return True; } @@ -496,6 +549,7 @@ Bool XF86DRIGetDeviceInfo(dpy, screen, hFrameBuffer, xXF86DRIGetDeviceInfoReply rep; xXF86DRIGetDeviceInfoReq *req; + TRACE("GetDeviceInfo..."); XF86DRICheckExtension (dpy, info, False); LockDisplay(dpy); @@ -506,12 +560,13 @@ Bool XF86DRIGetDeviceInfo(dpy, screen, hFrameBuffer, if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); + TRACE("GetDeviceInfo... return False"); return False; } *hFrameBuffer = rep.hFrameBufferLow; #ifdef LONG64 - *hFrameBuffer = ((drmHandle)rep.hFrameBufferHigh) << 32; + *hFrameBuffer |= ((drmHandle)rep.hFrameBufferHigh) << 32; #endif *fbOrigin = rep.framebufferOrigin; @@ -520,15 +575,20 @@ Bool XF86DRIGetDeviceInfo(dpy, screen, hFrameBuffer, *devPrivateSize = rep.devPrivateSize; if (rep.length) { - if (!(*pDevPrivate = (void *)Xcalloc(rep.length, 1))) { - _XEatData(dpy, ((rep.length+3) & ~3)); + if (!(*pDevPrivate = (void *)Xcalloc(rep.devPrivateSize, 1))) { + _XEatData(dpy, ((rep.devPrivateSize+3) & ~3)); + UnlockDisplay(dpy); + SyncHandle(); + TRACE("GetDeviceInfo... return False"); return False; } - _XRead32(dpy, *pDevPrivate, rep.length); + _XRead(dpy, (char*)*pDevPrivate, rep.devPrivateSize); } else { *pDevPrivate = NULL; } + UnlockDisplay(dpy); SyncHandle(); + TRACE("GetDeviceInfo... return True"); return True; } |