diff --git a/GL/glx/glxdri.c b/GL/glx/glxdri.c index 41e49e225..b5723049d 100644 --- a/GL/glx/glxdri.c +++ b/GL/glx/glxdri.c @@ -73,6 +73,9 @@ struct __GLXDRIscreen { __DRIscreen driScreen; void *driver; + xf86EnterVTProc *enterVT; + xf86LeaveVTProc *leaveVT; + unsigned char glx_enable_bits[__GLX_EXT_BYTES]; }; @@ -622,8 +625,7 @@ static __DRIfuncPtr getProcAddress(const char *proc_name) static __DRIscreen *findScreen(__DRInativeDisplay *dpy, int scrn) { - __GLXDRIscreen *screen = - (__GLXDRIscreen *) __glXgetActiveScreen(scrn); + __GLXDRIscreen *screen = (__GLXDRIscreen *) __glXgetActiveScreen(scrn); return &screen->driScreen; } @@ -817,6 +819,30 @@ static const __DRIinterfaceMethods interface_methods = { static const char dri_driver_path[] = DRI_DRIVER_PATH; +static Bool +glxDRIEnterVT (int index, int flags) +{ + __GLXDRIscreen *screen = (__GLXDRIscreen *) __glXgetActiveScreen(index); + + LogMessage(X_INFO, "AIGLX: Resuming AIGLX clients after VT switch\n"); + + glxResumeClients(); + + return (*screen->enterVT) (index, flags); +} + +static void +glxDRILeaveVT (int index, int flags) +{ + __GLXDRIscreen *screen = (__GLXDRIscreen *) __glXgetActiveScreen(index); + + LogMessage(X_INFO, "AIGLX: Suspending AIGLX clients for VT switch\n"); + + glxSuspendClients(); + + return (*screen->leaveVT) (index, flags); +} + static __GLXscreen * __glXDRIscreenProbe(ScreenPtr pScreen) { @@ -842,6 +868,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen) char filename[128]; Bool isCapable; size_t buffer_size; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable")) { LogMessage(X_ERROR, "AIGLX: DRI module not loaded\n"); @@ -1029,6 +1056,11 @@ __glXDRIscreenProbe(ScreenPtr pScreen) __glXsetEnterLeaveServerFuncs(__glXDRIenterServer, __glXDRIleaveServer); + screen->enterVT = pScrn->EnterVT; + pScrn->EnterVT = glxDRIEnterVT; + screen->leaveVT = pScrn->LeaveVT; + pScrn->LeaveVT = glxDRILeaveVT; + LogMessage(X_INFO, "AIGLX: Loaded and initialized %s\n", filename); diff --git a/GL/glx/glxext.c b/GL/glx/glxext.c index fdb8ea262..11fb7fcaf 100644 --- a/GL/glx/glxext.c +++ b/GL/glx/glxext.c @@ -59,10 +59,7 @@ xGLXSingleReply __glXReply; ** A set of state for each client. The 0th one is unused because client ** indices start at 1, not 0. */ -__GLXclientState *__glXClients[MAXCLIENTS+1]; - - -static Bool inDispatch; +static __GLXclientState *__glXClients[MAXCLIENTS + 1]; /* ** Forward declarations. @@ -219,6 +216,10 @@ static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid) return True; } +static __GLXcontext *glxPendingDestroyContexts; +static int glxServerLeaveCount; +static int glxBlockClients; + /* ** Free a context. */ @@ -236,13 +237,14 @@ GLboolean __glXFreeContext(__GLXcontext *cx) * __glXDispatch() or as a callback from the resource manager. In * the latter case we need to lift the DRI lock manually. */ - if (!inDispatch) - __glXleaveServer(); - - cx->destroy(cx); - - if (!inDispatch) - __glXenterServer(); + if (glxBlockClients) { + __glXleaveServer(); + cx->destroy(cx); + __glXenterServer(); + } else { + cx->next = glxPendingDestroyContexts; + glxPendingDestroyContexts = cx; + } return GL_TRUE; } @@ -338,7 +340,7 @@ void GlxExtensionInit(void) /* ** Initialize table of client state. There is never a client 0. */ - for (i=1; i <= MAXCLIENTS; i++) { + for (i = 1; i <= MAXCLIENTS; i++) { __glXClients[i] = 0; } @@ -409,11 +411,43 @@ __GLXcontext *__glXForceCurrent(__GLXclientState *cl, GLXContextTag tag, /************************************************************************/ -/* -** Top level dispatcher; all commands are executed from here down. -*/ +void glxSuspendClients(void) +{ + int i; -/* I cried when I wrote this. Damn you XAA! */ + for (i = 1; i <= MAXCLIENTS; i++) { + if (__glXClients[i] == NULL || !__glXClients[i]->inUse) + continue; + + IgnoreClient(__glXClients[i]->client); + } + + glxBlockClients = TRUE; +} + +void glxResumeClients(void) +{ + __GLXcontext *cx, *next; + int i; + + glxBlockClients = FALSE; + + for (i = 1; i <= MAXCLIENTS; i++) { + if (__glXClients[i] == NULL || !__glXClients[i]->inUse) + continue; + + AttendClient(__glXClients[i]->client); + } + + __glXleaveServer(); + for (cx = glxPendingDestroyContexts; cx != NULL; cx = next) { + next = cx->next; + + cx->destroy(cx); + } + glxPendingDestroyContexts = NULL; + __glXenterServer(); +} static void __glXnopEnterServer(void) @@ -438,14 +472,19 @@ void __glXsetEnterLeaveServerFuncs(void (*enter)(void), void __glXenterServer(void) { - (*__glXenterServerFunc)(); + glxServerLeaveCount--; + + if (glxServerLeaveCount == 0) + (*__glXenterServerFunc)(); } void __glXleaveServer(void) { - (*__glXleaveServerFunc)(); -} + if (glxServerLeaveCount == 0) + (*__glXleaveServerFunc)(); + glxServerLeaveCount++; +} /* ** Top level dispatcher; all commands are executed from here down. @@ -491,6 +530,15 @@ static int __glXDispatch(ClientPtr client) return __glXError(GLXBadLargeRequest); } + /* If we're currently blocking GLX clients, just put this guy to + * sleep, reset the request and return. */ + if (glxBlockClients) { + ResetCurrentRequest(client); + client->sequence--; + IgnoreClient(client); + return(client->noClientException); + } + /* ** Use the opcode to index into the procedure table. */ @@ -500,12 +548,8 @@ static int __glXDispatch(ClientPtr client) if (proc != NULL) { __glXleaveServer(); - inDispatch = True; - retval = (*proc)(cl, (GLbyte *) stuff); - inDispatch = False; - __glXenterServer(); } else { diff --git a/GL/glx/glxserver.h b/GL/glx/glxserver.h index 838973731..49cad7328 100644 --- a/GL/glx/glxserver.h +++ b/GL/glx/glxserver.h @@ -136,6 +136,9 @@ void __glXsetEnterLeaveServerFuncs(void (*enter)(void), void __glXenterServer(void); void __glXleaveServer(void); +void glxSuspendClients(void); +void glxResumeClients(void); + /* ** State kept per client. */ @@ -176,8 +179,6 @@ struct __GLXclientStateRec { char *GLClientextensions; }; -extern __GLXclientState *__glXClients[]; - /************************************************************************/ /* diff --git a/GL/glx/indirect_table.c b/GL/glx/indirect_table.c index d13e4f8df..57712f4f5 100644 --- a/GL/glx/indirect_table.c +++ b/GL/glx/indirect_table.c @@ -1232,12 +1232,12 @@ const struct __glXDispatchInfo Render_dispatch_info = { /*****************************************************************/ /* tree depth = 13 */ -static const int_fast16_t VendorPriv_dispatch_tree[155] = { +static const int_fast16_t VendorPriv_dispatch_tree[158] = { /* [0] -> opcode range [0, 131072], node depth 1 */ 2, 5, EMPTY_LEAF, - 119, + 122, EMPTY_LEAF, /* [5] -> opcode range [0, 32768], node depth 2 */ @@ -1254,7 +1254,7 @@ static const int_fast16_t VendorPriv_dispatch_tree[155] = { 2, 16, EMPTY_LEAF, - 78, + 81, EMPTY_LEAF, /* [16] -> opcode range [0, 2048], node depth 5 */ @@ -1299,7 +1299,7 @@ static const int_fast16_t VendorPriv_dispatch_tree[155] = { 44, EMPTY_LEAF, 56, - 67, + 70, /* [44] -> opcode range [1024, 1152], node depth 7 */ 1, @@ -1327,164 +1327,169 @@ static const int_fast16_t VendorPriv_dispatch_tree[155] = { EMPTY_LEAF, /* [59] -> opcode range [1280, 1344], node depth 8 */ - 1, - 62, - EMPTY_LEAF, - - /* [62] -> opcode range [1280, 1312], node depth 9 */ 2, - EMPTY_LEAF, + 64, LEAF(16), - LEAF(24), + EMPTY_LEAF, + 67, + + /* [64] -> opcode range [1280, 1296], node depth 9 */ + 1, + EMPTY_LEAF, LEAF(32), - /* [67] -> opcode range [1408, 1536], node depth 7 */ + /* [67] -> opcode range [1328, 1344], node depth 9 */ 1, - 70, + LEAF(40), EMPTY_LEAF, - /* [70] -> opcode range [1408, 1472], node depth 8 */ + /* [70] -> opcode range [1408, 1536], node depth 7 */ 1, 73, EMPTY_LEAF, - /* [73] -> opcode range [1408, 1440], node depth 9 */ - 2, - EMPTY_LEAF, - LEAF(40), - LEAF(48), - EMPTY_LEAF, - - /* [78] -> opcode range [4096, 6144], node depth 5 */ - 2, - 83, - EMPTY_LEAF, - 101, - EMPTY_LEAF, - - /* [83] -> opcode range [4096, 4608], node depth 6 */ + /* [73] -> opcode range [1408, 1472], node depth 8 */ 1, + 76, + EMPTY_LEAF, + + /* [76] -> opcode range [1408, 1440], node depth 9 */ + 2, + EMPTY_LEAF, + LEAF(48), + LEAF(56), + EMPTY_LEAF, + + /* [81] -> opcode range [4096, 6144], node depth 5 */ + 2, 86, EMPTY_LEAF, + 104, + EMPTY_LEAF, - /* [86] -> opcode range [4096, 4352], node depth 7 */ + /* [86] -> opcode range [4096, 4608], node depth 6 */ 1, 89, EMPTY_LEAF, - /* [89] -> opcode range [4096, 4224], node depth 8 */ + /* [89] -> opcode range [4096, 4352], node depth 7 */ 1, 92, EMPTY_LEAF, - /* [92] -> opcode range [4096, 4160], node depth 9 */ + /* [92] -> opcode range [4096, 4224], node depth 8 */ 1, 95, EMPTY_LEAF, - /* [95] -> opcode range [4096, 4128], node depth 10 */ + /* [95] -> opcode range [4096, 4160], node depth 9 */ 1, 98, EMPTY_LEAF, - /* [98] -> opcode range [4096, 4112], node depth 11 */ + /* [98] -> opcode range [4096, 4128], node depth 10 */ 1, - LEAF(56), + 101, EMPTY_LEAF, - /* [101] -> opcode range [5120, 5632], node depth 6 */ - 1, - 104, - EMPTY_LEAF, - - /* [104] -> opcode range [5120, 5376], node depth 7 */ - 1, - 107, - EMPTY_LEAF, - - /* [107] -> opcode range [5120, 5248], node depth 8 */ - 1, - 110, - EMPTY_LEAF, - - /* [110] -> opcode range [5120, 5184], node depth 9 */ - 1, - EMPTY_LEAF, - 113, - - /* [113] -> opcode range [5152, 5184], node depth 10 */ - 1, - 116, - EMPTY_LEAF, - - /* [116] -> opcode range [5152, 5168], node depth 11 */ + /* [101] -> opcode range [4096, 4112], node depth 11 */ 1, LEAF(64), EMPTY_LEAF, - /* [119] -> opcode range [65536, 98304], node depth 2 */ + /* [104] -> opcode range [5120, 5632], node depth 6 */ 1, - 122, + 107, EMPTY_LEAF, - /* [122] -> opcode range [65536, 81920], node depth 3 */ + /* [107] -> opcode range [5120, 5376], node depth 7 */ 1, - 125, + 110, EMPTY_LEAF, - /* [125] -> opcode range [65536, 73728], node depth 4 */ + /* [110] -> opcode range [5120, 5248], node depth 8 */ 1, - 128, + 113, EMPTY_LEAF, - /* [128] -> opcode range [65536, 69632], node depth 5 */ + /* [113] -> opcode range [5120, 5184], node depth 9 */ 1, - 131, + EMPTY_LEAF, + 116, + + /* [116] -> opcode range [5152, 5184], node depth 10 */ + 1, + 119, EMPTY_LEAF, - /* [131] -> opcode range [65536, 67584], node depth 6 */ - 1, - 134, - EMPTY_LEAF, - - /* [134] -> opcode range [65536, 66560], node depth 7 */ - 1, - 137, - EMPTY_LEAF, - - /* [137] -> opcode range [65536, 66048], node depth 8 */ - 1, - 140, - EMPTY_LEAF, - - /* [140] -> opcode range [65536, 65792], node depth 9 */ - 1, - 143, - EMPTY_LEAF, - - /* [143] -> opcode range [65536, 65664], node depth 10 */ - 1, - 146, - EMPTY_LEAF, - - /* [146] -> opcode range [65536, 65600], node depth 11 */ - 1, - 149, - EMPTY_LEAF, - - /* [149] -> opcode range [65536, 65568], node depth 12 */ - 1, - 152, - EMPTY_LEAF, - - /* [152] -> opcode range [65536, 65552], node depth 13 */ + /* [119] -> opcode range [5152, 5168], node depth 11 */ 1, LEAF(72), EMPTY_LEAF, + /* [122] -> opcode range [65536, 98304], node depth 2 */ + 1, + 125, + EMPTY_LEAF, + + /* [125] -> opcode range [65536, 81920], node depth 3 */ + 1, + 128, + EMPTY_LEAF, + + /* [128] -> opcode range [65536, 73728], node depth 4 */ + 1, + 131, + EMPTY_LEAF, + + /* [131] -> opcode range [65536, 69632], node depth 5 */ + 1, + 134, + EMPTY_LEAF, + + /* [134] -> opcode range [65536, 67584], node depth 6 */ + 1, + 137, + EMPTY_LEAF, + + /* [137] -> opcode range [65536, 66560], node depth 7 */ + 1, + 140, + EMPTY_LEAF, + + /* [140] -> opcode range [65536, 66048], node depth 8 */ + 1, + 143, + EMPTY_LEAF, + + /* [143] -> opcode range [65536, 65792], node depth 9 */ + 1, + 146, + EMPTY_LEAF, + + /* [146] -> opcode range [65536, 65664], node depth 10 */ + 1, + 149, + EMPTY_LEAF, + + /* [149] -> opcode range [65536, 65600], node depth 11 */ + 1, + 152, + EMPTY_LEAF, + + /* [152] -> opcode range [65536, 65568], node depth 12 */ + 1, + 155, + EMPTY_LEAF, + + /* [155] -> opcode range [65536, 65552], node depth 13 */ + 1, + LEAF(80), + EMPTY_LEAF, + }; -static const void *VendorPriv_function_table[80][2] = { +static const void *VendorPriv_function_table[88][2] = { /* [ 0] = 8 */ {NULL, NULL}, /* [ 1] = 9 */ {NULL, NULL}, /* [ 2] = 10 */ {NULL, NULL}, @@ -1501,70 +1506,78 @@ static const void *VendorPriv_function_table[80][2] = { /* [ 13] = 1029 */ {NULL, NULL}, /* [ 14] = 1030 */ {NULL, NULL}, /* [ 15] = 1031 */ {NULL, NULL}, - /* [ 16] = 1288 */ {NULL, NULL}, - /* [ 17] = 1289 */ {NULL, NULL}, - /* [ 18] = 1290 */ {NULL, NULL}, - /* [ 19] = 1291 */ {NULL, NULL}, - /* [ 20] = 1292 */ {NULL, NULL}, - /* [ 21] = 1293 */ {__glXDisp_AreProgramsResidentNV, __glXDispSwap_AreProgramsResidentNV}, - /* [ 22] = 1294 */ {__glXDisp_DeleteProgramsNV, __glXDispSwap_DeleteProgramsNV}, - /* [ 23] = 1295 */ {__glXDisp_GenProgramsNV, __glXDispSwap_GenProgramsNV}, - /* [ 24] = 1296 */ {__glXDisp_GetProgramEnvParameterfvARB, __glXDispSwap_GetProgramEnvParameterfvARB}, - /* [ 25] = 1297 */ {__glXDisp_GetProgramEnvParameterdvARB, __glXDispSwap_GetProgramEnvParameterdvARB}, - /* [ 26] = 1298 */ {__glXDisp_GetProgramivNV, __glXDispSwap_GetProgramivNV}, - /* [ 27] = 1299 */ {__glXDisp_GetProgramStringNV, __glXDispSwap_GetProgramStringNV}, - /* [ 28] = 1300 */ {__glXDisp_GetTrackMatrixivNV, __glXDispSwap_GetTrackMatrixivNV}, - /* [ 29] = 1301 */ {__glXDisp_GetVertexAttribdvARB, __glXDispSwap_GetVertexAttribdvARB}, - /* [ 30] = 1302 */ {__glXDisp_GetVertexAttribfvNV, __glXDispSwap_GetVertexAttribfvNV}, - /* [ 31] = 1303 */ {__glXDisp_GetVertexAttribivNV, __glXDispSwap_GetVertexAttribivNV}, - /* [ 32] = 1304 */ {__glXDisp_IsProgramNV, __glXDispSwap_IsProgramNV}, - /* [ 33] = 1305 */ {__glXDisp_GetProgramLocalParameterfvARB, __glXDispSwap_GetProgramLocalParameterfvARB}, - /* [ 34] = 1306 */ {__glXDisp_GetProgramLocalParameterdvARB, __glXDispSwap_GetProgramLocalParameterdvARB}, - /* [ 35] = 1307 */ {__glXDisp_GetProgramivARB, __glXDispSwap_GetProgramivARB}, - /* [ 36] = 1308 */ {__glXDisp_GetProgramStringARB, __glXDispSwap_GetProgramStringARB}, - /* [ 37] = 1309 */ {NULL, NULL}, - /* [ 38] = 1310 */ {__glXDisp_GetProgramNamedParameterfvNV, __glXDispSwap_GetProgramNamedParameterfvNV}, - /* [ 39] = 1311 */ {__glXDisp_GetProgramNamedParameterdvNV, __glXDispSwap_GetProgramNamedParameterdvNV}, - /* [ 40] = 1416 */ {NULL, NULL}, - /* [ 41] = 1417 */ {NULL, NULL}, - /* [ 42] = 1418 */ {NULL, NULL}, - /* [ 43] = 1419 */ {NULL, NULL}, - /* [ 44] = 1420 */ {NULL, NULL}, - /* [ 45] = 1421 */ {NULL, NULL}, - /* [ 46] = 1422 */ {__glXDisp_IsRenderbufferEXT, __glXDispSwap_IsRenderbufferEXT}, - /* [ 47] = 1423 */ {__glXDisp_GenRenderbuffersEXT, __glXDispSwap_GenRenderbuffersEXT}, - /* [ 48] = 1424 */ {__glXDisp_GetRenderbufferParameterivEXT, __glXDispSwap_GetRenderbufferParameterivEXT}, - /* [ 49] = 1425 */ {__glXDisp_IsFramebufferEXT, __glXDispSwap_IsFramebufferEXT}, - /* [ 50] = 1426 */ {__glXDisp_GenFramebuffersEXT, __glXDispSwap_GenFramebuffersEXT}, - /* [ 51] = 1427 */ {__glXDisp_CheckFramebufferStatusEXT, __glXDispSwap_CheckFramebufferStatusEXT}, - /* [ 52] = 1428 */ {__glXDisp_GetFramebufferAttachmentParameterivEXT, __glXDispSwap_GetFramebufferAttachmentParameterivEXT}, - /* [ 53] = 1429 */ {NULL, NULL}, - /* [ 54] = 1430 */ {NULL, NULL}, - /* [ 55] = 1431 */ {NULL, NULL}, - /* [ 56] = 4096 */ {NULL, NULL}, - /* [ 57] = 4097 */ {NULL, NULL}, - /* [ 58] = 4098 */ {__glXDisp_GetColorTableSGI, __glXDispSwap_GetColorTableSGI}, - /* [ 59] = 4099 */ {__glXDisp_GetColorTableParameterfvSGI, __glXDispSwap_GetColorTableParameterfvSGI}, - /* [ 60] = 4100 */ {__glXDisp_GetColorTableParameterivSGI, __glXDispSwap_GetColorTableParameterivSGI}, - /* [ 61] = 4101 */ {NULL, NULL}, - /* [ 62] = 4102 */ {NULL, NULL}, - /* [ 63] = 4103 */ {NULL, NULL}, - /* [ 64] = 5152 */ {__glXDisp_BindTexImageEXT, __glXDispSwap_BindTexImageEXT}, - /* [ 65] = 5153 */ {__glXDisp_ReleaseTexImageEXT, __glXDispSwap_ReleaseTexImageEXT}, - /* [ 66] = 5154 */ {__glXDisp_CopySubBufferMESA, __glXDispSwap_CopySubBufferMESA}, - /* [ 67] = 5155 */ {NULL, NULL}, - /* [ 68] = 5156 */ {NULL, NULL}, - /* [ 69] = 5157 */ {NULL, NULL}, - /* [ 70] = 5158 */ {NULL, NULL}, - /* [ 71] = 5159 */ {NULL, NULL}, - /* [ 72] = 65536 */ {__glXDisp_SwapIntervalSGI, __glXDispSwap_SwapIntervalSGI}, - /* [ 73] = 65537 */ {__glXDisp_MakeCurrentReadSGI, __glXDispSwap_MakeCurrentReadSGI}, - /* [ 74] = 65538 */ {NULL, NULL}, - /* [ 75] = 65539 */ {NULL, NULL}, - /* [ 76] = 65540 */ {__glXDisp_GetFBConfigsSGIX, __glXDispSwap_GetFBConfigsSGIX}, - /* [ 77] = 65541 */ {__glXDisp_CreateContextWithConfigSGIX, __glXDispSwap_CreateContextWithConfigSGIX}, - /* [ 78] = 65542 */ {__glXDisp_CreateGLXPixmapWithConfigSGIX, __glXDispSwap_CreateGLXPixmapWithConfigSGIX}, - /* [ 79] = 65543 */ {NULL, NULL}, + /* [ 16] = 1296 */ {__glXDisp_GetProgramEnvParameterfvARB, __glXDispSwap_GetProgramEnvParameterfvARB}, + /* [ 17] = 1297 */ {__glXDisp_GetProgramEnvParameterdvARB, __glXDispSwap_GetProgramEnvParameterdvARB}, + /* [ 18] = 1298 */ {__glXDisp_GetProgramivNV, __glXDispSwap_GetProgramivNV}, + /* [ 19] = 1299 */ {__glXDisp_GetProgramStringNV, __glXDispSwap_GetProgramStringNV}, + /* [ 20] = 1300 */ {__glXDisp_GetTrackMatrixivNV, __glXDispSwap_GetTrackMatrixivNV}, + /* [ 21] = 1301 */ {__glXDisp_GetVertexAttribdvARB, __glXDispSwap_GetVertexAttribdvARB}, + /* [ 22] = 1302 */ {__glXDisp_GetVertexAttribfvNV, __glXDispSwap_GetVertexAttribfvNV}, + /* [ 23] = 1303 */ {__glXDisp_GetVertexAttribivNV, __glXDispSwap_GetVertexAttribivNV}, + /* [ 24] = 1304 */ {__glXDisp_IsProgramNV, __glXDispSwap_IsProgramNV}, + /* [ 25] = 1305 */ {__glXDisp_GetProgramLocalParameterfvARB, __glXDispSwap_GetProgramLocalParameterfvARB}, + /* [ 26] = 1306 */ {__glXDisp_GetProgramLocalParameterdvARB, __glXDispSwap_GetProgramLocalParameterdvARB}, + /* [ 27] = 1307 */ {__glXDisp_GetProgramivARB, __glXDispSwap_GetProgramivARB}, + /* [ 28] = 1308 */ {__glXDisp_GetProgramStringARB, __glXDispSwap_GetProgramStringARB}, + /* [ 29] = 1309 */ {NULL, NULL}, + /* [ 30] = 1310 */ {__glXDisp_GetProgramNamedParameterfvNV, __glXDispSwap_GetProgramNamedParameterfvNV}, + /* [ 31] = 1311 */ {__glXDisp_GetProgramNamedParameterdvNV, __glXDispSwap_GetProgramNamedParameterdvNV}, + /* [ 32] = 1288 */ {NULL, NULL}, + /* [ 33] = 1289 */ {NULL, NULL}, + /* [ 34] = 1290 */ {NULL, NULL}, + /* [ 35] = 1291 */ {NULL, NULL}, + /* [ 36] = 1292 */ {NULL, NULL}, + /* [ 37] = 1293 */ {__glXDisp_AreProgramsResidentNV, __glXDispSwap_AreProgramsResidentNV}, + /* [ 38] = 1294 */ {__glXDisp_DeleteProgramsNV, __glXDispSwap_DeleteProgramsNV}, + /* [ 39] = 1295 */ {__glXDisp_GenProgramsNV, __glXDispSwap_GenProgramsNV}, + /* [ 40] = 1328 */ {NULL, NULL}, + /* [ 41] = 1329 */ {NULL, NULL}, + /* [ 42] = 1330 */ {__glXDisp_BindTexImageEXT, __glXDispSwap_BindTexImageEXT}, + /* [ 43] = 1331 */ {__glXDisp_ReleaseTexImageEXT, __glXDispSwap_ReleaseTexImageEXT}, + /* [ 44] = 1332 */ {NULL, NULL}, + /* [ 45] = 1333 */ {NULL, NULL}, + /* [ 46] = 1334 */ {NULL, NULL}, + /* [ 47] = 1335 */ {NULL, NULL}, + /* [ 48] = 1416 */ {NULL, NULL}, + /* [ 49] = 1417 */ {NULL, NULL}, + /* [ 50] = 1418 */ {NULL, NULL}, + /* [ 51] = 1419 */ {NULL, NULL}, + /* [ 52] = 1420 */ {NULL, NULL}, + /* [ 53] = 1421 */ {NULL, NULL}, + /* [ 54] = 1422 */ {__glXDisp_IsRenderbufferEXT, __glXDispSwap_IsRenderbufferEXT}, + /* [ 55] = 1423 */ {__glXDisp_GenRenderbuffersEXT, __glXDispSwap_GenRenderbuffersEXT}, + /* [ 56] = 1424 */ {__glXDisp_GetRenderbufferParameterivEXT, __glXDispSwap_GetRenderbufferParameterivEXT}, + /* [ 57] = 1425 */ {__glXDisp_IsFramebufferEXT, __glXDispSwap_IsFramebufferEXT}, + /* [ 58] = 1426 */ {__glXDisp_GenFramebuffersEXT, __glXDispSwap_GenFramebuffersEXT}, + /* [ 59] = 1427 */ {__glXDisp_CheckFramebufferStatusEXT, __glXDispSwap_CheckFramebufferStatusEXT}, + /* [ 60] = 1428 */ {__glXDisp_GetFramebufferAttachmentParameterivEXT, __glXDispSwap_GetFramebufferAttachmentParameterivEXT}, + /* [ 61] = 1429 */ {NULL, NULL}, + /* [ 62] = 1430 */ {NULL, NULL}, + /* [ 63] = 1431 */ {NULL, NULL}, + /* [ 64] = 4096 */ {NULL, NULL}, + /* [ 65] = 4097 */ {NULL, NULL}, + /* [ 66] = 4098 */ {__glXDisp_GetColorTableSGI, __glXDispSwap_GetColorTableSGI}, + /* [ 67] = 4099 */ {__glXDisp_GetColorTableParameterfvSGI, __glXDispSwap_GetColorTableParameterfvSGI}, + /* [ 68] = 4100 */ {__glXDisp_GetColorTableParameterivSGI, __glXDispSwap_GetColorTableParameterivSGI}, + /* [ 69] = 4101 */ {NULL, NULL}, + /* [ 70] = 4102 */ {NULL, NULL}, + /* [ 71] = 4103 */ {NULL, NULL}, + /* [ 72] = 5152 */ {NULL, NULL}, + /* [ 73] = 5153 */ {NULL, NULL}, + /* [ 74] = 5154 */ {__glXDisp_CopySubBufferMESA, __glXDispSwap_CopySubBufferMESA}, + /* [ 75] = 5155 */ {NULL, NULL}, + /* [ 76] = 5156 */ {NULL, NULL}, + /* [ 77] = 5157 */ {NULL, NULL}, + /* [ 78] = 5158 */ {NULL, NULL}, + /* [ 79] = 5159 */ {NULL, NULL}, + /* [ 80] = 65536 */ {__glXDisp_SwapIntervalSGI, __glXDispSwap_SwapIntervalSGI}, + /* [ 81] = 65537 */ {__glXDisp_MakeCurrentReadSGI, __glXDispSwap_MakeCurrentReadSGI}, + /* [ 82] = 65538 */ {NULL, NULL}, + /* [ 83] = 65539 */ {NULL, NULL}, + /* [ 84] = 65540 */ {__glXDisp_GetFBConfigsSGIX, __glXDispSwap_GetFBConfigsSGIX}, + /* [ 85] = 65541 */ {__glXDisp_CreateContextWithConfigSGIX, __glXDispSwap_CreateContextWithConfigSGIX}, + /* [ 86] = 65542 */ {__glXDisp_CreateGLXPixmapWithConfigSGIX, __glXDispSwap_CreateGLXPixmapWithConfigSGIX}, + /* [ 87] = 65543 */ {NULL, NULL}, }; const struct __glXDispatchInfo VendorPriv_dispatch_info = { diff --git a/configure.ac b/configure.ac index 8aa6a3424..0a9fe5240 100644 --- a/configure.ac +++ b/configure.ac @@ -432,6 +432,7 @@ AC_ARG_ENABLE(dbe, AS_HELP_STRING([--disable-dbe], [Build DBE extensi AC_ARG_ENABLE(xf86bigfont, AS_HELP_STRING([--disable-xf86bigfont], [Build XF86 Big Font extension (default: enabled)]), [XF86BIGFONT=$enableval], [XF86BIGFONT=yes]) AC_ARG_ENABLE(dpms, AS_HELP_STRING([--disable-dpms], [Build DPMS extension (default: enabled)]), [DPMSExtension=$enableval], [DPMSExtension=yes]) AC_ARG_ENABLE(dbus, AS_HELP_STRING([--disable-dbus], [Build D-BUS support (default: auto)]), [DBUS=$enableval], [DBUS=auto]) +AC_ARG_ENABLE(xfree86-utils, AS_HELP_STRING([--enable-xfree86-utils], [Build xfree86 DDX utilities (default: enabled)]), [XF86UTILS=$enableval], [XF86UTILS=yes]) dnl DDXes. AC_ARG_ENABLE(xorg, AS_HELP_STRING([--enable-xorg], [Build Xorg server (default: auto)]), [XORG=$enableval], [XORG=auto]) @@ -746,6 +747,8 @@ AC_DEFINE(XINPUT, 1, [Support X Input extension]) XI_LIB='$(top_builddir)/Xi/libXi.la' XI_INC='-I$(top_srcdir)/Xi' +AM_CONDITIONAL(XF86UTILS, test "x$XF86UTILS" = xyes) + AC_DEFINE(SHAPE, 1, [Support SHAPE extension]) AC_DEFINE(XKB, 1, [Build XKB]) diff --git a/hw/dmx/Makefile.am b/hw/dmx/Makefile.am index d36647b54..89136b904 100644 --- a/hw/dmx/Makefile.am +++ b/hw/dmx/Makefile.am @@ -16,6 +16,9 @@ GLX_INCS = -I$(top_srcdir)/hw/xfree86/dixmods/extmod \ GLX_DEFS = @GL_CFLAGS@ endif +# It's essential that fbcmap.c be compiled with this flag for DMX to work!! +DMX_CFLAGS = -DXFree86Server=1 + if BUILDDOCS SUBDIRS += doc endif @@ -86,6 +89,7 @@ Xdmx_CFLAGS = \ $(DIX_CFLAGS) \ $(GLX_INCS) \ $(GLX_DEFS) \ + $(DMX_CFLAGS) \ @DMXMODULES_CFLAGS@ # Man page diff --git a/hw/dmx/dmxcmap.c b/hw/dmx/dmxcmap.c index b4279e7ce..9a9781f53 100644 --- a/hw/dmx/dmxcmap.c +++ b/hw/dmx/dmxcmap.c @@ -40,6 +40,7 @@ #endif #include "dmx.h" +#include "dmxlog.h" #include "dmxsync.h" #include "dmxcmap.h" #include "dmxvisual.h" @@ -83,12 +84,18 @@ Bool dmxBECreateColormap(ColormapPtr pColormap) VisualPtr pVisual = pColormap->pVisual; Visual *visual = dmxLookupVisual(pScreen, pVisual); - pCmapPriv->cmap = XCreateColormap(dmxScreen->beDisplay, - dmxScreen->scrnWin, - visual, - (pVisual->class & DynamicClass ? - AllocAll : AllocNone)); - return (pCmapPriv->cmap != 0); + if (visual) { + pCmapPriv->cmap = XCreateColormap(dmxScreen->beDisplay, + dmxScreen->scrnWin, + visual, + (pVisual->class & DynamicClass ? + AllocAll : AllocNone)); + return (pCmapPriv->cmap != 0); + } + else { + dmxLog(dmxWarning, "dmxBECreateColormap: No visual found\n"); + return 0; + } } /** Create colormap on back-end server associated with \a pColormap's diff --git a/hw/dmx/dmxcursor.c b/hw/dmx/dmxcursor.c index a49fc9f43..e74a05215 100644 --- a/hw/dmx/dmxcursor.c +++ b/hw/dmx/dmxcursor.c @@ -664,8 +664,8 @@ static Bool _dmxUnrealizeCursor(ScreenPtr pScreen, CursorPtr pCursor) { DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum]; - DMXDBG3("_dmxUnrealizeCursor(%d,%p) %p\n", - pScreen->myNum, pCursor, pCursorPriv); + DMXDBG2("_dmxUnrealizeCursor(%d,%p)\n", + pScreen->myNum, pCursor); if (dmxScreen->beDisplay) { if (dmxBEFreeCursor(pScreen, pCursor)) diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am index 67bfd80d9..5cce11d27 100644 --- a/hw/xfree86/Makefile.am +++ b/hw/xfree86/Makefile.am @@ -2,12 +2,16 @@ if DRI DRI_SUBDIR = dri endif +if XF86UTILS +XF86UTILS_SUBDIR = utils +endif + DOC_SUBDIR = doc SUBDIRS = common ddc dummylib i2c x86emu int10 fbdevhw os-support parser rac \ ramdac shadowfb vbe vgahw xaa xf1bpp xf4bpp xf8_16bpp \ xf8_32bpp loader scanpci dixmods exa \ - $(DRI_SUBDIR) utils $(DOC_SUBDIR) + $(DRI_SUBDIR) $(XF86UTILS_SUBDIR) $(DOC_SUBDIR) DIST_SUBDIRS = common ddc dummylib i2c x86emu int10 fbdevhw os-support \ parser rac ramdac shadowfb vbe vgahw xaa xf1bpp xf4bpp \ diff --git a/hw/xfree86/os-support/bus/linuxPci.c b/hw/xfree86/os-support/bus/linuxPci.c index a3c07f330..c6dad1faa 100644 --- a/hw/xfree86/os-support/bus/linuxPci.c +++ b/hw/xfree86/os-support/bus/linuxPci.c @@ -83,7 +83,13 @@ static pciBusFuncs_t linuxFuncs0 = { /* pciAddrBusToHost */ linuxPpcBusAddrToHostAddr, #else /* pciAddrHostToBus */ pciAddrNOOP, +/* linuxTransAddrBusToHost is busted on sparc64 but the PCI rework tree + * makes it all moot, so we kludge it for now */ +#if defined(__sparc__) +/* pciAddrBusToHost */ pciAddrNOOP, +#else /* pciAddrBusToHost */ linuxTransAddrBusToHost, +#endif /* __sparc64__ */ #endif /* pciControlBridge */ NULL, diff --git a/hw/xfree86/parser/Makefile.am b/hw/xfree86/parser/Makefile.am index 23db38e84..abe9a5a4a 100644 --- a/hw/xfree86/parser/Makefile.am +++ b/hw/xfree86/parser/Makefile.am @@ -1,5 +1,8 @@ if INSTALL_LIBXF86CONFIG lib_LIBRARIES = libxf86config.a +LIBHEADERS = \ + xf86Optrec.h \ + xf86Parser.h else noinst_LIBRARIES = libxf86config.a endif @@ -31,3 +34,6 @@ EXTRA_DIST = \ xf86Parser.h \ xf86tokens.h \ cpconfig.c + +sdk_HEADERS = \ + $(LIBHEADERS) diff --git a/hw/xfree86/parser/Monitor.c b/hw/xfree86/parser/Monitor.c index 4a8575049..9dd0b1b1c 100644 --- a/hw/xfree86/parser/Monitor.c +++ b/hw/xfree86/parser/Monitor.c @@ -675,7 +675,7 @@ xf86printMonitorSection (FILE * cf, XF86ConfMonitorPtr ptr) ptr->mon_width, ptr->mon_height); if ( ptr->mon_n_hsync || ptr->mon_n_vrefresh ) - fprintf(cf," ### Comment all HorizSync and VertSync values to use DDC:\n"); + fprintf(cf," ### Comment all HorizSync and VertRefresh values to use DDC:\n"); for (i = 0; i < ptr->mon_n_hsync; i++) { fprintf (cf, "\tHorizSync %2.1f - %2.1f\n", diff --git a/hw/xfree86/parser/scan.c b/hw/xfree86/parser/scan.c index 5b29ab855..f81c45afe 100644 --- a/hw/xfree86/parser/scan.c +++ b/hw/xfree86/parser/scan.c @@ -157,9 +157,128 @@ xf86strToUL (char *str) return (tot); } +/* + * xf86getNextLine -- + * + * read from the configFile FILE stream until we encounter a new + * line; this is effectively just a big wrapper for fgets(3). + * + * xf86getToken() assumes that we will read up to the next + * newline; we need to grow configBuf and configRBuf as needed to + * support that. + */ + +static char* +xf86getNextLine(void) +{ + static int configBufLen = CONFIG_BUF_LEN; + char *tmpConfigBuf, *tmpConfigRBuf; + int c, i, pos = 0, eolFound = 0; + char *ret = NULL; + + /* + * reallocate the string if it was grown last time (i.e., is no + * longer CONFIG_BUF_LEN); we malloc the new strings first, so + * that if either of the mallocs fail, we can fall back on the + * existing buffer allocations + */ + + if (configBufLen != CONFIG_BUF_LEN) { + + tmpConfigBuf = xf86confmalloc(CONFIG_BUF_LEN); + tmpConfigRBuf = xf86confmalloc(CONFIG_BUF_LEN); + + if (!tmpConfigBuf || !tmpConfigRBuf) { + + /* + * at least one of the mallocs failed; keep the old buffers + * and free any partial allocations + */ + + xf86conffree(tmpConfigBuf); + xf86conffree(tmpConfigRBuf); + + } else { + + /* + * malloc succeeded; free the old buffers and use the new + * buffers + */ + + configBufLen = CONFIG_BUF_LEN; + + xf86conffree(configBuf); + xf86conffree(configRBuf); + + configBuf = tmpConfigBuf; + configRBuf = tmpConfigRBuf; + } + } + + /* read in another block of chars */ + + do { + ret = fgets(configBuf + pos, configBufLen - pos - 1, configFile); + + if (!ret) break; + + /* search for EOL in the new block of chars */ + + for (i = pos; i < (configBufLen - 1); i++) { + c = configBuf[i]; + + if (c == '\0') break; + + if ((c == '\n') || (c == '\r')) { + eolFound = 1; + break; + } + } + + /* + * if we didn't find EOL, then grow the string and + * read in more + */ + + if (!eolFound) { + + tmpConfigBuf = xf86confrealloc(configBuf, configBufLen + CONFIG_BUF_LEN); + tmpConfigRBuf = xf86confrealloc(configRBuf, configBufLen + CONFIG_BUF_LEN); + + if (!tmpConfigBuf || !tmpConfigRBuf) { + + /* + * at least one of the reallocations failed; use the + * new allocation that succeeded, but we have to + * fallback to the previous configBufLen size and use + * the string we have, even though we don't have an + * EOL + */ + + if (tmpConfigBuf) configBuf = tmpConfigBuf; + if (tmpConfigRBuf) configRBuf = tmpConfigRBuf; + + break; + + } else { + + /* reallocation succeeded */ + + configBuf = tmpConfigBuf; + configRBuf = tmpConfigRBuf; + pos = i; + configBufLen += CONFIG_BUF_LEN; + } + } + + } while (!eolFound); + + return (ret); +} + /* * xf86getToken -- - * Read next Token form the config file. Handle the global variable + * Read next Token from the config file. Handle the global variable * pushToken. */ int @@ -193,7 +312,7 @@ again: { char *ret; if (configFile) - ret = fgets (configBuf, CONFIG_BUF_LEN - 1, configFile); + ret = xf86getNextLine(); else { if (builtinConfig[builtinIndex] == NULL) ret = NULL; diff --git a/hw/xfree86/rac/Makefile.am b/hw/xfree86/rac/Makefile.am index 328ed197d..2d8d87975 100644 --- a/hw/xfree86/rac/Makefile.am +++ b/hw/xfree86/rac/Makefile.am @@ -1,4 +1,4 @@ -module_LIBRARIES = librac.a +noinst_LIBRARIES = librac.a librac_a_SOURCES = xf86RAC.c sdk_HEADERS = xf86RAC.h diff --git a/hw/xprint/config/C/print/models/PS2PDFspooldir-GS/Makefile.am b/hw/xprint/config/C/print/models/PS2PDFspooldir-GS/Makefile.am index 37b57d7bb..2b73b9dad 100644 --- a/hw/xprint/config/C/print/models/PS2PDFspooldir-GS/Makefile.am +++ b/hw/xprint/config/C/print/models/PS2PDFspooldir-GS/Makefile.am @@ -1,3 +1,4 @@ xpcdir = @xpconfigdir@/C/print/models/PS2PDFspooldir-GS -dist_xpc_DATA = model-config ps2pdf_spooltodir.sh +dist_xpc_DATA = model-config +dist_xpc_SCRIPTS = ps2pdf_spooltodir.sh diff --git a/hw/xprint/config/C/print/models/PSspooldir/Makefile.am b/hw/xprint/config/C/print/models/PSspooldir/Makefile.am index 52313aa23..717cd2c36 100644 --- a/hw/xprint/config/C/print/models/PSspooldir/Makefile.am +++ b/hw/xprint/config/C/print/models/PSspooldir/Makefile.am @@ -1,3 +1,4 @@ xpcdir = @xpconfigdir@/C/print/models/PSspooldir -dist_xpc_DATA = model-config spooltodir.sh +dist_xpc_DATA = model-config +dist_xpc_SCRIPTS = spooltodir.sh diff --git a/hw/xprint/config/Makefile.am b/hw/xprint/config/Makefile.am index a5ea214c4..197d19de0 100644 --- a/hw/xprint/config/Makefile.am +++ b/hw/xprint/config/Makefile.am @@ -709,4 +709,4 @@ install-data-local: remove-links uninstall-hook: remove-links -EXTRA_DIST = README +dist_xpconfig_DATA = README diff --git a/hw/xprint/doc/Xprt.html b/hw/xprint/doc/Xprt.html index f84a3c134..2aa0c9e3c 100644 --- a/hw/xprint/doc/Xprt.html +++ b/hw/xprint/doc/Xprt.html @@ -4,7 +4,7 @@ applications to use devices like printers, FAX or create documents in formats like PostScript, PCL or PDF. It may be used by clients such as mozilla. -
Xprint is a very flexible, extensible, scaleable, client/server +
Xprint is a very flexible, extensible, scalable, client/server print system based on ISO 10175 (and some other specs) and the X11 rendering protocol. Using Xprint an application can search, query and use devices like @@ -44,11 +44,11 @@ font databases.
permits the server to continue running if it fails to establish all of its well-known sockets (connection points for clients), but establishes at least - one.
Sets an altername Xprinters file (see section FILES).
+ one.
Sets an alternate Xprinters file (see section FILES).
Defines the spooler system to be used for print job spooling. Supported values in xprint.mozdev.org release 009 are:
aix |
aix4 |
bsd |
osf |
solaris |
sysv |
uxp |
cups |
lprng |
other |
none |
- (multiple values can be specified, seperated by ':', the first active spooler will be chosen). + (multiple values can be specified, separated by ':', the first active spooler will be chosen). The default value is platform-specific and can be obtained via
Xprt -h
.
diff --git a/hw/xprint/doc/Xprt.man.pre b/hw/xprint/doc/Xprt.man.pre
index 7599a1344..837619cb2 100644
--- a/hw/xprint/doc/Xprt.man.pre
+++ b/hw/xprint/doc/Xprt.man.pre
@@ -20,7 +20,7 @@ applications to use devices like printers, FAX or create
documents in formats like PostScript, PCL or PDF. It may be used by
clients such as mozilla.
.PP
-Xprint is a very flexible, extensible, scaleable, client/server
+Xprint is a very flexible, extensible, scalable, client/server
print system based on ISO 10175 (and some other specs) and the X11
rendering protocol.
Using Xprint an application can search, query and use devices like
@@ -85,7 +85,7 @@ points for clients), but establishes at least
one.
.TP
\fB\-XpFile \fIfile\fB\fR
-Sets an altername Xprinters file (see section FILES).
+Sets an alternate Xprinters file (see section FILES).
.TP
\fB\-XpSpoolerType \fIspoolername\fB\fR
Defines the spooler system to be used for print job spooling.
@@ -113,7 +113,7 @@ other
none
-(multiple values can be specified, seperated by ':', the first active spooler will be chosen).
+(multiple values can be specified, separated by ':', the first active spooler will be chosen).
The default value is platform-specific and can be obtained via
.nf
diff --git a/hw/xprint/doc/Xprt.sgml b/hw/xprint/doc/Xprt.sgml
index 0ffa39fcb..a62499263 100644
--- a/hw/xprint/doc/Xprt.sgml
+++ b/hw/xprint/doc/Xprt.sgml
@@ -55,7 +55,7 @@ HTML generation can be done like this:
clients such as