diff --git a/Xext/shm.c b/Xext/shm.c index 8cf59443c..34c875274 100644 --- a/Xext/shm.c +++ b/Xext/shm.c @@ -106,7 +106,6 @@ typedef struct _ShmDesc { unsigned long size; } ShmDescRec, *ShmDescPtr; -static void miShmPutImage(XSHM_PUT_IMAGE_ARGS); static PixmapPtr fbShmCreatePixmap(XSHM_CREATE_PIXMAP_ARGS); static int ShmDetachSegment( pointer /* value */, @@ -148,8 +147,8 @@ static int shmPixFormat[MAXSCREENS]; static ShmFuncsPtr shmFuncs[MAXSCREENS]; static DestroyPixmapProcPtr destroyPixmap[MAXSCREENS]; static DevPrivateKey shmPixmapPrivate = &shmPixmapPrivate; -static ShmFuncs miFuncs = {NULL, miShmPutImage}; -static ShmFuncs fbFuncs = {fbShmCreatePixmap, fbShmPutImage}; +static ShmFuncs miFuncs = {NULL, NULL}; +static ShmFuncs fbFuncs = {fbShmCreatePixmap, NULL}; #define VERIFY_SHMSEG(shmseg,shmdesc,client) \ { \ @@ -522,70 +521,28 @@ ProcShmDetach(client) return(client->noClientException); } +/* + * If the given request doesn't exactly match PutImage's constraints, + * wrap the image in a scratch pixmap header and let CopyArea sort it out. + */ static void -miShmPutImage(dst, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy, data) - DrawablePtr dst; - GCPtr pGC; - int depth, w, h, sx, sy, sw, sh, dx, dy; - unsigned int format; - char *data; +doShmPutImage(DrawablePtr dst, GCPtr pGC, + int depth, unsigned int format, + int w, int h, int sx, int sy, int sw, int sh, int dx, int dy, + char *data) { - PixmapPtr pmap; - GCPtr putGC; - - putGC = GetScratchGC(depth, dst->pScreen); - if (!putGC) + PixmapPtr pPixmap; + + pPixmap = GetScratchPixmapHeader(dst->pScreen, w, h, depth, + BitsPerPixel(depth), + PixmapBytePad(w, depth), + data); + if (!pPixmap) return; - pmap = (*dst->pScreen->CreatePixmap)(dst->pScreen, sw, sh, depth, - CREATE_PIXMAP_USAGE_SCRATCH); - if (!pmap) - { - FreeScratchGC(putGC); - return; - } - ValidateGC((DrawablePtr)pmap, putGC); - (*putGC->ops->PutImage)((DrawablePtr)pmap, putGC, depth, -sx, -sy, w, h, 0, - (format == XYPixmap) ? XYPixmap : ZPixmap, data); - FreeScratchGC(putGC); - if (format == XYBitmap) - (void)(*pGC->ops->CopyPlane)((DrawablePtr)pmap, dst, pGC, 0, 0, sw, sh, - dx, dy, 1L); - else - (void)(*pGC->ops->CopyArea)((DrawablePtr)pmap, dst, pGC, 0, 0, sw, sh, - dx, dy); - (*pmap->drawable.pScreen->DestroyPixmap)(pmap); + pGC->ops->CopyArea((DrawablePtr)pPixmap, dst, pGC, sx, sy, sw, sh, dx, dy); + FreeScratchPixmapHeader(pPixmap); } -_X_EXPORT void -fbShmPutImage(dst, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy, data) - DrawablePtr dst; - GCPtr pGC; - int depth, w, h, sx, sy, sw, sh, dx, dy; - unsigned int format; - char *data; -{ - if ((format == ZPixmap) || (depth == 1)) - { - PixmapPtr pPixmap; - - pPixmap = GetScratchPixmapHeader(dst->pScreen, w, h, depth, - BitsPerPixel(depth), PixmapBytePad(w, depth), (pointer)data); - if (!pPixmap) - return; - if (format == XYBitmap) - (void)(*pGC->ops->CopyPlane)((DrawablePtr)pPixmap, dst, pGC, - sx, sy, sw, sh, dx, dy, 1L); - else - (void)(*pGC->ops->CopyArea)((DrawablePtr)pPixmap, dst, pGC, - sx, sy, sw, sh, dx, dy); - FreeScratchPixmapHeader(pPixmap); - } - else - miShmPutImage(dst, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy, - data); -} - - #ifdef PANORAMIX static int ProcPanoramiXShmPutImage(register ClientPtr client) @@ -940,13 +897,12 @@ ProcShmPutImage(client) shmdesc->addr + stuff->offset + (stuff->srcY * length)); else - (*shmFuncs[pDraw->pScreen->myNum]->PutImage)( - pDraw, pGC, stuff->depth, stuff->format, - stuff->totalWidth, stuff->totalHeight, - stuff->srcX, stuff->srcY, - stuff->srcWidth, stuff->srcHeight, - stuff->dstX, stuff->dstY, - shmdesc->addr + stuff->offset); + doShmPutImage(pDraw, pGC, stuff->depth, stuff->format, + stuff->totalWidth, stuff->totalHeight, + stuff->srcX, stuff->srcY, + stuff->srcWidth, stuff->srcHeight, + stuff->dstX, stuff->dstY, + shmdesc->addr + stuff->offset); if (stuff->sendEvent) { diff --git a/Xext/shmint.h b/Xext/shmint.h index 33ab6a428..fc056bc72 100644 --- a/Xext/shmint.h +++ b/Xext/shmint.h @@ -36,9 +36,6 @@ ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs); void ShmSetPixmapFormat(ScreenPtr pScreen, int format); -void -fbShmPutImage(XSHM_PUT_IMAGE_ARGS); - void ShmRegisterFbFuncs(ScreenPtr pScreen); diff --git a/Xext/xselinux.c b/Xext/xselinux.c index a47df03c2..1d3449b9a 100644 --- a/Xext/xselinux.c +++ b/Xext/xselinux.c @@ -458,6 +458,7 @@ static void SELinuxLabelClient(ClientPtr client) { XtransConnInfo ci = ((OsCommPtr)client->osPrivate)->trans_conn; + int fd = _XSERVTransGetConnectionNumber(ci); SELinuxSubjectRec *subj; SELinuxObjectRec *obj; security_context_t ctx; @@ -467,19 +468,20 @@ SELinuxLabelClient(ClientPtr client) obj = dixLookupPrivate(&client->devPrivates, objectKey); sidput(obj->sid); + /* Try to get a context from the socket */ + if (fd < 0 || getpeercon(fd, &ctx) < 0) { + /* Otherwise, fall back to a default context */ + if (selabel_lookup(label_hnd, &ctx, NULL, SELABEL_X_CLIENT) < 0) + FatalError("SELinux: failed to look up remote-client context\n"); + } + + /* For local clients, try and determine the executable name */ if (_XSERVTransIsLocal(ci)) { - int fd = _XSERVTransGetConnectionNumber(ci); struct ucred creds; socklen_t len = sizeof(creds); char path[PATH_MAX + 1]; size_t bytes; - /* For local clients, can get context from the socket */ - if (getpeercon(fd, &ctx) < 0) - FatalError("SELinux: client %d: couldn't get context from socket\n", - client->index); - - /* Try and determine the client's executable name */ memset(&creds, 0, sizeof(creds)); if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &creds, &len) < 0) goto finish; @@ -500,10 +502,7 @@ SELinuxLabelClient(ClientPtr client) memcpy(subj->command, path, bytes); subj->command[bytes - 1] = 0; - } else - /* For remote clients, need to use a default context */ - if (selabel_lookup(label_hnd, &ctx, NULL, SELABEL_X_CLIENT) < 0) - FatalError("SELinux: failed to look up remote-client context\n"); + } finish: /* Get a SID from the context */ diff --git a/exa/exa.c b/exa/exa.c index 100a1ec66..ccf148a3e 100644 --- a/exa/exa.c +++ b/exa/exa.c @@ -924,13 +924,6 @@ exaDriverInit (ScreenPtr pScreen, } #endif -#ifdef MITSHM - /* Re-register with the MI funcs, which don't allow shared pixmaps. - * Shared pixmaps are almost always a performance loss for us, but this - * still allows for SHM PutImage. - */ - ShmRegisterFuncs(pScreen, &exaShmFuncs); -#endif /* * Hookup offscreen pixmaps */ diff --git a/exa/exa_accel.c b/exa/exa_accel.c index d66dd4718..3ec96253d 100644 --- a/exa/exa_accel.c +++ b/exa/exa_accel.c @@ -245,104 +245,12 @@ exaDoPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, return TRUE; } -#ifdef MITSHM - -static Bool -exaDoShmPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, - unsigned int format, int w, int h, int sx, int sy, int sw, - int sh, int dx, int dy, char *data) -{ - int src_stride = PixmapBytePad(w, depth); - - if (exaDoPutImage(pDrawable, pGC, depth, dx, dy, sw, sh, format, data + - sy * src_stride + sx * BitsPerPixel(depth) / 8, - src_stride)) - return TRUE; - - if (format == ZPixmap) - { - PixmapPtr pPixmap; - - pPixmap = GetScratchPixmapHeader(pDrawable->pScreen, w, h, depth, - BitsPerPixel(depth), PixmapBytePad(w, depth), (pointer)data); - if (!pPixmap) - return FALSE; - - if (exaGCReadsDestination(pDrawable, pGC->planemask, pGC->fillStyle, - pGC->alu)) - exaPrepareAccess (pDrawable, EXA_PREPARE_DEST); - else - ExaDoPrepareAccess (pDrawable, EXA_PREPARE_DEST); - fbCopyArea((DrawablePtr)pPixmap, pDrawable, pGC, sx, sy, sw, sh, dx, dy); - exaFinishAccess(pDrawable, EXA_PREPARE_DEST); - - FreeScratchPixmapHeader(pPixmap); - - return TRUE; - } - - return FALSE; -} - -/* The actual ShmPutImage isn't wrapped by the damage layer, so we need to - * inform any interested parties of the damage incurred to the drawable. - * - * We also need to set the pending damage to ensure correct migration in all - * cases. - */ -void -exaShmPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, unsigned int format, - int w, int h, int sx, int sy, int sw, int sh, int dx, int dy, - char *data) -{ - PixmapPtr pPixmap = exaGetDrawablePixmap(pDrawable); - ExaPixmapPriv(pPixmap); - BoxRec box = { .x1 = pDrawable->x + dx, .y1 = pDrawable->y + dy, - .x2 = pDrawable->x + dx + sw, .y2 = pDrawable->y + dy + sh }; - RegionRec region; - int xoff, yoff; - RegionPtr pending_damage = DamagePendingRegion(pExaPixmap->pDamage); - - REGION_INIT(pScreen, ®ion, &box, 1); - - exaGetDrawableDeltas(pDrawable, pPixmap, &xoff, &yoff); - - REGION_TRANSLATE(pScreen, ®ion, xoff, yoff); - REGION_UNION(pScreen, pending_damage, pending_damage, ®ion); - - if (!exaDoShmPutImage(pDrawable, pGC, depth, format, w, h, sx, sy, sw, sh, - dx, dy, data)) { - if (exaGCReadsDestination(pDrawable, pGC->planemask, pGC->fillStyle, - pGC->alu)) - exaPrepareAccess (pDrawable, EXA_PREPARE_DEST); - else - ExaDoPrepareAccess (pDrawable, EXA_PREPARE_DEST); - fbShmPutImage(pDrawable, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy, - data); - exaFinishAccess(pDrawable, EXA_PREPARE_DEST); - } - - REGION_TRANSLATE(pScreen, ®ion, -xoff, -yoff); - DamageDamageRegion(pDrawable, ®ion); - - REGION_UNINIT(pScreen, ®ion); -} - -ShmFuncs exaShmFuncs = { NULL, exaShmPutImage }; - -#endif - static void exaPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, int w, int h, int leftPad, int format, char *bits) { -#ifdef MITSHM - if (!exaDoShmPutImage(pDrawable, pGC, depth, format, w, h, 0, 0, w, h, x, y, - bits)) -#else if (!exaDoPutImage(pDrawable, pGC, depth, x, y, w, h, format, bits, PixmapBytePad(w, pDrawable->depth))) -#endif ExaCheckPutImage(pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits); } diff --git a/exa/exa_priv.h b/exa/exa_priv.h index 21e6f0b55..e4b6b54a5 100644 --- a/exa/exa_priv.h +++ b/exa/exa_priv.h @@ -319,21 +319,12 @@ Bool exaFillRegionTiled (DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile, DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu); -void -exaShmPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth, unsigned int format, - int w, int h, int sx, int sy, int sw, int sh, int dx, int dy, - char *data); - void exaGetImage (DrawablePtr pDrawable, int x, int y, int w, int h, unsigned int format, unsigned long planeMask, char *d); extern const GCOps exaOps; -#ifdef MITSHM -extern ShmFuncs exaShmFuncs; -#endif - #ifdef RENDER void ExaCheckComposite (CARD8 op, diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c index 9d987c238..f36dae739 100644 --- a/glx/glxdriswrast.c +++ b/glx/glxdriswrast.c @@ -532,7 +532,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen) xfree(screen); - FatalError("GLX: could not load software renderer\n"); + LogMessage(X_ERROR, "GLX: could not load software renderer\n"); return NULL; } diff --git a/glx/glxext.c b/glx/glxext.c index 13c65dade..6ba404fb1 100644 --- a/glx/glxext.c +++ b/glx/glxext.c @@ -279,6 +279,7 @@ void GlxExtensionInit(void) ScreenPtr pScreen; int i; __GLXprovider *p; + Bool glx_provided = False; __glXContextRes = CreateNewResourceType((DeleteType)ContextGone); __glXDrawableRes = CreateNewResourceType((DeleteType)DrawableGone); @@ -289,6 +290,29 @@ void GlxExtensionInit(void) if (!AddCallback (&ClientStateCallback, glxClientCallback, 0)) return; + for (i = 0; i < screenInfo.numScreens; i++) { + pScreen = screenInfo.screens[i]; + + for (p = __glXProviderStack; p != NULL; p = p->next) { + if (p->screenProbe(pScreen) != NULL) { + LogMessage(X_INFO, + "GLX: Initialized %s GL provider for screen %d\n", + p->name, i); + break; + } + } + + if (!p) + LogMessage(X_INFO, + "GLX: no usable GL providers found for screen %d\n", i); + else + glx_provided = True; + } + + /* don't register extension if GL is not provided on any screen */ + if (!glx_provided) + return; + /* ** Add extension to server extensions. */ @@ -306,19 +330,6 @@ void GlxExtensionInit(void) } __glXErrorBase = extEntry->errorBase; - - for (i = 0; i < screenInfo.numScreens; i++) { - pScreen = screenInfo.screens[i]; - - for (p = __glXProviderStack; p != NULL; p = p->next) { - if (p->screenProbe(pScreen) != NULL) { - LogMessage(X_INFO, - "GLX: Initialized %s GL provider for screen %d\n", - p->name, i); - break; - } - } - } } /************************************************************************/ diff --git a/hw/xfree86/ddc/print_edid.c b/hw/xfree86/ddc/print_edid.c index f5442adb7..df11bfb3d 100644 --- a/hw/xfree86/ddc/print_edid.c +++ b/hw/xfree86/ddc/print_edid.c @@ -148,7 +148,8 @@ print_dpms_features(int scrnIndex, struct disp_features *c, } } else { int enc = c->display_type; - xf86DrvMsg(scrnIndex, X_INFO, "\nSupported color encodings: " + xf86ErrorF("\n"); + xf86DrvMsg(scrnIndex, X_INFO, "Supported color encodings: " "RGB 4:4:4 %s%s\n", enc & DISP_YCRCB444 ? "YCrCb 4:4:4 " : "", enc & DISP_YCRCB422 ? "YCrCb 4:2:2" : ""); diff --git a/mi/miexpose.c b/mi/miexpose.c index 5c2bd0382..2fba6a28c 100644 --- a/mi/miexpose.c +++ b/mi/miexpose.c @@ -564,8 +564,8 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what) draw_x_off = drawable->x; draw_y_off = drawable->y; - tile_x_off = 0; - tile_y_off = 0; + tile_x_off = pWin->drawable.x - draw_x_off; + tile_y_off = pWin->drawable.y - draw_y_off; fill = pWin->background; switch (pWin->backgroundState) { case None: