mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-01-21 10:40:35 +01:00
Merge branch 'server-1.5-branch' into xorg-server-1.5-apple
This commit is contained in:
commit
c48b4ddeff
10 changed files with 64 additions and 208 deletions
94
Xext/shm.c
94
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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
37
glx/glxext.c
37
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
|
|
|
|||
|
|
@ -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" : "");
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue