From 8e3c1dfc48930c455529313a42efa35e3b9071b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Thu, 18 Oct 2007 21:01:51 -0400 Subject: [PATCH] Introduce a new "GlxVisuals" option that controls which visuals are added. Right now we default to "all" which gives us a situation much like before, but when the "typical" option is implemented, we can change the default and reduce the number of visuals the GLX module bloats the X server with. --- GL/glx/glxdrawable.h | 4 - GL/glx/glxscreens.c | 120 ++++++++++++++++++++------- GL/glx/glxserver.h | 10 +++ hw/xfree86/common/xf86Config.c | 29 ++++++- hw/xfree86/common/xf86Privstr.h | 9 ++ hw/xfree86/dixmods/glxmodule.c | 29 ++++--- hw/xfree86/doc/man/xorg.conf.man.pre | 11 +++ 7 files changed, 161 insertions(+), 51 deletions(-) diff --git a/GL/glx/glxdrawable.h b/GL/glx/glxdrawable.h index 858bbb35b..f62d1ee34 100644 --- a/GL/glx/glxdrawable.h +++ b/GL/glx/glxdrawable.h @@ -42,10 +42,6 @@ #include -#ifdef XF86DRI -#include -#endif - /* We just need to avoid clashing with DRAWABLE_{WINDOW,PIXMAP} */ enum { GLX_DRAWABLE_WINDOW, diff --git a/GL/glx/glxscreens.c b/GL/glx/glxscreens.c index bfd49a129..511aa8ad9 100644 --- a/GL/glx/glxscreens.c +++ b/GL/glx/glxscreens.c @@ -393,10 +393,7 @@ findFirstSet(unsigned int v) static void initGlxVisual(VisualPtr visual, __GLcontextModes *config) { - ErrorF("Adding visual 0x%02lx for fbconfig %d\n", - visual->vid, config->fbconfigID); - - config->visualID = visual[0].vid; + config->visualID = visual->vid; visual->class = _gl_convert_to_x_visual_type(config->visualType); visual->bitsPerRGBValue = config->redBits; visual->ColormapEntries = 1 << config->redBits; @@ -411,37 +408,84 @@ initGlxVisual(VisualPtr visual, __GLcontextModes *config) } static void -addGlxVisuals(__GLXscreen *pGlxScreen) +addMinimalSet(__GLXscreen *pGlxScreen) { __GLcontextModes *config; - VisualPtr visual; + VisualPtr visuals; + int depth; - /* Select a subset of fbconfigs that we send to the client when it - * asks for the glx visuals. All the fbconfigs here have a valid - * value for visual ID and each visual ID is only present once. - * This runs before composite adds its extra visual so we have to - * remember the number of visuals here.*/ - - /* For now, just add the first double buffer fbconfig. */ - for (config = pGlxScreen->fbconfigs; config != NULL; config = config->next) - if (config->doubleBufferMode) + for (config = pGlxScreen->fbconfigs; config != NULL; config = config->next) { + if (config->visualRating != GLX_NONE) + continue; + if (config->doubleBufferMode && config->depthBits > 0) break; + } if (config == NULL) config = pGlxScreen->fbconfigs; pGlxScreen->visuals = xcalloc(1, sizeof (__GLcontextModes *)); - visual = AddScreenVisuals(pGlxScreen->pScreen, 1, config->rgbBits); - if (visual == NULL) { + if (pGlxScreen->visuals == NULL) { + ErrorF("Failed to allocate for minimal set of GLX visuals\n"); + return; + } + + depth = config->redBits + config->greenBits + config->blueBits; + visuals = AddScreenVisuals(pGlxScreen->pScreen, 1, depth); + if (visuals == NULL) { xfree(pGlxScreen->visuals); return; } pGlxScreen->numVisuals = 1; pGlxScreen->visuals[0] = config; - initGlxVisual(&visual[0], config); + initGlxVisual(&visuals[0], config); } -void __glXScreenInit(__GLXscreen *glxScreen, ScreenPtr pScreen) +static void +addTypicalSet(__GLXscreen *pGlxScreen) +{ + addMinimalSet(pGlxScreen); +} + +static void +addFullSet(__GLXscreen *pGlxScreen) +{ + __GLcontextModes *config; + VisualPtr visuals; + int i, depth; + + pGlxScreen->visuals = + xcalloc(pGlxScreen->numFBConfigs, sizeof (__GLcontextModes *)); + if (pGlxScreen->visuals == NULL) { + ErrorF("Failed to allocate for full set of GLX visuals\n"); + return; + } + + config = pGlxScreen->fbconfigs; + depth = config->redBits + config->greenBits + config->blueBits; + visuals = AddScreenVisuals(pGlxScreen->pScreen, pGlxScreen->numFBConfigs, depth); + if (visuals == NULL) { + xfree(pGlxScreen->visuals); + return; + } + + ErrorF("addFullSet, setting numVisuals to %d\n", pGlxScreen->numFBConfigs); + + pGlxScreen->numVisuals = pGlxScreen->numFBConfigs; + for (i = 0, config = pGlxScreen->fbconfigs; config; config = config->next, i++) { + pGlxScreen->visuals[i] = config; + initGlxVisual(&visuals[i], config); + } +} + +static int glxVisualConfig = GLX_ALL_VISUALS; + +void GlxSetVisualConfig(int config) +{ + glxVisualConfig = config; +} + +void __glXScreenInit(__GLXscreen *pGlxScreen, ScreenPtr pScreen) { static int glxGeneration; __GLcontextModes *m; @@ -457,28 +501,44 @@ void __glXScreenInit(__GLXscreen *glxScreen, ScreenPtr pScreen) } i = 0; - for (m = glxScreen->fbconfigs; m != NULL; m = m->next) { + for (m = pGlxScreen->fbconfigs; m != NULL; m = m->next) { m->fbconfigID = FakeClientID(0); m->visualID = findVisualForConfig(pScreen, m); i++; } - glxScreen->numFBConfigs = i; + pGlxScreen->numFBConfigs = i; - addGlxVisuals(glxScreen); + /* Select a subset of fbconfigs that we send to the client when it + * asks for the glx visuals. All the fbconfigs here have a valid + * value for visual ID and each visual ID is only present once. + * This runs before composite adds its extra visual so we have to + * remember the number of visuals here.*/ - glxScreen->pScreen = pScreen; - glxScreen->GLextensions = xstrdup(GLServerExtensions); - glxScreen->GLXvendor = xstrdup(GLXServerVendorName); - glxScreen->GLXversion = xstrdup(GLXServerVersion); - glxScreen->GLXextensions = xstrdup(GLXServerExtensions); + switch (glxVisualConfig) { + case GLX_MINIMAL_VISUALS: + addMinimalSet(pGlxScreen); + break; + case GLX_TYPICAL_VISUALS: + addTypicalSet(pGlxScreen); + break; + case GLX_ALL_VISUALS: + addFullSet(pGlxScreen); + break; + } - glxScreen->PositionWindow = pScreen->PositionWindow; + pGlxScreen->pScreen = pScreen; + pGlxScreen->GLextensions = xstrdup(GLServerExtensions); + pGlxScreen->GLXvendor = xstrdup(GLXServerVendorName); + pGlxScreen->GLXversion = xstrdup(GLXServerVersion); + pGlxScreen->GLXextensions = xstrdup(GLXServerExtensions); + + pGlxScreen->PositionWindow = pScreen->PositionWindow; pScreen->PositionWindow = glxPositionWindow; - glxScreen->CloseScreen = pScreen->CloseScreen; + pGlxScreen->CloseScreen = pScreen->CloseScreen; pScreen->CloseScreen = glxCloseScreen; - pScreen->devPrivates[glxScreenPrivateIndex].ptr = (pointer) glxScreen; + pScreen->devPrivates[glxScreenPrivateIndex].ptr = (pointer) pGlxScreen; } void __glXScreenDestroy(__GLXscreen *screen) diff --git a/GL/glx/glxserver.h b/GL/glx/glxserver.h index 45de8e794..518868981 100644 --- a/GL/glx/glxserver.h +++ b/GL/glx/glxserver.h @@ -95,6 +95,8 @@ extern __GLXclientState *glxGetClient(ClientPtr pClient); /************************************************************************/ +void GlxExtensionInit(void); + void GlxSetVisualConfigs(int nconfigs, __GLXvisualConfig *configs, void **privates); @@ -132,6 +134,14 @@ struct __GLXprovider { void GlxPushProvider(__GLXprovider *provider); +enum { + GLX_MINIMAL_VISUALS, + GLX_TYPICAL_VISUALS, + GLX_ALL_VISUALS +}; + +void GlxSetVisualConfig(int config); + void __glXsetEnterLeaveServerFuncs(void (*enter)(GLboolean), void (*leave)(GLboolean)); void __glXenterServer(GLboolean rendering); diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c index 96fadc9dd..35b62a244 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c @@ -792,6 +792,7 @@ typedef enum { FLAG_USE_DEFAULT_FONT_PATH, FLAG_AUTO_ADD_DEVICES, FLAG_AUTO_ENABLE_DEVICES, + FLAG_GLX_VISUALS, } FlagValues; static OptionInfoRec FlagOptions[] = { @@ -873,6 +874,8 @@ static OptionInfoRec FlagOptions[] = { {0}, TRUE }, { FLAG_AUTO_ENABLE_DEVICES, "AutoEnableDevices", OPTV_BOOLEAN, {0}, TRUE }, + { FLAG_GLX_VISUALS, "GlxVisuals", OPTV_STRING, + {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE }, }; @@ -904,6 +907,7 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) Pix24Flags pix24 = Pix24DontCare; Bool value; MessageType from; + const char *s; /* * Merge the ServerLayout and ServerFlags options. The former have @@ -1021,7 +1025,6 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) if (xf86GetOptValBool(FlagOptions, FLAG_NOPM, &value)) xf86Info.pmFlag = !value; { - const char *s; if ((s = xf86GetOptValString(FlagOptions, FLAG_LOG))) { if (!xf86NameCmp(s,"flush")) { xf86Msg(X_CONFIG, "Flushing logfile enabled\n"); @@ -1040,8 +1043,6 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) #ifdef RENDER { - const char *s; - if ((s = xf86GetOptValString(FlagOptions, FLAG_RENDER_COLORMAP_MODE))){ int policy = PictureParseCmapPolicy (s); if (policy == PictureCmapPolicyInvalid) @@ -1055,7 +1056,6 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) } #endif { - const char *s; if ((s = xf86GetOptValString(FlagOptions, FLAG_HANDLE_SPECIAL_KEYS))) { if (!xf86NameCmp(s,"always")) { xf86Msg(X_CONFIG, "Always handling special keys in DDX\n"); @@ -1093,6 +1093,27 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts) xf86Info.aiglxFrom = X_CONFIG; } +#ifdef GLXEXT + xf86Info.glxVisuals = XF86_GlxVisualsAll; + xf86Info.glxVisualsFrom = X_DEFAULT; + if ((s = xf86GetOptValString(FlagOptions, FLAG_GLX_VISUALS))) { + if (!xf86NameCmp(s, "minimal")) { + xf86Info.glxVisuals = XF86_GlxVisualsMinimal; + } else if (!xf86NameCmp(s, "typical")) { + xf86Info.glxVisuals = XF86_GlxVisualsTypical; + } else if (!xf86NameCmp(s, "all")) { + xf86Info.glxVisuals = XF86_GlxVisualsAll; + } else { + xf86Msg(X_WARNING,"Unknown HandleSpecialKeys option\n"); + } + } + + if (xf86GetOptValBool(FlagOptions, FLAG_AIGLX, &value)) { + xf86Info.aiglx = value; + xf86Info.aiglxFrom = X_CONFIG; + } +#endif + xf86Info.allowEmptyInput = FALSE; if (xf86GetOptValBool(FlagOptions, FLAG_ALLOW_EMPTY_INPUT, &value)) xf86Info.allowEmptyInput = TRUE; diff --git a/hw/xfree86/common/xf86Privstr.h b/hw/xfree86/common/xf86Privstr.h index 75d497471..92a6305a0 100644 --- a/hw/xfree86/common/xf86Privstr.h +++ b/hw/xfree86/common/xf86Privstr.h @@ -60,6 +60,12 @@ typedef enum { SKAlways } SpecialKeysInDDX; +typedef enum { + XF86_GlxVisualsMinimal, + XF86_GlxVisualsTypical, + XF86_GlxVisualsAll, +} XF86_GlxVisuals; + /* * xf86InfoRec contains global parameters which the video drivers never * need to access. Global parameters which the video drivers do need @@ -120,6 +126,9 @@ typedef struct { MessageType randRFrom; Bool aiglx; MessageType aiglxFrom; + XF86_GlxVisuals glxVisuals; + MessageType glxVisualsFrom; + Bool useDefaultFontPath; MessageType useDefaultFontPathFrom; Bool ignoreABI; diff --git a/hw/xfree86/dixmods/glxmodule.c b/hw/xfree86/dixmods/glxmodule.c index f1c861b3d..847f0d4a2 100644 --- a/hw/xfree86/dixmods/glxmodule.c +++ b/hw/xfree86/dixmods/glxmodule.c @@ -41,17 +41,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "colormap.h" #include "micmap.h" #include "globals.h" - -typedef struct __GLXscreen __GLXscreen; -typedef struct __GLXprovider __GLXprovider; -struct __GLXprovider { - __GLXscreen *(*screenProbe)(ScreenPtr pScreen); - const char *name; - __GLXprovider *next; -}; - -extern void GlxPushProvider(__GLXprovider *provider); -extern void GlxExtensionInit(void); +#include "glxserver.h" static MODULESETUPPROTO(glxSetup); @@ -113,7 +103,6 @@ static __GLXprovider __glXMesaProxyProvider = { NULL }; - static pointer glxSetup(pointer module, pointer opts, int *errmaj, int *errmin) { @@ -138,8 +127,22 @@ glxSetup(pointer module, pointer opts, int *errmaj, int *errmin) GlxPushProvider(provider); } + switch (xf86Info.glxVisuals) { + case XF86_GlxVisualsMinimal: + GlxSetVisualConfig(GLX_MINIMAL_VISUALS); + xf86Msg(xf86Info.aiglxFrom, "Exporting only minimal set of GLX visuals\n"); + break; + case XF86_GlxVisualsTypical: + GlxSetVisualConfig(GLX_TYPICAL_VISUALS); + xf86Msg(xf86Info.aiglxFrom, "Exporting typical set of GLX visuals\n"); + break; + case XF86_GlxVisualsAll: + GlxSetVisualConfig(GLX_ALL_VISUALS); + xf86Msg(xf86Info.aiglxFrom, "Exporting all GLX visuals\n"); + break; + } + LoadExtension(&GLXExt, FALSE); - bail: return module; } diff --git a/hw/xfree86/doc/man/xorg.conf.man.pre b/hw/xfree86/doc/man/xorg.conf.man.pre index 54d8eaa87..4064ef6d8 100644 --- a/hw/xfree86/doc/man/xorg.conf.man.pre +++ b/hw/xfree86/doc/man/xorg.conf.man.pre @@ -700,6 +700,17 @@ the builtin handler will be used. .BI "Option \*qAIGLX\*q \*q" boolean \*q enable or disable AIGLX. AIGLX is enabled by default. .TP 7 +.BI "Option \*qGlxVisuals\*q \*q" string \*q +This option controls how many GLX visuals the GLX modules sets up. +The default value is +.BR "typical" , +which will setup up a typical subset of +the GLXFBConfigs provided by the driver as GLX visuals. Other options are +.BR "minimal" , +which will set up the minimal set allowed by the GLX specification and +.BR "all" +which will setup GLX visuals for all GLXFBConfigs. +.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