[RFC PATCH] glx: Try to reduce the number of GLX visuals
Thomas Hellstrom
thellstrom at vmware.com
Wed Sep 27 00:56:04 UTC 2017
On 09/26/2017 05:35 PM, Thomas Hellstrom wrote:
> Don't create GLX visuals that would be viewed as identical as an already
> existing GLX visual by glXChooseVisual. Multiple fbconfigs may point to
> the same GLX visual.
>
> Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>
> ---
> glx/glxscreens.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 66 insertions(+), 1 deletion(-)
>
> diff --git a/glx/glxscreens.c b/glx/glxscreens.c
> index 99bf6dd..f07850d 100644
> --- a/glx/glxscreens.c
> +++ b/glx/glxscreens.c
> @@ -158,6 +158,55 @@ static const char GLServerExtensions[] =
> "GL_SGIX_shadow_ambient "
> "GL_SUN_slice_accum ";
>
> +/**
> + * Are visuals equal in terms of glXChooseVisual?
> + *
> + * Some fields of the __GLXconfig structure are, according to the
> + * GLX spec not part of the visual structure meaning that their
> + * corresponding attribute can not be used in glXChooseVisual, nor
> + * using glXGetConfig. Eliminating those fields, check whether
> + * two __GLXconfigs would be considered equal.
> + */
> +static Bool
> +glxVisualsEqual(const __GLXconfig *c1, const __GLXconfig *c2) {
> + /* GLX 1.4 spec */
> + return c1->rgbBits == c2->rgbBits &&
> + c1->indexBits == c2->indexBits &&
> + c1->level == c2->level &&
> + (c1->renderType & GLX_RGBA_BIT) ==
> + (c2->renderType & GLX_RGBA_BIT) &&
> + c1->doubleBufferMode == c2->doubleBufferMode &&
> + c1->stereoMode == c2->stereoMode &&
> + c1->numAuxBuffers == c2->numAuxBuffers &&
> + c1->redBits == c2->redBits &&
> + c1->greenBits == c2->greenBits &&
> + c1->blueBits == c2->blueBits &&
> + c1->alphaBits == c2->alphaBits &&
> + c1->depthBits == c2->depthBits &&
> + c1->stencilBits == c2->stencilBits &&
> + c1->accumRedBits == c2->accumRedBits &&
> + c1->accumGreenBits == c2->accumGreenBits &&
> + c1->accumBlueBits == c2->accumBlueBits &&
> + c1->accumAlphaBits == c2->accumAlphaBits &&
> + c1->sampleBuffers == c2->sampleBuffers &&
> + c1->samples == c2->samples &&
> + c1->visualType == c2->visualType &&
> + /* EXT_visual_rating, but NOT GLX 1.4 */
> + c1->visualRating == c2->visualRating &&
> + /* EXT_visual_info, but NOT GLX 1.4 */
> + c1->transparentPixel == c2->transparentPixel &&
> + c1->transparentRed == c2->transparentRed &&
> + c1->transparentGreen == c2->transparentGreen &&
> + c1->transparentBlue == c2->transparentBlue &&
> + c1->transparentAlpha == c2->transparentAlpha &&
> + c1->transparentIndex == c2->transparentIndex &&
> + /* SGIX_visual_select_group */
> + c1->visualSelectGroup == c2->visualSelectGroup &&
> + /* ARB_framebuffer_sRGB */
> + c1->sRGBCapable == c2->sRGBCapable;
Actually, if reducing visuals like this appears to be a good thing, we
should probably also check the value of
the "duplicatedForComp" field.
/Thomas
> +}
> +
> +
> static Bool
> glxCloseScreen(ScreenPtr pScreen)
> {
> @@ -358,9 +407,10 @@ __glXScreenInit(__GLXscreen * pGlxScreen, ScreenPtr pScreen)
> * an existing, appropriate visual.
> */
> for (config = pGlxScreen->fbconfigs; config != NULL; config = config->next) {
> - int depth;
> + int depth, vis;
>
> VisualPtr visual;
> + const __GLXconfig *config2;
>
> if (config->visualID != 0)
> continue;
> @@ -393,6 +443,21 @@ __glXScreenInit(__GLXscreen * pGlxScreen, ScreenPtr pScreen)
> continue;
> }
>
> + /* We don't need to create a new visual if we already have an
> + * identical visual. Instead we will have multiple fbconfigs
> + * pointing to the same GLX visual.
> + */
> + for (vis = 0; vis < pGlxScreen->numVisuals; ++vis) {
> + config2 = pGlxScreen->visuals[vis];
> + if (glxVisualsEqual(config, config2)) {
> + config->visualID = config2->visualID;
> + break;
> + }
> + }
> +
> + if (config->visualID != 0)
> + continue;
> +
> /* Create a new X visual for our FBconfig. */
> visual = AddScreenVisuals(pScreen, 1, depth);
> if (visual == NULL)
More information about the xorg-devel
mailing list