Merge branch 'master' into XACE-SELINUX

Conflicts:

	include/miscstruct.h
This commit is contained in:
Eamon Walsh 2007-05-22 14:50:26 -04:00 committed by Eamon Walsh
commit 2a4aa63a23
103 changed files with 2815 additions and 7862 deletions

View File

@ -1019,6 +1019,7 @@ __glXCreateARGBConfig(__GLXscreen *screen)
VisualPtr visual; VisualPtr visual;
int i; int i;
/* search for a 32-bit visual */
visual = NULL; visual = NULL;
for (i = 0; i < screen->pScreen->numVisuals; i++) for (i = 0; i < screen->pScreen->numVisuals; i++)
if (screen->pScreen->visuals[i].nplanes == 32) { if (screen->pScreen->visuals[i].nplanes == 32) {
@ -1037,8 +1038,22 @@ __glXCreateARGBConfig(__GLXscreen *screen)
if (modes == NULL) if (modes == NULL)
return; return;
modes->next = screen->modes; /* Insert this new mode at the TAIL of the linked list.
screen->modes = modes; * Previously, the mode was incorrectly inserted at the head of the
* list, causing find_mesa_visual() to be off by one. This would
* GLX clients to blow up if they attempted to use the last mode
* in the list!
*/
{
__GLcontextModes *prev = NULL, *m;
for (m = screen->modes; m; m = m->next)
prev = m;
if (prev)
prev->next = modes;
else
screen->modes = modes;
}
screen->numUsableVisuals++; screen->numUsableVisuals++;
screen->numVisuals++; screen->numVisuals++;
@ -1104,6 +1119,9 @@ int DoGetFBConfigs(__GLXclientState *cl, unsigned screen, GLboolean do_swap)
} }
pGlxScreen = __glXActiveScreens[screen]; pGlxScreen = __glXActiveScreens[screen];
/* Create the "extra" 32bpp ARGB visual, if not already added.
* XXX This is questionable place to do so! Re-examine this someday.
*/
__glXCreateARGBConfig(pGlxScreen); __glXCreateARGBConfig(pGlxScreen);
reply.numFBConfigs = pGlxScreen->numUsableVisuals; reply.numFBConfigs = pGlxScreen->numUsableVisuals;
@ -1661,6 +1679,7 @@ DoGetDrawableAttributes(__GLXclientState *cl, XID drawId)
xGLXGetDrawableAttributesReply reply; xGLXGetDrawableAttributesReply reply;
CARD32 attributes[4]; CARD32 attributes[4];
int numAttribs; int numAttribs;
PixmapPtr pixmap;
glxPixmap = (__GLXpixmap *)LookupIDByType(drawId, __glXPixmapRes); glxPixmap = (__GLXpixmap *)LookupIDByType(drawId, __glXPixmapRes);
if (!glxPixmap) { if (!glxPixmap) {
@ -1675,10 +1694,19 @@ DoGetDrawableAttributes(__GLXclientState *cl, XID drawId)
reply.numAttribs = numAttribs; reply.numAttribs = numAttribs;
attributes[0] = GLX_TEXTURE_TARGET_EXT; attributes[0] = GLX_TEXTURE_TARGET_EXT;
attributes[1] = GLX_TEXTURE_RECTANGLE_EXT;
attributes[2] = GLX_Y_INVERTED_EXT; attributes[2] = GLX_Y_INVERTED_EXT;
attributes[3] = GL_FALSE; attributes[3] = GL_FALSE;
/* XXX this is merely less wrong, see fdo bug #8991 */
pixmap = (PixmapPtr) glxPixmap->pDraw;
if ((pixmap->drawable.width & (pixmap->drawable.width - 1)) ||
(pixmap->drawable.height & (pixmap->drawable.height - 1))
/* || strstr(CALL_GetString(GL_EXTENSIONS,
"GL_ARB_texture_non_power_of_two")) */)
attributes[1] = GLX_TEXTURE_RECTANGLE_EXT;
else
attributes[1] = GLX_TEXTURE_2D_EXT;
if (client->swapped) { if (client->swapped) {
__glXSwapGetDrawableAttributesReply(client, &reply, attributes); __glXSwapGetDrawableAttributesReply(client, &reply, attributes);
} else { } else {

View File

@ -42,6 +42,10 @@
#include <damage.h> #include <damage.h>
#ifdef XF86DRI
#include <GL/internal/dri_interface.h>
#endif
typedef struct { typedef struct {
DrawablePtr pDraw; DrawablePtr pDraw;
@ -50,7 +54,12 @@ typedef struct {
ScreenPtr pScreen; ScreenPtr pScreen;
Bool idExists; Bool idExists;
int refcnt; int refcnt;
#ifdef XF86DRI
DamagePtr pDamage; DamagePtr pDamage;
__DRIcontext *pDRICtx;
GLint texname;
unsigned long offset;
#endif
} __GLXpixmap; } __GLXpixmap;
struct __GLXdrawable { struct __GLXdrawable {

View File

@ -76,6 +76,11 @@ struct __GLXDRIscreen {
xf86EnterVTProc *enterVT; xf86EnterVTProc *enterVT;
xf86LeaveVTProc *leaveVT; xf86LeaveVTProc *leaveVT;
DRITexOffsetStartProcPtr texOffsetStart;
DRITexOffsetFinishProcPtr texOffsetFinish;
__GLXpixmap* texOffsetOverride[16];
GLuint lastTexOffsetOverride;
unsigned char glx_enable_bits[__GLX_EXT_BYTES]; unsigned char glx_enable_bits[__GLX_EXT_BYTES];
}; };
@ -125,30 +130,75 @@ struct __GLXDRIdrawable {
static const char CREATE_NEW_SCREEN_FUNC[] = static const char CREATE_NEW_SCREEN_FUNC[] =
"__driCreateNewScreen_" STRINGIFY (INTERNAL_VERSION); "__driCreateNewScreen_" STRINGIFY (INTERNAL_VERSION);
/* The DRI driver entry point version wasn't bumped when the
* copySubBuffer functionality was added to the DRI drivers, but the
* functionality is still conditional on the value of the
* internal_api_version passed to __driCreateNewScreen. However, the
* screen constructor doesn't fail for a DRI driver that's older than
* the passed in version number, so there's no way we can know for
* sure that we can actually use the copySubBuffer functionality. But
* since the earliest (and at this point only) released mesa version
* (6.5) that uses the 20050727 entry point does have copySubBuffer,
* we'll just settle for that. We still have to pass in a higher to
* the screen constructor to enable the functionality.
*/
#define COPY_SUB_BUFFER_INTERNAL_VERSION 20060314
static void static void
__glXDRIleaveServer(void) __glXDRIleaveServer(GLboolean rendering)
{ {
DRIBlockHandler(NULL, NULL, NULL); int i;
for (i = 0; rendering && i < screenInfo.numScreens; i++) {
__GLXDRIscreen * const screen =
(__GLXDRIscreen *) __glXgetActiveScreen(i);
GLuint lastOverride = screen->lastTexOffsetOverride;
if (lastOverride) {
__GLXpixmap **texOffsetOverride = screen->texOffsetOverride;
int j;
for (j = 0; j < lastOverride; j++) {
__GLXpixmap *pGlxPix = texOffsetOverride[j];
if (pGlxPix && pGlxPix->texname) {
pGlxPix->offset =
screen->texOffsetStart((PixmapPtr)pGlxPix->pDraw);
}
}
}
}
DRIBlockHandler(NULL, NULL, NULL);
for (i = 0; rendering && i < screenInfo.numScreens; i++) {
__GLXDRIscreen * const screen =
(__GLXDRIscreen *) __glXgetActiveScreen(i);
GLuint lastOverride = screen->lastTexOffsetOverride;
if (lastOverride) {
__GLXpixmap **texOffsetOverride = screen->texOffsetOverride;
int j;
for (j = 0; j < lastOverride; j++) {
__GLXpixmap *pGlxPix = texOffsetOverride[j];
if (pGlxPix && pGlxPix->texname) {
screen->driScreen.setTexOffset(pGlxPix->pDRICtx,
pGlxPix->texname,
pGlxPix->offset,
pGlxPix->pDraw->depth,
((PixmapPtr)pGlxPix->pDraw)->
devKind);
}
}
}
}
} }
static void static void
__glXDRIenterServer(void) __glXDRIenterServer(GLboolean rendering)
{ {
DRIWakeupHandler(NULL, 0, NULL); int i;
for (i = 0; rendering && i < screenInfo.numScreens; i++) {
__GLXDRIscreen * const screen =
(__GLXDRIscreen *) __glXgetActiveScreen(i);
if (screen->lastTexOffsetOverride) {
CALL_Flush(GET_DISPATCH(), ());
break;
}
}
DRIWakeupHandler(NULL, 0, NULL);
} }
/** /**
@ -289,19 +339,6 @@ __glXDRIcontextForceCurrent(__GLXcontext *baseContext)
&context->driContext); &context->driContext);
} }
static int
glxCountBits(int word)
{
int ret = 0;
while (word) {
ret += (word & 1);
word >>= 1;
}
return ret;
}
static void static void
glxFillAlphaChannel (PixmapPtr pixmap, int x, int y, int width, int height) glxFillAlphaChannel (PixmapPtr pixmap, int x, int y, int width, int height)
{ {
@ -335,19 +372,75 @@ __glXDRIbindTexImage(__GLXcontext *baseContext,
int buffer, int buffer,
__GLXpixmap *glxPixmap) __GLXpixmap *glxPixmap)
{ {
RegionPtr pRegion; RegionPtr pRegion = NULL;
PixmapPtr pixmap; PixmapPtr pixmap;
int bpp; int w, h, bpp, override = 0;
GLenum target, format, type; GLenum target, format, type;
ScreenPtr pScreen = glxPixmap->pScreen;
__GLXDRIscreen * const screen =
(__GLXDRIscreen *) __glXgetActiveScreen(pScreen->myNum);
pixmap = (PixmapPtr) glxPixmap->pDraw; pixmap = (PixmapPtr) glxPixmap->pDraw;
if (!glxPixmap->pDamage) { w = pixmap->drawable.width;
glxPixmap->pDamage = DamageCreate(NULL, NULL, DamageReportNone, h = pixmap->drawable.height;
TRUE, glxPixmap->pScreen, NULL);
if (!glxPixmap->pDamage) if (h & (h - 1) || w & (w - 1))
return BadAlloc; target = GL_TEXTURE_RECTANGLE_ARB;
else
target = GL_TEXTURE_2D;
if (screen->texOffsetStart && screen->driScreen.setTexOffset) {
__GLXpixmap **texOffsetOverride = screen->texOffsetOverride;
int i, firstEmpty = 16, texname;
for (i = 0; i < 16; i++) {
if (texOffsetOverride[i] == glxPixmap)
goto alreadyin;
if (firstEmpty == 16 && !texOffsetOverride[i])
firstEmpty = i;
}
if (firstEmpty == 16) {
ErrorF("%s: Failed to register texture offset override\n", __func__);
goto nooverride;
}
if (firstEmpty >= screen->lastTexOffsetOverride)
screen->lastTexOffsetOverride = firstEmpty + 1;
texOffsetOverride[firstEmpty] = glxPixmap;
alreadyin:
override = 1;
glxPixmap->pDRICtx = &((__GLXDRIcontext*)baseContext)->driContext;
CALL_GetIntegerv(GET_DISPATCH(), (target == GL_TEXTURE_2D ?
GL_TEXTURE_BINDING_2D :
GL_TEXTURE_BINDING_RECTANGLE_NV,
&texname));
if (texname == glxPixmap->texname)
return Success;
glxPixmap->texname = texname;
screen->driScreen.setTexOffset(glxPixmap->pDRICtx, texname, 0,
pixmap->drawable.depth, pixmap->devKind);
}
nooverride:
if (!glxPixmap->pDamage) {
if (!override) {
glxPixmap->pDamage = DamageCreate(NULL, NULL, DamageReportNone,
TRUE, pScreen, NULL);
if (!glxPixmap->pDamage)
return BadAlloc;
DamageRegister ((DrawablePtr) pixmap, glxPixmap->pDamage);
}
DamageRegister ((DrawablePtr) pixmap, glxPixmap->pDamage);
pRegion = NULL; pRegion = NULL;
} else { } else {
pRegion = DamageRegion(glxPixmap->pDamage); pRegion = DamageRegion(glxPixmap->pDamage);
@ -360,30 +453,22 @@ __glXDRIbindTexImage(__GLXcontext *baseContext,
bpp = 4; bpp = 4;
format = GL_BGRA; format = GL_BGRA;
type = type =
#if X_BYTE_ORDER == X_LITTLE_ENDIAN #if X_BYTE_ORDER == X_BIG_ENDIAN
GL_UNSIGNED_BYTE; !override ? GL_UNSIGNED_INT_8_8_8_8_REV :
#else
GL_UNSIGNED_INT_8_8_8_8_REV;
#endif #endif
GL_UNSIGNED_BYTE;
} else { } else {
bpp = 2; bpp = 2;
format = GL_RGB; format = GL_RGB;
type = GL_UNSIGNED_SHORT_5_6_5; type = GL_UNSIGNED_SHORT_5_6_5;
} }
if (!(glxCountBits(pixmap->drawable.width) == 1 &&
glxCountBits(pixmap->drawable.height) == 1)
/* || strstr(CALL_GetString(GL_EXTENSIONS,
"GL_ARB_texture_non_power_of_two")) */)
target = GL_TEXTURE_RECTANGLE_ARB;
else
target = GL_TEXTURE_2D;
CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_ROW_LENGTH, CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_ROW_LENGTH,
pixmap->devKind / bpp) ); pixmap->devKind / bpp) );
if (pRegion == NULL) if (pRegion == NULL)
{ {
if (pixmap->drawable.depth == 24) if (!override && pixmap->drawable.depth == 24)
glxFillAlphaChannel(pixmap, glxFillAlphaChannel(pixmap,
pixmap->drawable.x, pixmap->drawable.x,
pixmap->drawable.y, pixmap->drawable.y,
@ -404,8 +489,8 @@ __glXDRIbindTexImage(__GLXcontext *baseContext,
0, 0,
format, format,
type, type,
pixmap->devPrivate.ptr) ); override ? NULL : pixmap->devPrivate.ptr) );
} else { } else if (!override) {
int i, numRects; int i, numRects;
BoxPtr p; BoxPtr p;
@ -436,7 +521,8 @@ __glXDRIbindTexImage(__GLXcontext *baseContext,
} }
} }
DamageEmpty(glxPixmap->pDamage); if (!override)
DamageEmpty(glxPixmap->pDamage);
return Success; return Success;
} }
@ -446,6 +532,40 @@ __glXDRIreleaseTexImage(__GLXcontext *baseContext,
int buffer, int buffer,
__GLXpixmap *pixmap) __GLXpixmap *pixmap)
{ {
ScreenPtr pScreen = pixmap->pScreen;
__GLXDRIscreen * const screen =
(__GLXDRIscreen *) __glXgetActiveScreen(pScreen->myNum);
GLuint lastOverride = screen->lastTexOffsetOverride;
if (lastOverride) {
__GLXpixmap **texOffsetOverride = screen->texOffsetOverride;
int i;
for (i = 0; i < lastOverride; i++) {
if (texOffsetOverride[i] == pixmap) {
if (screen->texOffsetFinish)
screen->texOffsetFinish((PixmapPtr)pixmap->pDraw);
texOffsetOverride[i] = NULL;
if (i + 1 == lastOverride) {
lastOverride = 0;
while (i--) {
if (texOffsetOverride[i]) {
lastOverride = i + 1;
break;
}
}
screen->lastTexOffsetOverride = lastOverride;
break;
}
}
}
}
return Success; return Success;
} }
@ -666,9 +786,9 @@ static GLboolean createContext(__DRInativeDisplay *dpy, int screen,
fakeID = FakeClientID(0); fakeID = FakeClientID(0);
*(XID *) contextID = fakeID; *(XID *) contextID = fakeID;
__glXDRIenterServer(); __glXDRIenterServer(GL_FALSE);
retval = DRICreateContext(pScreen, visual, fakeID, hw_context); retval = DRICreateContext(pScreen, visual, fakeID, hw_context);
__glXDRIleaveServer(); __glXDRIleaveServer(GL_FALSE);
return retval; return retval;
} }
@ -677,9 +797,9 @@ static GLboolean destroyContext(__DRInativeDisplay *dpy, int screen,
{ {
GLboolean retval; GLboolean retval;
__glXDRIenterServer(); __glXDRIenterServer(GL_FALSE);
retval = DRIDestroyContext(screenInfo.screens[screen], context); retval = DRIDestroyContext(screenInfo.screens[screen], context);
__glXDRIleaveServer(); __glXDRIleaveServer(GL_FALSE);
return retval; return retval;
} }
@ -694,12 +814,12 @@ createDrawable(__DRInativeDisplay *dpy, int screen,
if (!pDrawable) if (!pDrawable)
return GL_FALSE; return GL_FALSE;
__glXDRIenterServer(); __glXDRIenterServer(GL_FALSE);
retval = DRICreateDrawable(screenInfo.screens[screen], retval = DRICreateDrawable(screenInfo.screens[screen],
drawable, drawable,
pDrawable, pDrawable,
hHWDrawable); hHWDrawable);
__glXDRIleaveServer(); __glXDRIleaveServer(GL_FALSE);
return retval; return retval;
} }
@ -713,11 +833,11 @@ destroyDrawable(__DRInativeDisplay *dpy, int screen, __DRIid drawable)
if (!pDrawable) if (!pDrawable)
return GL_FALSE; return GL_FALSE;
__glXDRIenterServer(); __glXDRIenterServer(GL_FALSE);
retval = DRIDestroyDrawable(screenInfo.screens[screen], retval = DRIDestroyDrawable(screenInfo.screens[screen],
drawable, drawable,
pDrawable); pDrawable);
__glXDRIleaveServer(); __glXDRIleaveServer(GL_FALSE);
return retval; return retval;
} }
@ -754,14 +874,14 @@ getDrawableInfo(__DRInativeDisplay *dpy, int screen,
return GL_FALSE; return GL_FALSE;
} }
__glXDRIenterServer(); __glXDRIenterServer(GL_FALSE);
retval = DRIGetDrawableInfo(screenInfo.screens[screen], retval = DRIGetDrawableInfo(screenInfo.screens[screen],
pDrawable, index, stamp, pDrawable, index, stamp,
x, y, width, height, x, y, width, height,
numClipRects, &pClipRects, numClipRects, &pClipRects,
backX, backY, backX, backY,
numBackClipRects, &pBackClipRects); numBackClipRects, &pBackClipRects);
__glXDRIleaveServer(); __glXDRIleaveServer(GL_FALSE);
if (*numClipRects > 0) { if (*numClipRects > 0) {
size = sizeof (drm_clip_rect_t) * *numClipRects; size = sizeof (drm_clip_rect_t) * *numClipRects;
@ -866,7 +986,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
__DRIframebuffer framebuffer; __DRIframebuffer framebuffer;
int fd = -1; int fd = -1;
int status; int status;
int api_ver = COPY_SUB_BUFFER_INTERNAL_VERSION; int api_ver = 20070121;
drm_magic_t magic; drm_magic_t magic;
drmVersionPtr version; drmVersionPtr version;
int newlyopened; int newlyopened;
@ -1048,6 +1168,9 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
goto handle_error; goto handle_error;
} }
DRIGetTexOffsetFuncs(pScreen, &screen->texOffsetStart,
&screen->texOffsetFinish);
__glXScreenInit(&screen->base, pScreen); __glXScreenInit(&screen->base, pScreen);
buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL); buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);

View File

@ -238,9 +238,9 @@ GLboolean __glXFreeContext(__GLXcontext *cx)
* the latter case we need to lift the DRI lock manually. */ * the latter case we need to lift the DRI lock manually. */
if (!glxBlockClients) { if (!glxBlockClients) {
__glXleaveServer(); __glXleaveServer(GL_FALSE);
cx->destroy(cx); cx->destroy(cx);
__glXenterServer(); __glXenterServer(GL_FALSE);
} else { } else {
cx->next = glxPendingDestroyContexts; cx->next = glxPendingDestroyContexts;
glxPendingDestroyContexts = cx; glxPendingDestroyContexts = cx;
@ -439,49 +439,49 @@ void glxResumeClients(void)
AttendClient(__glXClients[i]->client); AttendClient(__glXClients[i]->client);
} }
__glXleaveServer(); __glXleaveServer(GL_FALSE);
for (cx = glxPendingDestroyContexts; cx != NULL; cx = next) { for (cx = glxPendingDestroyContexts; cx != NULL; cx = next) {
next = cx->next; next = cx->next;
cx->destroy(cx); cx->destroy(cx);
} }
glxPendingDestroyContexts = NULL; glxPendingDestroyContexts = NULL;
__glXenterServer(); __glXenterServer(GL_FALSE);
} }
static void static void
__glXnopEnterServer(void) __glXnopEnterServer(GLboolean rendering)
{ {
} }
static void static void
__glXnopLeaveServer(void) __glXnopLeaveServer(GLboolean rendering)
{ {
} }
static void (*__glXenterServerFunc)(void) = __glXnopEnterServer; static void (*__glXenterServerFunc)(GLboolean) = __glXnopEnterServer;
static void (*__glXleaveServerFunc)(void) = __glXnopLeaveServer; static void (*__glXleaveServerFunc)(GLboolean) = __glXnopLeaveServer;
void __glXsetEnterLeaveServerFuncs(void (*enter)(void), void __glXsetEnterLeaveServerFuncs(void (*enter)(GLboolean),
void (*leave)(void)) void (*leave)(GLboolean))
{ {
__glXenterServerFunc = enter; __glXenterServerFunc = enter;
__glXleaveServerFunc = leave; __glXleaveServerFunc = leave;
} }
void __glXenterServer(void) void __glXenterServer(GLboolean rendering)
{ {
glxServerLeaveCount--; glxServerLeaveCount--;
if (glxServerLeaveCount == 0) if (glxServerLeaveCount == 0)
(*__glXenterServerFunc)(); (*__glXenterServerFunc)(rendering);
} }
void __glXleaveServer(void) void __glXleaveServer(GLboolean rendering)
{ {
if (glxServerLeaveCount == 0) if (glxServerLeaveCount == 0)
(*__glXleaveServerFunc)(); (*__glXleaveServerFunc)(rendering);
glxServerLeaveCount++; glxServerLeaveCount++;
} }
@ -546,11 +546,12 @@ static int __glXDispatch(ClientPtr client)
opcode, opcode,
client->swapped); client->swapped);
if (proc != NULL) { if (proc != NULL) {
__glXleaveServer(); GLboolean rendering = opcode <= X_GLXRenderLarge;
__glXleaveServer(rendering);
retval = (*proc)(cl, (GLbyte *) stuff); retval = (*proc)(cl, (GLbyte *) stuff);
__glXenterServer(); __glXenterServer(rendering);
} }
else { else {
retval = BadRequest; retval = BadRequest;

View File

@ -106,11 +106,11 @@ __glXMesaDrawableSwapBuffers(__GLXdrawable *base)
* why we need to re-take the lock and swap in the server context * why we need to re-take the lock and swap in the server context
* before calling XMesaSwapBuffers() here. /me shakes head. */ * before calling XMesaSwapBuffers() here. /me shakes head. */
__glXenterServer(); __glXenterServer(GL_FALSE);
XMesaSwapBuffers(glxPriv->xm_buf); XMesaSwapBuffers(glxPriv->xm_buf);
__glXleaveServer(); __glXleaveServer(GL_FALSE);
return GL_TRUE; return GL_TRUE;
} }
@ -258,12 +258,14 @@ __glXMesaScreenDestroy(__GLXscreen *screen)
__GLXMESAscreen *mesaScreen = (__GLXMESAscreen *) screen; __GLXMESAscreen *mesaScreen = (__GLXMESAscreen *) screen;
int i; int i;
for (i = 0; i < mesaScreen->num_vis; i++) { if (mesaScreen->xm_vis) {
if (mesaScreen->xm_vis[i]) for (i = 0; i < mesaScreen->num_vis; i++) {
XMesaDestroyVisual(mesaScreen->xm_vis[i]); if (mesaScreen->xm_vis[i])
} XMesaDestroyVisual(mesaScreen->xm_vis[i]);
}
xfree(mesaScreen->xm_vis); xfree(mesaScreen->xm_vis);
}
__glXScreenDestroy(screen); __glXScreenDestroy(screen);

View File

