X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fglx%2Fglxext.c;h=cef81920356e8a69f7a27ef9239fb915611cbe42;hb=b44875e2dc650c58986480f3360fccfc8d890605;hp=c6e4d9f57384c8f9391d44ddc4db699baf4b9605;hpb=2d94601582e4f0fcaf8c02a15b23cba39dec7bb1;p=mesa.git diff --git a/src/glx/glxext.c b/src/glx/glxext.c index c6e4d9f5738..cef81920356 100644 --- a/src/glx/glxext.c +++ b/src/glx/glxext.c @@ -38,15 +38,19 @@ */ #include +#include + #include "glxclient.h" #include #include #ifdef GLX_USE_APPLEGL -#include "apple_glx.h" -#include "apple_visual.h" +#include "apple/apple_glx.h" +#include "apple/apple_visual.h" #endif #include "glxextensions.h" +#include "util/debug.h" + #include #include #include @@ -134,16 +138,25 @@ __glXWireToEvent(Display *dpy, XEvent *event, xEvent *wire) GLXBufferSwapComplete *aevent = (GLXBufferSwapComplete *)event; xGLXBufferSwapComplete2 *awire = (xGLXBufferSwapComplete2 *)wire; struct glx_drawable *glxDraw = GetGLXDrawable(dpy, awire->drawable); - aevent->event_type = awire->event_type; - aevent->drawable = awire->drawable; - aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo; - aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo; if (!glxDraw) return False; - if (awire->sbc < glxDraw->lastEventSbc) - glxDraw->eventSbcWrap += 0x100000000; + aevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire); + aevent->send_event = (awire->type & 0x80) != 0; + aevent->display = dpy; + aevent->event_type = awire->event_type; + aevent->drawable = glxDraw->xDrawable; + aevent->ust = ((CARD64)awire->ust_hi << 32) | awire->ust_lo; + aevent->msc = ((CARD64)awire->msc_hi << 32) | awire->msc_lo; + + /* Handle 32-Bit wire sbc wraparound in both directions to cope with out + * of sequence 64-Bit sbc's + */ + if ((int64_t) awire->sbc < ((int64_t) glxDraw->lastEventSbc - 0x40000000)) + glxDraw->eventSbcWrap += 0x100000000; + if ((int64_t) awire->sbc > ((int64_t) glxDraw->lastEventSbc + 0x40000000)) + glxDraw->eventSbcWrap -= 0x100000000; glxDraw->lastEventSbc = awire->sbc; aevent->sbc = awire->sbc + glxDraw->eventSbcWrap; return True; @@ -242,6 +255,7 @@ glx_display_free(struct glx_display *priv) (*priv->driswDisplay->destroyDisplay) (priv->driswDisplay); priv->driswDisplay = NULL; +#if defined (GLX_USE_DRM) if (priv->driDisplay) (*priv->driDisplay->destroyDisplay) (priv->driDisplay); priv->driDisplay = NULL; @@ -249,7 +263,19 @@ glx_display_free(struct glx_display *priv) if (priv->dri2Display) (*priv->dri2Display->destroyDisplay) (priv->dri2Display); priv->dri2Display = NULL; -#endif + + if (priv->dri3Display) + (*priv->dri3Display->destroyDisplay) (priv->dri3Display); + priv->dri3Display = NULL; +#endif /* GLX_USE_DRM */ + +#if defined(GLX_USE_WINDOWSGL) + if (priv->windowsdriDisplay) + (*priv->windowsdriDisplay->destroyDisplay) (priv->windowsdriDisplay); + priv->windowsdriDisplay = NULL; +#endif /* GLX_USE_WINDOWSGL */ + +#endif /* GLX_DIRECT_RENDERING && !GLX_USE_APPLEGL */ free((char *) priv); } @@ -269,7 +295,8 @@ __glXCloseDisplay(Display * dpy, XExtCodes * codes) } _XUnlockMutex(_Xglobal_lock); - glx_display_free(priv); + if (priv != NULL) + glx_display_free(priv); return 1; } @@ -316,9 +343,12 @@ static GLint convert_from_x_visual_type(int visualType) { static const int glx_visual_types[] = { - GLX_STATIC_GRAY, GLX_GRAY_SCALE, - GLX_STATIC_COLOR, GLX_PSEUDO_COLOR, - GLX_TRUE_COLOR, GLX_DIRECT_COLOR + [StaticGray] = GLX_STATIC_GRAY, + [GrayScale] = GLX_GRAY_SCALE, + [StaticColor] = GLX_STATIC_COLOR, + [PseudoColor] = GLX_PSEUDO_COLOR, + [TrueColor] = GLX_TRUE_COLOR, + [DirectColor] = GLX_DIRECT_COLOR, }; if (visualType < ARRAY_SIZE(glx_visual_types)) @@ -375,8 +405,6 @@ __glXInitializeVisualConfigFromTags(struct glx_config * config, int count, #endif } - config->sRGBCapable = GL_FALSE; - /* ** Additional properties may be in a list at the end ** of the reply. They are in pairs of property type @@ -501,7 +529,17 @@ __glXInitializeVisualConfigFromTags(struct glx_config * config, int count, config->visualSelectGroup = *bp++; break; case GLX_SWAP_METHOD_OML: - config->swapMethod = *bp++; + if (*bp == GLX_SWAP_UNDEFINED_OML || + *bp == GLX_SWAP_COPY_OML || + *bp == GLX_SWAP_EXCHANGE_OML) { + config->swapMethod = *bp++; + } else { + /* X servers with old HW drivers may return any value here, so + * assume GLX_SWAP_METHOD_UNDEFINED. + */ + config->swapMethod = GLX_SWAP_UNDEFINED_OML; + bp++; + } break; #endif case GLX_SAMPLE_BUFFERS_SGIS: @@ -544,7 +582,7 @@ __glXInitializeVisualConfigFromTags(struct glx_config * config, int count, i = count; break; default: - if(getenv("LIBGL_DIAGNOSTIC")) { + if(env_var_as_boolean("LIBGL_DIAGNOSTIC", false)) { long int tagvalue = *bp++; fprintf(stderr, "WARNING: unknown GLX tag from server: " "tag 0x%lx value 0x%lx\n", tag, tagvalue); @@ -576,7 +614,7 @@ __glXInitializeVisualConfigFromTags(struct glx_config * config, int count, * GLXPbuffer drawables." */ if (config->floatMode) - config->drawableType &= ~(GLX_WINDOW_BIT|GLX_PIXMAP_BIT); + config->drawableType &= GLX_PBUFFER_BIT; } static struct glx_config * @@ -623,6 +661,8 @@ createConfigsFromProperties(Display * dpy, int nvisuals, int nprops, */ m->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT; #endif + /* Older X servers don't send this so we default it here. */ + m->sRGBCapable = GL_FALSE; __glXInitializeVisualConfigFromTags(m, nprops, props, tagged_only, GL_TRUE); m->screen = screen; @@ -676,6 +716,10 @@ static GLboolean psc->serverGLXexts = __glXQueryServerString(dpy, priv->majorOpcode, screen, GLX_EXTENSIONS); + if (psc->serverGLXexts == NULL) { + return GL_FALSE; + } + LockDisplay(dpy); psc->configs = NULL; @@ -721,8 +765,11 @@ glx_screen_init(struct glx_screen *psc, psc->dpy = priv->dpy; psc->display = priv; - getVisualConfigs(psc, priv, screen); - getFBConfigs(psc, priv, screen); + if (!getVisualConfigs(psc, priv, screen)) + return GL_FALSE; + + if (!getFBConfigs(psc, priv, screen)) + return GL_FALSE; return GL_TRUE; } @@ -770,15 +817,26 @@ AllocAndFetchScreenConfigs(Display * dpy, struct glx_display * priv) for (i = 0; i < screens; i++, psc++) { psc = NULL; #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) +#if defined(GLX_USE_DRM) +#if defined(HAVE_DRI3) if (priv->dri3Display) psc = (*priv->dri3Display->createScreen) (i, priv); +#endif /* HAVE_DRI3 */ if (psc == NULL && priv->dri2Display) psc = (*priv->dri2Display->createScreen) (i, priv); if (psc == NULL && priv->driDisplay) psc = (*priv->driDisplay->createScreen) (i, priv); +#endif /* GLX_USE_DRM */ + +#ifdef GLX_USE_WINDOWSGL + if (psc == NULL && priv->windowsdriDisplay) + psc = (*priv->windowsdriDisplay->createScreen) (i, priv); +#endif + if (psc == NULL && priv->driswDisplay) psc = (*priv->driswDisplay->createScreen) (i, priv); -#endif +#endif /* GLX_DIRECT_RENDERING && !GLX_USE_APPLEGL */ + #if defined(GLX_USE_APPLEGL) if (psc == NULL) psc = applegl_create_screen(i, priv); @@ -823,7 +881,6 @@ __glXInitialize(Display * dpy) dpyPriv->codes = XInitExtension(dpy, __glXExtensionName); if (!dpyPriv->codes) { free(dpyPriv); - _XUnlockMutex(_Xglobal_lock); return NULL; } @@ -839,7 +896,6 @@ __glXInitialize(Display * dpy) &dpyPriv->majorVersion, &dpyPriv->minorVersion) || (dpyPriv->majorVersion == 1 && dpyPriv->minorVersion < 1)) { free(dpyPriv); - _XUnlockMutex(_Xglobal_lock); return NULL; } @@ -854,8 +910,8 @@ __glXInitialize(Display * dpy) dpyPriv->glXDrawHash = __glxHashCreate(); #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) - glx_direct = (getenv("LIBGL_ALWAYS_INDIRECT") == NULL); - glx_accel = (getenv("LIBGL_ALWAYS_SOFTWARE") == NULL); + glx_direct = !env_var_as_boolean("LIBGL_ALWAYS_INDIRECT", false); + glx_accel = !env_var_as_boolean("LIBGL_ALWAYS_SOFTWARE", false); dpyPriv->drawHash = __glxHashCreate(); @@ -864,15 +920,19 @@ __glXInitialize(Display * dpy) ** Note: This _must_ be done before calling any other DRI routines ** (e.g., those called in AllocAndFetchScreenConfigs). */ +#if defined(GLX_USE_DRM) if (glx_direct && glx_accel) { - if (!getenv("LIBGL_DRI3_DISABLE")) +#if defined(HAVE_DRI3) + if (!env_var_as_boolean("LIBGL_DRI3_DISABLE", false)) dpyPriv->dri3Display = dri3_create_display(dpy); +#endif /* HAVE_DRI3 */ dpyPriv->dri2Display = dri2CreateDisplay(dpy); dpyPriv->driDisplay = driCreateDisplay(dpy); } +#endif /* GLX_USE_DRM */ if (glx_direct) dpyPriv->driswDisplay = driswCreateDisplay(dpy); -#endif +#endif /* GLX_DIRECT_RENDERING && !GLX_USE_APPLEGL */ #ifdef GLX_USE_APPLEGL if (!applegl_create_display(dpyPriv)) { @@ -880,6 +940,12 @@ __glXInitialize(Display * dpy) return NULL; } #endif + +#ifdef GLX_USE_WINDOWSGL + if (glx_direct && glx_accel) + dpyPriv->windowsdriDisplay = driwindowsCreateDisplay(dpy); +#endif + if (!AllocAndFetchScreenConfigs(dpy, dpyPriv)) { free(dpyPriv); return NULL; @@ -902,7 +968,7 @@ __glXInitialize(Display * dpy) dpyPriv->next = glx_displays; glx_displays = dpyPriv; - _XUnlockMutex(_Xglobal_lock); + _XUnlockMutex(_Xglobal_lock); return dpyPriv; }