@ -131,10 +131,10 @@ struct __GLXprovider {
void GlxPushProvider(__GLXprovider *provider); void GlxPushProvider(__GLXprovider *provider);
void __glXsetEnterLeaveServerFuncs(void (*enter)(void), void __glXsetEnterLeaveServerFuncs(void (*enter)(GLboolean),
void (*leave)(void)); void (*leave)(GLboolean));
void __glXenterServer(void); void __glXenterServer(GLboolean rendering);
void __glXleaveServer(void); void __glXleaveServer(GLboolean rendering);
void glxSuspendClients(void); void glxSuspendClients(void);
void glxResumeClients(void); void glxResumeClients(void);

View File

@ -211,8 +211,6 @@ extern HIDDEN int __glXDisp_ReadPixels(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_ReadPixels(struct __GLXclientStateRec *, GLbyte *); extern HIDDEN int __glXDispSwap_ReadPixels(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_EdgeFlagv(GLbyte * pc); extern HIDDEN void __glXDisp_EdgeFlagv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_EdgeFlagv(GLbyte * pc); extern HIDDEN void __glXDispSwap_EdgeFlagv(GLbyte * pc);
extern HIDDEN void __glXDisp_Rotatef(GLbyte * pc);
extern HIDDEN void __glXDispSwap_Rotatef(GLbyte * pc);
extern HIDDEN void __glXDisp_TexParameterf(GLbyte * pc); extern HIDDEN void __glXDisp_TexParameterf(GLbyte * pc);
extern HIDDEN void __glXDispSwap_TexParameterf(GLbyte * pc); extern HIDDEN void __glXDispSwap_TexParameterf(GLbyte * pc);
extern HIDDEN void __glXDisp_TexParameteri(GLbyte * pc); extern HIDDEN void __glXDisp_TexParameteri(GLbyte * pc);
@ -519,6 +517,8 @@ extern HIDDEN void __glXDisp_SecondaryColor3ivEXT(GLbyte * pc);
extern HIDDEN void __glXDispSwap_SecondaryColor3ivEXT(GLbyte * pc); extern HIDDEN void __glXDispSwap_SecondaryColor3ivEXT(GLbyte * pc);
extern HIDDEN void __glXDisp_TexCoord4iv(GLbyte * pc); extern HIDDEN void __glXDisp_TexCoord4iv(GLbyte * pc);
extern HIDDEN void __glXDispSwap_TexCoord4iv(GLbyte * pc); extern HIDDEN void __glXDispSwap_TexCoord4iv(GLbyte * pc);
extern HIDDEN int __glXDisp_GetDrawableAttributesSGIX(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetDrawableAttributesSGIX(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_SampleMaskSGIS(GLbyte * pc); extern HIDDEN void __glXDisp_SampleMaskSGIS(GLbyte * pc);
extern HIDDEN void __glXDispSwap_SampleMaskSGIS(GLbyte * pc); extern HIDDEN void __glXDispSwap_SampleMaskSGIS(GLbyte * pc);
extern HIDDEN void __glXDisp_ColorTableParameteriv(GLbyte * pc); extern HIDDEN void __glXDisp_ColorTableParameteriv(GLbyte * pc);
@ -849,10 +849,8 @@ extern HIDDEN int __glXDisp_GetHistogramParameteriv(struct __GLXclientStateRec *
extern HIDDEN int __glXDispSwap_GetHistogramParameteriv(struct __GLXclientStateRec *, GLbyte *); extern HIDDEN int __glXDispSwap_GetHistogramParameteriv(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_GetHistogramParameterivEXT(struct __GLXclientStateRec *, GLbyte *); extern HIDDEN int __glXDisp_GetHistogramParameterivEXT(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetHistogramParameterivEXT(struct __GLXclientStateRec *, GLbyte *); extern HIDDEN int __glXDispSwap_GetHistogramParameterivEXT(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_GetConvolutionFilter(struct __GLXclientStateRec *, GLbyte *); extern HIDDEN void __glXDisp_Rotatef(GLbyte * pc);
extern HIDDEN int __glXDispSwap_GetConvolutionFilter(struct __GLXclientStateRec *, GLbyte *); extern HIDDEN void __glXDispSwap_Rotatef(GLbyte * pc);
extern HIDDEN int __glXDisp_GetConvolutionFilterEXT(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetConvolutionFilterEXT(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_GetProgramivARB(struct __GLXclientStateRec *, GLbyte *); extern HIDDEN int __glXDisp_GetProgramivARB(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetProgramivARB(struct __GLXclientStateRec *, GLbyte *); extern HIDDEN int __glXDispSwap_GetProgramivARB(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN void __glXDisp_BlendFuncSeparateEXT(GLbyte * pc); extern HIDDEN void __glXDisp_BlendFuncSeparateEXT(GLbyte * pc);
@ -877,6 +875,10 @@ extern HIDDEN void __glXDisp_Map2f(GLbyte * pc);
extern HIDDEN void __glXDispSwap_Map2f(GLbyte * pc); extern HIDDEN void __glXDispSwap_Map2f(GLbyte * pc);
extern HIDDEN void __glXDisp_ProgramStringARB(GLbyte * pc); extern HIDDEN void __glXDisp_ProgramStringARB(GLbyte * pc);
extern HIDDEN void __glXDispSwap_ProgramStringARB(GLbyte * pc); extern HIDDEN void __glXDispSwap_ProgramStringARB(GLbyte * pc);
extern HIDDEN int __glXDisp_GetConvolutionFilter(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetConvolutionFilter(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_GetConvolutionFilterEXT(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetConvolutionFilterEXT(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_GetCompressedTexImageARB(struct __GLXclientStateRec *, GLbyte *); extern HIDDEN int __glXDisp_GetCompressedTexImageARB(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDispSwap_GetCompressedTexImageARB(struct __GLXclientStateRec *, GLbyte *); extern HIDDEN int __glXDispSwap_GetCompressedTexImageARB(struct __GLXclientStateRec *, GLbyte *);
extern HIDDEN int __glXDisp_GetTexGenfv(struct __GLXclientStateRec *, GLbyte *); extern HIDDEN int __glXDisp_GetTexGenfv(struct __GLXclientStateRec *, GLbyte *);

View File

@ -370,6 +370,7 @@ __glGetBooleanv_size(GLenum e)
case GL_PROJECTION_STACK_DEPTH: case GL_PROJECTION_STACK_DEPTH:
case GL_TEXTURE_STACK_DEPTH: case GL_TEXTURE_STACK_DEPTH:
case GL_ATTRIB_STACK_DEPTH: case GL_ATTRIB_STACK_DEPTH:
case GL_CLIENT_ATTRIB_STACK_DEPTH:
case GL_ALPHA_TEST: case GL_ALPHA_TEST:
case GL_ALPHA_TEST_FUNC: case GL_ALPHA_TEST_FUNC:
case GL_ALPHA_TEST_REF: case GL_ALPHA_TEST_REF:
@ -448,6 +449,7 @@ __glGetBooleanv_size(GLenum e)
case GL_MAX_NAME_STACK_DEPTH: case GL_MAX_NAME_STACK_DEPTH:
case GL_MAX_PROJECTION_STACK_DEPTH: case GL_MAX_PROJECTION_STACK_DEPTH:
case GL_MAX_TEXTURE_STACK_DEPTH: case GL_MAX_TEXTURE_STACK_DEPTH:
case GL_MAX_CLIENT_ATTRIB_STACK_DEPTH:
case GL_SUBPIXEL_BITS: case GL_SUBPIXEL_BITS:
case GL_INDEX_BITS: case GL_INDEX_BITS:
case GL_RED_BITS: case GL_RED_BITS:

View File

@ -1231,8 +1231,8 @@ const struct __glXDispatchInfo Render_dispatch_info = {
}; };
/*****************************************************************/ /*****************************************************************/
/* tree depth = 13 */ /* tree depth = 12 */
static const int_fast16_t VendorPriv_dispatch_tree[155] = { static const int_fast16_t VendorPriv_dispatch_tree[152] = {
/* [0] -> opcode range [0, 131072], node depth 1 */ /* [0] -> opcode range [0, 131072], node depth 1 */
2, 2,
5, 5,
@ -1474,17 +1474,12 @@ static const int_fast16_t VendorPriv_dispatch_tree[155] = {
/* [149] -> opcode range [65536, 65568], node depth 12 */ /* [149] -> opcode range [65536, 65568], node depth 12 */
1, 1,
152,
EMPTY_LEAF,
/* [152] -> opcode range [65536, 65552], node depth 13 */
1,
LEAF(88), LEAF(88),
EMPTY_LEAF, EMPTY_LEAF,
}; };
static const void *VendorPriv_function_table[96][2] = { static const void *VendorPriv_function_table[104][2] = {
/* [ 0] = 0 */ {NULL, NULL}, /* [ 0] = 0 */ {NULL, NULL},
/* [ 1] = 1 */ {__glXDisp_GetConvolutionFilterEXT, __glXDispSwap_GetConvolutionFilterEXT}, /* [ 1] = 1 */ {__glXDisp_GetConvolutionFilterEXT, __glXDispSwap_GetConvolutionFilterEXT},
/* [ 2] = 2 */ {__glXDisp_GetConvolutionParameterfvEXT, __glXDispSwap_GetConvolutionParameterfvEXT}, /* [ 2] = 2 */ {__glXDisp_GetConvolutionParameterfvEXT, __glXDispSwap_GetConvolutionParameterfvEXT},
@ -1581,6 +1576,14 @@ static const void *VendorPriv_function_table[96][2] = {
/* [ 93] = 65541 */ {__glXDisp_CreateContextWithConfigSGIX, __glXDispSwap_CreateContextWithConfigSGIX}, /* [ 93] = 65541 */ {__glXDisp_CreateContextWithConfigSGIX, __glXDispSwap_CreateContextWithConfigSGIX},
/* [ 94] = 65542 */ {__glXDisp_CreateGLXPixmapWithConfigSGIX, __glXDispSwap_CreateGLXPixmapWithConfigSGIX}, /* [ 94] = 65542 */ {__glXDisp_CreateGLXPixmapWithConfigSGIX, __glXDispSwap_CreateGLXPixmapWithConfigSGIX},
/* [ 95] = 65543 */ {NULL, NULL}, /* [ 95] = 65543 */ {NULL, NULL},
/* [ 96] = 65544 */ {NULL, NULL},
/* [ 97] = 65545 */ {NULL, NULL},
/* [ 98] = 65546 */ {__glXDisp_GetDrawableAttributesSGIX, __glXDispSwap_GetDrawableAttributesSGIX},
/* [ 99] = 65547 */ {NULL, NULL},
/* [ 100] = 65548 */ {NULL, NULL},
/* [ 101] = 65549 */ {NULL, NULL},
/* [ 102] = 65550 */ {NULL, NULL},
/* [ 103] = 65551 */ {NULL, NULL},
}; };
const struct __glXDispatchInfo VendorPriv_dispatch_info = { const struct __glXDispatchInfo VendorPriv_dispatch_info = {

View File

@ -61,10 +61,10 @@ nodist_libmain_la_SOURCES = accum.c \
matrix.c \ matrix.c \
mipmap.c \ mipmap.c \
mm.c \ mm.c \
occlude.c \
pixel.c \ pixel.c \
points.c \ points.c \
polygon.c \ polygon.c \
queryobj.c \
rastpos.c \ rastpos.c \
rbadaptors.c \ rbadaptors.c \
renderbuffer.c \ renderbuffer.c \

View File

@ -31,6 +31,7 @@ nodist_libslang_la_SOURCES = slang_builtin.c \
slang_library_noise.c \ slang_library_noise.c \
slang_link.c \ slang_link.c \
slang_log.c \ slang_log.c \
slang_mem.c \
slang_preprocess.c \ slang_preprocess.c \
slang_print.c \ slang_print.c \
slang_simplify.c \ slang_simplify.c \

View File

@ -243,6 +243,11 @@ SyncInitServerTime(
void void
); );
static void
SyncInitIdleTime(
void
);
static void static void
SyncResetProc( SyncResetProc(
ExtensionEntry * /* extEntry */ ExtensionEntry * /* extEntry */
@ -2400,6 +2405,7 @@ SyncExtensionInit(INITARGS)
* because there is always a servertime counter. * because there is always a servertime counter.
*/ */
SyncInitServerTime(); SyncInitServerTime();
SyncInitIdleTime();
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "Sync Extension %d.%d\n", fprintf(stderr, "Sync Extension %d.%d\n",
@ -2520,3 +2526,116 @@ SyncInitServerTime(void)
ServertimeQueryValue, ServertimeBracketValues); ServertimeQueryValue, ServertimeBracketValues);
pnext_time = NULL; pnext_time = NULL;
} }
/*
* IDLETIME implementation
*/
static pointer IdleTimeCounter;
static XSyncValue *pIdleTimeValueLess;
static XSyncValue *pIdleTimeValueGreater;
static void
IdleTimeQueryValue (pointer pCounter, CARD64 *pValue_return)
{
CARD32 idle = GetTimeInMillis() - lastDeviceEventTime.milliseconds;
XSyncIntsToValue (pValue_return, idle, 0);
}
static void
IdleTimeBlockHandler (pointer env,
struct timeval **wt,
pointer LastSelectMask)
{
XSyncValue idle;
if (!pIdleTimeValueLess && !pIdleTimeValueGreater)
return;
IdleTimeQueryValue (NULL, &idle);
if (pIdleTimeValueLess &&
XSyncValueLessOrEqual (idle, *pIdleTimeValueLess))
{
AdjustWaitForDelay (wt, 0);
}
else if (pIdleTimeValueGreater)
{
unsigned long timeout = 0;
if (XSyncValueLessThan (idle, *pIdleTimeValueGreater))
{
XSyncValue value;
Bool overflow;
XSyncValueSubtract (&value, *pIdleTimeValueGreater,
idle, &overflow);
timeout = XSyncValueLow32 (value);
}
AdjustWaitForDelay (wt, timeout);
}
}
static void
IdleTimeWakeupHandler (pointer env,
int rc,
pointer LastSelectMask)
{
XSyncValue idle;
if (!pIdleTimeValueLess && !pIdleTimeValueGreater)
return;
IdleTimeQueryValue (NULL, &idle);
if ((pIdleTimeValueGreater &&
XSyncValueGreaterThan (idle, *pIdleTimeValueGreater)) ||
(pIdleTimeValueLess && XSyncValueLessThan (idle, *pIdleTimeValueLess)))
{
SyncChangeCounter (IdleTimeCounter, idle);
}
}
static void
IdleTimeBracketValues (pointer pCounter,
CARD64 *pbracket_less,
CARD64 *pbracket_greater)
{
Bool registered = (pIdleTimeValueLess || pIdleTimeValueGreater);
if (registered && !pbracket_less && !pbracket_greater)
{
RemoveBlockAndWakeupHandlers(IdleTimeBlockHandler,
IdleTimeWakeupHandler,
NULL);
}
else if (!registered && (pbracket_less || pbracket_greater))
{
RegisterBlockAndWakeupHandlers(IdleTimeBlockHandler,
IdleTimeWakeupHandler,
NULL);
}
pIdleTimeValueGreater = pbracket_greater;
pIdleTimeValueLess = pbracket_less;
}
static void
SyncInitIdleTime (void)
{
CARD64 resolution;
XSyncValue idle;
IdleTimeQueryValue (NULL, &idle);
XSyncIntToValue (&resolution, 4);
IdleTimeCounter = SyncCreateSystemCounter ("IDLETIME", idle, resolution,
XSyncCounterUnrestricted,
IdleTimeQueryValue,
IdleTimeBracketValues);
pIdleTimeValueLess = pIdleTimeValueGreater = NULL;
}

View File

@ -280,11 +280,6 @@ configMessage(DBusConnection *connection, DBusMessage *message, void *closure)
if (strcmp(dbus_message_get_interface(message), if (strcmp(dbus_message_get_interface(message),
"org.x.config.input") == 0) { "org.x.config.input") == 0) {
if (!dbus_message_iter_init(message, &iter)) {
ErrorF("[config] failed to init iterator\n");
dbus_error_free(&error);
return DBUS_HANDLER_RESULT_NEED_MEMORY; /* ?? */
}
if (!(reply = dbus_message_new_method_return(message))) { if (!(reply = dbus_message_new_method_return(message))) {
ErrorF("[config] failed to create the reply message\n"); ErrorF("[config] failed to create the reply message\n");
@ -293,20 +288,35 @@ configMessage(DBusConnection *connection, DBusMessage *message, void *closure)
} }
dbus_message_iter_init_append(reply, &r_iter); dbus_message_iter_init_append(reply, &r_iter);
if (strcmp(dbus_message_get_member(message), "add") == 0) /* listDevices doesn't take any arguments */
ret = configAddDevice(message, &iter, reply, &r_iter, &error); if (strcmp(dbus_message_get_member(message), "listDevices") == 0)
else if (strcmp(dbus_message_get_member(message), "remove") == 0) ret = configListDevices(message, NULL, reply, &r_iter, &error);
ret = configRemoveDevice(message, &iter, &error); else
else if (strcmp(dbus_message_get_member(message), "listDevices") == 0) {
ret = configListDevices(message, &iter, reply, &r_iter, &error); if (!dbus_message_iter_init(message, &iter)) {
if (ret != BadDrawable && ret != BadAlloc) { ErrorF("[config] failed to init iterator\n");
dbus_message_unref(reply);
dbus_error_free(&error);
return DBUS_HANDLER_RESULT_NEED_MEMORY; /* ?? */
}
if (strcmp(dbus_message_get_member(message), "add") == 0)
ret = configAddDevice(message, &iter, reply, &r_iter, &error);
else if (strcmp(dbus_message_get_member(message), "remove") == 0)
ret = configRemoveDevice(message, &iter, &error);
}
if (ret != BadDrawable && ret != BadAlloc) {
if (!strlen(dbus_message_get_signature(reply))) if (!strlen(dbus_message_get_signature(reply)))
{
ret = -ret; /* return errors as negative numbers */
if (!dbus_message_iter_append_basic(&r_iter, DBUS_TYPE_INT32, &ret)) { if (!dbus_message_iter_append_basic(&r_iter, DBUS_TYPE_INT32, &ret)) {
ErrorF("[config] couldn't append to iterator\n"); ErrorF("[config] couldn't append to iterator\n");
dbus_message_unref(reply);
dbus_error_free(&error); dbus_error_free(&error);
return DBUS_HANDLER_RESULT_HANDLED; return DBUS_HANDLER_RESULT_HANDLED;
} }
}
if (!dbus_connection_send(bus, reply, NULL)) if (!dbus_connection_send(bus, reply, NULL))
ErrorF("[config] failed to send reply\n"); ErrorF("[config] failed to send reply\n");

View File

@ -15,21 +15,23 @@ org.x.config.input:
Option names beginning with _ are not allowed; they are reserved Option names beginning with _ are not allowed; they are reserved
for internal use. for internal use.
Returns one int32, which is an X Status, as defined in X.h. If Returns one signed int32, which is the device id of the new device.
everything is successful, Success will be returned. BadMatch will If the return value is a negative number, it represents the X
be returned if the options given do not match any device. BadValue Status, as defined in X.h. BadMatch will be returned if the options
is returned for a malformed message. given do not match any device. BadValue is returned for a malformed
message. (Example: 8 is new device id 8. -8 is BadMatch.)
Notably, BadAlloc is never returned: the server internally signals Notably, BadAlloc is never returned: the server internally signals
to D-BUS that the attempt failed for lack of memory. to D-BUS that the attempt failed for lack of memory.
The return does not notify the client of which devices were created
or modified as a result of this request: clients are encouraged to
listen for the XInput DevicePresenceNotify event to monitor changes
in the device list.
org.x.config.input.remove: org.x.config.input.remove:
Takes one int32 argument, which is the device ID to remove, i.e.: Takes one int32 argument, which is the device ID to remove, i.e.:
i i
is the signature. is the signature.
Same return values as org.x.config.input.add.
Returns one signed int32 which represents an X status as defined in
X.h. See org.x.config.input.add. Error codes are negative numbers.
org.x.config.input.listDevices:
Lists the currently active devices. No argument.
Return value is sequence of <id> <name> <id> <name> ...

View File

@ -182,6 +182,7 @@ AC_CHECK_FUNC([mmap], AC_DEFINE(HAS_MMAP, 1, [Have the `mmap' function.]))
dnl Find the math libary dnl Find the math libary
AC_CHECK_LIB(m, sqrt) AC_CHECK_LIB(m, sqrt)
AC_CHECK_LIB(m, cbrt, AC_DEFINE(HAVE_CBRT, 1, [Have the 'cbrt' function]))
AC_CHECK_HEADERS([ndbm.h dbm.h rpcsvc/dbm.h]) AC_CHECK_HEADERS([ndbm.h dbm.h rpcsvc/dbm.h])
@ -374,17 +375,12 @@ fi
AC_MSG_RESULT([$mmx_capable]) AC_MSG_RESULT([$mmx_capable])
AM_CONDITIONAL(MMX_CAPABLE, [test "x$mmx_capable" = xyes]) AM_CONDITIONAL(MMX_CAPABLE, [test "x$mmx_capable" = xyes])
OSNAME=`uname -srm`
AC_DEFINE_UNQUOTED(OSNAME, "$OSNAME",
[Define to OS Name string to display for build OS in Xorg log])
DEFAULT_VENDOR_NAME="The X.Org Foundation" DEFAULT_VENDOR_NAME="The X.Org Foundation"
DEFAULT_VENDOR_NAME_SHORT="X.Org" DEFAULT_VENDOR_NAME_SHORT="X.Org"
DEFAULT_VERSION_MAJOR=7 DEFAULT_VERSION_MAJOR=7
DEFAULT_VERSION_MINOR=1 DEFAULT_VERSION_MINOR=2
DEFAULT_VERSION_PATCH=99 DEFAULT_VERSION_PATCH=0
DEFAULT_VERSION_SNAP=2 DEFAULT_VERSION_SNAP=0
DEFAULT_RELEASE_DATE="21 December 2005" DEFAULT_RELEASE_DATE="21 December 2005"
DEFAULT_VENDOR_WEB="http://wiki.x.org" DEFAULT_VENDOR_WEB="http://wiki.x.org"
@ -444,9 +440,9 @@ AC_ARG_WITH(builder-addr, AS_HELP_STRING([--with-builder-addr=ADDRESS],
[Builder address (default: xorg@lists.freedesktop.org)]), [Builder address (default: xorg@lists.freedesktop.org)]),
[ BUILDERADDR="$withval" ], [ BUILDERADDR="$withval" ],
[ BUILDERADDR="xorg@lists.freedesktop.org" ]) [ BUILDERADDR="xorg@lists.freedesktop.org" ])
AC_ARG_WITH(os-name, AS_HELP_STRING([--with-os-name=OSNAME], [Name of OS (default: UNKNOWN)]), AC_ARG_WITH(os-name, AS_HELP_STRING([--with-os-name=OSNAME], [Name of OS (default: output of "uname -srm")]),
[ OSNAME="$withval" ], [ OSNAME="$withval" ],
[ OSNAME="UNKNOWN" ]) [ OSNAME=`uname -srm` ])
AC_ARG_WITH(os-vendor, AS_HELP_STRING([--with-os-vendor=OSVENDOR], [Name of OS vendor]), AC_ARG_WITH(os-vendor, AS_HELP_STRING([--with-os-vendor=OSVENDOR], [Name of OS vendor]),
[ OSVENDOR="$withval" ], [ OSVENDOR="$withval" ],
[ OSVENDOR="" ]) [ OSVENDOR="" ])
@ -628,9 +624,11 @@ XEXT_INC='-I$(top_srcdir)/Xext'
XEXT_LIB='$(top_builddir)/Xext/libXext.la' XEXT_LIB='$(top_builddir)/Xext/libXext.la'
XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la' XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
PIXMAN="[pixman >= 0.9.0]"
dnl Core modules for most extensions, et al. dnl Core modules for most extensions, et al.
REQUIRED_MODULES="[randrproto >= 1.2] renderproto [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto xextproto xproto xtrans [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto [inputproto >= 1.4] [kbproto >= 1.0.3]" REQUIRED_MODULES="[randrproto >= 1.2] renderproto [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto xextproto xproto xtrans [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto [inputproto >= 1.4.2] [kbproto >= 1.0.3]"
REQUIRED_LIBS="xfont xau fontenc" REQUIRED_LIBS="xfont xau fontenc $PIXMAN"
if test "x$DBUS" = xauto; then if test "x$DBUS" = xauto; then
PKG_CHECK_MODULES(DBUS, dbus-1, [DBUS=yes], [DBUS=no]) PKG_CHECK_MODULES(DBUS, dbus-1, [DBUS=yes], [DBUS=no])
@ -962,6 +960,11 @@ AC_DEFINE_UNQUOTED(XORG_RELEASE, ["$VENDOR_RELEASE_STRING"], [Vendor release])
AC_DEFINE_UNQUOTED(XORG_DATE, ["$RELEASE_DATE"], [Vendor release]) AC_DEFINE_UNQUOTED(XORG_DATE, ["$RELEASE_DATE"], [Vendor release])
AC_DEFINE_UNQUOTED(XORG_MAN_VERSION, ["$VENDOR_MAN_VERSION"], [Vendor man version]) AC_DEFINE_UNQUOTED(XORG_MAN_VERSION, ["$VENDOR_MAN_VERSION"], [Vendor man version])
AC_DEFINE_UNQUOTED(BUILDERADDR, ["$BUILDERADDR"], [Builder address]) AC_DEFINE_UNQUOTED(BUILDERADDR, ["$BUILDERADDR"], [Builder address])
if test -z "$OSNAME"; then
OSNAME="UNKNOWN"
fi
AC_DEFINE_UNQUOTED(OSNAME, ["$OSNAME"], [Operating System Name]) AC_DEFINE_UNQUOTED(OSNAME, ["$OSNAME"], [Operating System Name])
AC_DEFINE_UNQUOTED(OSVENDOR, ["$OSVENDOR"], [Operating System Vendor]) AC_DEFINE_UNQUOTED(OSVENDOR, ["$OSVENDOR"], [Operating System Vendor])
AC_DEFINE_UNQUOTED(BUILDERSTRING, ["$BUILDERSTRING"], [Builder string]) AC_DEFINE_UNQUOTED(BUILDERSTRING, ["$BUILDERSTRING"], [Builder string])
@ -1000,7 +1003,6 @@ else
fi fi
CWRAP_LIB='$(top_builddir)/os/libcwrapper.la' CWRAP_LIB='$(top_builddir)/os/libcwrapper.la'
MI_LIB='$(top_builddir)/mi/libmi.la' MI_LIB='$(top_builddir)/mi/libmi.la'
MINIMI_LIB='$(top_builddir)/mi/libminimi.la'
MI_EXT_LIB='$(top_builddir)/mi/libmiext.la' MI_EXT_LIB='$(top_builddir)/mi/libmiext.la'
MI_INC='-I$(top_srcdir)/mi' MI_INC='-I$(top_srcdir)/mi'
FB_LIB='$(top_builddir)/fb/libfb.la' FB_LIB='$(top_builddir)/fb/libfb.la'
@ -1117,7 +1119,7 @@ dnl ---------------------------------------------------------------------------
dnl DMX DDX dnl DMX DDX
AC_MSG_CHECKING([whether to build Xdmx DDX]) AC_MSG_CHECKING([whether to build Xdmx DDX])
PKG_CHECK_MODULES([DMXMODULES], [xmuu xext x11 xrender xfixes xfont xi dmxproto xau $XDMCP_MODULES], [have_dmx=yes], [have_dmx=no]) PKG_CHECK_MODULES([DMXMODULES], [xmuu xext x11 xrender xfixes xfont xi dmxproto xau $XDMCP_MODULES $PIXMAN], [have_dmx=yes], [have_dmx=no])
if test "x$DMX" = xauto; then if test "x$DMX" = xauto; then
DMX="$have_dmx" DMX="$have_dmx"
fi fi

View File

@ -76,6 +76,7 @@ SOFTWARE.
#include "swaprep.h" #include "swaprep.h"
#include "dixevents.h" #include "dixevents.h"
#include <X11/extensions/XI.h>
#include <X11/extensions/XIproto.h> #include <X11/extensions/XIproto.h>
#include "exglobals.h" #include "exglobals.h"
#include "exevents.h" #include "exevents.h"
@ -164,6 +165,8 @@ EnableDevice(DeviceIntPtr dev)
{ {
DeviceIntPtr *prev; DeviceIntPtr *prev;
int ret; int ret;
DeviceIntRec dummyDev;
devicePresenceNotify ev;
for (prev = &inputInfo.off_devices; for (prev = &inputInfo.off_devices;
*prev && (*prev != dev); *prev && (*prev != dev);
@ -182,6 +185,14 @@ EnableDevice(DeviceIntPtr dev)
*prev = dev; *prev = dev;
dev->next = NULL; dev->next = NULL;
ev.type = DevicePresenceNotify;
ev.time = currentTime.milliseconds;
ev.devchange = DeviceEnabled;
ev.deviceid = dev->id;
dummyDev.id = 0;
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
(xEvent *) &ev, 1);
return TRUE; return TRUE;
} }
@ -189,6 +200,8 @@ Bool
DisableDevice(DeviceIntPtr dev) DisableDevice(DeviceIntPtr dev)
{ {
DeviceIntPtr *prev; DeviceIntPtr *prev;
DeviceIntRec dummyDev;
devicePresenceNotify ev;
for (prev = &inputInfo.devices; for (prev = &inputInfo.devices;
*prev && (*prev != dev); *prev && (*prev != dev);
@ -201,6 +214,15 @@ DisableDevice(DeviceIntPtr dev)
*prev = dev->next; *prev = dev->next;
dev->next = inputInfo.off_devices; dev->next = inputInfo.off_devices;
inputInfo.off_devices = dev; inputInfo.off_devices = dev;
ev.type = DevicePresenceNotify;
ev.time = currentTime.milliseconds;
ev.devchange = DeviceDisabled;
ev.deviceid = dev->id;
dummyDev.id = 0;
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
(xEvent *) &ev, 1);
return TRUE; return TRUE;
} }
@ -219,8 +241,8 @@ ActivateDevice(DeviceIntPtr dev)
ev.type = DevicePresenceNotify; ev.type = DevicePresenceNotify;
ev.time = currentTime.milliseconds; ev.time = currentTime.milliseconds;
ev.devchange = 0; ev.devchange = DeviceAdded;
ev.deviceid = 0; ev.deviceid = dev->id;
dummyDev.id = 0; dummyDev.id = 0;
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask, SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
(xEvent *) &ev, 1); (xEvent *) &ev, 1);
@ -555,12 +577,16 @@ RemoveDevice(DeviceIntPtr dev)
int ret = BadMatch; int ret = BadMatch;
devicePresenceNotify ev; devicePresenceNotify ev;
DeviceIntRec dummyDev; DeviceIntRec dummyDev;
int deviceid;
DebugF("(dix) removing device %d\n", dev->id); DebugF("(dix) removing device %d\n", dev->id);
if (!dev || dev == inputInfo.keyboard || dev == inputInfo.pointer) if (!dev || dev == inputInfo.keyboard || dev == inputInfo.pointer)
return BadImplementation; return BadImplementation;
deviceid = dev->id;
DisableDevice(dev);
prev = NULL; prev = NULL;
for (tmp = inputInfo.devices; tmp; (prev = tmp), (tmp = next)) { for (tmp = inputInfo.devices; tmp; (prev = tmp), (tmp = next)) {
next = tmp->next; next = tmp->next;
@ -595,8 +621,8 @@ RemoveDevice(DeviceIntPtr dev)
inputInfo.numDevices--; inputInfo.numDevices--;
ev.type = DevicePresenceNotify; ev.type = DevicePresenceNotify;
ev.time = currentTime.milliseconds; ev.time = currentTime.milliseconds;
ev.devchange = 0; ev.devchange = DeviceRemoved;
ev.deviceid = 0; ev.deviceid = deviceid;
dummyDev.id = 0; dummyDev.id = 0;
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask, SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
(xEvent *) &ev, 1); (xEvent *) &ev, 1);
@ -1249,6 +1275,7 @@ DoSetModifierMapping(ClientPtr client, KeyCode *inputMap,
} }
else { else {
pDev->key->modifierKeyMap = NULL; pDev->key->modifierKeyMap = NULL;
pDev->key->maxKeysPerModifier = 0;
} }
} }
} }

View File

@ -255,6 +255,7 @@ main(int argc, char *argv[], char *envp[])
display = "0"; display = "0";
InitGlobals(); InitGlobals();
InitRegions();
#ifdef XPRINT #ifdef XPRINT
PrinterInitGlobals(); PrinterInitGlobals();
#endif #endif

View File

@ -126,7 +126,7 @@ exaGetDrawablePixmap(DrawablePtr pDrawable)
* the backing drawable. These coordinates are nonzero only for redirected * the backing drawable. These coordinates are nonzero only for redirected
* windows. * windows.
*/ */
static void void
exaGetDrawableDeltas (DrawablePtr pDrawable, PixmapPtr pPixmap, exaGetDrawableDeltas (DrawablePtr pDrawable, PixmapPtr pPixmap,
int *xp, int *yp) int *xp, int *yp)
{ {
@ -172,29 +172,6 @@ exaPixmapDirty (PixmapPtr pPix, int x1, int y1, int x2, int y2)
REGION_UNINIT(pScreen, &region); REGION_UNINIT(pScreen, &region);
} }
/**
* exaDrawableDirty() marks a pixmap backing a drawable as dirty, allowing for
* optimizations in pixmap migration when no changes have occurred.
*/
void
exaDrawableDirty (DrawablePtr pDrawable, int x1, int y1, int x2, int y2)
{
PixmapPtr pPix = exaGetDrawablePixmap(pDrawable);
int xoff, yoff;
x1 = max(x1, pDrawable->x);
y1 = max(y1, pDrawable->y);
x2 = min(x2, pDrawable->x + pDrawable->width);
y2 = min(y2, pDrawable->y + pDrawable->height);
if (x1 >= x2 || y1 >= y2)
return;
exaGetDrawableDeltas(pDrawable, pPix, &xoff, &yoff);
exaPixmapDirty(pPix, x1 + xoff, y1 + yoff, x2 + xoff, y2 + yoff);
}
static Bool static Bool
exaDestroyPixmap (PixmapPtr pPixmap) exaDestroyPixmap (PixmapPtr pPixmap)
{ {

View File

@ -229,7 +229,7 @@ typedef struct _ExaDriver {
* @{ * @{
*/ */
/** /**
* PrepareCopy() sets up the driver for doing a copy within offscreen * PrepareCopy() sets up the driver for doing a copy within video
* memory. * memory.
* *
* @param pSrcPixmap source pixmap * @param pSrcPixmap source pixmap
@ -721,6 +721,9 @@ exaOffscreenAlloc(ScreenPtr pScreen, int size, int align,
ExaOffscreenArea * ExaOffscreenArea *
exaOffscreenFree(ScreenPtr pScreen, ExaOffscreenArea *area); exaOffscreenFree(ScreenPtr pScreen, ExaOffscreenArea *area);
void
ExaOffscreenMarkUsed (PixmapPtr pPixmap);
unsigned long unsigned long
exaGetPixmapOffset(PixmapPtr pPix); exaGetPixmapOffset(PixmapPtr pPix);

View File

@ -74,6 +74,7 @@ exaFillSpans(DrawablePtr pDrawable, GCPtr pGC, int n,
pGC->planemask, pGC->planemask,
pGC->fgPixel)) pGC->fgPixel))
{ {
exaDoMigration (pixmaps, 1, FALSE);
ExaCheckFillSpans (pDrawable, pGC, n, ppt, pwidth, fSorted); ExaCheckFillSpans (pDrawable, pGC, n, ppt, pwidth, fSorted);
return; return;
} }
@ -109,8 +110,6 @@ exaFillSpans(DrawablePtr pDrawable, GCPtr pGC, int n,
(*pExaScr->info->Solid) (pPixmap, (*pExaScr->info->Solid) (pPixmap,
fullX1 + off_x, fullY1 + off_y, fullX1 + off_x, fullY1 + off_y,
fullX2 + off_x, fullY1 + 1 + off_y); fullX2 + off_x, fullY1 + 1 + off_y);
exaPixmapDirty (pPixmap, fullX1 + off_x, fullY1 + off_y,
fullX2 + off_x, fullY1 + 1 + off_y);
} }
else else
{ {
@ -129,8 +128,6 @@ exaFillSpans(DrawablePtr pDrawable, GCPtr pGC, int n,
(*pExaScr->info->Solid) (pPixmap, (*pExaScr->info->Solid) (pPixmap,
partX1 + off_x, fullY1 + off_y, partX1 + off_x, fullY1 + off_y,
partX2 + off_x, fullY1 + 1 + off_y); partX2 + off_x, fullY1 + 1 + off_y);
exaPixmapDirty (pPixmap, partX1 + off_x, fullY1 + off_y,
partX2 + off_x, fullY1 + 1 + off_y);
} }
} }
pbox++; pbox++;
@ -154,8 +151,9 @@ exaPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
int xoff, yoff; int xoff, yoff;
int src_stride, bpp = pDrawable->bitsPerPixel; int src_stride, bpp = pDrawable->bitsPerPixel;
if (pExaScr->swappedOut || pExaScr->info->UploadToScreen == NULL) pixmaps[0].as_dst = TRUE;
goto migrate_and_fallback; pixmaps[0].as_src = FALSE;
pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
/* Don't bother with under 8bpp, XYPixmaps. */ /* Don't bother with under 8bpp, XYPixmaps. */
if (format != ZPixmap || bpp < 8) if (format != ZPixmap || bpp < 8)
@ -165,10 +163,14 @@ exaPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
if (!EXA_PM_IS_SOLID(pDrawable, pGC->planemask) || pGC->alu != GXcopy) if (!EXA_PM_IS_SOLID(pDrawable, pGC->planemask) || pGC->alu != GXcopy)
goto migrate_and_fallback; goto migrate_and_fallback;
pixmaps[0].as_dst = TRUE; if (pExaScr->swappedOut)
pixmaps[0].as_src = FALSE; goto fallback;
pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
exaDoMigration (pixmaps, 1, TRUE); exaDoMigration (pixmaps, 1, TRUE);
if (pExaScr->info->UploadToScreen == NULL)
goto fallback;
pPix = exaGetOffscreenPixmap (pDrawable, &xoff, &yoff); pPix = exaGetOffscreenPixmap (pDrawable, &xoff, &yoff);
if (pPix == NULL) if (pPix == NULL)
@ -221,25 +223,23 @@ exaPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y,
fbBltStip((FbStip *)bits + (y1 - y) * (src_stride / sizeof(FbStip)), fbBltStip((FbStip *)bits + (y1 - y) * (src_stride / sizeof(FbStip)),
src_stride / sizeof(FbStip), src_stride / sizeof(FbStip),
(x1 - x) * bpp, (x1 - x) * dstBpp,
dst + (y1 + yoff) * dst_stride, dst + (y1 + dstYoff) * dst_stride,
dst_stride, dst_stride,
(x1 + xoff) * bpp, (x1 + dstXoff) * dstBpp,
(x2 - x1) * bpp, (x2 - x1) * dstBpp,
y2 - y1, y2 - y1,
GXcopy, FB_ALLONES, bpp); GXcopy, FB_ALLONES, dstBpp);
exaFinishAccess(pDrawable, EXA_PREPARE_DEST); exaFinishAccess(pDrawable, EXA_PREPARE_DEST);
} }
exaPixmapDirty(pPix, x1 + xoff, y1 + yoff, x2 + xoff, y2 + yoff); exaPixmapDirty(pPix, x1 + xoff, y1 + yoff, x2 + xoff, y2 + yoff);
} }
return; return;
migrate_and_fallback: migrate_and_fallback:
pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = FALSE;
pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
exaDoMigration (pixmaps, 1, FALSE); exaDoMigration (pixmaps, 1, FALSE);
fallback: fallback:
@ -387,6 +387,7 @@ exaCopyNtoN (DrawablePtr pSrcDrawable,
int src_off_x, src_off_y; int src_off_x, src_off_y;
int dst_off_x, dst_off_y; int dst_off_x, dst_off_y;
ExaMigrationRec pixmaps[2]; ExaMigrationRec pixmaps[2];
Bool fallback = FALSE;
pixmaps[0].as_dst = TRUE; pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = FALSE; pixmaps[0].as_src = FALSE;
@ -404,62 +405,64 @@ exaCopyNtoN (DrawablePtr pSrcDrawable,
pDstPixmap->drawable.width > pExaScr->info->maxX || pDstPixmap->drawable.width > pExaScr->info->maxX ||
pDstPixmap->drawable.height > pExaScr->info->maxY) pDstPixmap->drawable.height > pExaScr->info->maxY)
{ {
exaDoMigration (pixmaps, 2, FALSE); fallback = TRUE;
goto fallback;
} else { } else {
exaDoMigration (pixmaps, 2, TRUE); exaDoMigration (pixmaps, 2, TRUE);
} }
/* Mixed directions must be handled specially if the card is lame */ /* Mixed directions must be handled specially if the card is lame */
if (pExaScr->info->flags & EXA_TWO_BITBLT_DIRECTIONS && if (!fallback && (pExaScr->info->flags & EXA_TWO_BITBLT_DIRECTIONS) &&
reverse != upsidedown) { reverse != upsidedown) {
if (!exaCopyNtoNTwoDir(pSrcDrawable, pDstDrawable, pGC, pbox, nbox, if (exaCopyNtoNTwoDir(pSrcDrawable, pDstDrawable, pGC, pbox, nbox,
dx, dy)) dx, dy))
goto fallback; return;
return; fallback = TRUE;
} }
if ((pSrcPixmap = exaGetOffscreenPixmap (pSrcDrawable, &src_off_x, &src_off_y)) && pSrcPixmap = exaGetDrawablePixmap (pSrcDrawable);
(pDstPixmap = exaGetOffscreenPixmap (pDstDrawable, &dst_off_x, &dst_off_y)) && pDstPixmap = exaGetDrawablePixmap (pDstDrawable);
(*pExaScr->info->PrepareCopy) (pSrcPixmap, pDstPixmap,
reverse ? -1 : 1, upsidedown ? -1 : 1, exaGetDrawableDeltas (pSrcDrawable, pSrcPixmap, &src_off_x, &src_off_y);
pGC ? pGC->alu : GXcopy, exaGetDrawableDeltas (pDstDrawable, pDstPixmap, &dst_off_x, &dst_off_y);
pGC ? pGC->planemask : FB_ALLONES))
if (fallback || !exaPixmapIsOffscreen(pSrcPixmap) ||
!exaPixmapIsOffscreen(pDstPixmap) ||
!(*pExaScr->info->PrepareCopy) (pSrcPixmap, pDstPixmap, reverse ? -1 : 1,
upsidedown ? -1 : 1,
pGC ? pGC->alu : GXcopy,
pGC ? pGC->planemask : FB_ALLONES)) {
fallback = TRUE;
EXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrcDrawable, pDstDrawable,
exaDrawableLocation(pSrcDrawable),
exaDrawableLocation(pDstDrawable)));
exaDoMigration (pixmaps, 2, FALSE);
exaPrepareAccess (pDstDrawable, EXA_PREPARE_DEST);
exaPrepareAccess (pSrcDrawable, EXA_PREPARE_SRC);
fbCopyNtoN (pSrcDrawable, pDstDrawable, pGC,
pbox, nbox, dx, dy, reverse, upsidedown,
bitplane, closure);
exaFinishAccess (pSrcDrawable, EXA_PREPARE_SRC);
exaFinishAccess (pDstDrawable, EXA_PREPARE_DEST);
}
while (nbox--)
{ {
while (nbox--) if (!fallback)
{
(*pExaScr->info->Copy) (pDstPixmap, (*pExaScr->info->Copy) (pDstPixmap,
pbox->x1 + dx + src_off_x, pbox->x1 + dx + src_off_x,
pbox->y1 + dy + src_off_y, pbox->y1 + dy + src_off_y,
pbox->x1 + dst_off_x, pbox->y1 + dst_off_y, pbox->x1 + dst_off_x, pbox->y1 + dst_off_y,
pbox->x2 - pbox->x1, pbox->x2 - pbox->x1, pbox->y2 - pbox->y1);
pbox->y2 - pbox->y1); exaPixmapDirty (pDstPixmap, pbox->x1 + dst_off_x, pbox->y1 + dst_off_y,
exaPixmapDirty (pDstPixmap, pbox->x2 + dst_off_x, pbox->y2 + dst_off_y);
pbox->x1 + dst_off_x, pbox->y1 + dst_off_y,
pbox->x2 + dst_off_x, pbox->y2 + dst_off_y);
pbox++;
}
(*pExaScr->info->DoneCopy) (pDstPixmap);
exaMarkSync(pDstDrawable->pScreen);
return;
}
fallback:
EXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrcDrawable, pDstDrawable,
exaDrawableLocation(pSrcDrawable),
exaDrawableLocation(pDstDrawable)));
exaPrepareAccess (pDstDrawable, EXA_PREPARE_DEST);
exaPrepareAccess (pSrcDrawable, EXA_PREPARE_SRC);
fbCopyNtoN (pSrcDrawable, pDstDrawable, pGC,
pbox, nbox, dx, dy, reverse, upsidedown,
bitplane, closure);
exaFinishAccess (pSrcDrawable, EXA_PREPARE_SRC);
exaFinishAccess (pDstDrawable, EXA_PREPARE_DEST);
while (nbox--)
{
exaDrawableDirty (pDstDrawable, pbox->x1, pbox->y1, pbox->x2, pbox->y2);
pbox++; pbox++;
} }
if (fallback)
return;
(*pExaScr->info->DoneCopy) (pDstPixmap);
exaMarkSync (pDstDrawable->pScreen);
} }
RegionPtr RegionPtr
@ -618,6 +621,9 @@ exaPolySegment (DrawablePtr pDrawable, GCPtr pGC, int nseg,
DEALLOCATE_LOCAL(prect); DEALLOCATE_LOCAL(prect);
} }
static Bool exaFillRegionSolid (DrawablePtr pDrawable, RegionPtr pRegion,
Pixel pixel, CARD32 planemask, CARD32 alu);
static void static void
exaPolyFillRect(DrawablePtr pDrawable, exaPolyFillRect(DrawablePtr pDrawable,
GCPtr pGC, GCPtr pGC,
@ -626,7 +632,7 @@ exaPolyFillRect(DrawablePtr pDrawable,
{ {
ExaScreenPriv (pDrawable->pScreen); ExaScreenPriv (pDrawable->pScreen);
RegionPtr pClip = fbGetCompositeClip(pGC); RegionPtr pClip = fbGetCompositeClip(pGC);
PixmapPtr pPixmap; PixmapPtr pPixmap = exaGetDrawablePixmap(pDrawable);
register BoxPtr pbox; register BoxPtr pbox;
BoxPtr pextent; BoxPtr pextent;
int extentX1, extentX2, extentY1, extentY2; int extentX1, extentX2, extentY1, extentY2;
@ -635,39 +641,80 @@ exaPolyFillRect(DrawablePtr pDrawable,
int xoff, yoff; int xoff, yoff;
int xorg, yorg; int xorg, yorg;
int n; int n;
ExaMigrationRec pixmaps[1]; ExaMigrationRec pixmaps[2];
RegionPtr pReg = RECTS_TO_REGION(pScreen, nrect, prect, CT_UNSORTED);
RegionPtr pDamageReg = DamageRegion(ExaGetPixmapPriv(pPixmap)->pDamage);
/* Compute intersection of rects and clip region */
REGION_TRANSLATE(pScreen, pReg, pDrawable->x, pDrawable->y);
REGION_INTERSECT(pScreen, pReg, pClip, pReg);
if (!REGION_NUM_RECTS(pReg)) {
REGION_DESTROY(pScreen, pReg);
return;
}
pixmaps[0].as_dst = TRUE; pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = FALSE; pixmaps[0].as_src = FALSE;
pixmaps[0].pPix = pPixmap = exaGetDrawablePixmap (pDrawable); pixmaps[0].pPix = pPixmap;
exaGetDrawableDeltas(pDrawable, pPixmap, &xoff, &yoff);
if (pExaScr->swappedOut || if (pExaScr->swappedOut ||
pGC->fillStyle != FillSolid ||
pPixmap->drawable.width > pExaScr->info->maxX || pPixmap->drawable.width > pExaScr->info->maxX ||
pPixmap->drawable.height > pExaScr->info->maxY) pPixmap->drawable.height > pExaScr->info->maxY)
{ {
exaDoMigration (pixmaps, 1, FALSE); goto fallback;
ExaCheckPolyFillRect (pDrawable, pGC, nrect, prect);
while (nrect-- >= 0) {
exaDrawableDirty(pDrawable,
pDrawable->x + prect->x,
pDrawable->y + prect->y,
pDrawable->x + prect->x + prect->width,
pDrawable->y + prect->y + prect->height);
prect++;
}
return;
} else {
exaDoMigration (pixmaps, 1, TRUE);
} }
if (!(pPixmap = exaGetOffscreenPixmap (pDrawable, &xoff, &yoff)) || /* For ROPs where overlaps don't matter, convert rectangles to region and
* call exaFillRegion{Solid,Tiled}.
*/
if ((pGC->fillStyle == FillSolid || pGC->fillStyle == FillTiled) &&
(pGC->alu == GXcopy || pGC->alu == GXclear || pGC->alu == GXnoop ||
pGC->alu == GXcopyInverted || pGC->alu == GXset)) {
if (((pGC->fillStyle == FillSolid || pGC->tileIsPixel) &&
exaFillRegionSolid(pDrawable, pReg, pGC->fillStyle == FillSolid ?
pGC->fgPixel : pGC->tile.pixel, pGC->planemask,
pGC->alu)) ||
(pGC->fillStyle == FillTiled && !pGC->tileIsPixel &&
exaFillRegionTiled(pDrawable, pReg, pGC->tile.pixmap, &pGC->patOrg,
pGC->planemask, pGC->alu))) {
goto damage;
}
}
if (pGC->fillStyle != FillSolid &&
!(pGC->tileIsPixel && pGC->fillStyle == FillTiled))
{
goto fallback;
}
exaDoMigration (pixmaps, 1, TRUE);
if (!exaPixmapIsOffscreen (pPixmap) ||
!(*pExaScr->info->PrepareSolid) (pPixmap, !(*pExaScr->info->PrepareSolid) (pPixmap,
pGC->alu, pGC->alu,
pGC->planemask, pGC->planemask,
pGC->fgPixel)) pGC->fgPixel))
{ {
fallback:
if (pGC->fillStyle == FillTiled && !pGC->tileIsPixel) {
pixmaps[1].as_dst = FALSE;
pixmaps[1].as_src = TRUE;
pixmaps[1].pPix = pGC->tile.pixmap;
exaDoMigration (pixmaps, 2, FALSE);
} else {
exaDoMigration (pixmaps, 1, FALSE);
}
ExaCheckPolyFillRect (pDrawable, pGC, nrect, prect); ExaCheckPolyFillRect (pDrawable, pGC, nrect, prect);
damage:
REGION_TRANSLATE(pScreen, pReg, xoff, yoff);
REGION_UNION(pScreen, pDamageReg, pReg, pDamageReg);
REGION_DESTROY(pScreen, pReg);
return; return;
} }
@ -715,7 +762,8 @@ exaPolyFillRect(DrawablePtr pDrawable,
pbox = REGION_RECTS(pClip); pbox = REGION_RECTS(pClip);
/* /*
* clip the rectangle to each box in the clip region * clip the rectangle to each box in the clip region
* this is logically equivalent to calling Intersect() * this is logically equivalent to calling Intersect(),
* but rectangles may overlap each other here.
*/ */
while(n--) while(n--)
{ {
@ -775,20 +823,19 @@ exaSolidBoxClipped (DrawablePtr pDrawable,
pPixmap->drawable.width > pExaScr->info->maxX || pPixmap->drawable.width > pExaScr->info->maxX ||
pPixmap->drawable.height > pExaScr->info->maxY) pPixmap->drawable.height > pExaScr->info->maxY)
{ {
exaDoMigration (pixmaps, 1, FALSE); fallback = TRUE;
goto fallback;
} else { } else {
exaDoMigration (pixmaps, 1, TRUE); exaDoMigration (pixmaps, 1, TRUE);
} }
pPixmap = exaGetOffscreenPixmap (pDrawable, &xoff, &yoff); exaGetDrawableDeltas (pDrawable, pPixmap, &xoff, &yoff);
if (!pPixmap || if (fallback || !exaPixmapIsOffscreen(pPixmap) ||
!(*pExaScr->info->PrepareSolid) (pPixmap, GXcopy, pm, fg)) !(*pExaScr->info->PrepareSolid) (pPixmap, GXcopy, pm, fg))
{ {
fallback:
EXA_FALLBACK(("to %p (%c)\n", pDrawable, EXA_FALLBACK(("to %p (%c)\n", pDrawable,
exaDrawableLocation(pDrawable))); exaDrawableLocation(pDrawable)));
exaDoMigration (pixmaps, 1, FALSE);
fallback = TRUE; fallback = TRUE;
exaPrepareAccess (pDrawable, EXA_PREPARE_DEST); exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
fg = fbReplicatePixel (fg, pDrawable->bitsPerPixel); fg = fbReplicatePixel (fg, pDrawable->bitsPerPixel);
@ -827,10 +874,10 @@ fallback:
(*pExaScr->info->Solid) (pPixmap, (*pExaScr->info->Solid) (pPixmap,
partX1 + xoff, partY1 + yoff, partX1 + xoff, partY1 + yoff,
partX2 + xoff, partY2 + yoff); partX2 + xoff, partY2 + yoff);
exaPixmapDirty (pPixmap, partX1 + xoff, partY1 + yoff, }
partX2 + xoff, partY2 + yoff);
} else exaPixmapDirty (pPixmap, partX1 + xoff, partY1 + yoff, partX2 + xoff,
exaDrawableDirty (pDrawable, partX1, partY1, partX2, partY2); partY2 + yoff);
} }
if (fallback) if (fallback)
@ -870,12 +917,36 @@ exaImageGlyphBlt (DrawablePtr pDrawable,
int dstBpp; int dstBpp;
int dstXoff, dstYoff; int dstXoff, dstYoff;
FbBits depthMask; FbBits depthMask;
PixmapPtr pPixmap = exaGetDrawablePixmap(pDrawable);
ExaMigrationRec pixmaps[1];
int xBack, widthBack, yBack, heightBack;
for (ppci = ppciInit, n = nglyph, widthBack = 0; n; n--)
widthBack += (*ppci++)->metrics.characterWidth;
xBack = x;
if (widthBack < 0)
{
xBack += widthBack;
widthBack = -widthBack;
}
yBack = y - FONTASCENT(pGC->font);
heightBack = FONTASCENT(pGC->font) + FONTDESCENT(pGC->font);
if (xBack >= pDrawable->width || yBack >= pDrawable->height ||
(xBack + widthBack) <= 0 || (yBack + heightBack) <= 0)
return;
pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = TRUE;
pixmaps[0].pPix = pPixmap;
depthMask = FbFullMask(pDrawable->depth); depthMask = FbFullMask(pDrawable->depth);
if ((pGC->planemask & depthMask) != depthMask) if ((pGC->planemask & depthMask) != depthMask)
{ {
exaDoMigration(pixmaps, 1, FALSE);
ExaCheckImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppciInit, pglyphBase); ExaCheckImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppciInit, pglyphBase);
return; goto damage;
} }
glyph = NULL; glyph = NULL;
switch (pDrawable->bitsPerPixel) { switch (pDrawable->bitsPerPixel) {
@ -887,6 +958,8 @@ exaImageGlyphBlt (DrawablePtr pDrawable,
x += pDrawable->x; x += pDrawable->x;
y += pDrawable->y; y += pDrawable->y;
xBack += pDrawable->x;
yBack += pDrawable->y;
if (TERMINALFONT (pGC->font) && !glyph) if (TERMINALFONT (pGC->font) && !glyph)
{ {
@ -894,23 +967,6 @@ exaImageGlyphBlt (DrawablePtr pDrawable,
} }
else else
{ {
int xBack, widthBack;
int yBack, heightBack;
ppci = ppciInit;
n = nglyph;
widthBack = 0;
while (n--)
widthBack += (*ppci++)->metrics.characterWidth;
xBack = x;
if (widthBack < 0)
{
xBack += widthBack;
widthBack = -widthBack;
}
yBack = y - FONTASCENT(pGC->font);
heightBack = FONTASCENT(pGC->font) + FONTDESCENT(pGC->font);
exaSolidBoxClipped (pDrawable, exaSolidBoxClipped (pDrawable,
fbGetCompositeClip(pGC), fbGetCompositeClip(pGC),
pGC->planemask, pGC->planemask,
@ -923,74 +979,50 @@ exaImageGlyphBlt (DrawablePtr pDrawable,
} }
EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable))); EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
exaDoMigration(pixmaps, 1, FALSE);
exaPrepareAccess (pDrawable, EXA_PREPARE_DEST); exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
exaPrepareAccessGC (pGC); exaPrepareAccessGC (pGC);
fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff); fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
ppci = ppciInit; for (ppci = ppciInit; nglyph; nglyph--, x += pci->metrics.characterWidth)
while (nglyph--)
{ {
pci = *ppci++; pci = *ppci++;
pglyph = FONTGLYPHBITS(pglyphBase, pci);
gWidth = GLYPHWIDTHPIXELS(pci); gWidth = GLYPHWIDTHPIXELS(pci);
gHeight = GLYPHHEIGHTPIXELS(pci); gHeight = GLYPHHEIGHTPIXELS(pci);
if (gWidth && gHeight) gx = x + pci->metrics.leftSideBearing;
gy = y - pci->metrics.ascent;
if (!gWidth || !gHeight || (gx + gWidth) <= xBack ||
(gy + gHeight) <= yBack || gx >= (xBack + widthBack) ||
gy >= (yBack + heightBack))
continue;
pglyph = FONTGLYPHBITS(pglyphBase, pci);
if (glyph && gWidth <= sizeof (FbStip) * 8 &&
fbGlyphIn (fbGetCompositeClip(pGC), gx, gy, gWidth, gHeight))
{ {
gx = x + pci->metrics.leftSideBearing; (*glyph) (dst + (gy + dstYoff) * dstStride, dstStride, dstBpp,
gy = y - pci->metrics.ascent; (FbStip *) pglyph, pPriv->fg, gx + dstXoff, gHeight);
if (glyph && gWidth <= sizeof (FbStip) * 8 && }
fbGlyphIn (fbGetCompositeClip(pGC), gx, gy, gWidth, gHeight)) else
{ {
(*glyph) (dst + (gy + dstYoff) * dstStride, RegionPtr pClip = fbGetCompositeClip(pGC);
dstStride,
dstBpp, gStride = GLYPHWIDTHBYTESPADDED(pci) / sizeof (FbStip);
(FbStip *) pglyph, fbPutXYImage (pDrawable, pClip, pPriv->fg, pPriv->bg, pPriv->pm,
pPriv->fg, GXcopy, opaque, gx, gy, gWidth, gHeight,
gx + dstXoff, (FbStip *) pglyph, gStride, 0);
gHeight);
exaDrawableDirty (pDrawable, gx, gy, gx + gWidth, gy + gHeight);
}
else
{
RegionPtr pClip = fbGetCompositeClip(pGC);
int nbox;
BoxPtr pbox;
gStride = GLYPHWIDTHBYTESPADDED(pci) / sizeof (FbStip);
fbPutXYImage (pDrawable,
pClip,
pPriv->fg,
pPriv->bg,
pPriv->pm,
GXcopy,
opaque,
gx,
gy,
gWidth, gHeight,
(FbStip *) pglyph,
gStride,
0);
for (nbox = REGION_NUM_RECTS(pClip), pbox = REGION_RECTS(pClip);
nbox--; pbox++) {
int x1 = max(gx, pbox->x1), x2 = min(gx + gWidth, pbox->x2);
int y1 = max(gy, pbox->y1), y2 = min(gy + gHeight, pbox->y2);
if (x1 >= x2 || y1 >= y2)
continue;
exaDrawableDirty (pDrawable, gx, gy, gx + gWidth,
gy + gHeight);
}
}
} }
x += pci->metrics.characterWidth;
} }
exaFinishAccessGC (pGC); exaFinishAccessGC (pGC);
exaFinishAccess (pDrawable, EXA_PREPARE_DEST); exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
damage:
exaGetDrawableDeltas(pDrawable, pPixmap, &dstXoff, &dstYoff);
exaPixmapDirty(pPixmap, xBack + dstXoff, yBack + dstYoff,
xBack + dstXoff + widthBack, yBack + dstYoff + heightBack);
} }
const GCOps exaOps = { const GCOps exaOps = {
@ -1043,10 +1075,12 @@ exaCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
REGION_UNINIT(pWin->drawable.pScreen, &rgnDst); REGION_UNINIT(pWin->drawable.pScreen, &rgnDst);
} }
static void static Bool
exaFillRegionSolid (DrawablePtr pDrawable, exaFillRegionSolid (DrawablePtr pDrawable,
RegionPtr pRegion, RegionPtr pRegion,
Pixel pixel) Pixel pixel,
CARD32 planemask,
CARD32 alu)
{ {
ExaScreenPriv(pDrawable->pScreen); ExaScreenPriv(pDrawable->pScreen);
PixmapPtr pPixmap; PixmapPtr pPixmap;
@ -1062,22 +1096,19 @@ exaFillRegionSolid (DrawablePtr pDrawable,
if (pPixmap->drawable.width > pExaScr->info->maxX || if (pPixmap->drawable.width > pExaScr->info->maxX ||
pPixmap->drawable.height > pExaScr->info->maxY) pPixmap->drawable.height > pExaScr->info->maxY)
{ {
exaDoMigration (pixmaps, 1, FALSE);
goto fallback; goto fallback;
} else { } else {
exaDoMigration (pixmaps, 1, TRUE); exaDoMigration (pixmaps, 1, TRUE);
} }
if ((pPixmap = exaGetOffscreenPixmap (pDrawable, &xoff, &yoff)) && if ((pPixmap = exaGetOffscreenPixmap (pDrawable, &xoff, &yoff)) &&
(*pExaScr->info->PrepareSolid) (pPixmap, GXcopy, FB_ALLONES, pixel)) (*pExaScr->info->PrepareSolid) (pPixmap, alu, planemask, pixel))
{ {
while (nbox--) while (nbox--)
{ {
(*pExaScr->info->Solid) (pPixmap, (*pExaScr->info->Solid) (pPixmap,
pBox->x1 + xoff, pBox->y1 + yoff, pBox->x1 + xoff, pBox->y1 + yoff,
pBox->x2 + xoff, pBox->y2 + yoff); pBox->x2 + xoff, pBox->y2 + yoff);
exaPixmapDirty (pPixmap, pBox->x1 + xoff, pBox->y1 + yoff,
pBox->x2 + xoff, pBox->y2 + yoff);
pBox++; pBox++;
} }
(*pExaScr->info->DoneSolid) (pPixmap); (*pExaScr->info->DoneSolid) (pPixmap);
@ -1086,27 +1117,30 @@ exaFillRegionSolid (DrawablePtr pDrawable,
else else
{ {
fallback: fallback:
if (alu != GXcopy || planemask != FB_ALLONES)
return FALSE;
EXA_FALLBACK(("to %p (%c)\n", pDrawable, EXA_FALLBACK(("to %p (%c)\n", pDrawable,
exaDrawableLocation(pDrawable))); exaDrawableLocation(pDrawable)));
exaDoMigration (pixmaps, 1, FALSE);
exaPrepareAccess (pDrawable, EXA_PREPARE_DEST); exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
fbFillRegionSolid (pDrawable, pRegion, 0, fbFillRegionSolid (pDrawable, pRegion, 0,
fbReplicatePixel (pixel, pDrawable->bitsPerPixel)); fbReplicatePixel (pixel, pDrawable->bitsPerPixel));
exaFinishAccess (pDrawable, EXA_PREPARE_DEST); exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
while (nbox--)
{
exaDrawableDirty (pDrawable, pBox->x1, pBox->y1, pBox->x2, pBox->y2);
pBox++;
}
} }
return TRUE;
} }
/* Try to do an accelerated tile of the pTile into pRegion of pDrawable. /* Try to do an accelerated tile of the pTile into pRegion of pDrawable.
* Based on fbFillRegionTiled(), fbTile(). * Based on fbFillRegionTiled(), fbTile().
*/ */
static void Bool
exaFillRegionTiled (DrawablePtr pDrawable, exaFillRegionTiled (DrawablePtr pDrawable,
RegionPtr pRegion, RegionPtr pRegion,
PixmapPtr pTile) PixmapPtr pTile,
DDXPointPtr pPatOrg,
CARD32 planemask,
CARD32 alu)
{ {
ExaScreenPriv(pDrawable->pScreen); ExaScreenPriv(pDrawable->pScreen);
PixmapPtr pPixmap; PixmapPtr pPixmap;
@ -1122,10 +1156,10 @@ exaFillRegionTiled (DrawablePtr pDrawable,
/* If we're filling with a solid color, grab it out and go to /* If we're filling with a solid color, grab it out and go to
* FillRegionSolid, saving numerous copies. * FillRegionSolid, saving numerous copies.
*/ */
if (tileWidth == 1 && tileHeight == 1) { if (tileWidth == 1 && tileHeight == 1)
exaFillRegionSolid(pDrawable, pRegion, exaGetPixmapFirstPixel (pTile)); return exaFillRegionSolid(pDrawable, pRegion,
return; exaGetPixmapFirstPixel (pTile), planemask,
} alu);
pixmaps[0].as_dst = TRUE; pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = FALSE; pixmaps[0].as_src = FALSE;
@ -1139,7 +1173,6 @@ exaFillRegionTiled (DrawablePtr pDrawable,
tileWidth > pExaScr->info->maxX || tileWidth > pExaScr->info->maxX ||
tileHeight > pExaScr->info->maxY) tileHeight > pExaScr->info->maxY)
{ {
exaDoMigration (pixmaps, 2, FALSE);
goto fallback; goto fallback;
} else { } else {
exaDoMigration (pixmaps, 2, TRUE); exaDoMigration (pixmaps, 2, TRUE);
@ -1153,8 +1186,9 @@ exaFillRegionTiled (DrawablePtr pDrawable,
if (!exaPixmapIsOffscreen(pTile)) if (!exaPixmapIsOffscreen(pTile))
goto fallback; goto fallback;
if ((*pExaScr->info->PrepareCopy) (exaGetOffscreenPixmap((DrawablePtr)pTile, &tileXoff, &tileYoff), pPixmap, 0, 0, GXcopy, if ((*pExaScr->info->PrepareCopy) (exaGetOffscreenPixmap((DrawablePtr)pTile,
FB_ALLONES)) &tileXoff, &tileYoff),
pPixmap, 0, 0, alu, planemask))
{ {
while (nbox--) while (nbox--)
{ {
@ -1162,7 +1196,7 @@ exaFillRegionTiled (DrawablePtr pDrawable,
int dstY = pBox->y1; int dstY = pBox->y1;
int tileY; int tileY;
tileY = (dstY - pDrawable->y) % tileHeight; tileY = (dstY - pDrawable->y - pPatOrg->y) % tileHeight;
while (height > 0) { while (height > 0) {
int width = pBox->x2 - pBox->x1; int width = pBox->x2 - pBox->x1;
int dstX = pBox->x1; int dstX = pBox->x1;
@ -1173,7 +1207,7 @@ exaFillRegionTiled (DrawablePtr pDrawable,
h = height; h = height;
height -= h; height -= h;
tileX = (dstX - pDrawable->x) % tileWidth; tileX = (dstX - pDrawable->x - pPatOrg->x) % tileWidth;
while (width > 0) { while (width > 0) {
int w = tileWidth - tileX; int w = tileWidth - tileX;
if (w > width) if (w > width)
@ -1190,38 +1224,44 @@ exaFillRegionTiled (DrawablePtr pDrawable,
dstY += h; dstY += h;
tileY = 0; tileY = 0;
} }
exaPixmapDirty (pPixmap, pBox->x1 + xoff, pBox->y1 + yoff,
pBox->x2 + xoff, pBox->y2 + yoff);
pBox++; pBox++;
} }
(*pExaScr->info->DoneCopy) (pPixmap); (*pExaScr->info->DoneCopy) (pPixmap);
exaMarkSync(pDrawable->pScreen); exaMarkSync(pDrawable->pScreen);
return; return TRUE;
} }
fallback: fallback:
if (alu != GXcopy || planemask != FB_ALLONES)
return FALSE;
EXA_FALLBACK(("from %p to %p (%c,%c)\n", pTile, pDrawable, EXA_FALLBACK(("from %p to %p (%c,%c)\n", pTile, pDrawable,
exaDrawableLocation(&pTile->drawable), exaDrawableLocation(&pTile->drawable),
exaDrawableLocation(pDrawable))); exaDrawableLocation(pDrawable)));
exaDoMigration (pixmaps, 2, FALSE);
exaPrepareAccess (pDrawable, EXA_PREPARE_DEST); exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
exaPrepareAccess ((DrawablePtr)pTile, EXA_PREPARE_SRC); exaPrepareAccess ((DrawablePtr)pTile, EXA_PREPARE_SRC);
fbFillRegionTiled (pDrawable, pRegion, pTile); fbFillRegionTiled (pDrawable, pRegion, pTile);
exaFinishAccess ((DrawablePtr)pTile, EXA_PREPARE_SRC); exaFinishAccess ((DrawablePtr)pTile, EXA_PREPARE_SRC);
exaFinishAccess (pDrawable, EXA_PREPARE_DEST); exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
while (nbox--)
{ return TRUE;
exaDrawableDirty (pDrawable, pBox->x1, pBox->y1, pBox->x2, pBox->y2);
pBox++;
}
} }
void void
exaPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what) exaPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
{ {
ExaScreenPriv (pWin->drawable.pScreen); ExaScreenPriv (pWin->drawable.pScreen);
if (!REGION_NUM_RECTS(pRegion)) PixmapPtr pPixmap = exaGetDrawablePixmap((DrawablePtr)pWin);
int xoff, yoff;
BoxPtr pBox;
int nbox = REGION_NUM_RECTS(pRegion);
if (!nbox)
return; return;
if (!pExaScr->swappedOut) { if (!pExaScr->swappedOut) {
DDXPointRec zeros = { 0, 0 };
switch (what) { switch (what) {
case PW_BACKGROUND: case PW_BACKGROUND:
switch (pWin->backgroundState) { switch (pWin->backgroundState) {
@ -1235,25 +1275,41 @@ exaPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
what); what);
return; return;
case BackgroundPixel: case BackgroundPixel:
exaFillRegionSolid((DrawablePtr)pWin, pRegion, pWin->background.pixel); exaFillRegionSolid((DrawablePtr)pWin, pRegion, pWin->background.pixel,
return; FB_ALLONES, GXcopy);
goto damage;
case BackgroundPixmap: case BackgroundPixmap:
exaFillRegionTiled((DrawablePtr)pWin, pRegion, pWin->background.pixmap); exaFillRegionTiled((DrawablePtr)pWin, pRegion, pWin->background.pixmap,
return; &zeros, FB_ALLONES, GXcopy);
goto damage;
} }
break; break;
case PW_BORDER: case PW_BORDER:
if (pWin->borderIsPixel) { if (pWin->borderIsPixel) {
exaFillRegionSolid((DrawablePtr)pWin, pRegion, pWin->border.pixel); exaFillRegionSolid((DrawablePtr)pWin, pRegion, pWin->border.pixel,
return; FB_ALLONES, GXcopy);
goto damage;
} else { } else {
exaFillRegionTiled((DrawablePtr)pWin, pRegion, pWin->border.pixmap); exaFillRegionTiled((DrawablePtr)pWin, pRegion, pWin->border.pixmap,
return; &zeros, FB_ALLONES, GXcopy);
goto damage;
} }
break; break;
} }
} }
ExaCheckPaintWindow (pWin, pRegion, what); ExaCheckPaintWindow (pWin, pRegion, what);
damage:
exaGetDrawableDeltas((DrawablePtr)pWin, pPixmap, &xoff, &yoff);
pBox = REGION_RECTS(pRegion);
while (nbox--)
{
exaPixmapDirty (pPixmap, pBox->x1 + xoff, pBox->y1 + yoff,
pBox->x2 + xoff, pBox->y2 + yoff);
pBox++;
}
} }
/** /**
@ -1273,27 +1329,22 @@ exaGetImage (DrawablePtr pDrawable, int x, int y, int w, int h,
int xoff, yoff; int xoff, yoff;
Bool ok; Bool ok;
if (pExaScr->swappedOut || pExaScr->info->DownloadFromScreen == NULL) if (pExaScr->info->DownloadFromScreen == NULL)
goto fallback; goto migrate_and_fallback;
/* Only cover the ZPixmap, solid copy case. */ /* Only cover the ZPixmap, solid copy case. */
if (format != ZPixmap || !EXA_PM_IS_SOLID(pDrawable, planeMask)) if (format != ZPixmap || !EXA_PM_IS_SOLID(pDrawable, planeMask))
goto fallback; goto migrate_and_fallback;
/* Only try to handle the 8bpp and up cases, since we don't want to think /* Only try to handle the 8bpp and up cases, since we don't want to think
* about <8bpp. * about <8bpp.
*/ */
if (pDrawable->bitsPerPixel < 8) if (pDrawable->bitsPerPixel < 8)
goto migrate_and_fallback;
if (pExaScr->swappedOut)
goto fallback; goto fallback;
/* Migrate, but assume that we could accelerate the download. It is up to
* the migration scheme to ensure that this case doesn't result in bad
* moving of pixmaps.
*/
pixmaps[0].as_dst = FALSE;
pixmaps[0].as_src = TRUE;
pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
exaDoMigration (pixmaps, 1, TRUE);
pPix = exaGetOffscreenPixmap (pDrawable, &xoff, &yoff); pPix = exaGetOffscreenPixmap (pDrawable, &xoff, &yoff);
if (pPix == NULL) if (pPix == NULL)
goto fallback; goto fallback;
@ -1308,12 +1359,12 @@ exaGetImage (DrawablePtr pDrawable, int x, int y, int w, int h,
return; return;
} }
fallback: migrate_and_fallback:
pixmaps[0].as_dst = FALSE; pixmaps[0].as_dst = FALSE;
pixmaps[0].as_src = TRUE; pixmaps[0].as_src = TRUE;
pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable); pixmaps[0].pPix = exaGetDrawablePixmap (pDrawable);
exaDoMigration (pixmaps, 1, FALSE); exaDoMigration (pixmaps, 1, FALSE);
fallback:
ExaCheckGetImage (pDrawable, x, y, w, h, format, planeMask, d); ExaCheckGetImage (pDrawable, x, y, w, h, format, planeMask, d);
} }

View File

@ -464,12 +464,10 @@ exaAssertNotDirty (PixmapPtr pPixmap)
BoxPtr pBox = REGION_RECTS(pValidReg); BoxPtr pBox = REGION_RECTS(pValidReg);
Bool ret = TRUE; Bool ret = TRUE;
if (pExaPixmap == NULL || pExaPixmap->fb_ptr == NULL) if (!nbox || exaPixmapIsPinned(pPixmap) || pExaPixmap->fb_ptr == NULL)
return ret; return ret;
dst = pExaPixmap->sys_ptr;
dst_pitch = pExaPixmap->sys_pitch; dst_pitch = pExaPixmap->sys_pitch;
src = pExaPixmap->fb_ptr;
src_pitch = pExaPixmap->fb_pitch; src_pitch = pExaPixmap->fb_pitch;
cpp = pPixmap->drawable.bitsPerPixel / 8; cpp = pPixmap->drawable.bitsPerPixel / 8;
@ -486,21 +484,18 @@ exaAssertNotDirty (PixmapPtr pPixmap)
continue; continue;
rowbytes = (pBox->x2 - pBox->x1) * cpp; rowbytes = (pBox->x2 - pBox->x1) * cpp;
src += pBox->y1 * src_pitch + pBox->x1 * cpp; src = pExaPixmap->fb_ptr + pBox->y1 * src_pitch + pBox->x1 * cpp;
dst += pBox->y1 * dst_pitch + pBox->x1 * cpp; dst = pExaPixmap->sys_ptr + pBox->y1 * dst_pitch + pBox->x1 * cpp;
for (y = pBox->y2 - pBox->y1; y; y--) { for (y = pBox->y1; y < pBox->y2;
if (memcmp(dst + pBox->y1 * dst_pitch + pBox->x1 * cpp, y++, src += src_pitch, dst += dst_pitch) {
src + pBox->y1 * src_pitch + pBox->x1 * cpp, if (memcmp(dst, src, rowbytes) != 0) {
(pBox->x2 - pBox->x1) * cpp) != 0) {
ret = FALSE; ret = FALSE;
exaPixmapDirty(pPixmap, pBox->x1, pBox->y1, pBox->x2,
pBox->y2);
break; break;
} }
src += src_pitch;
dst += dst_pitch;
} }
src -= pBox->y1 * src_pitch + pBox->x1 * cpp;
dst -= pBox->y1 * dst_pitch + pBox->x1 * cpp;
} }
exaFinishAccess(&pPixmap->drawable, EXA_PREPARE_SRC); exaFinishAccess(&pPixmap->drawable, EXA_PREPARE_SRC);

View File

@ -54,7 +54,7 @@ ExaOffscreenValidate (ScreenPtr pScreen)
assert (area->offset >= area->base_offset && assert (area->offset >= area->base_offset &&
area->offset < (area->base_offset + area->size)); area->offset < (area->base_offset + area->size));
if (prev) if (prev)
assert (prev->base_offset + prev->area.size == area->base_offset); assert (prev->base_offset + prev->size == area->base_offset);
prev = area; prev = area;
} }
assert (prev->base_offset + prev->size == pExaScr->info->memorySize); assert (prev->base_offset + prev->size == pExaScr->info->memorySize);
@ -341,13 +341,15 @@ exaEnableDisableFBAccess (int index, Bool enable)
ScreenPtr pScreen = screenInfo.screens[index]; ScreenPtr pScreen = screenInfo.screens[index];
ExaScreenPriv (pScreen); ExaScreenPriv (pScreen);
if (!enable) { if (!enable && pExaScr->disableFbCount++ == 0) {
if (pExaScr->info->exa_minor < 1) if (pExaScr->info->exa_minor < 1)
ExaOffscreenSwapOut (pScreen); ExaOffscreenSwapOut (pScreen);
else else
ExaOffscreenEjectPixmaps (pScreen); ExaOffscreenEjectPixmaps (pScreen);
pExaScr->swappedOut = TRUE; pExaScr->swappedOut = TRUE;
} else { }
if (enable && --pExaScr->disableFbCount == 0) {
if (pExaScr->info->exa_minor < 1) if (pExaScr->info->exa_minor < 1)
ExaOffscreenSwapIn (pScreen); ExaOffscreenSwapIn (pScreen);
pExaScr->swappedOut = FALSE; pExaScr->swappedOut = FALSE;

View File

@ -113,6 +113,7 @@ typedef struct {
enum ExaMigrationHeuristic migration; enum ExaMigrationHeuristic migration;
Bool hideOffscreenPixmapData; Bool hideOffscreenPixmapData;
Bool checkDirtyCorrectness; Bool checkDirtyCorrectness;
unsigned disableFbCount;
} ExaScreenPrivRec, *ExaScreenPrivPtr; } ExaScreenPrivRec, *ExaScreenPrivPtr;
/* /*
@ -287,6 +288,10 @@ exaGetPixmapFirstPixel (PixmapPtr pPixmap);
void void
exaCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc); exaCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
Bool
exaFillRegionTiled (DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile,
DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu);
void void
exaPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what); exaPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what);
@ -317,9 +322,6 @@ ExaCheckComposite (CARD8 op,
#endif #endif
/* exa_offscreen.c */ /* exa_offscreen.c */
void
ExaOffscreenMarkUsed (PixmapPtr pPixmap);
void void
ExaOffscreenSwapOut (ScreenPtr pScreen); ExaOffscreenSwapOut (ScreenPtr pScreen);
@ -343,7 +345,8 @@ void
exaPixmapDirty(PixmapPtr pPix, int x1, int y1, int x2, int y2); exaPixmapDirty(PixmapPtr pPix, int x1, int y1, int x2, int y2);
void void
exaDrawableDirty(DrawablePtr pDrawable, int x1, int y1, int x2, int y2); exaGetDrawableDeltas (DrawablePtr pDrawable, PixmapPtr pPixmap,
int *xp, int *yp);
Bool Bool
exaDrawableIsOffscreen (DrawablePtr pDrawable); exaDrawableIsOffscreen (DrawablePtr pDrawable);

View File

@ -297,15 +297,15 @@ exaTryDriverSolidFill(PicturePtr pSrc,
nbox = REGION_NUM_RECTS(&region); nbox = REGION_NUM_RECTS(&region);
pbox = REGION_RECTS(&region); pbox = REGION_RECTS(&region);
while (nbox--) while (nbox--)
{ {
(*pExaScr->info->Solid) (pDstPix, (*pExaScr->info->Solid) (pDstPix,
pbox->x1 + dst_off_x, pbox->y1 + dst_off_y, pbox->x1 + dst_off_x, pbox->y1 + dst_off_y,
pbox->x2 + dst_off_x, pbox->y2 + dst_off_y); pbox->x2 + dst_off_x, pbox->y2 + dst_off_y);
exaPixmapDirty (pDstPix, pbox->x1 + dst_off_x, pbox->y1 + dst_off_y,
pbox->x2 + dst_off_x, pbox->y2 + dst_off_y);
pbox++; pbox++;
} }
(*pExaScr->info->DoneSolid) (pDstPix); (*pExaScr->info->DoneSolid) (pDstPix);
exaMarkSync(pDst->pDrawable->pScreen); exaMarkSync(pDst->pDrawable->pScreen);
@ -446,8 +446,6 @@ exaTryDriverComposite(CARD8 op,
pbox->y1 + dst_off_y, pbox->y1 + dst_off_y,
pbox->x2 - pbox->x1, pbox->x2 - pbox->x1,
pbox->y2 - pbox->y1); pbox->y2 - pbox->y1);
exaPixmapDirty (pDstPix, pbox->x1 + dst_off_x, pbox->y1 + dst_off_y,
pbox->x2 + dst_off_x, pbox->y2 + dst_off_y);
pbox++; pbox++;
} }
(*pExaScr->info->DoneComposite) (pDstPix); (*pExaScr->info->DoneComposite) (pDstPix);
@ -521,6 +519,9 @@ exaTryMagicTwoPassCompositeHelper(CARD8 op,
CARD16 height) CARD16 height)
{ {
ExaScreenPriv (pDst->pDrawable->pScreen); ExaScreenPriv (pDst->pDrawable->pScreen);
DrawablePtr pDstDraw = pDst->pDrawable;
PixmapPtr pDstPixmap = exaGetDrawablePixmap(pDstDraw);
int xoff, yoff;
assert(op == PictOpOver); assert(op == PictOpOver);
@ -539,6 +540,12 @@ exaTryMagicTwoPassCompositeHelper(CARD8 op,
exaComposite(PictOpOutReverse, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, exaComposite(PictOpOutReverse, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask,
xDst, yDst, width, height); xDst, yDst, width, height);
exaGetDrawableDeltas(pDstDraw, pDstPixmap, &xoff, &yoff);
xoff += pDstDraw->x;
yoff += pDstDraw->y;
exaPixmapDirty(pDstPixmap, xDst + xoff, yDst + yoff, xDst + xoff + width,
yDst + yoff + height);
/* Then, add in the source value times the destination alpha factors (1.0). /* Then, add in the source value times the destination alpha factors (1.0).
*/ */
exaComposite(PictOpAdd, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, exaComposite(PictOpAdd, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask,
@ -565,6 +572,28 @@ exaComposite(CARD8 op,
int ret = -1; int ret = -1;
Bool saveSrcRepeat = pSrc->repeat; Bool saveSrcRepeat = pSrc->repeat;
Bool saveMaskRepeat = pMask ? pMask->repeat : 0; Bool saveMaskRepeat = pMask ? pMask->repeat : 0;
ExaMigrationRec pixmaps[3];
int npixmaps = 1;
PixmapPtr pSrcPixmap = NULL;
pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = exaOpReadsDestination(op);
pixmaps[0].pPix = exaGetDrawablePixmap (pDst->pDrawable);
if (pSrc->pDrawable) {
pSrcPixmap = exaGetDrawablePixmap (pSrc->pDrawable);
pixmaps[npixmaps].as_dst = FALSE;
pixmaps[npixmaps].as_src = TRUE;
pixmaps[npixmaps].pPix = pSrcPixmap;
npixmaps++;
}
if (pMask && pMask->pDrawable) {
pixmaps[npixmaps].as_dst = FALSE;
pixmaps[npixmaps].as_src = TRUE;
pixmaps[npixmaps].pPix = exaGetDrawablePixmap (pMask->pDrawable);
npixmaps++;
}
/* We currently don't support acceleration of gradients, or other pictures /* We currently don't support acceleration of gradients, or other pictures
* with a NULL pDrawable. * with a NULL pDrawable.
@ -583,19 +612,24 @@ exaComposite(CARD8 op,
if (!pMask) if (!pMask)
{ {
if (op == PictOpSrc) if ((op == PictOpSrc &&
((pSrc->format == pDst->format) ||
(pSrc->format==PICT_a8r8g8b8 && pDst->format==PICT_x8r8g8b8) ||
(pSrc->format==PICT_a8b8g8r8 && pDst->format==PICT_x8b8g8r8))) ||
(op == PictOpOver && !pSrc->alphaMap && !pDst->alphaMap &&
pSrc->format == pDst->format &&
(pSrc->format==PICT_x8r8g8b8 || pSrc->format==PICT_x8b8g8r8)))
{ {
if (pSrc->pDrawable->width == 1 && if (pSrc->pDrawable->width == 1 &&
pSrc->pDrawable->height == 1 && pSrc->repeat && pSrc->pDrawable->height == 1 &&
pSrc->repeatType == RepeatNormal) pSrc->repeat)
{ {
ret = exaTryDriverSolidFill(pSrc, pDst, xSrc, ySrc, xDst, yDst, ret = exaTryDriverSolidFill(pSrc, pDst, xSrc, ySrc, xDst, yDst,
width, height); width, height);
if (ret == 1) if (ret == 1)
goto done; goto done;
} }
else if (!pSrc->repeat && !pSrc->transform && else if (pSrcPixmap && !pSrc->repeat && !pSrc->transform)
pSrc->format == pDst->format)
{ {
RegionRec region; RegionRec region;
@ -617,6 +651,45 @@ exaComposite(CARD8 op,
REGION_UNINIT(pDst->pDrawable->pScreen, &region); REGION_UNINIT(pDst->pDrawable->pScreen, &region);
goto done; goto done;
} }
else if (pSrcPixmap && !pSrc->transform &&
pSrc->repeatType == RepeatNormal)
{
RegionRec region;
DDXPointRec srcOrg;
/* Let's see if the driver can do the repeat in one go */
if (pExaScr->info->PrepareComposite && !pSrc->alphaMap &&
!pDst->alphaMap)
{
ret = exaTryDriverComposite(op, pSrc, pMask, pDst, xSrc,
ySrc, xMask, yMask, xDst, yDst,
width, height);
if (ret == 1)
goto done;
}
/* Now see if we can use exaFillRegionTiled() */
xDst += pDst->pDrawable->x;
yDst += pDst->pDrawable->y;
xSrc += pSrc->pDrawable->x;
ySrc += pSrc->pDrawable->y;
if (!miComputeCompositeRegion (&region, pSrc, pMask, pDst, xSrc,
ySrc, xMask, yMask, xDst, yDst,
width, height))
goto done;
srcOrg.x = (xSrc - xDst) % pSrcPixmap->drawable.width;
srcOrg.y = (ySrc - yDst) % pSrcPixmap->drawable.height;
ret = exaFillRegionTiled(pDst->pDrawable, &region, pSrcPixmap,
&srcOrg, FB_ALLONES, GXcopy);
REGION_UNINIT(pDst->pDrawable->pScreen, &region);
if (ret)
goto done;
}
} }
} }
@ -627,8 +700,8 @@ exaComposite(CARD8 op,
pMask->repeat = 0; pMask->repeat = 0;
if (pExaScr->info->PrepareComposite && if (pExaScr->info->PrepareComposite &&
(!pSrc->repeat || pSrc->repeat == RepeatNormal) && (!pSrc->repeat || pSrc->repeatType == RepeatNormal) &&
(!pMask || !pMask->repeat || pMask->repeat == RepeatNormal) && (!pMask || !pMask->repeat || pMask->repeatType == RepeatNormal) &&
!pSrc->alphaMap && (!pMask || !pMask->alphaMap) && !pDst->alphaMap) !pSrc->alphaMap && (!pMask || !pMask->alphaMap) && !pDst->alphaMap)
{ {
Bool isSrcSolid; Bool isSrcSolid;
@ -660,39 +733,14 @@ exaComposite(CARD8 op,
} }
} }
if (ret != 0) {
ExaMigrationRec pixmaps[3];
/* failure to accelerate was not due to pixmaps being in the wrong
* locations.
*/
pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = exaOpReadsDestination(op);
pixmaps[0].pPix = exaGetDrawablePixmap (pDst->pDrawable);
pixmaps[1].as_dst = FALSE;
pixmaps[1].as_src = TRUE;
pixmaps[1].pPix = exaGetDrawablePixmap (pSrc->pDrawable);
if (pMask) {
pixmaps[2].as_dst = FALSE;
pixmaps[2].as_src = TRUE;
pixmaps[2].pPix = exaGetDrawablePixmap (pMask->pDrawable);
exaDoMigration(pixmaps, 3, FALSE);
} else {
exaDoMigration(pixmaps, 2, FALSE);
}
}
fallback: fallback:
#if DEBUG_TRACE_FALL #if DEBUG_TRACE_FALL
exaPrintCompositeFallback (op, pSrc, pMask, pDst); exaPrintCompositeFallback (op, pSrc, pMask, pDst);
#endif #endif
exaDoMigration(pixmaps, npixmaps, FALSE);
ExaCheckComposite (op, pSrc, pMask, pDst, xSrc, ySrc, ExaCheckComposite (op, pSrc, pMask, pDst, xSrc, ySrc,
xMask, yMask, xDst, yDst, width, height); xMask, yMask, xDst, yDst, width, height);
exaDrawableDirty(pDst->pDrawable,
pDst->pDrawable->x + xDst,
pDst->pDrawable->y + yDst,
pDst->pDrawable->x + xDst + width,
pDst->pDrawable->y + yDst + height);
done: done:
pSrc->repeat = saveSrcRepeat; pSrc->repeat = saveSrcRepeat;
@ -716,6 +764,7 @@ exaRasterizeTrapezoid (PicturePtr pPicture, xTrapezoid *trap,
{ {
DrawablePtr pDraw = pPicture->pDrawable; DrawablePtr pDraw = pPicture->pDrawable;
ExaMigrationRec pixmaps[1]; ExaMigrationRec pixmaps[1];
int xoff, yoff;
pixmaps[0].as_dst = TRUE; pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = TRUE; pixmaps[0].as_src = TRUE;
@ -724,8 +773,10 @@ exaRasterizeTrapezoid (PicturePtr pPicture, xTrapezoid *trap,
exaPrepareAccess(pDraw, EXA_PREPARE_DEST); exaPrepareAccess(pDraw, EXA_PREPARE_DEST);
fbRasterizeTrapezoid(pPicture, trap, x_off, y_off); fbRasterizeTrapezoid(pPicture, trap, x_off, y_off);
exaDrawableDirty(pDraw, pDraw->x, pDraw->y, exaGetDrawableDeltas(pDraw, pixmaps[0].pPix, &xoff, &yoff);
pDraw->x + pDraw->width, pDraw->y + pDraw->height); exaPixmapDirty(pixmaps[0].pPix, pDraw->x + xoff, pDraw->y + yoff,
pDraw->x + xoff + pDraw->width,
pDraw->y + yoff + pDraw->height);
exaFinishAccess(pDraw, EXA_PREPARE_DEST); exaFinishAccess(pDraw, EXA_PREPARE_DEST);
} }
@ -739,6 +790,7 @@ exaAddTriangles (PicturePtr pPicture, INT16 x_off, INT16 y_off, int ntri,
{ {
DrawablePtr pDraw = pPicture->pDrawable; DrawablePtr pDraw = pPicture->pDrawable;
ExaMigrationRec pixmaps[1]; ExaMigrationRec pixmaps[1];
int xoff, yoff;
pixmaps[0].as_dst = TRUE; pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = TRUE; pixmaps[0].as_src = TRUE;
@ -747,8 +799,10 @@ exaAddTriangles (PicturePtr pPicture, INT16 x_off, INT16 y_off, int ntri,
exaPrepareAccess(pDraw, EXA_PREPARE_DEST); exaPrepareAccess(pDraw, EXA_PREPARE_DEST);
fbAddTriangles(pPicture, x_off, y_off, ntri, tris); fbAddTriangles(pPicture, x_off, y_off, ntri, tris);
exaDrawableDirty(pDraw, pDraw->x, pDraw->y, exaGetDrawableDeltas(pDraw, pixmaps[0].pPix, &xoff, &yoff);
pDraw->x + pDraw->width, pDraw->y + pDraw->height); exaPixmapDirty(pixmaps[0].pPix, pDraw->x + xoff, pDraw->y + yoff,
pDraw->x + xoff + pDraw->width,
pDraw->y + yoff + pDraw->height);
exaFinishAccess(pDraw, EXA_PREPARE_DEST); exaFinishAccess(pDraw, EXA_PREPARE_DEST);
} }
@ -845,10 +899,11 @@ exaGlyphs (CARD8 op,
PixmapPtr pPixmap = NULL; PixmapPtr pPixmap = NULL;
PicturePtr pPicture; PicturePtr pPicture;
PixmapPtr pMaskPixmap = NULL; PixmapPtr pMaskPixmap = NULL;
PixmapPtr pDstPixmap = exaGetDrawablePixmap(pDst->pDrawable);
PicturePtr pMask; PicturePtr pMask;
ScreenPtr pScreen = pDst->pDrawable->pScreen; ScreenPtr pScreen = pDst->pDrawable->pScreen;
int width = 0, height = 0; int width = 0, height = 0;
int x, y; int x, y, x1, y1, xoff, yoff;
int xDst = list->xOff, yDst = list->yOff; int xDst = list->xOff, yDst = list->yOff;
int n; int n;
int error; int error;
@ -893,6 +948,11 @@ exaGlyphs (CARD8 op,
miGlyphExtents (nlist, list, glyphs, &extents); miGlyphExtents (nlist, list, glyphs, &extents);
extents.x1 = max(extents.x1, 0);
extents.y1 = max(extents.y1, 0);
extents.x2 = min(extents.x2, pDst->pDrawable->width);
extents.y2 = min(extents.y2, pDst->pDrawable->height);
if (extents.x2 <= extents.x1 || extents.y2 <= extents.y1) if (extents.x2 <= extents.x1 || extents.y2 <= extents.y1)
return; return;
width = extents.x2 - extents.x1; width = extents.x2 - extents.x1;
@ -918,6 +978,7 @@ exaGlyphs (CARD8 op,
rect.width = width; rect.width = width;
rect.height = height; rect.height = height;
(*pGC->ops->PolyFillRect) (&pMaskPixmap->drawable, pGC, 1, &rect); (*pGC->ops->PolyFillRect) (&pMaskPixmap->drawable, pGC, 1, &rect);
exaPixmapDirty(pMaskPixmap, 0, 0, width, height);
FreeScratchGC (pGC); FreeScratchGC (pGC);
x = -extents.x1; x = -extents.x1;
y = -extents.y1; y = -extents.y1;
@ -929,6 +990,8 @@ exaGlyphs (CARD8 op,
y = 0; y = 0;
} }
exaGetDrawableDeltas(pDst->pDrawable, pDstPixmap, &xoff, &yoff);
while (nlist--) while (nlist--)
{ {
GCPtr pGC = NULL; GCPtr pGC = NULL;
@ -983,12 +1046,20 @@ exaGlyphs (CARD8 op,
pixmaps[0].as_dst = TRUE; pixmaps[0].as_dst = TRUE;
pixmaps[0].as_src = TRUE; pixmaps[0].as_src = TRUE;
pixmaps[0].pPix = pPixmap; pixmaps[0].pPix = pPixmap;
exaDoMigration (pixmaps, 1, TRUE); exaDoMigration (pixmaps, 1, pExaScr->info->PrepareComposite != NULL);
while (n--) while (n--)
{ {
GlyphPtr glyph = *glyphs++; GlyphPtr glyph = *glyphs++;
pointer glyphdata = (pointer) (glyph + 1); pointer glyphdata = (pointer) (glyph + 1);
DrawablePtr pCmpDrw = (maskFormat ? pMask : pDst)->pDrawable;
x1 = x - glyph->info.x;
y1 = y - glyph->info.y;
if (x1 >= pCmpDrw->width || y1 >= pCmpDrw->height ||
(x1 + glyph->info.width) <= 0 || (y1 + glyph->info.height) <= 0)
goto nextglyph;
(*pScreen->ModifyPixmapHeader) (pScratchPixmap, (*pScreen->ModifyPixmapHeader) (pScratchPixmap,
glyph->info.width, glyph->info.width,
@ -1048,17 +1119,22 @@ exaGlyphs (CARD8 op,
if (maskFormat) if (maskFormat)
{ {
exaComposite (PictOpAdd, pPicture, NULL, pMask, 0, 0, 0, 0, exaComposite (PictOpAdd, pPicture, NULL, pMask, 0, 0, 0, 0,
x - glyph->info.x, y - glyph->info.y, x1, y1, glyph->info.width, glyph->info.height);
glyph->info.width, glyph->info.height); exaPixmapDirty(pMaskPixmap, x1, y1, x1 + glyph->info.width,
y1 + glyph->info.height);
} }
else else
{ {
exaComposite (op, pSrc, pPicture, pDst, exaComposite (op, pSrc, pPicture, pDst,
xSrc + (x - glyph->info.x) - xDst, xSrc + x1 - xDst, ySrc + y1 - yDst,
ySrc + (y - glyph->info.y) - yDst, 0, 0, x1, y1, glyph->info.width,
0, 0, x - glyph->info.x, y - glyph->info.y, glyph->info.height);
glyph->info.width, glyph->info.height); x1 += pDst->pDrawable->x + xoff;
y1 += pDst->pDrawable->y + yoff;
exaPixmapDirty(pDstPixmap, x1, y1, x1 + glyph->info.width,
y1 + glyph->info.height);
} }
nextglyph:
x += glyph->info.xOff; x += glyph->info.xOff;
y += glyph->info.yOff; y += glyph->info.yOff;
} }

View File

@ -88,10 +88,15 @@ ExaCheckPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth,
int x, int y, int w, int h, int leftPad, int format, int x, int y, int w, int h, int leftPad, int format,
char *bits) char *bits)
{ {
PixmapPtr pPixmap = exaGetDrawablePixmap(pDrawable);
int xoff, yoff;
EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable))); EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
exaPrepareAccess (pDrawable, EXA_PREPARE_DEST); exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
fbPutImage (pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits); fbPutImage (pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits);
exaFinishAccess (pDrawable, EXA_PREPARE_DEST); exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
exaGetDrawableDeltas(pDrawable, pPixmap, &xoff, &yoff);
exaPixmapDirty(pPixmap, x + xoff, y + yoff, x + xoff + w, y + yoff + h);
} }
RegionPtr RegionPtr
@ -201,32 +206,11 @@ ExaCheckPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
{ {
EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable))); EXA_FALLBACK(("to %p (%c)\n", pDrawable, exaDrawableLocation(pDrawable)));
if (nrect) { exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
int x1 = max(prect->x, 0), y1 = max(prect->y, 0); exaPrepareAccessGC (pGC);
int x2 = min(prect->x + prect->width, pDrawable->width); fbPolyFillRect (pDrawable, pGC, nrect, prect);
int y2 = min(prect->y + prect->height, pDrawable->height); exaFinishAccessGC (pGC);
exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
exaPrepareAccess (pDrawable, EXA_PREPARE_DEST);
exaPrepareAccessGC (pGC);
fbPolyFillRect (pDrawable, pGC, nrect, prect);
exaFinishAccessGC (pGC);
exaFinishAccess (pDrawable, EXA_PREPARE_DEST);
/* Only track bounding box of damage, as this path can degenerate to
* zillions of damage boxes
*/
while (--nrect)
{
prect++;
x1 = min(x1, prect->x);
x2 = max(x2, prect->x + prect->width);
y1 = min(y1, prect->y);
y2 = max(y2, prect->y + prect->height);
}
exaDrawableDirty (pDrawable, pDrawable->x + x1, pDrawable->y + y1,
pDrawable->x + x2, pDrawable->y + y2);
}
} }
void void

View File

@ -42,7 +42,6 @@ libfb_la_SOURCES = \
fbblt.c \ fbblt.c \
fbbltone.c \ fbbltone.c \
fbbstore.c \ fbbstore.c \
fbcompose.c \
fbcopy.c \ fbcopy.c \
fbfill.c \ fbfill.c \
fbfillrect.c \ fbfillrect.c \

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -82,6 +82,32 @@ void fbCompositeSrc_8888x8888mmx (CARD8 op,
INT16 yDst, INT16 yDst,
CARD16 width, CARD16 width,
CARD16 height); CARD16 height);
void
fbCompositeSolidMaskSrc_nx8x8888mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void
fbCompositeSrc_x888x8x8888mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeSolidMask_nx8888x8888Cmmx (CARD8 op, void fbCompositeSolidMask_nx8888x8888Cmmx (CARD8 op,
PicturePtr pSrc, PicturePtr pSrc,
PicturePtr pMask, PicturePtr pMask,
@ -106,6 +132,42 @@ void fbCompositeSolidMask_nx8x8888mmx (CARD8 op,
INT16 yDst, INT16 yDst,
CARD16 width, CARD16 width,
CARD16 height); CARD16 height);
void fbCompositeIn_nx8x8mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeIn_8x8mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeSrcAdd_8888x8x8mmx (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void fbCompositeSrcAdd_8000x8000mmx (CARD8 op, void fbCompositeSrcAdd_8000x8000mmx (CARD8 op,
PicturePtr pSrc, PicturePtr pSrc,
PicturePtr pMask, PicturePtr pMask,

File diff suppressed because it is too large Load Diff

View File

@ -121,7 +121,15 @@ fbCanGetSolid(PicturePtr pict)
break; \ break; \
case 16: \ case 16: \
(bits) = READ((CARD16 *) __bits__); \ (bits) = READ((CARD16 *) __bits__); \
(bits) = cvt0565to8888(bits); \ (bits) = cvt0565to0888(bits); \
break; \
case 8: \
(bits) = READ((CARD8 *) __bits__); \
(bits) = (bits) << 24; \
break; \
case 1: \
(bits) = READ((CARD32 *) __bits__); \
(bits) = FbLeftStipBits((bits),1) ? 0xff000000 : 0x00000000;\
break; \ break; \
default: \ default: \
return; \ return; \
@ -153,7 +161,7 @@ fbCanGetSolid(PicturePtr pict)
#define cvt8888to0565(s) ((((s) >> 3) & 0x001f) | \ #define cvt8888to0565(s) ((((s) >> 3) & 0x001f) | \
(((s) >> 5) & 0x07e0) | \ (((s) >> 5) & 0x07e0) | \
(((s) >> 8) & 0xf800)) (((s) >> 8) & 0xf800))
#define cvt0565to8888(s) (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \ #define cvt0565to0888(s) (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \
((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \ ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \
((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000))) ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000)))
@ -375,6 +383,9 @@ typedef struct _FbComposeData {
CARD16 height; CARD16 height;
} FbComposeData; } FbComposeData;
void
fbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer);
typedef FASTCALL void (*CombineMaskU) (CARD32 *src, const CARD32 *mask, int width); typedef FASTCALL void (*CombineMaskU) (CARD32 *src, const CARD32 *mask, int width);
typedef FASTCALL void (*CombineFuncU) (CARD32 *dest, const CARD32 *src, int width); typedef FASTCALL void (*CombineFuncU) (CARD32 *dest, const CARD32 *src, int width);
typedef FASTCALL void (*CombineFuncC) (CARD32 *dest, CARD32 *src, CARD32 *mask, int width); typedef FASTCALL void (*CombineFuncC) (CARD32 *dest, CARD32 *src, CARD32 *mask, int width);
@ -414,197 +425,6 @@ fbRasterizeEdges (FbBits *buf,
xFixed b); xFixed b);
/* fbpict.c */ /* fbpict.c */
CARD32
fbOver (CARD32 x, CARD32 y);
CARD32
fbOver24 (CARD32 x, CARD32 y);
CARD32
fbIn (CARD32 x, CARD8 y);
void
fbCompositeSolidMask_nx8x8888 (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void
fbCompositeSolidMask_nx8x0888 (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void
fbCompositeSolidMask_nx8888x8888C (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void
fbCompositeSolidMask_nx8x0565 (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void
fbCompositeSolidMask_nx8888x0565C (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void
fbCompositeSrc_8888x8888 (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void
fbCompositeSrc_8888x0888 (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void
fbCompositeSrc_8888x0565 (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void
fbCompositeSrc_0565x0565 (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void
fbCompositeSrcAdd_8000x8000 (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void
fbCompositeSrcAdd_8888x8888 (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void
fbCompositeSrcAdd_1000x1000 (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void
fbCompositeSolidMask_nx1xn (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void void
fbComposite (CARD8 op, fbComposite (CARD8 op,
PicturePtr pSrc, PicturePtr pSrc,
@ -619,6 +439,36 @@ fbComposite (CARD8 op,
CARD16 width, CARD16 width,
CARD16 height); CARD16 height);
typedef void (*CompositeFunc) (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
void
fbWalkCompositeRegion (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height,
Bool srcRepeat,
Bool maskRepeat,
CompositeFunc compositeRect);
/* fbtrap.c */ /* fbtrap.c */
void void

View File

@ -117,6 +117,9 @@ fbRasterizeTrapezoid (PicturePtr pPicture,
RenderEdge l, r; RenderEdge l, r;
xFixed t, b; xFixed t, b;
if (!xTrapezoidValid (trap))
return;
fbGetDrawable (pPicture->pDrawable, buf, stride, bpp, pxoff, pyoff); fbGetDrawable (pPicture->pDrawable, buf, stride, bpp, pxoff, pyoff);
width = pPicture->pDrawable->width; width = pPicture->pDrawable->width;

View File

@ -66,7 +66,7 @@
((year-2000) * 10000) + \ ((year-2000) * 10000) + \
((month) * 100) + \ ((month) * 100) + \
((day) * 1) ((day) * 1)
#define VENDOR_RELEASE DMX_VENDOR_RELEASE(1,2,2004,6,30) #define VENDOR_RELEASE DMX_VENDOR_RELEASE(1,2,2007,4,24)
#define VENDOR_STRING "DMX Project" #define VENDOR_STRING "DMX Project"
/* Enable the DMX extension */ /* Enable the DMX extension */

View File

@ -67,7 +67,7 @@ extern void __glXFreeGLXPixmap( __GLXpixmap *pGlxPixmap );
extern void __glXNoSuchRenderOpcode(GLbyte*); extern void __glXNoSuchRenderOpcode(GLbyte*);
extern int __glXNoSuchSingleOpcode(__GLXclientState*, GLbyte*); extern int __glXNoSuchSingleOpcode(__GLXclientState*, GLbyte*);
extern void __glXErrorCallBack(__GLinterface *gc, GLenum code); extern void __glXErrorCallBack(GLenum code);
extern void __glXClearErrorOccured(void); extern void __glXClearErrorOccured(void);
extern GLboolean __glXErrorOccured(void); extern GLboolean __glXErrorOccured(void);
extern void __glXResetLargeCommandStatus(__GLXclientState*); extern void __glXResetLargeCommandStatus(__GLXclientState*);

View File

@ -23,14 +23,20 @@ if KDRIVELINUX
LINUX_SUBDIRS = linux LINUX_SUBDIRS = linux
endif endif
SUBDIRS = \ SERVER_SUBDIRS = \
src \
$(LINUX_SUBDIRS) \
$(XSDL_SUBDIRS) \ $(XSDL_SUBDIRS) \
$(FBDEV_SUBDIRS) \ $(FBDEV_SUBDIRS) \
$(VESA_SUBDIRS) \ $(VESA_SUBDIRS) \
$(XEPHYR_SUBDIRS) \ $(XEPHYR_SUBDIRS) \
$(XFAKE_SUBDIRS) $(XFAKE_SUBDIRS)
SUBDIRS = \
src \
$(LINUX_SUBDIRS) \
$(SERVER_SUBDIRS)
DIST_SUBDIRS = vesa ati chips epson i810 mach64 mga neomagic nvidia pm2 r128 \ DIST_SUBDIRS = vesa ati chips epson i810 mach64 mga neomagic nvidia pm2 r128 \
smi via fbdev sdl ephyr src linux fake sis300 smi via fbdev sdl ephyr src linux fake sis300
relink:
@for i in $(SERVER_SUBDIRS) ; do make -C $$i relink ; done

View File

@ -62,3 +62,6 @@ Xati_LDADD = \
$(ATI_LIBS) \ $(ATI_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -24,3 +24,6 @@ Xchips_LDADD = \
$(CHIPS_LIBS) \ $(CHIPS_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -29,3 +29,6 @@ Xephyr_LDADD = \
../../../exa/libexa.la \ ../../../exa/libexa.la \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XEPHYR_LIBS@ @XEPHYR_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -24,3 +24,6 @@ Xepson_LDADD = \
$(EPSON_LIBS) \ $(EPSON_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -20,3 +20,6 @@ Xfake_LDADD = \
libfake.a \ libfake.a \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -18,4 +18,7 @@ Xfbdev_LDADD = \
libfbdev.a \ libfbdev.a \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)
endif endif

View File

@ -27,3 +27,6 @@ Xi810_LDADD = \
$(I810_LIBS) \ $(I810_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -31,3 +31,6 @@ Xmach64_LDADD = \
$(MACH64_LIBS) \ $(MACH64_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -26,3 +26,6 @@ Xmga_LDADD = \
$(MGA_LIBS) \ $(MGA_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -38,3 +38,6 @@ Xneomagic_LDADD = \
$(NEOMAGIC_LIBS) \ $(NEOMAGIC_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -27,3 +27,6 @@ Xnvidia_LDADD = \
$(NVIDIA_LIBS) \ $(NVIDIA_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -25,3 +25,6 @@ Xpm2_LDADD = \
$(PM2_LIBS) \ $(PM2_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -24,3 +24,6 @@ Xr128_LDADD = \
$(R128_LIBS) \ $(R128_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -11,3 +11,6 @@ Xsdl_LDADD = @KDRIVE_PURE_LIBS@ \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ \ @XSERVER_LIBS@ \
@XSDL_LIBS@ @XSDL_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -38,3 +38,6 @@ Xsis_LDADD = \
$(SIS_LIBS) \ $(SIS_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
$(TSLIB_FLAG) $(TSLIB_FLAG)
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -29,3 +29,6 @@ Xsmi_LDADD = \
$(SMI_LIBS) \ $(SMI_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -23,3 +23,6 @@ Xvesa_LDADD = \
libvesa.a \ libvesa.a \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -25,3 +25,6 @@ Xvia_LDADD = \
$(VIA_LIBS) \ $(VIA_LIBS) \
@KDRIVE_LIBS@ \ @KDRIVE_LIBS@ \
@XSERVER_LIBS@ @XSERVER_LIBS@
relink:
rm -f $(bin_PROGRAMS) && make $(bin_PROGRAMS)

View File

@ -254,6 +254,7 @@ xf86ModulelistFromConfig(pointer **optlist)
char *ignore[] = { "GLcore", "speedo", "bitmap", "drm", NULL }; char *ignore[] = { "GLcore", "speedo", "bitmap", "drm", NULL };
pointer *optarray; pointer *optarray;
XF86LoadPtr modp; XF86LoadPtr modp;
Bool found;
/* /*
* make sure the config file has been parsed and that we have a * make sure the config file has been parsed and that we have a
@ -266,35 +267,76 @@ xf86ModulelistFromConfig(pointer **optlist)
} }
if (xf86configptr->conf_modules) { if (xf86configptr->conf_modules) {
/* /* Walk the disable list and let people know what we've parsed to
* Walk the list of modules in the "Module" section to determine how * not be loaded
* many we have. */
*/ modp = xf86configptr->conf_modules->mod_disable_lst;
modp = xf86configptr->conf_modules->mod_load_lst; while (modp) {
while (modp) { xf86Msg(X_WARNING, "\"%s\" will not be loaded unless you've specified it to be loaded elsewhere.\n", modp->load_name);
for (i = 0; ignore[i]; i++) { modp = (XF86LoadPtr) modp->list.next;
if (strcmp(modp->load_name, ignore[i]) == 0) }
modp->ignore = 1; /*
* Walk the default settings table. For each module listed to be
* loaded, make sure it's in the mod_load_lst. If it's not, make
* sure it's not in the mod_no_load_lst. If it's not disabled,
* append it to mod_load_lst
*/
for (i=0 ; ModuleDefaults[i].name != NULL ; i++) {
if (ModuleDefaults[i].toLoad == FALSE) {
xf86Msg(X_WARNING, "\"%s\" is not to be loaded by default. Skipping.\n", ModuleDefaults[i].name);
continue;
} }
if (!modp->ignore) found = FALSE;
count++; modp = xf86configptr->conf_modules->mod_load_lst;
modp = (XF86LoadPtr) modp->list.next; while (modp) {
} if (strcmp(modp->load_name, ModuleDefaults[i].name) == 0) {
xf86Msg(X_INFO, "\"%s\" will be loaded. This was enabled by default and also specified in the config file.\n", ModuleDefaults[i].name);
found = TRUE;
break;
}
modp = (XF86LoadPtr) modp->list.next;
}
if (found == FALSE) {
modp = xf86configptr->conf_modules->mod_disable_lst;
while (modp) {
if (strcmp(modp->load_name, ModuleDefaults[i].name) == 0) {
xf86Msg(X_INFO, "\"%s\" will be loaded even though the default is to disable it.\n", ModuleDefaults[i].name);
found = TRUE;
break;
}
modp = (XF86LoadPtr) modp->list.next;
}
}
if (found == FALSE) {
XF86ConfModulePtr ptr = xf86configptr->conf_modules;
ptr = xf86addNewLoadDirective(ptr, ModuleDefaults[i].name, XF86_LOAD_MODULE, ModuleDefaults[i].load_opt);
xf86Msg(X_INFO, "\"%s\" will be loaded by default.\n", ModuleDefaults[i].name);
}
}
} else { } else {
xf86configptr->conf_modules = xnfcalloc(1, sizeof(XF86ConfModuleRec)); xf86configptr->conf_modules = xnfcalloc(1, sizeof(XF86ConfModuleRec));
for (i=0 ; ModuleDefaults[i].name != NULL ; i++) {
if (ModuleDefaults[i].toLoad == TRUE) {
XF86ConfModulePtr ptr = xf86configptr->conf_modules;
ptr = xf86addNewLoadDirective(ptr, ModuleDefaults[i].name, XF86_LOAD_MODULE, ModuleDefaults[i].load_opt);
}
}
} }
if (count == 0) { /*
XF86ConfModulePtr ptr = xf86configptr->conf_modules; * Walk the list of modules in the "Module" section to determine how
ptr = xf86addNewLoadDirective(ptr, "extmod", XF86_LOAD_MODULE, NULL); * many we have.
ptr = xf86addNewLoadDirective(ptr, "dbe", XF86_LOAD_MODULE, NULL); */
ptr = xf86addNewLoadDirective(ptr, "glx", XF86_LOAD_MODULE, NULL); modp = xf86configptr->conf_modules->mod_load_lst;
ptr = xf86addNewLoadDirective(ptr, "freetype", XF86_LOAD_MODULE, NULL); while (modp) {
ptr = xf86addNewLoadDirective(ptr, "type1", XF86_LOAD_MODULE, NULL); for (i = 0; ignore[i]; i++) {
ptr = xf86addNewLoadDirective(ptr, "record", XF86_LOAD_MODULE, NULL); if (strcmp(modp->load_name, ignore[i]) == 0)
ptr = xf86addNewLoadDirective(ptr, "dri", XF86_LOAD_MODULE, NULL); modp->ignore = 1;
count = 7; }
} if (!modp->ignore)
count++;
modp = (XF86LoadPtr) modp->list.next;
}
/* /*
* allocate the memory and walk the list again to fill in the pointers * allocate the memory and walk the list again to fill in the pointers
@ -303,22 +345,22 @@ xf86ModulelistFromConfig(pointer **optlist)
optarray = xnfalloc((count + 1) * sizeof(pointer)); optarray = xnfalloc((count + 1) * sizeof(pointer));
count = 0; count = 0;
if (xf86configptr->conf_modules) { if (xf86configptr->conf_modules) {
modp = xf86configptr->conf_modules->mod_load_lst; modp = xf86configptr->conf_modules->mod_load_lst;
while (modp) { while (modp) {
if (!modp->ignore) { if (!modp->ignore) {
modulearray[count] = modp->load_name; modulearray[count] = modp->load_name;
optarray[count] = modp->load_opt; optarray[count] = modp->load_opt;
count++; count++;
} }
modp = (XF86LoadPtr) modp->list.next; modp = (XF86LoadPtr) modp->list.next;
} }
} }
modulearray[count] = NULL; modulearray[count] = NULL;
optarray[count] = NULL; optarray[count] = NULL;
if (optlist) if (optlist)
*optlist = optarray; *optlist = optarray;
else else
xfree(optarray); xfree(optarray);
return modulearray; return modulearray;
} }
@ -565,16 +607,24 @@ configFiles(XF86ConfFilesPtr fileconf)
char *log_buf; char *log_buf;
/* FontPath */ /* FontPath */
/* Try XF86Config FontPath first */ /* Try XF86Config FontPath first */
if (!xf86fpFlag) { if (!xf86fpFlag) {
if (fileconf) { if (fileconf) {
if (fileconf->file_fontpath) { if (fileconf->file_fontpath) {
char *f = xf86ValidateFontPath(fileconf->file_fontpath); char *f = xf86ValidateFontPath(fileconf->file_fontpath);
pathFrom = X_CONFIG; pathFrom = X_CONFIG;
if (*f) if (*f) {
defaultFontPath = f; if (xf86Info.useDefaultFontPath) {
else { xf86Msg(X_WARNING, "Including the default font path %s.\n", defaultFontPath);
char *g = xnfalloc(strlen(defaultFontPath) + strlen(f) + 3);
strcpy(g, f);
strcat(g, ",");
defaultFontPath = strcat(g, defaultFontPath);
xfree(f);
} else {
defaultFontPath = f;
}
} else {
xf86Msg(X_WARNING, xf86Msg(X_WARNING,
"FontPath is completely invalid. Using compiled-in default.\n"); "FontPath is completely invalid. Using compiled-in default.\n");
fontPath = NULL; fontPath = NULL;
@ -742,6 +792,7 @@ typedef enum {
FLAG_AIGLX, FLAG_AIGLX,
FLAG_IGNORE_ABI, FLAG_IGNORE_ABI,
FLAG_ALLOW_EMPTY_INPUT, FLAG_ALLOW_EMPTY_INPUT,
FLAG_USE_DEFAULT_FONT_PATH
} FlagValues; } FlagValues;
static OptionInfoRec FlagOptions[] = { static OptionInfoRec FlagOptions[] = {
@ -817,6 +868,8 @@ static OptionInfoRec FlagOptions[] = {
{0}, FALSE }, {0}, FALSE },
{ FLAG_IGNORE_ABI, "IgnoreABI", OPTV_BOOLEAN, { FLAG_IGNORE_ABI, "IgnoreABI", OPTV_BOOLEAN,
{0}, FALSE }, {0}, FALSE },
{ FLAG_USE_DEFAULT_FONT_PATH, "UseDefaultFontPath", OPTV_BOOLEAN,
{0}, FALSE },
{ -1, NULL, OPTV_NONE, { -1, NULL, OPTV_NONE,
{0}, FALSE }, {0}, FALSE },
}; };
@ -1016,6 +1069,13 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts)
if (xf86GetOptValBool(FlagOptions, FLAG_ALLOW_EMPTY_INPUT, &value)) if (xf86GetOptValBool(FlagOptions, FLAG_ALLOW_EMPTY_INPUT, &value))
xf86Info.allowEmptyInput = TRUE; xf86Info.allowEmptyInput = TRUE;
xf86Info.useDefaultFontPath = TRUE;
xf86Info.useDefaultFontPathFrom = X_DEFAULT;
if (xf86GetOptValBool(FlagOptions, FLAG_USE_DEFAULT_FONT_PATH, &value)) {
xf86Info.useDefaultFontPath = value;
xf86Info.useDefaultFontPathFrom = X_CONFIG;
}
/* Make sure that timers don't overflow CARD32's after multiplying */ /* Make sure that timers don't overflow CARD32's after multiplying */
#define MAX_TIME_IN_MIN (0x7fffffff / MILLI_PER_MIN) #define MAX_TIME_IN_MIN (0x7fffffff / MILLI_PER_MIN)
@ -1749,7 +1809,7 @@ configImpliedLayout(serverLayoutPtr servlayoutp, XF86ConfScreenPtr conf_screen)
indp = xnfalloc(sizeof(IDevRec)); indp = xnfalloc(sizeof(IDevRec));
indp->identifier = NULL; indp->identifier = NULL;
servlayoutp->inputs = indp; servlayoutp->inputs = indp;
if (!xf86Info.allowEmptyInput && checkCoreInputDevices(servlayoutp, TRUE)) if (!xf86Info.allowEmptyInput && !checkCoreInputDevices(servlayoutp, TRUE))
return FALSE; return FALSE;
return TRUE; return TRUE;
@ -2451,9 +2511,9 @@ xf86HandleConfigFile(Bool autoconfig)
/* Now process everything else */ /* Now process everything else */
if (!configFiles(xf86configptr->conf_files) || if (!configServerFlags(xf86configptr->conf_flags,
!configServerFlags(xf86configptr->conf_flags,
xf86ConfigLayout.options) || xf86ConfigLayout.options) ||
!configFiles(xf86configptr->conf_files) ||
!configExtensions(xf86configptr->conf_extensions) !configExtensions(xf86configptr->conf_extensions)
#ifdef XF86DRI #ifdef XF86DRI
|| !configDRI(xf86configptr->conf_dri) || !configDRI(xf86configptr->conf_dri)

View File

@ -33,6 +33,8 @@
#ifndef _xf86_config_h #ifndef _xf86_config_h
#define _xf86_config_h #define _xf86_config_h
#include "xf86Optrec.h"
#ifdef HAVE_PARSER_DECLS #ifdef HAVE_PARSER_DECLS
/* /*
* global structure that holds the result of parsing the config file * global structure that holds the result of parsing the config file
@ -46,6 +48,23 @@ typedef enum _ConfigStatus {
CONFIG_NOFILE CONFIG_NOFILE
} ConfigStatus; } ConfigStatus;
typedef struct _ModuleDefault {
char *name;
Bool toLoad;
XF86OptionPtr load_opt;
} ModuleDefault;
static ModuleDefault ModuleDefaults[] = {
{.name = "extmod", .toLoad = TRUE, .load_opt=NULL},
{.name = "dbe", .toLoad = TRUE, .load_opt=NULL},
{.name = "glx", .toLoad = TRUE, .load_opt=NULL},
{.name = "freetype", .toLoad = TRUE, .load_opt=NULL},
{.name = "type1", .toLoad = TRUE, .load_opt=NULL},
{.name = "record", .toLoad = TRUE, .load_opt=NULL},
{.name = "dri", .toLoad = TRUE, .load_opt=NULL},
{.name = NULL, .toLoad = FALSE, .load_opt=NULL}
};
/* /*
* prototypes * prototypes
*/ */

View File

@ -120,6 +120,8 @@ typedef struct {
MessageType randRFrom; MessageType randRFrom;
Bool aiglx; Bool aiglx;
MessageType aiglxFrom; MessageType aiglxFrom;
Bool useDefaultFontPath;
MessageType useDefaultFontPathFrom;
Bool ignoreABI; Bool ignoreABI;
struct { struct {
Bool disabled; /* enable/disable deactivating Bool disabled; /* enable/disable deactivating

View File

@ -764,4 +764,48 @@ xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum)
} }
} }
/**
* Deactivate a device. Call this function from the driver if you receive a
* read error or something else that spoils your day.
* Device will be moved to the off_devices list, but it will still be there
* until you really clean up after it.
* Notifies the client about an inactive device.
*
* @param panic True if device is unrecoverable and needs to be removed.
*/
_X_EXPORT void
xf86DisableDevice(DeviceIntPtr dev, Bool panic)
{
devicePresenceNotify ev;
DeviceIntRec dummyDev;
if(!panic)
{
DisableDevice(dev);
} else
{
ev.type = DevicePresenceNotify;
ev.time = currentTime.milliseconds;
ev.devchange = DeviceUnrecoverable;
ev.deviceid = dev->id;
dummyDev.id = 0;
SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
(xEvent *) &ev, 1);
DeleteInputDeviceRequest(dev);
}
}
/**
* Reactivate a device. Call this function from the driver if you just found
* out that the read error wasn't quite that bad after all.
* Device will be re-activated, and an event sent to the client.
*/
_X_EXPORT void
xf86EnableDevice(DeviceIntPtr dev)
{
EnableDevice(dev);
}
/* end of xf86Xinput.c */ /* end of xf86Xinput.c */

View File

@ -187,6 +187,8 @@ void xf86InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, int minval,
void xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum); void xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum);
void xf86AddEnabledDevice(InputInfoPtr pInfo); void xf86AddEnabledDevice(InputInfoPtr pInfo);
void xf86RemoveEnabledDevice(InputInfoPtr pInfo); void xf86RemoveEnabledDevice(InputInfoPtr pInfo);
void xf86DisableDevice(DeviceIntPtr dev, Bool panic);
void xf86EnableDevice(DeviceIntPtr dev);
/* xf86Helper.c */ /* xf86Helper.c */
void xf86AddInputDriver(InputDriverPtr driver, pointer module, int flags); void xf86AddInputDriver(InputDriverPtr driver, pointer module, int flags);
@ -204,6 +206,7 @@ int xf86GetMotionEvents(DeviceIntPtr dev, xTimecoord *buff,
void xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts, void xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts,
pointer extraOpts); pointer extraOpts);
/* Legacy hatred */ /* Legacy hatred */
#define SendCoreEvents 59 #define SendCoreEvents 59
#define DontSendCoreEvents 60 #define DontSendCoreEvents 60

View File

@ -1,361 +0,0 @@
/*
* Copyright 2006 Luc Verhaegen.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sub license,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
#include "xf86.h"
#include "xf86DDC.h"
#include <X11/Xatom.h>
#include "property.h"
#include "propertyst.h"
#include "xf86DDC.h"
/*
* TODO:
* - for those with access to the VESA DMT standard; review please.
*/
#define MODEPREFIX(name) NULL, NULL, name, 0,M_T_DRIVER
#define MODESUFFIX 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,FALSE,FALSE,0,NULL,0,0.0,0.0
DisplayModeRec DDCEstablishedModes[17] = {
{ MODEPREFIX("800x600"), 40000, 800, 840, 968, 1056, 0, 600, 601, 605, 628, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@60Hz */
{ MODEPREFIX("800x600"), 36000, 800, 824, 896, 1024, 0, 600, 601, 603, 625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@56Hz */
{ MODEPREFIX("640x480"), 31500, 640, 656, 720, 840, 0, 480, 481, 484, 500, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@75Hz */
{ MODEPREFIX("640x480"), 31500, 640, 664, 704, 832, 0, 480, 489, 491, 520, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@72Hz */
{ MODEPREFIX("640x480"), 30240, 640, 704, 768, 864, 0, 480, 483, 486, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@67Hz */
{ MODEPREFIX("640x480"), 25200, 640, 656, 752, 800, 0, 480, 490, 492, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@60Hz */
{ MODEPREFIX("720x400"), 35500, 720, 738, 846, 900, 0, 400, 421, 423, 449, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 720x400@88Hz */
{ MODEPREFIX("720x400"), 28320, 720, 738, 846, 900, 0, 400, 412, 414, 449, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 720x400@70Hz */
{ MODEPREFIX("1280x1024"), 135000, 1280, 1296, 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x1024@75Hz */
{ MODEPREFIX("1024x768"), 78800, 1024, 1040, 1136, 1312, 0, 768, 769, 772, 800, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1024x768@75Hz */
{ MODEPREFIX("1024x768"), 75000, 1024, 1048, 1184, 1328, 0, 768, 771, 777, 806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768@70Hz */
{ MODEPREFIX("1024x768"), 65000, 1024, 1048, 1184, 1344, 0, 768, 771, 777, 806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768@60Hz */
{ MODEPREFIX("1024x768"), 44900, 1024, 1032, 1208, 1264, 0, 768, 768, 776, 817, 0, V_PHSYNC | V_PVSYNC | V_INTERLACE, MODESUFFIX }, /* 1024x768@43Hz */
{ MODEPREFIX("832x624"), 57284, 832, 864, 928, 1152, 0, 624, 625, 628, 667, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 832x624@75Hz */
{ MODEPREFIX("800x600"), 49500, 800, 816, 896, 1056, 0, 600, 601, 604, 625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@75Hz */
{ MODEPREFIX("800x600"), 50000, 800, 856, 976, 1040, 0, 600, 637, 643, 666, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@72Hz */
{ MODEPREFIX("1152x864"), 108000, 1152, 1216, 1344, 1600, 0, 864, 865, 868, 900, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1152x864@75Hz */
};
static DisplayModePtr
DDCModesFromEstablished(int scrnIndex, struct established_timings *timing)
{
DisplayModePtr Modes = NULL, Mode = NULL;
CARD32 bits = (timing->t1) | (timing->t2 << 8) |
((timing->t_manu & 0x80) << 9);
int i;
for (i = 0; i < 17; i++) {
if (bits & (0x01 << i)) {
Mode = xf86DuplicateMode(&DDCEstablishedModes[i]);
Modes = xf86ModesAdd(Modes, Mode);
}
}
return Modes;
}
/*
*
*/
static DisplayModePtr
DDCModesFromStandardTiming(int scrnIndex, struct std_timings *timing)
{
DisplayModePtr Modes = NULL, Mode = NULL;
int i;
for (i = 0; i < STD_TIMINGS; i++) {
if (timing[i].hsize && timing[i].vsize && timing[i].refresh) {
Mode = xf86CVTMode(timing[i].hsize, timing[i].vsize,
timing[i].refresh, FALSE, FALSE);
Mode->type = M_T_DRIVER;
Modes = xf86ModesAdd(Modes, Mode);
}
}
return Modes;
}
/*
*
*/
static DisplayModePtr
DDCModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing,
int preferred)
{
DisplayModePtr Mode;
/*
* Refuse to create modes that are insufficiently large. 64 is a random
* number, maybe the spec says something about what the minimum is. In
* particular I see this frequently with _old_ EDID, 1.0 or so, so maybe
* our parser is just being too aggresive there.
*/
if (timing->h_active < 64 || timing->v_active < 64) {
xf86DrvMsg(scrnIndex, X_INFO,
"%s: Ignoring tiny %dx%d mode\n", __func__,
timing->h_active, timing->v_active);
return NULL;
}
/* We don't do stereo */
if (timing->stereo) {
xf86DrvMsg(scrnIndex, X_INFO,
"%s: Ignoring: We don't handle stereo.\n", __func__);
return NULL;
}
/* We only do seperate sync currently */
if (timing->sync != 0x03) {
xf86DrvMsg(scrnIndex, X_INFO,
"%s: %dx%d Warning: We only handle seperate"
" sync.\n", __func__, timing->h_active, timing->v_active);
}
Mode = xnfalloc(sizeof(DisplayModeRec));
memset(Mode, 0, sizeof(DisplayModeRec));
Mode->type = M_T_DRIVER;
if (preferred)
Mode->type |= M_T_PREFERRED;
Mode->Clock = timing->clock / 1000.0;
Mode->HDisplay = timing->h_active;
Mode->HSyncStart = timing->h_active + timing->h_sync_off;
Mode->HSyncEnd = Mode->HSyncStart + timing->h_sync_width;
Mode->HTotal = timing->h_active + timing->h_blanking;
Mode->VDisplay = timing->v_active;
Mode->VSyncStart = timing->v_active + timing->v_sync_off;
Mode->VSyncEnd = Mode->VSyncStart + timing->v_sync_width;
Mode->VTotal = timing->v_active + timing->v_blanking;
xf86SetModeDefaultName(Mode);
/* We ignore h/v_size and h/v_border for now. */
if (timing->interlaced)
Mode->Flags |= V_INTERLACE;
if (timing->misc & 0x02)
Mode->Flags |= V_PHSYNC;
else
Mode->Flags |= V_NHSYNC;
if (timing->misc & 0x01)
Mode->Flags |= V_PVSYNC;
else
Mode->Flags |= V_NVSYNC;
return Mode;
}
/*
*
*/
static void
DDCGuessRangesFromModes(int scrnIndex, MonPtr Monitor, DisplayModePtr Modes)
{
DisplayModePtr Mode = Modes;
if (!Monitor || !Modes)
return;
/* set up the ranges for scanning through the modes */
Monitor->nHsync = 1;
Monitor->hsync[0].lo = 1024.0;
Monitor->hsync[0].hi = 0.0;
Monitor->nVrefresh = 1;
Monitor->vrefresh[0].lo = 1024.0;
Monitor->vrefresh[0].hi = 0.0;
while (Mode) {
if (!Mode->HSync)
Mode->HSync = ((float) Mode->Clock ) / ((float) Mode->HTotal);
if (!Mode->VRefresh)
Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) /
((float) (Mode->HTotal * Mode->VTotal));
if (Mode->HSync < Monitor->hsync[0].lo)
Monitor->hsync[0].lo = Mode->HSync;
if (Mode->HSync > Monitor->hsync[0].hi)
Monitor->hsync[0].hi = Mode->HSync;
if (Mode->VRefresh < Monitor->vrefresh[0].lo)
Monitor->vrefresh[0].lo = Mode->VRefresh;
if (Mode->VRefresh > Monitor->vrefresh[0].hi)
Monitor->vrefresh[0].hi = Mode->VRefresh;
Mode = Mode->next;
}
}
DisplayModePtr
xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC)
{
int preferred, i;
DisplayModePtr Modes = NULL, Mode;
preferred = PREFERRED_TIMING_MODE(DDC->features.msc);
/* Add established timings */
Mode = DDCModesFromEstablished(scrnIndex, &DDC->timings1);
Modes = xf86ModesAdd(Modes, Mode);
/* Add standard timings */
Mode = DDCModesFromStandardTiming(scrnIndex, DDC->timings2);
Modes = xf86ModesAdd(Modes, Mode);
for (i = 0; i < DET_TIMINGS; i++) {
struct detailed_monitor_section *det_mon = &DDC->det_mon[i];
switch (det_mon->type) {
case DT:
Mode = DDCModeFromDetailedTiming(scrnIndex,
&det_mon->section.d_timings,
preferred);
preferred = 0;
Modes = xf86ModesAdd(Modes, Mode);
break;
case DS_STD_TIMINGS:
Mode = DDCModesFromStandardTiming(scrnIndex,
det_mon->section.std_t);
Modes = xf86ModesAdd(Modes, Mode);
break;
default:
break;
}
}
return Modes;
}
/*
* Fill out MonPtr with xf86MonPtr information.
*/
void
xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC)
{
DisplayModePtr Modes = NULL, Mode;
int i, clock;
Bool have_hsync = FALSE, have_vrefresh = FALSE;
if (!Monitor || !DDC)
return;
Monitor->DDC = DDC;
Monitor->widthmm = 10 * DDC->features.hsize;
Monitor->heightmm = 10 * DDC->features.vsize;
/* If this is a digital display, then we can use reduced blanking */
if (DDC->features.input_type)
Monitor->reducedblanking = TRUE;
/* Allow the user to also enable this through config */
Modes = xf86DDCGetModes(scrnIndex, DDC);
/* Skip EDID ranges if they were specified in the config file */
have_hsync = (Monitor->nHsync != 0);
have_vrefresh = (Monitor->nVrefresh != 0);
/* Go through the detailed monitor sections */
for (i = 0; i < DET_TIMINGS; i++) {
switch (DDC->det_mon[i].type) {
case DS_RANGES:
if (!have_hsync) {
if (!Monitor->nHsync)
xf86DrvMsg(scrnIndex, X_INFO,
"Using EDID range info for horizontal sync\n");
Monitor->hsync[Monitor->nHsync].lo =
DDC->det_mon[i].section.ranges.min_h;
Monitor->hsync[Monitor->nHsync].hi =
DDC->det_mon[i].section.ranges.max_h;
Monitor->nHsync++;
} else {
xf86DrvMsg(scrnIndex, X_INFO,
"Using hsync ranges from config file\n");
}
if (!have_vrefresh) {
if (!Monitor->nVrefresh)
xf86DrvMsg(scrnIndex, X_INFO,
"Using EDID range info for vertical refresh\n");
Monitor->vrefresh[Monitor->nVrefresh].lo =
DDC->det_mon[i].section.ranges.min_v;
Monitor->vrefresh[Monitor->nVrefresh].hi =
DDC->det_mon[i].section.ranges.max_v;
Monitor->nVrefresh++;
} else {
xf86DrvMsg(scrnIndex, X_INFO,
"Using vrefresh ranges from config file\n");
}
clock = DDC->det_mon[i].section.ranges.max_clock * 1000;
if (clock > Monitor->maxPixClock)
Monitor->maxPixClock = clock;
break;
default:
break;
}
}
if (Modes) {
/* Print Modes */
xf86DrvMsg(scrnIndex, X_INFO, "Printing DDC gathered Modelines:\n");
Mode = Modes;
while (Mode) {
xf86PrintModeline(scrnIndex, Mode);
Mode = Mode->next;
}
/* Do we still need ranges to be filled in? */
if (!Monitor->nHsync || !Monitor->nVrefresh)
DDCGuessRangesFromModes(scrnIndex, Monitor, Modes);
/* look for last Mode */
Mode = Modes;
while (Mode->next)
Mode = Mode->next;
/* add to MonPtr */
if (Monitor->Modes) {
Monitor->Last->next = Modes;
Modes->prev = Monitor->Last;
Monitor->Last = Mode;
} else {
Monitor->Modes = Modes;
Monitor->Last = Mode;
}
}
}

View File

@ -45,9 +45,6 @@ fontsmodule_LTLIBRARIES = libfreetype.la \
AM_CFLAGS = @XORG_CFLAGS@ @DIX_CFLAGS@ AM_CFLAGS = @XORG_CFLAGS@ @DIX_CFLAGS@
INCLUDES = @XORG_INCS@ \ INCLUDES = @XORG_INCS@ \
-I$(top_srcdir)/afb \
-I$(top_srcdir)/cfb \
-I$(top_srcdir)/mfb \
-I$(top_srcdir)/dbe \ -I$(top_srcdir)/dbe \
-I$(top_srcdir)/hw/xfree86/loader \ -I$(top_srcdir)/hw/xfree86/loader \
-I$(top_srcdir)/miext/shadow \ -I$(top_srcdir)/miext/shadow \

View File

@ -29,7 +29,6 @@
#endif #endif
#include "xf86Module.h" #include "xf86Module.h"
#include "afb.h"
static MODULESETUPPROTO(afbSetup); static MODULESETUPPROTO(afbSetup);

View File

@ -28,10 +28,7 @@
#include <xorg-config.h> #include <xorg-config.h>
#endif #endif
#define PSZ 32
#include "xf86Module.h" #include "xf86Module.h"
#include "cfb.h"
static MODULESETUPPROTO(cfb32Setup); static MODULESETUPPROTO(cfb32Setup);

View File

@ -28,10 +28,7 @@
#include <xorg-config.h> #include <xorg-config.h>
#endif #endif
#define PSZ 8
#include "xf86Module.h" #include "xf86Module.h"
#include "cfb.h"
static MODULESETUPPROTO(cfbSetup); static MODULESETUPPROTO(cfbSetup);

View File

@ -604,6 +604,11 @@ the builtin handler will be used.
.BI "Option \*qAIGLX\*q \*q" boolean \*q .BI "Option \*qAIGLX\*q \*q" boolean \*q
enable or disable AIGLX. AIGLX is enabled by default. enable or disable AIGLX. AIGLX is enabled by default.
.TP 7 .TP 7
.BI "Option \*qUseDefaultFontPath\*q \*q" boolean \*q
Include the default font path even if other paths are specified in
xorg.conf. If enabled, other font paths are included as well. Enabled by
default.
.TP 7
.BI "Option \*qIgnoreABI\*q \*q" boolean \*q .BI "Option \*qIgnoreABI\*q \*q" boolean \*q
Allow modules built for a different, potentially incompatible version of Allow modules built for a different, potentially incompatible version of
the X server to load. Disabled by default. the X server to load. Disabled by default.
@ -639,6 +644,20 @@ Example: the Type 1 font rasteriser can be loaded with the following entry:
.B "Load \*qtype1\*q" .B "Load \*qtype1\*q"
.RE .RE
.RE .RE
.TP 7
.BI "Disable \*q" modulename \*q
This instructs the server to not load the module called
.IR modulename .
Some modules are loaded by default in the server, and this overrides that
default. If a
.B Load
instruction is given for the same module, it overrides the
.B Disable
instruction and the module is loaded. The module name given should be the
module's standard name, not the module file name. As with the
.B Load
instruction, the standard name is case-sensitive, and does not include the
"lib" prefix, or the ".a", ".o", or ".so" suffixes.
.PP .PP
The second form of entry is a The second form of entry is a
.BR SubSection, .BR SubSection,

View File

@ -473,6 +473,9 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD)
pDRIPriv->pLockRefCount = &pDRIEntPriv->lockRefCount; pDRIPriv->pLockRefCount = &pDRIEntPriv->lockRefCount;
pDRIPriv->pLockingContext = &pDRIEntPriv->lockingContext; pDRIPriv->pLockingContext = &pDRIEntPriv->lockingContext;
if (!pDRIEntPriv->keepFDOpen)
pDRIEntPriv->keepFDOpen = pDRIInfo->keepFDOpen;
pDRIEntPriv->refCount++; pDRIEntPriv->refCount++;
return TRUE; return TRUE;
@ -2207,6 +2210,19 @@ DRIGetContext(ScreenPtr pScreen)
return pDRIPriv->myContext; return pDRIPriv->myContext;
} }
void
DRIGetTexOffsetFuncs(ScreenPtr pScreen,
DRITexOffsetStartProcPtr *texOffsetStartFunc,
DRITexOffsetFinishProcPtr *texOffsetFinishFunc)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
if (!pDRIPriv) return;
*texOffsetStartFunc = pDRIPriv->pDriverInfo->texOffsetStart;
*texOffsetFinishFunc = pDRIPriv->pDriverInfo->texOffsetFinish;
}
/* This lets get at the unwrapped functions so that they can correctly /* This lets get at the unwrapped functions so that they can correctly
* call the lowerlevel functions, and choose whether they will be * call the lowerlevel functions, and choose whether they will be
* called at every level of recursion (eg in validatetree). * called at every level of recursion (eg in validatetree).

View File

@ -107,9 +107,12 @@ typedef struct {
*/ */
#define DRIINFO_MAJOR_VERSION 5 #define DRIINFO_MAJOR_VERSION 5
#define DRIINFO_MINOR_VERSION 2 #define DRIINFO_MINOR_VERSION 3
#define DRIINFO_PATCH_VERSION 0 #define DRIINFO_PATCH_VERSION 0
typedef unsigned long long (*DRITexOffsetStartProcPtr)(PixmapPtr pPix);
typedef void (*DRITexOffsetFinishProcPtr)(PixmapPtr pPix);
typedef struct { typedef struct {
/* driver call back functions /* driver call back functions
* *
@ -180,6 +183,10 @@ typedef struct {
/* New with DRI version 5.2.0 */ /* New with DRI version 5.2.0 */
Bool allocSarea; Bool allocSarea;
Bool keepFDOpen; Bool keepFDOpen;
/* New with DRI version 5.3.0 */
DRITexOffsetStartProcPtr texOffsetStart;
DRITexOffsetFinishProcPtr texOffsetFinish;
} DRIInfoRec, *DRIInfoPtr; } DRIInfoRec, *DRIInfoPtr;
@ -358,7 +365,9 @@ extern void *DRIMasterSareaPointer(ScrnInfoPtr pScrn);
extern drm_handle_t DRIMasterSareaHandle(ScrnInfoPtr pScrn); extern drm_handle_t DRIMasterSareaHandle(ScrnInfoPtr pScrn);
extern void DRIGetTexOffsetFuncs(ScreenPtr pScreen,
DRITexOffsetStartProcPtr *texOffsetStartFunc,
DRITexOffsetFinishProcPtr *texOffsetFinishFunc);
#define _DRI_H_ #define _DRI_H_

View File

@ -1723,7 +1723,25 @@ Bool
xf86SetDesiredModes (ScrnInfoPtr scrn) xf86SetDesiredModes (ScrnInfoPtr scrn)
{ {
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
int c; int c, o;
/*
* Turn off everything so mode setting is done
* with hardware in a consistent state
*/
for (o = 0; o < config->num_output; o++)
{
xf86OutputPtr output = config->output[o];
(*output->funcs->dpms)(output, DPMSModeOff);
}
for (c = 0; c < config->num_crtc; c++)
{
xf86CrtcPtr crtc = config->crtc[c];
crtc->funcs->dpms(crtc, DPMSModeOff);
memset(&crtc->mode, 0, sizeof(crtc->mode));
}
for (c = 0; c < config->num_crtc; c++) for (c = 0; c < config->num_crtc; c++)
{ {
@ -1903,7 +1921,9 @@ xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation)
} }
} }
xf86DisableUnusedFunctions(pScrn); xf86DisableUnusedFunctions(pScrn);
#if RANDR_12_INTERFACE
xf86RandR12TellChanged (pScrn->pScreen); xf86RandR12TellChanged (pScrn->pScreen);
#endif
return ok; return ok;
} }

View File

@ -562,6 +562,10 @@ typedef struct _xf86CrtcConfig {
OptionInfoPtr options; OptionInfoPtr options;
Bool debug_modes; Bool debug_modes;
/* wrap screen BlockHandler for rotation */
ScreenBlockHandlerProcPtr BlockHandler;
} xf86CrtcConfigRec, *xf86CrtcConfigPtr; } xf86CrtcConfigRec, *xf86CrtcConfigPtr;
extern int xf86CrtcConfigPrivateIndex; extern int xf86CrtcConfigPrivateIndex;

View File

@ -87,6 +87,11 @@ static Bool quirk_prefer_large_60 (int scrnIndex, xf86MonPtr DDC)
DDC->vendor.prod_id == 44358) DDC->vendor.prod_id == 44358)
return TRUE; return TRUE;
/* Samsung SyncMaster 226BW */
if (memcmp (DDC->vendor.name, "SAM", 4) == 0 &&
DDC->vendor.prod_id == 638)
return TRUE;
return FALSE; return FALSE;
} }

View File

@ -337,6 +337,7 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen,
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen); ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
WindowPtr pRoot = WindowTable[pScreen->myNum]; WindowPtr pRoot = WindowTable[pScreen->myNum];
PixmapPtr pScrnPix = (*pScreen->GetScreenPixmap)(pScreen);
Bool ret = FALSE; Bool ret = FALSE;
if (randrp->virtualX == -1 || randrp->virtualY == -1) if (randrp->virtualX == -1 || randrp->virtualY == -1)
@ -353,8 +354,8 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen,
ret = TRUE; ret = TRUE;
pScreen->width = width; pScreen->width = pScrnPix->drawable.width = width;
pScreen->height = height; pScreen->height = pScrnPix->drawable.height = height;
pScreen->mmWidth = mmWidth; pScreen->mmWidth = mmWidth;
pScreen->mmHeight = mmHeight; pScreen->mmHeight = mmHeight;

View File

@ -24,6 +24,9 @@
#define _XF86_RANDR_H_ #define _XF86_RANDR_H_
#include <randrstr.h> #include <randrstr.h>
#include <X11/extensions/render.h> #include <X11/extensions/render.h>
#if XF86_MODES_RENAME
#include "xf86Rename.h"
#endif
Bool xf86RandR12CreateScreenResources (ScreenPtr pScreen); Bool xf86RandR12CreateScreenResources (ScreenPtr pScreen);
Bool xf86RandR12Init(ScreenPtr pScreen); Bool xf86RandR12Init(ScreenPtr pScreen);

View File

@ -25,6 +25,12 @@
#include "local_xf86Rename.h" #include "local_xf86Rename.h"
#define xf86_cursors_fini XF86NAME(xf86_cursors_fini)
#define xf86_cursors_init XF86NAME(xf86_cursors_init)
#define xf86_hide_cursors XF86NAME(xf86_hide_cursors)
#define xf86_reload_cursors XF86NAME(xf86_reload_cursors)
#define xf86_show_cursors XF86NAME(xf86_show_cursors)
#define xf86ConnectorGetName XF86NAME(xf86ConnectorGetName)
#define xf86CrtcConfigInit XF86NAME(xf86CrtcConfigInit) #define xf86CrtcConfigInit XF86NAME(xf86CrtcConfigInit)
#define xf86CrtcConfigPrivateIndex XF86NAME(xf86CrtcConfigPrivateIndex) #define xf86CrtcConfigPrivateIndex XF86NAME(xf86CrtcConfigPrivateIndex)
#define xf86CrtcCreate XF86NAME(xf86CrtcCreate) #define xf86CrtcCreate XF86NAME(xf86CrtcCreate)
@ -35,6 +41,7 @@
#define xf86CrtcSetMode XF86NAME(xf86CrtcSetMode) #define xf86CrtcSetMode XF86NAME(xf86CrtcSetMode)
#define xf86CrtcSetSizeRange XF86NAME(xf86CrtcSetSizeRange) #define xf86CrtcSetSizeRange XF86NAME(xf86CrtcSetSizeRange)
#define xf86CVTMode XF86NAME(xf86CVTMode) #define xf86CVTMode XF86NAME(xf86CVTMode)
#define xf86DDCMonitorSet XF86NAME(xf86DDCMonitorSet)
#define xf86DisableUnusedFunctions XF86NAME(xf86DisableUnusedFunctions) #define xf86DisableUnusedFunctions XF86NAME(xf86DisableUnusedFunctions)
#define xf86DPMSSet XF86NAME(xf86DPMSSet) #define xf86DPMSSet XF86NAME(xf86DPMSSet)
#define xf86DuplicateMode XF86NAME(xf86DuplicateMode) #define xf86DuplicateMode XF86NAME(xf86DuplicateMode)
@ -52,9 +59,11 @@
#define xf86OutputGetEDIDModes XF86NAME(xf86OutputGetEDIDModes) #define xf86OutputGetEDIDModes XF86NAME(xf86OutputGetEDIDModes)
#define xf86OutputRename XF86NAME(xf86OutputRename) #define xf86OutputRename XF86NAME(xf86OutputRename)
#define xf86OutputSetEDID XF86NAME(xf86OutputSetEDID) #define xf86OutputSetEDID XF86NAME(xf86OutputSetEDID)
#define xf86OutputUseScreenMonitor XF86NAME(xf86OutputUseScreenMonitor)
#define xf86PrintModeline XF86NAME(xf86PrintModeline) #define xf86PrintModeline XF86NAME(xf86PrintModeline)
#define xf86ProbeOutputModes XF86NAME(xf86ProbeOutputModes) #define xf86ProbeOutputModes XF86NAME(xf86ProbeOutputModes)
#define xf86PruneInvalidModes XF86NAME(xf86PruneInvalidModes) #define xf86PruneInvalidModes XF86NAME(xf86PruneInvalidModes)
#define xf86RotateCloseScreen XF86NAME(xf86RotateCloseScreen)
#define xf86SetModeCrtc XF86NAME(xf86SetModeCrtc) #define xf86SetModeCrtc XF86NAME(xf86SetModeCrtc)
#define xf86SetModeDefaultName XF86NAME(xf86SetModeDefaultName) #define xf86SetModeDefaultName XF86NAME(xf86SetModeDefaultName)
#define xf86SetScrnInfoModes XF86NAME(xf86SetScrnInfoModes) #define xf86SetScrnInfoModes XF86NAME(xf86SetScrnInfoModes)

View File

@ -264,7 +264,7 @@ xf86RotatePrepare (ScreenPtr pScreen)
} }
} }
static void static Bool
xf86RotateRedisplay(ScreenPtr pScreen) xf86RotateRedisplay(ScreenPtr pScreen)
{ {
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
@ -273,18 +273,28 @@ xf86RotateRedisplay(ScreenPtr pScreen)
RegionPtr region; RegionPtr region;
if (!damage) if (!damage)
return; return FALSE;
xf86RotatePrepare (pScreen); xf86RotatePrepare (pScreen);
region = DamageRegion(damage); region = DamageRegion(damage);
if (REGION_NOTEMPTY(pScreen, region)) if (REGION_NOTEMPTY(pScreen, region))
{ {
int c; int c;
SourceValidateProcPtr SourceValidate;
/*
* SourceValidate is used by the software cursor code
* to pull the cursor off of the screen when reading
* bits from the frame buffer. Bypassing this function
* leaves the software cursor in place
*/
SourceValidate = pScreen->SourceValidate;
pScreen->SourceValidate = NULL;
for (c = 0; c < xf86_config->num_crtc; c++) for (c = 0; c < xf86_config->num_crtc; c++)
{ {
xf86CrtcPtr crtc = xf86_config->crtc[c]; xf86CrtcPtr crtc = xf86_config->crtc[c];
if (crtc->rotation != RR_Rotate_0) if (crtc->rotation != RR_Rotate_0 && crtc->enabled)
{ {
BoxRec box; BoxRec box;
RegionRec crtc_damage; RegionRec crtc_damage;
@ -304,21 +314,28 @@ xf86RotateRedisplay(ScreenPtr pScreen)
REGION_UNINIT (pScreen, &crtc_damage); REGION_UNINIT (pScreen, &crtc_damage);
} }
} }
pScreen->SourceValidate = SourceValidate;
DamageEmpty(damage); DamageEmpty(damage);
} }
return TRUE;
} }
static void static void
xf86RotateBlockHandler(pointer data, OSTimePtr pTimeout, pointer pRead) xf86RotateBlockHandler(int screenNum, pointer blockData,
pointer pTimeout, pointer pReadmask)
{ {
ScreenPtr pScreen = (ScreenPtr) data; ScreenPtr pScreen = screenInfo.screens[screenNum];
ScrnInfoPtr pScrn = xf86Screens[screenNum];
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
xf86RotateRedisplay(pScreen); pScreen->BlockHandler = xf86_config->BlockHandler;
} (*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask);
if (xf86RotateRedisplay(pScreen))
static void {
xf86RotateWakeupHandler(pointer data, int i, pointer LastSelectMask) /* Re-wrap if rotation is still happening */
{ xf86_config->BlockHandler = pScreen->BlockHandler;
pScreen->BlockHandler = xf86RotateBlockHandler;
}
} }
static void static void
@ -338,7 +355,8 @@ xf86RotateDestroy (xf86CrtcPtr crtc)
} }
for (c = 0; c < xf86_config->num_crtc; c++) for (c = 0; c < xf86_config->num_crtc; c++)
if (crtc->rotatedPixmap || crtc->rotatedData) if (xf86_config->crtc[c]->rotatedPixmap ||
xf86_config->crtc[c]->rotatedData)
return; return;
/* /*
@ -355,10 +373,6 @@ xf86RotateDestroy (xf86CrtcPtr crtc)
} }
DamageDestroy (xf86_config->rotation_damage); DamageDestroy (xf86_config->rotation_damage);
xf86_config->rotation_damage = NULL; xf86_config->rotation_damage = NULL;
/* Free block/wakeup handler */
RemoveBlockAndWakeupHandlers (xf86RotateBlockHandler,
xf86RotateWakeupHandler,
(pointer) pScreen);
} }
} }
@ -428,20 +442,12 @@ xf86CrtcRotate (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation)
if (!xf86_config->rotation_damage) if (!xf86_config->rotation_damage)
goto bail2; goto bail2;
/* Assign block/wakeup handler */ /* Wrap block handler */
if (!RegisterBlockAndWakeupHandlers (xf86RotateBlockHandler, xf86_config->BlockHandler = pScreen->BlockHandler;
xf86RotateWakeupHandler, pScreen->BlockHandler = xf86RotateBlockHandler;
(pointer) pScreen))
{
goto bail3;
}
} }
if (0) if (0)
{ {
bail3:
DamageDestroy (xf86_config->rotation_damage);
xf86_config->rotation_damage = NULL;
bail2: bail2:
if (shadow || shadowData) if (shadow || shadowData)
{ {

View File

@ -232,14 +232,14 @@ _X_EXPORT int pciNumBuses = 0; /* Actual number of PCI buses */
int pciMaxBusNum = MAX_PCI_BUSES; int pciMaxBusNum = MAX_PCI_BUSES;
static Bool inProbe = FALSE; static Bool inProbe = FALSE;
static pciConfigPtr pci_devp[MAX_PCI_DEVICES + 1] = {NULL, }; static pciConfigPtr *pci_devp = NULL;
static int readPciBios( PCITAG Tag, CARD8* tmp, ADDRESS hostbase, static int readPciBios( PCITAG Tag, CARD8* tmp, ADDRESS hostbase,
unsigned char * buf, int len, PciBiosType BiosType ); unsigned char * buf, int len, PciBiosType BiosType );
static int (*pciOSHandleBIOS)(PCITAG Tag, int basereg, unsigned char *buf, int len); static int (*pciOSHandleBIOS)(PCITAG Tag, int basereg, unsigned char *buf, int len);
int xf86MaxPciDevs = MAX_PCI_DEVICES; int xf86MaxPciDevs = 0;
/* /*
* Platform specific PCI function pointers. * Platform specific PCI function pointers.
@ -272,6 +272,14 @@ pciInit()
if (pciNumBuses <= 0) if (pciNumBuses <= 0)
ARCH_PCI_OS_INIT(); ARCH_PCI_OS_INIT();
#endif #endif
if (xf86MaxPciDevs == 0) {
xf86Msg(X_WARNING,
"OS did not count PCI devices, guessing wildly\n");
xf86MaxPciDevs = MAX_PCI_DEVICES;
}
if (pci_devp)
xfree(pci_devp);
pci_devp = xnfcalloc(xf86MaxPciDevs + 1, sizeof(pciConfigPtr));
} }
void pciSetOSBIOSPtr(int (*bios_fn)(PCITAG Tag, int basereg, unsigned char * buf, int len)) void pciSetOSBIOSPtr(int (*bios_fn)(PCITAG Tag, int basereg, unsigned char * buf, int len))
@ -920,7 +928,7 @@ xf86scanpci(int flags)
* result in an endless recursion if platform/OS specific PCI * result in an endless recursion if platform/OS specific PCI
* bus probing code calls this function from with in it. * bus probing code calls this function from with in it.
*/ */
if (done || pci_devp[0]) if (done || pci_devp)
return pci_devp; return pci_devp;
done = TRUE; done = TRUE;

View File

@ -327,7 +327,7 @@
# define INCLUDE_XF86_MAP_PCI_MEM # define INCLUDE_XF86_MAP_PCI_MEM
# define INCLUDE_XF86_NO_DOMAIN # define INCLUDE_XF86_NO_DOMAIN
# endif # endif
# if !defined(__FreeBSD__) # if !defined(__FreeBSD__) && !defined(linux)
# define ARCH_PCI_PCI_BRIDGE sparcPciPciBridge # define ARCH_PCI_PCI_BRIDGE sparcPciPciBridge
# endif # endif
#elif defined(__amd64__) || defined(__amd64) #elif defined(__amd64__) || defined(__amd64)

View File

@ -76,6 +76,7 @@ static xf86ConfigSymTabRec ModuleTab[] =
{ {
{ENDSECTION, "endsection"}, {ENDSECTION, "endsection"},
{LOAD, "load"}, {LOAD, "load"},
{DISABLE, "disable"},
{LOAD_DRIVER, "loaddriver"}, {LOAD_DRIVER, "loaddriver"},
{SUBSECTION, "subsection"}, {SUBSECTION, "subsection"},
{-1, ""}, {-1, ""},
@ -141,6 +142,13 @@ xf86parseModuleSection (void)
xf86addNewLoadDirective (ptr->mod_load_lst, val.str, xf86addNewLoadDirective (ptr->mod_load_lst, val.str,
XF86_LOAD_MODULE, NULL); XF86_LOAD_MODULE, NULL);
break; break;
case DISABLE:
if (xf86getSubToken (&(ptr->mod_comment)) != STRING)
Error (QUOTE_MSG, "Disable");
ptr->mod_disable_lst =
xf86addNewLoadDirective (ptr->mod_disable_lst, val.str,
XF86_DISABLE_MODULE, NULL);
break;
case LOAD_DRIVER: case LOAD_DRIVER:
if (xf86getSubToken (&(ptr->mod_comment)) != STRING) if (xf86getSubToken (&(ptr->mod_comment)) != STRING)
Error (QUOTE_MSG, "LoadDriver"); Error (QUOTE_MSG, "LoadDriver");
@ -257,6 +265,15 @@ xf86freeModules (XF86ConfModulePtr ptr)
lptr = lptr->list.next; lptr = lptr->list.next;
xf86conffree (prev); xf86conffree (prev);
} }
lptr = ptr->mod_disable_lst;
while (lptr)
{
TestFree (lptr->load_name);
TestFree (lptr->load_comment);
prev = lptr;
lptr = lptr->list.next;
xf86conffree (prev);
}
TestFree (ptr->mod_comment); TestFree (ptr->mod_comment);
xf86conffree (ptr); xf86conffree (ptr);
} }

View File

@ -82,6 +82,7 @@ XF86ConfFilesRec, *XF86ConfFilesPtr;
/* Values for load_type */ /* Values for load_type */
#define XF86_LOAD_MODULE 0 #define XF86_LOAD_MODULE 0
#define XF86_LOAD_DRIVER 1 #define XF86_LOAD_DRIVER 1
#define XF86_DISABLE_MODULE 2
typedef struct typedef struct
{ {
@ -97,6 +98,7 @@ XF86LoadRec, *XF86LoadPtr;
typedef struct typedef struct
{ {
XF86LoadPtr mod_load_lst; XF86LoadPtr mod_load_lst;
XF86LoadPtr mod_disable_lst;
char *mod_comment; char *mod_comment;
} }
XF86ConfModuleRec, *XF86ConfModulePtr; XF86ConfModuleRec, *XF86ConfModulePtr;

View File

@ -170,6 +170,7 @@ typedef enum {
/* Module tokens */ /* Module tokens */
LOAD, LOAD,
LOAD_DRIVER, LOAD_DRIVER,
DISABLE,
/* Device tokens */ /* Device tokens */
DRIVER, DRIVER,

View File

@ -32,10 +32,6 @@ Original mi code written by Keith Packard.
#include "xaa.h" #include "xaa.h"
#include "xaalocal.h" #include "xaalocal.h"
#ifdef ICEILTEMPDECL
ICEILTEMPDECL
#endif
#define DRAW_POINT(pScrn, x, y) \ #define DRAW_POINT(pScrn, x, y) \
if(hardClip) (*infoRec->SubsequentSolidFillRect)(pScrn, x, y, 1, 1); \ if(hardClip) (*infoRec->SubsequentSolidFillRect)(pScrn, x, y, 1, 1); \
else XAAPointHelper(pScrn, x, y) else XAAPointHelper(pScrn, x, y)

View File

@ -177,7 +177,7 @@ xglCompositeGeneral (CARD8 op,
{ {
if (!pSrc->transform && pSrc->filter != PictFilterConvolution) if (!pSrc->transform && pSrc->filter != PictFilterConvolution)
{ {
if (pSrc->pDrawable && pSrc->repeat == RepeatNormal) if (pSrc->pDrawable && pSrc->repeatType == RepeatNormal)
{ {
XGL_PIXMAP_PRIV ((PixmapPtr) pSrc->pDrawable); XGL_PIXMAP_PRIV ((PixmapPtr) pSrc->pDrawable);

View File

@ -100,9 +100,10 @@ winMouseProc (DeviceIntPtr pDeviceInt, int iState)
InitPointerDeviceStruct (pDevice, InitPointerDeviceStruct (pDevice,
map, map,
lngMouseButtons + lngWheelEvents, lngMouseButtons + lngWheelEvents,
miPointerGetMotionEvents, GetMotionHistory,
winMouseCtrl, winMouseCtrl,
miPointerGetMotionBufferSize ()); GetMotionHistorySize(),
2);
free(map); free(map);
#if defined(XFree86Server) && defined(XINPUT) #if defined(XFree86Server) && defined(XINPUT)

View File

@ -445,10 +445,7 @@ GetWindowName (Display *pDisplay, Window iWin, char **ppName)
} }
else else
{ {
XmbTextPropertyToTextList (pDisplay, &xtpName, &ppList, &nNum); if (XmbTextPropertyToTextList (pDisplay, &xtpName, &ppList, &nNum) >= Success && nNum > 0 && *ppList)
/* */
if (nNum && ppList && *ppList)
{ {
*ppName = strdup (*ppList); *ppName = strdup (*ppList);
XFreeStringList (ppList); XFreeStringList (ppList);

View File

@ -38,6 +38,7 @@
#include "winmultiwindowclass.h" #include "winmultiwindowclass.h"
#include "winprefs.h" #include "winprefs.h"
#include "winmsg.h" #include "winmsg.h"
#include "inputstr.h"
/* /*
* External global variables * External global variables
@ -444,7 +445,7 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
/* Avoid the BitBlt's if the PAINTSTRUCT is bogus */ /* Avoid the BitBlt's if the PAINTSTRUCT is bogus */
if (ps.rcPaint.right==0 && ps.rcPaint.bottom==0 && ps.rcPaint.left==0 && ps.rcPaint.top==0) if (ps.rcPaint.right==0 && ps.rcPaint.bottom==0 && ps.rcPaint.left==0 && ps.rcPaint.top==0)
{ {
EndPaint (hwndScreen, &ps); EndPaint (hwnd, &ps);
return 0; return 0;
} }
@ -474,7 +475,7 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
} }
/* EndPaint frees the DC */ /* EndPaint frees the DC */
EndPaint (hwndScreen, &ps); EndPaint (hwnd, &ps);
return 0; return 0;
case WM_MOUSEMOVE: case WM_MOUSEMOVE:
@ -494,8 +495,8 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
break; break;
/* Has the mouse pointer crossed screens? */ /* Has the mouse pointer crossed screens? */
if (s_pScreen != miPointerCurrentScreen ()) if (s_pScreen != miPointerGetScreen(inputInfo.pointer))
miPointerSetNewScreen (s_pScreenInfo->dwScreen, miPointerSetScreen (inputInfo.pointer, s_pScreenInfo->dwScreen,
ptMouse.x - s_pScreenInfo->dwXOffset, ptMouse.x - s_pScreenInfo->dwXOffset,
ptMouse.y - s_pScreenInfo->dwYOffset); ptMouse.y - s_pScreenInfo->dwYOffset);

View File

@ -41,6 +41,7 @@
#include <X11/Xatom.h> #include <X11/Xatom.h>
#include "winmultiwindowclass.h" #include "winmultiwindowclass.h"
#include "winmsg.h" #include "winmsg.h"
#include "inputstr.h"
/* /*
@ -534,8 +535,8 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
break; break;
/* Has the mouse pointer crossed screens? */ /* Has the mouse pointer crossed screens? */
if (pScreen != miPointerCurrentScreen ()) if (pScreen != miPointerGetScreen(inputInfo.pointer))
miPointerSetNewScreen (pScreenInfo->dwScreen, miPointerSetScreen (inputInfo.pointer, pScreenInfo->dwScreen,
ptMouse.x - pScreenInfo->dwXOffset, ptMouse.x - pScreenInfo->dwXOffset,
ptMouse.y - pScreenInfo->dwYOffset); ptMouse.y - pScreenInfo->dwYOffset);

View File

@ -40,6 +40,7 @@
#include "winprefs.h" #include "winprefs.h"
#include "winconfig.h" #include "winconfig.h"
#include "winmsg.h" #include "winmsg.h"
#include "inputstr.h"
#ifdef XKB #ifdef XKB
extern BOOL winCheckKeyPressed(WPARAM wParam, LPARAM lParam); extern BOOL winCheckKeyPressed(WPARAM wParam, LPARAM lParam);
@ -723,8 +724,8 @@ winWindowProc (HWND hwnd, UINT message,
break; break;
/* Has the mouse pointer crossed screens? */ /* Has the mouse pointer crossed screens? */
if (s_pScreen != miPointerCurrentScreen ()) if (s_pScreen != miPointerGetScreen(inputInfo.pointer))
miPointerSetNewScreen (s_pScreenInfo->dwScreen, miPointerSetScreen (inputInfo.pointer, s_pScreenInfo->dwScreen,
GET_X_LPARAM(lParam)-s_pScreenInfo->dwXOffset, GET_X_LPARAM(lParam)-s_pScreenInfo->dwXOffset,
GET_Y_LPARAM(lParam)-s_pScreenInfo->dwYOffset); GET_Y_LPARAM(lParam)-s_pScreenInfo->dwYOffset);

View File

@ -102,6 +102,9 @@
/* Define to 1 if you have the <byteswap.h> header file. */ /* Define to 1 if you have the <byteswap.h> header file. */
#undef HAVE_BYTESWAP_H #undef HAVE_BYTESWAP_H
/* Define to 1 if you have cbrt */
#undef HAVE_CBRT
/* Define to 1 if you have the <dbm.h> header file. */ /* Define to 1 if you have the <dbm.h> header file. */
#undef HAVE_DBM_H #undef HAVE_DBM_H

View File

@ -239,7 +239,7 @@ extern int Ones(
unsigned long /*mask*/); unsigned long /*mask*/);
typedef struct _xPoint *DDXPointPtr; typedef struct _xPoint *DDXPointPtr;
typedef struct _Box *BoxPtr; typedef struct pixman_box16 *BoxPtr;
typedef struct _xEvent *xEventPtr; typedef struct _xEvent *xEventPtr;
typedef struct _xRectangle *xRectanglePtr; typedef struct _xRectangle *xRectanglePtr;
typedef struct _GrabRec *GrabPtr; typedef struct _GrabRec *GrabPtr;

View File

@ -50,12 +50,11 @@ SOFTWARE.
#include "misc.h" #include "misc.h"
#include <X11/Xprotostr.h> #include <X11/Xprotostr.h>
#include <pixman/pixman.h>
typedef xPoint DDXPointRec; typedef xPoint DDXPointRec;
typedef struct _Box { typedef struct pixman_box16 BoxRec;
short x1, y1, x2, y2;
} BoxRec;
typedef union _DevUnion { typedef union _DevUnion {
pointer ptr; pointer ptr;

View File

@ -48,7 +48,7 @@ SOFTWARE.
#ifndef REGIONSTRUCT_H #ifndef REGIONSTRUCT_H
#define REGIONSTRUCT_H #define REGIONSTRUCT_H
typedef struct _Region RegionRec, *RegionPtr; typedef struct pixman_region16 RegionRec, *RegionPtr;
#include "miscstruct.h" #include "miscstruct.h"
@ -64,16 +64,7 @@ typedef struct _Region RegionRec, *RegionPtr;
* clip region * clip region
*/ */
typedef struct _RegData { typedef struct pixman_region16_data RegDataRec, *RegDataPtr;
long size;
long numRects;
/* BoxRec rects[size]; in memory but not explicitly declared */
} RegDataRec, *RegDataPtr;
struct _Region {
BoxRec extents;
RegDataPtr data;
};
extern BoxRec miEmptyBox; extern BoxRec miEmptyBox;
extern RegDataRec miEmptyData; extern RegDataRec miEmptyData;
@ -234,6 +225,8 @@ extern RegDataRec miBrokenData;
/* moved from mi.h */ /* moved from mi.h */
extern void InitRegions (void);
extern RegionPtr miRegionCreate( extern RegionPtr miRegionCreate(
BoxPtr /*rect*/, BoxPtr /*rect*/,
int /*size*/); int /*size*/);

View File

@ -1,4 +1,4 @@
noinst_LTLIBRARIES = libminimi.la libmi.la noinst_LTLIBRARIES = libmi.la
if XORG if XORG
sdk_HEADERS = mibank.h micmap.h miline.h mipointer.h mi.h mibstore.h \ sdk_HEADERS = mibank.h micmap.h miline.h mipointer.h mi.h mibstore.h \
@ -8,9 +8,7 @@ endif
AM_CFLAGS = $(DIX_CFLAGS) AM_CFLAGS = $(DIX_CFLAGS)
# libminimi is for dmx - it has different defines for miinitext.c libmi_la_SOURCES = \
libminimi_la_SOURCES = \
cbrt.c \
mi.h \ mi.h \
miarc.c \ miarc.c \
mibank.c \ mibank.c \
@ -69,7 +67,3 @@ libminimi_la_SOURCES = \
mizerarc.h \ mizerarc.h \
mizerclip.c \ mizerclip.c \
mizerline.c mizerline.c
libmi_la_SOURCES = $(libminimi_la_SOURCES)
INCLUDES = -I$(top_srcdir)/mfb

View File

@ -1,46 +0,0 @@
/*
Copyright 1990, 1998 The Open Group
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of The Open Group shall
not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization
from The Open Group.
*/
/* simple cbrt, in case your math library doesn't have a good one */
/*
* Would normally include <math.h> for this, but for the sake of compiler
* warnings, we don't want to get duplicate declarations for cbrt().
*/
double pow(double, double);
double cbrt(double);
double
cbrt(double x)
{
if (x > 0.0)
return pow(x, 1.0/3.0);
else
return -pow(-x, 1.0/3.0);
}

View File

@ -51,14 +51,7 @@ SOFTWARE.
#include <dix-config.h> #include <dix-config.h>
#endif #endif
#if defined(_XOPEN_SOURCE) || defined(__QNXNTO__) \
|| (defined(sun) && defined(__SVR4))
#include <math.h> #include <math.h>
#else
#define _XOPEN_SOURCE /* to get prototype for hypot on some systems */
#include <math.h>
#undef _XOPEN_SOURCE
#endif
#include <X11/X.h> #include <X11/X.h>
#include <X11/Xprotostr.h> #include <X11/Xprotostr.h>
#include "misc.h" #include "misc.h"
@ -75,10 +68,16 @@ static double miDsin(double a);
static double miDcos(double a); static double miDcos(double a);
static double miDasin(double v); static double miDasin(double v);
static double miDatan2(double dy, double dx); static double miDatan2(double dy, double dx);
double cbrt(double);
#ifdef ICEILTEMPDECL #ifndef HAVE_CBRT
ICEILTEMPDECL static double
cbrt(double x)
{
if (x > 0.0)
return pow(x, 1.0/3.0);
else
return -pow(-x, 1.0/3.0);
}
#endif #endif
/* /*
@ -104,37 +103,16 @@ ICEILTEMPDECL
#undef max #undef max
#undef min #undef min
#if defined (__GNUC__) && !defined (__STRICT_ANSI__) _X_INLINE static int max (const int x, const int y)
#define USE_INLINE
#endif
#ifdef USE_INLINE
inline static int max (const int x, const int y)
{ {
return x>y? x:y; return x>y? x:y;
} }
inline static int min (const int x, const int y) _X_INLINE static int min (const int x, const int y)
{ {
return x<y? x:y; return x<y? x:y;
} }
#else
static int
max (int x, int y)
{
return x>y? x:y;
}
static int
min (int x, int y)
{
return x<y? x:y;
}
#endif
struct bound { struct bound {
double min, max; double min, max;
}; };

View File

@ -48,6 +48,8 @@ SOFTWARE.
#ifndef __MIFPOLY_H__ #ifndef __MIFPOLY_H__
#define __MIFPOLY_H__ #define __MIFPOLY_H__
#include <X11/Xfuncproto.h>
#define EPSILON 0.000001 #define EPSILON 0.000001
#define ISEQUAL(a,b) (Fabs((a) - (b)) <= EPSILON) #define ISEQUAL(a,b) (Fabs((a) - (b)) <= EPSILON)
#define UNEQUAL(a,b) (Fabs((a) - (b)) > EPSILON) #define UNEQUAL(a,b) (Fabs((a) - (b)) > EPSILON)
@ -66,20 +68,11 @@ SOFTWARE.
#define SQSECANT 108.856472512142 /* 1/sin^2(11/2) - for 11o miter cutoff */ #define SQSECANT 108.856472512142 /* 1/sin^2(11/2) - for 11o miter cutoff */
#define D2SECANT 5.21671526231167 /* 1/2*sin(11/2) - max extension per width */ #define D2SECANT 5.21671526231167 /* 1/2*sin(11/2) - max extension per width */
#ifdef NOINLINEICEIL static _X_INLINE int ICEIL(double x)
#define ICEIL(x) ((int)ceil(x))
#else
#ifdef __GNUC__
static __inline int ICEIL(double x)
{ {
int _cTmp = x; int _cTmp = x;
return ((x == _cTmp) || (x < 0.0)) ? _cTmp : _cTmp+1; return ((x == _cTmp) || (x < 0.0)) ? _cTmp : _cTmp+1;
} }
#else
#define ICEIL(x) ((((x) == (_cTmp = (x))) || ((x) < 0.0)) ? _cTmp : _cTmp+1)
#define ICEILTEMPDECL static int _cTmp;
#endif
#endif
/* Point with sub-pixel positioning. In this case we use doubles, but /* Point with sub-pixel positioning. In this case we use doubles, but
* see mifpolycon.c for other suggestions * see mifpolycon.c for other suggestions

View File

@ -58,10 +58,6 @@ SOFTWARE.
static int GetFPolyYBounds(SppPointPtr pts, int n, double yFtrans, static int GetFPolyYBounds(SppPointPtr pts, int n, double yFtrans,
int *by, int *ty); int *by, int *ty);
#ifdef ICEILTEMPDECL
ICEILTEMPDECL
#endif
/* /*
* Written by Todd Newman; April. 1987. * Written by Todd Newman; April. 1987.
* *

View File

@ -81,15 +81,11 @@ Equipment Corporation.
#include "regionstr.h" #include "regionstr.h"
#include <X11/Xprotostr.h> #include <X11/Xprotostr.h>
#include <X11/Xfuncproto.h>
#include "gc.h" #include "gc.h"
#include "mi.h" #include "mi.h"
#include "mispans.h" #include "mispans.h"
#include <pixman/pixman.h>
#if defined (__GNUC__) && !defined (NO_INLINES)
#define INLINE __inline
#else
#define INLINE
#endif
#undef assert #undef assert
#ifdef DEBUG #ifdef DEBUG
@ -223,6 +219,43 @@ _X_EXPORT RegDataRec miEmptyData = {0, 0};
RegDataRec miBrokenData = {0, 0}; RegDataRec miBrokenData = {0, 0};
static RegionRec miBrokenRegion = { { 0, 0, 0, 0 }, &miBrokenData }; static RegionRec miBrokenRegion = { { 0, 0, 0, 0 }, &miBrokenData };
extern void
InitRegions (void)
{
pixman_region_set_static_pointers (&miEmptyBox, &miEmptyData, &miBrokenData);
}
/*****************************************************************
* RegionCreate(rect, size)
* This routine does a simple malloc to make a structure of
* REGION of "size" number of rectangles.
*****************************************************************/
_X_EXPORT RegionPtr
miRegionCreate(rect, size)
BoxPtr rect;
int size;
{
RegionPtr pReg;
pReg = (RegionPtr)xalloc(sizeof(RegionRec));
if (!pReg)
return &miBrokenRegion;
miRegionInit (pReg, rect, size);
return(pReg);
}
_X_EXPORT void
miRegionDestroy(pReg)
RegionPtr pReg;
{
pixman_region_fini (pReg);
if (pReg != &miBrokenRegion)
xfree(pReg);
}
_X_EXPORT void _X_EXPORT void
miPrintRegion(rgn) miPrintRegion(rgn)
RegionPtr rgn; RegionPtr rgn;
@ -248,26 +281,7 @@ miRegionEqual(reg1, reg2)
RegionPtr reg1; RegionPtr reg1;
RegionPtr reg2; RegionPtr reg2;
{ {
int i, num; return pixman_region_equal (reg1, reg2);
BoxPtr rects1, rects2;
if (reg1->extents.x1 != reg2->extents.x1) return FALSE;
if (reg1->extents.x2 != reg2->extents.x2) return FALSE;
if (reg1->extents.y1 != reg2->extents.y1) return FALSE;
if (reg1->extents.y2 != reg2->extents.y2) return FALSE;
num = REGION_NUM_RECTS(reg1);
if (num != REGION_NUM_RECTS(reg2)) return FALSE;
rects1 = REGION_RECTS(reg1);
rects2 = REGION_RECTS(reg2);
for (i = 0; i != num; i++) {
if (rects1[i].x1 != rects2[i].x1) return FALSE;
if (rects1[i].x2 != rects2[i].x2) return FALSE;
if (rects1[i].y1 != rects2[i].y1) return FALSE;
if (rects1[i].y2 != rects2[i].y2) return FALSE;
}
return TRUE;
} }
#ifdef DEBUG #ifdef DEBUG
@ -302,7 +316,7 @@ miValidRegion(reg)
(pboxN->y1 >= pboxN->y2)) (pboxN->y1 >= pboxN->y2))
return FALSE; return FALSE;
if (pboxN->x1 < box.x1) if (pboxN->x1 < box.x1)
box.x1 = pboxN->x1; box.x1 = pboxN->x1;
if (pboxN->x2 > box.x2) if (pboxN->x2 > box.x2)
box.x2 = pboxN->x2; box.x2 = pboxN->x2;
if ((pboxN->y1 < pboxP->y1) || if ((pboxN->y1 < pboxP->y1) ||
@ -316,45 +330,8 @@ miValidRegion(reg)
(box.y2 == reg->extents.y2)); (box.y2 == reg->extents.y2));
} }
} }
#endif /* DEBUG */ #endif /* DEBUG */
/*****************************************************************
* RegionCreate(rect, size)
* This routine does a simple malloc to make a structure of
* REGION of "size" number of rectangles.
*****************************************************************/
_X_EXPORT RegionPtr
miRegionCreate(rect, size)
BoxPtr rect;
int size;
{
RegionPtr pReg;
pReg = (RegionPtr)xalloc(sizeof(RegionRec));
if (!pReg)
return &miBrokenRegion;
if (rect)
{
pReg->extents = *rect;
pReg->data = (RegDataPtr)NULL;
}
else
{
pReg->extents = miEmptyBox;
if ((size > 1) && (pReg->data = xallocData(size)))
{
pReg->data->size = size;
pReg->data->numRects = 0;
}
else
pReg->data = &miEmptyData;
}
return(pReg);
}
/***************************************************************** /*****************************************************************
* RegionInit(pReg, rect, size) * RegionInit(pReg, rect, size)
* Outer region rect is statically allocated. * Outer region rect is statically allocated.
@ -367,39 +344,16 @@ miRegionInit(pReg, rect, size)
int size; int size;
{ {
if (rect) if (rect)
{ pixman_region_init_with_extents (pReg, rect);
pReg->extents = *rect;
pReg->data = (RegDataPtr)NULL;
}
else else
{ pixman_region_init (pReg);
pReg->extents = miEmptyBox;
if ((size > 1) && (pReg->data = xallocData(size)))
{
pReg->data->size = size;
pReg->data->numRects = 0;
}
else
pReg->data = &miEmptyData;
}
}
_X_EXPORT void
miRegionDestroy(pReg)
RegionPtr pReg;
{
good(pReg);
xfreeData(pReg);
if (pReg != &miBrokenRegion)
xfree(pReg);
} }
_X_EXPORT void _X_EXPORT void
miRegionUninit(pReg) miRegionUninit(pReg)
RegionPtr pReg; RegionPtr pReg;
{ {
good(pReg); pixman_region_fini (pReg);
xfreeData(pReg);
} }
Bool Bool
@ -458,32 +412,9 @@ miRegionCopy(dst, src)
RegionPtr dst; RegionPtr dst;
RegionPtr src; RegionPtr src;
{ {
good(dst); return pixman_region_copy (dst, src);
good(src);
if (dst == src)
return TRUE;
dst->extents = src->extents;
if (!src->data || !src->data->size)
{
xfreeData(dst);
dst->data = src->data;
return TRUE;
}
if (!dst->data || (dst->data->size < src->data->numRects))
{
xfreeData(dst);
dst->data = xallocData(src->data->numRects);
if (!dst->data)
return miRegionBreak (dst);
dst->data->size = src->data->numRects;
}
dst->data->numRects = src->data->numRects;
memmove((char *)REGION_BOXPTR(dst),(char *)REGION_BOXPTR(src),
dst->data->numRects * sizeof(BoxRec));
return TRUE;
} }
/*====================================================================== /*======================================================================
* Generic Region Operator * Generic Region Operator
*====================================================================*/ *====================================================================*/
@ -506,7 +437,7 @@ miRegionCopy(dst, src)
* *
*----------------------------------------------------------------------- *-----------------------------------------------------------------------
*/ */
INLINE static int _X_INLINE static int
miCoalesce ( miCoalesce (
RegionPtr pReg, /* Region to coalesce */ RegionPtr pReg, /* Region to coalesce */
int prevStart, /* Index of start of previous band */ int prevStart, /* Index of start of previous band */
@ -590,7 +521,7 @@ miCoalesce (
*----------------------------------------------------------------------- *-----------------------------------------------------------------------
*/ */
INLINE static Bool _X_INLINE static Bool
miAppendNonO ( miAppendNonO (
RegionPtr pReg, RegionPtr pReg,
BoxPtr r, BoxPtr r,
@ -914,8 +845,7 @@ miRegionOp(
*----------------------------------------------------------------------- *-----------------------------------------------------------------------
*/ */
static void static void
miSetExtents (pReg) miSetExtents (RegionPtr pReg)
RegionPtr pReg;
{ {
BoxPtr pBox, pBoxEnd; BoxPtr pBox, pBoxEnd;
@ -972,113 +902,13 @@ miSetExtents (pReg)
*----------------------------------------------------------------------- *-----------------------------------------------------------------------
*/ */
/*ARGSUSED*/ /*ARGSUSED*/
static Bool
miIntersectO (
RegionPtr pReg,
BoxPtr r1,
BoxPtr r1End,
BoxPtr r2,
BoxPtr r2End,
short y1,
short y2,
Bool *pOverlap)
{
int x1;
int x2;
BoxPtr pNextRect;
pNextRect = REGION_TOP(pReg);
assert(y1 < y2);
assert(r1 != r1End && r2 != r2End);
do {
x1 = max(r1->x1, r2->x1);
x2 = min(r1->x2, r2->x2);
/*
* If there's any overlap between the two rectangles, add that
* overlap to the new region.
*/
if (x1 < x2)
NEWRECT(pReg, pNextRect, x1, y1, x2, y2);
/*
* Advance the pointer(s) with the leftmost right side, since the next
* rectangle on that list may still overlap the other region's
* current rectangle.
*/
if (r1->x2 == x2) {
r1++;
}
if (r2->x2 == x2) {
r2++;
}
} while ((r1 != r1End) && (r2 != r2End));
return TRUE;
}
_X_EXPORT Bool _X_EXPORT Bool
miIntersect(newReg, reg1, reg2) miIntersect(newReg, reg1, reg2)
RegionPtr newReg; /* destination Region */ RegionPtr newReg; /* destination Region */
RegionPtr reg1; RegionPtr reg1;
RegionPtr reg2; /* source regions */ RegionPtr reg2; /* source regions */
{ {
good(reg1); return pixman_region_intersect (newReg, reg1, reg2);
good(reg2);
good(newReg);
/* check for trivial reject */
if (REGION_NIL(reg1) || REGION_NIL(reg2) ||
!EXTENTCHECK(&reg1->extents, &reg2->extents))
{
/* Covers about 20% of all cases */
xfreeData(newReg);
newReg->extents.x2 = newReg->extents.x1;
newReg->extents.y2 = newReg->extents.y1;
if (REGION_NAR(reg1) || REGION_NAR(reg2))
{
newReg->data = &miBrokenData;
return FALSE;
}
else
newReg->data = &miEmptyData;
}
else if (!reg1->data && !reg2->data)
{
/* Covers about 80% of cases that aren't trivially rejected */
newReg->extents.x1 = max(reg1->extents.x1, reg2->extents.x1);
newReg->extents.y1 = max(reg1->extents.y1, reg2->extents.y1);
newReg->extents.x2 = min(reg1->extents.x2, reg2->extents.x2);
newReg->extents.y2 = min(reg1->extents.y2, reg2->extents.y2);
xfreeData(newReg);
newReg->data = (RegDataPtr)NULL;
}
else if (!reg2->data && SUBSUMES(&reg2->extents, &reg1->extents))
{
return miRegionCopy(newReg, reg1);
}
else if (!reg1->data && SUBSUMES(&reg1->extents, &reg2->extents))
{
return miRegionCopy(newReg, reg2);
}
else if (reg1 == reg2)
{
return miRegionCopy(newReg, reg1);
}
else
{
/* General purpose intersection */
Bool overlap; /* result ignored */
if (!miRegionOp(newReg, reg1, reg2, miIntersectO, FALSE, FALSE,
&overlap))
return FALSE;
miSetExtents(newReg);
}
good(newReg);
return(TRUE);
} }
#define MERGERECT(r) \ #define MERGERECT(r) \
@ -1181,78 +1011,9 @@ miUnion(newReg, reg1, reg2)
RegionPtr reg1; RegionPtr reg1;
RegionPtr reg2; /* source regions */ RegionPtr reg2; /* source regions */
{ {
Bool overlap; /* result ignored */ return pixman_region_union (newReg, reg1, reg2);
/* Return TRUE if some overlap between reg1, reg2 */
good(reg1);
good(reg2);
good(newReg);
/* checks all the simple cases */
/*
* Region 1 and 2 are the same
*/
if (reg1 == reg2)
{
return miRegionCopy(newReg, reg1);
}
/*
* Region 1 is empty
*/
if (REGION_NIL(reg1))
{
if (REGION_NAR(reg1))
return miRegionBreak (newReg);
if (newReg != reg2)
return miRegionCopy(newReg, reg2);
return TRUE;
}
/*
* Region 2 is empty
*/
if (REGION_NIL(reg2))
{
if (REGION_NAR(reg2))
return miRegionBreak (newReg);
if (newReg != reg1)
return miRegionCopy(newReg, reg1);
return TRUE;
}
/*
* Region 1 completely subsumes region 2
*/
if (!reg1->data && SUBSUMES(&reg1->extents, &reg2->extents))
{
if (newReg != reg1)
return miRegionCopy(newReg, reg1);
return TRUE;
}
/*
* Region 2 completely subsumes region 1
*/
if (!reg2->data && SUBSUMES(&reg2->extents, &reg1->extents))
{
if (newReg != reg2)
return miRegionCopy(newReg, reg2);
return TRUE;
}
if (!miRegionOp(newReg, reg1, reg2, miUnionO, TRUE, TRUE, &overlap))
return FALSE;
newReg->extents.x1 = min(reg1->extents.x1, reg2->extents.x1);
newReg->extents.y1 = min(reg1->extents.y1, reg2->extents.y1);
newReg->extents.x2 = max(reg1->extents.x2, reg2->extents.x2);
newReg->extents.y2 = max(reg1->extents.y2, reg2->extents.y2);
good(newReg);
return TRUE;
} }
/*====================================================================== /*======================================================================
* Batch Rectangle Union * Batch Rectangle Union
*====================================================================*/ *====================================================================*/
@ -1657,6 +1418,7 @@ miRectsToRegion(nrects, prect, ctype)
xRectangle *prect; xRectangle *prect;
int ctype; int ctype;
{ {
RegionPtr pRgn; RegionPtr pRgn;
RegDataPtr pData; RegDataPtr pData;
BoxPtr pBox; BoxPtr pBox;
@ -1752,115 +1514,6 @@ miRectsToRegion(nrects, prect, ctype)
*----------------------------------------------------------------------- *-----------------------------------------------------------------------
*/ */
/*ARGSUSED*/ /*ARGSUSED*/
static Bool
miSubtractO (
RegionPtr pReg,
BoxPtr r1,
BoxPtr r1End,
BoxPtr r2,
BoxPtr r2End,
short y1,
short y2,
Bool *pOverlap)
{
BoxPtr pNextRect;
int x1;
x1 = r1->x1;
assert(y1<y2);
assert(r1 != r1End && r2 != r2End);
pNextRect = REGION_TOP(pReg);
do
{
if (r2->x2 <= x1)
{
/*
* Subtrahend entirely to left of minuend: go to next subtrahend.
*/
r2++;
}
else if (r2->x1 <= x1)
{
/*
* Subtrahend preceeds minuend: nuke left edge of minuend.
*/
x1 = r2->x2;
if (x1 >= r1->x2)
{
/*
* Minuend completely covered: advance to next minuend and
* reset left fence to edge of new minuend.
*/
r1++;
if (r1 != r1End)
x1 = r1->x1;
}
else
{
/*
* Subtrahend now used up since it doesn't extend beyond
* minuend
*/
r2++;
}
}
else if (r2->x1 < r1->x2)
{
/*
* Left part of subtrahend covers part of minuend: add uncovered
* part of minuend to region and skip to next subtrahend.
*/
assert(x1<r2->x1);
NEWRECT(pReg, pNextRect, x1, y1, r2->x1, y2);
x1 = r2->x2;
if (x1 >= r1->x2)
{
/*
* Minuend used up: advance to new...
*/
r1++;
if (r1 != r1End)
x1 = r1->x1;
}
else
{
/*
* Subtrahend used up
*/
r2++;
}
}
else
{
/*
* Minuend used up: add any remaining piece before advancing.
*/
if (r1->x2 > x1)
NEWRECT(pReg, pNextRect, x1, y1, r1->x2, y2);
r1++;
if (r1 != r1End)
x1 = r1->x1;
}
} while ((r1 != r1End) && (r2 != r2End));
/*
* Add remaining minuend rectangles to region.
*/
while (r1 != r1End)
{
assert(x1<r1->x2);
NEWRECT(pReg, pNextRect, x1, y1, r1->x2, y2);
r1++;
if (r1 != r1End)
x1 = r1->x1;
}
return TRUE;
}
/*- /*-
*----------------------------------------------------------------------- *-----------------------------------------------------------------------
@ -1882,44 +1535,7 @@ miSubtract(regD, regM, regS)
RegionPtr regM; RegionPtr regM;
RegionPtr regS; RegionPtr regS;
{ {
Bool overlap; /* result ignored */ return pixman_region_subtract (regD, regM, regS);
good(regM);
good(regS);
good(regD);
/* check for trivial rejects */
if (REGION_NIL(regM) || REGION_NIL(regS) ||
!EXTENTCHECK(&regM->extents, &regS->extents))
{
if (REGION_NAR (regS))
return miRegionBreak (regD);
return miRegionCopy(regD, regM);
}
else if (regM == regS)
{
xfreeData(regD);
regD->extents.x2 = regD->extents.x1;
regD->extents.y2 = regD->extents.y1;
regD->data = &miEmptyData;
return TRUE;
}
/* Add those rectangles in region 1 that aren't in region 2,
do yucky substraction for overlaps, and
just throw away rectangles in region 2 that aren't in region 1 */
if (!miRegionOp(regD, regM, regS, miSubtractO, TRUE, FALSE, &overlap))
return FALSE;
/*
* Can't alter RegD's extents before we call miRegionOp because
* it might be one of the source regions and miRegionOp depends
* on the extents of those regions being unaltered. Besides, this
* way there's no checking against rectangles that will be nuked
* due to coalescing, so we have to examine fewer rectangles.
*/
miSetExtents(regD);
good(regD);
return TRUE;
} }
/*====================================================================== /*======================================================================
@ -1947,150 +1563,14 @@ miInverse(newReg, reg1, invRect)
RegionPtr reg1; /* Region to invert */ RegionPtr reg1; /* Region to invert */
BoxPtr invRect; /* Bounding box for inversion */ BoxPtr invRect; /* Bounding box for inversion */
{ {
RegionRec invReg; /* Quick and dirty region made from the return pixman_region_inverse (newReg, reg1, invRect);
* bounding box */
Bool overlap; /* result ignored */
good(reg1);
good(newReg);
/* check for trivial rejects */
if (REGION_NIL(reg1) || !EXTENTCHECK(invRect, &reg1->extents))
{
if (REGION_NAR(reg1))
return miRegionBreak (newReg);
newReg->extents = *invRect;
xfreeData(newReg);
newReg->data = (RegDataPtr)NULL;
return TRUE;
}
/* Add those rectangles in region 1 that aren't in region 2,
do yucky substraction for overlaps, and
just throw away rectangles in region 2 that aren't in region 1 */
invReg.extents = *invRect;
invReg.data = (RegDataPtr)NULL;
if (!miRegionOp(newReg, &invReg, reg1, miSubtractO, TRUE, FALSE, &overlap))
return FALSE;
/*
* Can't alter newReg's extents before we call miRegionOp because
* it might be one of the source regions and miRegionOp depends
* on the extents of those regions being unaltered. Besides, this
* way there's no checking against rectangles that will be nuked
* due to coalescing, so we have to examine fewer rectangles.
*/
miSetExtents(newReg);
good(newReg);
return TRUE;
} }
/*
* RectIn(region, rect)
* This routine takes a pointer to a region and a pointer to a box
* and determines if the box is outside/inside/partly inside the region.
*
* The idea is to travel through the list of rectangles trying to cover the
* passed box with them. Anytime a piece of the rectangle isn't covered
* by a band of rectangles, partOut is set TRUE. Any time a rectangle in
* the region covers part of the box, partIn is set TRUE. The process ends
* when either the box has been completely covered (we reached a band that
* doesn't overlap the box, partIn is TRUE and partOut is false), the
* box has been partially covered (partIn == partOut == TRUE -- because of
* the banding, the first time this is true we know the box is only
* partially in the region) or is outside the region (we reached a band
* that doesn't overlap the box at all and partIn is false)
*/
_X_EXPORT int _X_EXPORT int
miRectIn(region, prect) miRectIn(region, prect)
RegionPtr region; RegionPtr region;
BoxPtr prect; BoxPtr prect;
{ {
int x; return pixman_region_contains_rectangle (region, prect);
int y;
BoxPtr pbox;
BoxPtr pboxEnd;
int partIn, partOut;
int numRects;
good(region);
numRects = REGION_NUM_RECTS(region);
/* useful optimization */
if (!numRects || !EXTENTCHECK(&region->extents, prect))
return(rgnOUT);
if (numRects == 1)
{
/* We know that it must be rgnIN or rgnPART */
if (SUBSUMES(&region->extents, prect))
return(rgnIN);
else
return(rgnPART);
}
partOut = FALSE;
partIn = FALSE;
/* (x,y) starts at upper left of rect, moving to the right and down */
x = prect->x1;
y = prect->y1;
/* can stop when both partOut and partIn are TRUE, or we reach prect->y2 */
for (pbox = REGION_BOXPTR(region), pboxEnd = pbox + numRects;
pbox != pboxEnd;
pbox++)
{
if (pbox->y2 <= y)
continue; /* getting up to speed or skipping remainder of band */
if (pbox->y1 > y)
{
partOut = TRUE; /* missed part of rectangle above */
if (partIn || (pbox->y1 >= prect->y2))
break;
y = pbox->y1; /* x guaranteed to be == prect->x1 */
}
if (pbox->x2 <= x)
continue; /* not far enough over yet */
if (pbox->x1 > x)
{
partOut = TRUE; /* missed part of rectangle to left */
if (partIn)
break;
}
if (pbox->x1 < prect->x2)
{
partIn = TRUE; /* definitely overlap */
if (partOut)
break;
}
if (pbox->x2 >= prect->x2)
{
y = pbox->y2; /* finished with this band */
if (y >= prect->y2)
break;
x = prect->x1; /* reset x out to left again */
}
else
{
/*
* Because boxes in a band are maximal width, if the first box
* to overlap the rectangle doesn't completely cover it in that
* band, the rectangle must be partially out, since some of it
* will be uncovered in that band. partIn will have been set true
* by now...
*/
partOut = TRUE;
break;
}
}
return(partIn ? ((y < prect->y2) ? rgnPART : rgnIN) : rgnOUT);
} }
/* TranslateRegion(pReg, x, y) /* TranslateRegion(pReg, x, y)
@ -2103,83 +1583,7 @@ miTranslateRegion(pReg, x, y)
int x; int x;
int y; int y;
{ {
int x1, x2, y1, y2; pixman_region_translate (pReg, x, y);
int nbox;
BoxPtr pbox;
good(pReg);
pReg->extents.x1 = x1 = pReg->extents.x1 + x;
pReg->extents.y1 = y1 = pReg->extents.y1 + y;
pReg->extents.x2 = x2 = pReg->extents.x2 + x;
pReg->extents.y2 = y2 = pReg->extents.y2 + y;
if (((x1 - MINSHORT)|(y1 - MINSHORT)|(MAXSHORT - x2)|(MAXSHORT - y2)) >= 0)
{
if (pReg->data && (nbox = pReg->data->numRects))
{
for (pbox = REGION_BOXPTR(pReg); nbox--; pbox++)
{
pbox->x1 += x;
pbox->y1 += y;
pbox->x2 += x;
pbox->y2 += y;
}
}
return;
}
if (((x2 - MINSHORT)|(y2 - MINSHORT)|(MAXSHORT - x1)|(MAXSHORT - y1)) <= 0)
{
pReg->extents.x2 = pReg->extents.x1;
pReg->extents.y2 = pReg->extents.y1;
xfreeData(pReg);
pReg->data = &miEmptyData;
return;
}
if (x1 < MINSHORT)
pReg->extents.x1 = MINSHORT;
else if (x2 > MAXSHORT)
pReg->extents.x2 = MAXSHORT;
if (y1 < MINSHORT)
pReg->extents.y1 = MINSHORT;
else if (y2 > MAXSHORT)
pReg->extents.y2 = MAXSHORT;
if (pReg->data && (nbox = pReg->data->numRects))
{
BoxPtr pboxout;
for (pboxout = pbox = REGION_BOXPTR(pReg); nbox--; pbox++)
{
pboxout->x1 = x1 = pbox->x1 + x;
pboxout->y1 = y1 = pbox->y1 + y;
pboxout->x2 = x2 = pbox->x2 + x;
pboxout->y2 = y2 = pbox->y2 + y;
if (((x2 - MINSHORT)|(y2 - MINSHORT)|
(MAXSHORT - x1)|(MAXSHORT - y1)) <= 0)
{
pReg->data->numRects--;
continue;
}
if (x1 < MINSHORT)
pboxout->x1 = MINSHORT;
else if (x2 > MAXSHORT)
pboxout->x2 = MAXSHORT;
if (y1 < MINSHORT)
pboxout->y1 = MINSHORT;
else if (y2 > MAXSHORT)
pboxout->y2 = MAXSHORT;
pboxout++;
}
if (pboxout != pbox)
{
if (pReg->data->numRects == 1)
{
pReg->extents = *REGION_BOXPTR(pReg);
xfreeData(pReg);
pReg->data = (RegDataPtr)NULL;
}
else
miSetExtents(pReg);
}
}
} }
_X_EXPORT void _X_EXPORT void
@ -2187,12 +1591,7 @@ miRegionReset(pReg, pBox)
RegionPtr pReg; RegionPtr pReg;
BoxPtr pBox; BoxPtr pBox;
{ {
good(pReg); pixman_region_reset (pReg, pBox);
assert(pBox->x1<=pBox->x2);
assert(pBox->y1<=pBox->y2);
pReg->extents = *pBox;
xfreeData(pReg);
pReg->data = (RegDataPtr)NULL;
} }
_X_EXPORT Bool _X_EXPORT Bool
@ -2201,40 +1600,14 @@ miPointInRegion(pReg, x, y, box)
int x, y; int x, y;
BoxPtr box; /* "return" value */ BoxPtr box; /* "return" value */
{ {
BoxPtr pbox, pboxEnd; return pixman_region_contains_point (pReg, x, y, box);
int numRects;
good(pReg);
numRects = REGION_NUM_RECTS(pReg);
if (!numRects || !INBOX(&pReg->extents, x, y))
return(FALSE);
if (numRects == 1)
{
*box = pReg->extents;
return(TRUE);
}
for (pbox = REGION_BOXPTR(pReg), pboxEnd = pbox + numRects;
pbox != pboxEnd;
pbox++)
{
if (y >= pbox->y2)
continue; /* not there yet */
if ((y < pbox->y1) || (x < pbox->x1))
break; /* missed it */
if (x >= pbox->x2)
continue; /* not there yet */
*box = *pbox;
return(TRUE);
}
return(FALSE);
} }
_X_EXPORT Bool _X_EXPORT Bool
miRegionNotEmpty(pReg) miRegionNotEmpty(pReg)
RegionPtr pReg; RegionPtr pReg;
{ {
good(pReg); return pixman_region_not_empty (pReg);
return(!REGION_NIL(pReg));
} }
Bool Bool

View File

@ -52,10 +52,6 @@ from The Open Group.
#include "miwideline.h" #include "miwideline.h"
#include "mi.h" #include "mi.h"
#ifdef ICEILTEMPDECL
ICEILTEMPDECL
#endif
static void miLineArc(DrawablePtr pDraw, GCPtr pGC, static void miLineArc(DrawablePtr pDraw, GCPtr pGC,
unsigned long pixel, SpanDataPtr spanData, unsigned long pixel, SpanDataPtr spanData,
LineFacePtr leftFace, LineFacePtr leftFace,

View File

@ -30,6 +30,7 @@
#include "gcstruct.h" #include "gcstruct.h"
#include "pixmapstr.h" #include "pixmapstr.h"
#include "cw.h" #include "cw.h"
#include "mi.h"
#define SETUP_BACKING_DST(_pDst, _pGC) \ #define SETUP_BACKING_DST(_pDst, _pGC) \
cwGCPtr pGCPrivate = getCwGC (_pGC); \ cwGCPtr pGCPrivate = getCwGC (_pGC); \
@ -185,7 +186,7 @@ cwCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy,
int w, int h, int dstx, int dsty) int w, int h, int dstx, int dsty)
{ {
int odstx, odsty; int odstx, odsty;
RegionPtr exposed = NULL; int osrcx, osrcy;
SETUP_BACKING_DST(pDst, pGC); SETUP_BACKING_DST(pDst, pGC);
SETUP_BACKING_SRC(pSrc, pGC); SETUP_BACKING_SRC(pSrc, pGC);
@ -193,19 +194,20 @@ cwCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy,
odstx = dstx; odstx = dstx;
odsty = dsty; odsty = dsty;
osrcx = srcx;
osrcy = srcy;
CW_OFFSET_XY_DST(dstx, dsty); CW_OFFSET_XY_DST(dstx, dsty);
CW_OFFSET_XY_SRC(srcx, srcy); CW_OFFSET_XY_SRC(srcx, srcy);
exposed = (*pBackingGC->ops->CopyArea)(pBackingSrc, pBackingDst, (*pBackingGC->ops->CopyArea)(pBackingSrc, pBackingDst,
pBackingGC, srcx, srcy, w, h, pBackingGC, srcx, srcy, w, h,
dstx, dsty); dstx, dsty);
if (exposed != NULL)
REGION_TRANSLATE(pDst->pScreen, exposed, odstx - dstx, odsty - dsty);
EPILOGUE(pGC); EPILOGUE(pGC);
return exposed; return miHandleExposures(pSrc, pDst, pGC,
osrcx, osrcy, w, h,
odstx, odsty, 0);
} }
static RegionPtr static RegionPtr
@ -213,7 +215,7 @@ cwCopyPlane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy,
int w, int h, int dstx, int dsty, unsigned long plane) int w, int h, int dstx, int dsty, unsigned long plane)
{ {
int odstx, odsty; int odstx, odsty;
RegionPtr exposed = NULL; int osrcx, osrcy;
SETUP_BACKING_DST(pDst, pGC); SETUP_BACKING_DST(pDst, pGC);
SETUP_BACKING_SRC(pSrc, pGC); SETUP_BACKING_SRC(pSrc, pGC);
@ -221,19 +223,20 @@ cwCopyPlane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy,
odstx = dstx; odstx = dstx;
odsty = dsty; odsty = dsty;
osrcx = srcx;
osrcy = srcy;
CW_OFFSET_XY_DST(dstx, dsty); CW_OFFSET_XY_DST(dstx, dsty);
CW_OFFSET_XY_SRC(srcx, srcy); CW_OFFSET_XY_SRC(srcx, srcy);
exposed = (*pBackingGC->ops->CopyPlane)(pBackingSrc, pBackingDst, (*pBackingGC->ops->CopyPlane)(pBackingSrc, pBackingDst,
pBackingGC, srcx, srcy, w, h, pBackingGC, srcx, srcy, w, h,
dstx, dsty, plane); dstx, dsty, plane);
if (exposed != NULL)
REGION_TRANSLATE(pDst->pScreen, exposed, odstx - dstx, odsty - dsty);
EPILOGUE(pGC); EPILOGUE(pGC);
return exposed; return miHandleExposures(pSrc, pDst, pGC,
osrcx, osrcy, w, h,
odstx, odsty, plane);
} }
static void static void

View File

@ -46,22 +46,6 @@
#include "fbpict.h" #include "fbpict.h"
#include "safeAlpha.h" #include "safeAlpha.h"
#include "rootlessCommon.h" #include "rootlessCommon.h"
# define mod(a,b) ((b) == 1 ? 0 : (a) >= 0 ? (a) % (b) : (b) - (-a) % (b))
typedef void (*CompositeFunc) (CARD8 op,
PicturePtr pSrc,
PicturePtr pMask,
PicturePtr pDst,
INT16 xSrc,
INT16 ySrc,
INT16 xMask,
INT16 yMask,
INT16 xDst,
INT16 yDst,
CARD16 width,
CARD16 height);
/* Optimized version of fbCompositeSolidMask_nx8x8888 */ /* Optimized version of fbCompositeSolidMask_nx8x8888 */
void void
@ -148,45 +132,21 @@ SafeAlphaCompositeSolidMask_nx8x8888(
} }
void void
SafeAlphaComposite (CARD8 op, SafeAlphaComposite (CARD8 op,
PicturePtr pSrc, PicturePtr pSrc,
PicturePtr pMask, PicturePtr pMask,
PicturePtr pDst, PicturePtr pDst,
INT16 xSrc, INT16 xSrc,
INT16 ySrc, INT16 ySrc,
INT16 xMask, INT16 xMask,
INT16 yMask, INT16 yMask,
INT16 xDst, INT16 xDst,
INT16 yDst, INT16 yDst,
CARD16 width, CARD16 width,
CARD16 height) CARD16 height)
{ {
RegionRec region; int oldDepth = pDst->pDrawable->depth;
int n; int oldFormat = pDst->format;
BoxPtr pbox;
CompositeFunc func = 0;
Bool srcRepeat = pSrc->repeat;
Bool maskRepeat = FALSE;
Bool srcAlphaMap = pSrc->alphaMap != 0;
Bool maskAlphaMap = FALSE;
Bool dstAlphaMap = pDst->alphaMap != 0;
int x_msk, y_msk, x_src, y_src, x_dst, y_dst;
int w, h, w_this, h_this;
int dstDepth = pDst->pDrawable->depth;
int oldFormat = pDst->format;
xDst += pDst->pDrawable->x;
yDst += pDst->pDrawable->y;
xSrc += pSrc->pDrawable->x;
ySrc += pSrc->pDrawable->y;
if (pMask)
{
xMask += pMask->pDrawable->x;
yMask += pMask->pDrawable->y;
maskRepeat = pMask->repeat;
maskAlphaMap = pMask->alphaMap != 0;
}
/* /*
* We can use the more optimized fbpict code, but it sets bits above * We can use the more optimized fbpict code, but it sets bits above
@ -198,6 +158,7 @@ SafeAlphaComposite (CARD8 op,
{ {
pDst->pDrawable->depth = 32; pDst->pDrawable->depth = 32;
} }
/* For rootless preserve the alpha in x8r8g8b8 which really is /* For rootless preserve the alpha in x8r8g8b8 which really is
* a8r8g8b8 * a8r8g8b8
*/ */
@ -206,440 +167,33 @@ SafeAlphaComposite (CARD8 op,
pDst->format = PICT_a8r8g8b8; pDst->format = PICT_a8r8g8b8;
} }
if (pSrc->pDrawable && pMask->pDrawable &&
!pSrc->transform && !pMask->transform &&
if (!pSrc->transform && !(pMask && pMask->transform)) !pSrc->alphaMap && !pMask->alphaMap &&
if (!maskAlphaMap && !srcAlphaMap && !dstAlphaMap) !pMask->repeat && !pMask->componentAlpha && !pDst->alphaMap &&
switch (op) { pMask->format == PICT_a8 &&
case PictOpSrc: pSrc->repeatType == RepeatNormal &&
#ifdef USE_MMX pSrc->pDrawable->width == 1 &&
if (!pMask && pSrc->format == pDst->format && pSrc->pDrawable->height == 1 &&
pSrc->pDrawable != pDst->pDrawable) (pDst->format == PICT_a8r8g8b8 ||
{ pDst->format == PICT_x8r8g8b8 ||
func = fbCompositeCopyAreammx; pDst->format == PICT_a8b8g8r8 ||
} pDst->format == PICT_x8b8g8r8))
#endif
break;
case PictOpOver:
if (pMask)
{
if (srcRepeat &&
pSrc->pDrawable->width == 1 &&
pSrc->pDrawable->height == 1)
{
srcRepeat = FALSE;
if (PICT_FORMAT_COLOR(pSrc->format)) {
switch (pMask->format) {
case PICT_a8:
switch (pDst->format) {
case PICT_r5g6b5:
case PICT_b5g6r5:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSolidMask_nx8x0565mmx;
else
#endif
func = fbCompositeSolidMask_nx8x0565;
break;
case PICT_r8g8b8:
case PICT_b8g8r8:
func = fbCompositeSolidMask_nx8x0888;
break;
case PICT_a8r8g8b8:
case PICT_x8r8g8b8:
case PICT_a8b8g8r8:
case PICT_x8b8g8r8:
func = SafeAlphaCompositeSolidMask_nx8x8888;
break;
}
break;
case PICT_a8r8g8b8:
if (pMask->componentAlpha) {
switch (pDst->format) {
case PICT_a8r8g8b8:
case PICT_x8r8g8b8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSolidMask_nx8888x8888Cmmx;
else
#endif
func = fbCompositeSolidMask_nx8888x8888C;
break;
case PICT_r5g6b5:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSolidMask_nx8888x0565Cmmx;
else
#endif
func = fbCompositeSolidMask_nx8888x0565C;
break;
}
}
break;
case PICT_a8b8g8r8:
if (pMask->componentAlpha) {
switch (pDst->format) {
case PICT_a8b8g8r8:
case PICT_x8b8g8r8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSolidMask_nx8888x8888Cmmx;
else
#endif
func = fbCompositeSolidMask_nx8888x8888C;
break;
case PICT_b5g6r5:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSolidMask_nx8888x0565Cmmx;
else
#endif
func = fbCompositeSolidMask_nx8888x0565C;
break;
}
}
break;
case PICT_a1:
switch (pDst->format) {
case PICT_r5g6b5:
case PICT_b5g6r5:
case PICT_r8g8b8:
case PICT_b8g8r8:
case PICT_a8r8g8b8:
case PICT_x8r8g8b8:
case PICT_a8b8g8r8:
case PICT_x8b8g8r8:
func = fbCompositeSolidMask_nx1xn;
break;
}
break;
}
}
}
else /* has mask and non-repeating source */
{
if (pSrc->pDrawable == pMask->pDrawable &&
xSrc == xMask && ySrc == yMask &&
!pMask->componentAlpha)
{
/* source == mask: non-premultiplied data */
switch (pSrc->format) {
case PICT_x8b8g8r8:
switch (pMask->format) {
case PICT_a8r8g8b8:
case PICT_a8b8g8r8:
switch (pDst->format) {
case PICT_a8r8g8b8:
case PICT_x8r8g8b8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrc_8888RevNPx8888mmx;
#endif
break;
case PICT_r5g6b5:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrc_8888RevNPx0565mmx;
#endif
break;
}
break;
}
break;
case PICT_x8r8g8b8:
switch (pMask->format) {
case PICT_a8r8g8b8:
case PICT_a8b8g8r8:
switch (pDst->format) {
case PICT_a8b8g8r8:
case PICT_x8b8g8r8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrc_8888RevNPx8888mmx;
#endif
break;
case PICT_r5g6b5:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrc_8888RevNPx0565mmx;
#endif
break;
}
break;
}
break;
}
break;
}
else
{
/* non-repeating source, repeating mask => translucent window */
if (maskRepeat &&
pMask->pDrawable->width == 1 &&
pMask->pDrawable->height == 1)
{
if (pSrc->format == PICT_x8r8g8b8 &&
pDst->format == PICT_x8r8g8b8 &&
pMask->format == PICT_a8)
{
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrc_8888x8x8888mmx;
#endif
}
}
}
}
}
else /* no mask */
{
if (srcRepeat &&
pSrc->pDrawable->width == 1 &&
pSrc->pDrawable->height == 1)
{
/* no mask and repeating source */
switch (pSrc->format) {
case PICT_a8r8g8b8:
switch (pDst->format) {
case PICT_a8r8g8b8:
case PICT_x8r8g8b8:
#ifdef USE_MMX
if (fbHaveMMX())
{
srcRepeat = FALSE;
func = fbCompositeSolid_nx8888mmx;
}
#endif
break;
case PICT_r5g6b5:
#ifdef USE_MMX
if (fbHaveMMX())
{
srcRepeat = FALSE;
func = fbCompositeSolid_nx0565mmx;
}
#endif
break;
}
break;
}
}
else
{
switch (pSrc->format) {
case PICT_a8r8g8b8:
switch (pDst->format) {
case PICT_a8r8g8b8:
case PICT_x8r8g8b8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrc_8888x8888mmx;
else
#endif
func = fbCompositeSrc_8888x8888;
break;
case PICT_r8g8b8:
func = fbCompositeSrc_8888x0888;
break;
case PICT_r5g6b5:
func = fbCompositeSrc_8888x0565;
break;
}
break;
case PICT_x8r8g8b8:
switch (pDst->format) {
case PICT_a8r8g8b8:
case PICT_x8r8g8b8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeCopyAreammx;
#endif
break;
}
case PICT_x8b8g8r8:
switch (pDst->format) {
case PICT_a8b8g8r8:
case PICT_x8b8g8r8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeCopyAreammx;
#endif
break;
}
break;
case PICT_a8b8g8r8:
switch (pDst->format) {
case PICT_a8b8g8r8:
case PICT_x8b8g8r8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrc_8888x8888mmx;
else
#endif
func = fbCompositeSrc_8888x8888;
break;
case PICT_b8g8r8:
func = fbCompositeSrc_8888x0888;
break;
case PICT_b5g6r5:
func = fbCompositeSrc_8888x0565;
break;
}
break;
case PICT_r5g6b5:
switch (pDst->format) {
case PICT_r5g6b5:
func = fbCompositeSrc_0565x0565;
break;
}
break;
case PICT_b5g6r5:
switch (pDst->format) {
case PICT_b5g6r5:
func = fbCompositeSrc_0565x0565;
break;
}
break;
}
}
}
break;
case PictOpAdd:
if (pMask == 0)
{
switch (pSrc->format) {
case PICT_a8r8g8b8:
switch (pDst->format) {
case PICT_a8r8g8b8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrcAdd_8888x8888mmx;
else
#endif
func = fbCompositeSrcAdd_8888x8888;
break;
}
break;
case PICT_a8b8g8r8:
switch (pDst->format) {
case PICT_a8b8g8r8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrcAdd_8888x8888mmx;
else
#endif
func = fbCompositeSrcAdd_8888x8888;
break;
}
break;
case PICT_a8:
switch (pDst->format) {
case PICT_a8:
#ifdef USE_MMX
if (fbHaveMMX())
func = fbCompositeSrcAdd_8000x8000mmx;
else
#endif
func = fbCompositeSrcAdd_8000x8000;
break;
}
break;
case PICT_a1:
switch (pDst->format) {
case PICT_a1:
func = fbCompositeSrcAdd_1000x1000;
break;
}
break;
}
}
break;
}
if (!func) {
/* no fast path, use the general code */
fbCompositeGeneral(op, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst, yDst, width, height);
// Reset destination depth and format to their true value
pDst->pDrawable->depth = dstDepth;
pDst->format = oldFormat;
return;
}
if (!miComputeCompositeRegion (&region,
pSrc,
pMask,
pDst,
xSrc,
ySrc,
xMask,
yMask,
xDst,
yDst,
width,
height))
return;
n = REGION_NUM_RECTS (&region);
pbox = REGION_RECTS (&region);
while (n--)
{ {
h = pbox->y2 - pbox->y1; fbWalkCompositeRegion (op, pSrc, pMask, pDst,
y_src = pbox->y1 - yDst + ySrc; xSrc, ySrc, xMask, yMask, xDst, yDst,
y_msk = pbox->y1 - yDst + yMask; width, height,
y_dst = pbox->y1; TRUE /* srcRepeat */,
while (h) FALSE /* maskRepeat */,
{ SafeAlphaCompositeSolidMask_nx8x8888);
h_this = h; }
w = pbox->x2 - pbox->x1; else
x_src = pbox->x1 - xDst + xSrc; {
x_msk = pbox->x1 - xDst + xMask; fbComposite (op, pSrc, pMask, pDst,
x_dst = pbox->x1; xSrc, ySrc, xMask, yMask, xDst, yDst, width, height);
if (maskRepeat)
{
y_msk = mod (y_msk, pMask->pDrawable->height);
if (h_this > pMask->pDrawable->height - y_msk)
h_this = pMask->pDrawable->height - y_msk;
}
if (srcRepeat)
{
y_src = mod (y_src, pSrc->pDrawable->height);
if (h_this > pSrc->pDrawable->height - y_src)
h_this = pSrc->pDrawable->height - y_src;
}
while (w)
{
w_this = w;
if (maskRepeat)
{
x_msk = mod (x_msk, pMask->pDrawable->width);
if (w_this > pMask->pDrawable->width - x_msk)
w_this = pMask->pDrawable->width - x_msk;
}
if (srcRepeat)
{
x_src = mod (x_src, pSrc->pDrawable->width);
if (w_this > pSrc->pDrawable->width - x_src)
w_this = pSrc->pDrawable->width - x_src;
}
(*func) (op, pSrc, pMask, pDst,
x_src, y_src, x_msk, y_msk, x_dst, y_dst,
w_this, h_this);
w -= w_this;
x_src += w_this;
x_msk += w_this;
x_dst += w_this;
}
h -= h_this;
y_src += h_this;
y_msk += h_this;
y_dst += h_this;
}
pbox++;
} }
REGION_UNINIT (pDst->pDrawable->pScreen, &region);
// Reset destination depth/format to its true value pDst->pDrawable->depth = oldDepth;
pDst->pDrawable->depth = dstDepth;
pDst->format = oldFormat; pDst->format = oldFormat;
} }

View File

@ -428,6 +428,14 @@ RRXineramaExtensionInit(void)
return; return;
#endif #endif
/*
* Xinerama isn't capable enough to have multiple protocol screens each
* with their own output geometry. So if there's more than one protocol
* screen, just don't even try.
*/
if (screenInfo.numScreens > 1)
return;
(void) AddExtension(PANORAMIX_PROTOCOL_NAME, 0,0, (void) AddExtension(PANORAMIX_PROTOCOL_NAME, 0,0,
ProcRRXineramaDispatch, ProcRRXineramaDispatch,
SProcRRXineramaDispatch, SProcRRXineramaDispatch,

View File

@ -890,54 +890,22 @@ static unsigned int INTERPOLATE_PIXEL_256(unsigned int x, unsigned int a,
return x; return x;
} }
static void initGradientColorTable(SourcePictPtr pGradient, int *error) CARD32
PictureGradientColor (PictGradientStopPtr stop1,
PictGradientStopPtr stop2,
CARD32 x)
{ {
int begin_pos, end_pos; CARD32 current_color, next_color;
xFixed incr, dpos; int dist, idist;
int pos, current_stop;
PictGradientStopPtr stops = pGradient->linear.stops;
int nstops = pGradient->linear.nstops;
/* The position where the gradient begins and ends */ current_color = xRenderColorToCard32 (stop1->color);
begin_pos = (stops[0].x * PICT_GRADIENT_STOPTABLE_SIZE) >> 16; next_color = xRenderColorToCard32 (stop2->color);
end_pos = (stops[nstops - 1].x * PICT_GRADIENT_STOPTABLE_SIZE) >> 16;
pos = 0; /* The position in the color table. */ dist = (int) (256 * (x - stop1->x) / (stop2->x - stop1->x));
idist = 256 - dist;
/* Up to first point */ return premultiply (INTERPOLATE_PIXEL_256 (current_color, idist,
while (pos <= begin_pos) { next_color, dist));
pGradient->linear.colorTable[pos] = xRenderColorToCard32(stops[0].color);
++pos;
}
incr = (1<<16)/ PICT_GRADIENT_STOPTABLE_SIZE; /* the double increment. */
dpos = incr * pos; /* The position in terms of 0-1. */
current_stop = 0; /* We always interpolate between current and current + 1. */
/* Gradient area */
while (pos < end_pos) {
unsigned int current_color = xRenderColorToCard32(stops[current_stop].color);
unsigned int next_color = xRenderColorToCard32(stops[current_stop + 1].color);
int dist = (int)(256*(dpos - stops[current_stop].x)
/ (stops[current_stop+1].x - stops[current_stop].x));
int idist = 256 - dist;
pGradient->linear.colorTable[pos] = premultiply(INTERPOLATE_PIXEL_256(current_color, idist, next_color, dist));
++pos;
dpos += incr;
if (dpos > stops[current_stop + 1].x)
++current_stop;
}
/* After last point */
while (pos < PICT_GRADIENT_STOPTABLE_SIZE) {
pGradient->linear.colorTable[pos] = xRenderColorToCard32(stops[nstops - 1].color);
++pos;
}
} }
static void initGradient(SourcePictPtr pGradient, int stopCount, static void initGradient(SourcePictPtr pGradient, int stopCount,
@ -953,26 +921,30 @@ static void initGradient(SourcePictPtr pGradient, int stopCount,
dpos = -1; dpos = -1;
for (i = 0; i < stopCount; ++i) { for (i = 0; i < stopCount; ++i) {
if (stopPoints[i] <= dpos || stopPoints[i] > (1<<16)) { if (stopPoints[i] < dpos || stopPoints[i] > (1<<16)) {
*error = BadValue; *error = BadValue;
return; return;
} }
dpos = stopPoints[i]; dpos = stopPoints[i];
} }
pGradient->linear.stops = xalloc(stopCount*sizeof(PictGradientStop)); pGradient->gradient.stops = xalloc(stopCount*sizeof(PictGradientStop));
if (!pGradient->linear.stops) { if (!pGradient->gradient.stops) {
*error = BadAlloc; *error = BadAlloc;
return; return;
} }
pGradient->linear.nstops = stopCount; pGradient->gradient.nstops = stopCount;
for (i = 0; i < stopCount; ++i) { for (i = 0; i < stopCount; ++i) {
pGradient->linear.stops[i].x = stopPoints[i]; pGradient->gradient.stops[i].x = stopPoints[i];
pGradient->linear.stops[i].color = stopColors[i]; pGradient->gradient.stops[i].color = stopColors[i];
} }
initGradientColorTable(pGradient, error);
pGradient->gradient.class = SourcePictClassUnknown;
pGradient->gradient.stopRange = 0xffff;
pGradient->gradient.colorTable = NULL;
pGradient->gradient.colorTableSize = 0;
} }
static PicturePtr createSourcePicture(void) static PicturePtr createSourcePicture(void)
@ -980,9 +952,9 @@ static PicturePtr createSourcePicture(void)
PicturePtr pPicture; PicturePtr pPicture;
pPicture = (PicturePtr) xalloc(sizeof(PictureRec)); pPicture = (PicturePtr) xalloc(sizeof(PictureRec));
pPicture->pDrawable = 0; pPicture->pDrawable = 0;
pPicture->format = PICT_a8r8g8b8;
pPicture->pFormat = 0; pPicture->pFormat = 0;
pPicture->pNext = 0; pPicture->pNext = 0;
pPicture->format = PICT_a8r8g8b8;
pPicture->devPrivates = 0; pPicture->devPrivates = 0;
SetPictureToDefaults(pPicture); SetPictureToDefaults(pPicture);
@ -1027,10 +999,6 @@ CreateLinearGradientPicture (Picture pid, xPointFixed *p1, xPointFixed *p2,
*error = BadAlloc; *error = BadAlloc;
return 0; return 0;
} }
if (p1->x == p2->x && p1->y == p2->y) {
*error = BadValue;
return 0;
}
pPicture->id = pid; pPicture->id = pid;
pPicture->pSourcePict = (SourcePictPtr) xalloc(sizeof(PictLinearGradient)); pPicture->pSourcePict = (SourcePictPtr) xalloc(sizeof(PictLinearGradient));
@ -1072,14 +1040,6 @@ CreateRadialGradientPicture (Picture pid, xPointFixed *inner, xPointFixed *outer
*error = BadAlloc; *error = BadAlloc;
return 0; return 0;
} }
{
double dx = (double)(inner->x - outer->x);
double dy = (double)(inner->y - outer->y);
if (sqrt(dx*dx + dy*dy) + (double)(innerRadius) > (double)(outerRadius)) {
*error = BadValue;
return 0;
}
}
pPicture->id = pid; pPicture->id = pid;
pPicture->pSourcePict = (SourcePictPtr) xalloc(sizeof(PictRadialGradient)); pPicture->pSourcePict = (SourcePictPtr) xalloc(sizeof(PictRadialGradient));
@ -1091,21 +1051,18 @@ CreateRadialGradientPicture (Picture pid, xPointFixed *inner, xPointFixed *outer
radial = &pPicture->pSourcePict->radial; radial = &pPicture->pSourcePict->radial;
radial->type = SourcePictTypeRadial; radial->type = SourcePictTypeRadial;
{ radial->c1.x = inner->x;
double x = (double)innerRadius / (double)outerRadius; radial->c1.y = inner->y;
radial->dx = (outer->x - inner->x); radial->c1.radius = innerRadius;
radial->dy = (outer->y - inner->y); radial->c2.x = outer->x;
radial->fx = (inner->x) - x*radial->dx; radial->c2.y = outer->y;
radial->fy = (inner->y) - x*radial->dy; radial->c2.radius = outerRadius;
radial->m = 1./(1+x); radial->cdx = (radial->c2.x - radial->c1.x) / 65536.;
radial->b = -x*radial->m; radial->cdy = (radial->c2.y - radial->c1.y) / 65536.;
radial->dx /= 65536.; radial->dr = (radial->c2.radius - radial->c1.radius) / 65536.;
radial->dy /= 65536.; radial->A = ( radial->cdx * radial->cdx
radial->fx /= 65536.; + radial->cdy * radial->cdy
radial->fy /= 65536.; - radial->dr * radial->dr);
x = outerRadius/65536.;
radial->a = x*x - radial->dx*radial->dx - radial->dy*radial->dy;
}
initGradient(pPicture->pSourcePict, nStops, stops, colors, error); initGradient(pPicture->pSourcePict, nStops, stops, colors, error);
if (*error) { if (*error) {
@ -1627,13 +1584,17 @@ FreePicture (pointer value,
{ {
if (pPicture->transform) if (pPicture->transform)
xfree (pPicture->transform); xfree (pPicture->transform);
if (!pPicture->pDrawable) {
if (pPicture->pSourcePict) { if (pPicture->pSourcePict)
if (pPicture->pSourcePict->type != SourcePictTypeSolidFill) {
xfree(pPicture->pSourcePict->linear.stops); if (pPicture->pSourcePict->type != SourcePictTypeSolidFill)
xfree(pPicture->pSourcePict); xfree(pPicture->pSourcePict->linear.stops);
}
} else { xfree(pPicture->pSourcePict);
}
if (pPicture->pDrawable)
{
ScreenPtr pScreen = pPicture->pDrawable->pScreen; ScreenPtr pScreen = pPicture->pDrawable->pScreen;
PictureScreenPtr ps = GetPictureScreen(pScreen); PictureScreenPtr ps = GetPictureScreen(pScreen);
@ -1918,9 +1879,6 @@ AddTraps (PicturePtr pPicture,
(*ps->AddTraps) (pPicture, xOff, yOff, ntrap, traps); (*ps->AddTraps) (pPicture, xOff, yOff, ntrap, traps);
} }
#define MAX_FIXED_48_16 ((xFixed_48_16) 0x7fffffff)
#define MIN_FIXED_48_16 (-((xFixed_48_16) 1 << 31))
_X_EXPORT Bool _X_EXPORT Bool
PictureTransformPoint3d (PictTransformPtr transform, PictureTransformPoint3d (PictTransformPtr transform,
PictVectorPtr vector) PictVectorPtr vector)

Some files were not shown because too many files have changed in this diff Show More