glx: fix regression with GLX_USE_GL
[mesa.git] / src / glx / glxext.c
index c2de1a3fff8200a39802b8c8a31a739bb4f893aa..0e148edf8eb911444b11287c3befc3cebd2b8225 100644 (file)
 #include <X11/extensions/Xext.h>
 #include <X11/extensions/extutil.h>
 #include <X11/extensions/dri2proto.h>
+#ifdef GLX_USE_APPLEGL
+#include "apple_glx.h"
+#include "apple_visual.h"
+#endif
 #include "glxextensions.h"
 #include "glcontextmodes.h"
 
@@ -65,7 +69,12 @@ _X_HIDDEN int __glXDebug = 0;
 /* Extension required boiler plate */
 
 static char *__glXExtensionName = GLX_EXTENSION_NAME;
+#ifdef GLX_USE_APPLEGL
+static XExtensionInfo __glXExtensionInfo_data;
+XExtensionInfo *__glXExtensionInfo = &__glXExtensionInfo_data;
+#else
 XExtensionInfo *__glXExtensionInfo = NULL;
+#endif
 
 static /* const */ char *error_list[] = {
    "GLXBadContext",
@@ -98,6 +107,11 @@ __glXCloseDisplay(Display * dpy, XExtCodes * codes)
 }
 
 
+#ifdef GLX_USE_APPLEGL
+static char *__glXErrorString(Display *dpy, int code, XExtCodes *codes, 
+                              char *buf, int n);
+#endif
+
 static
 XEXT_GENERATE_ERROR_STRING(__glXErrorString, __glXExtensionName,
                            __GLX_NUMBER_ERRORS, error_list)
@@ -206,7 +220,7 @@ __glXEventToWire(Display *dpy, XEvent *event, xEvent *wire)
       break;
    case GLX_EXCHANGE_COMPLETE_INTEL:
       break;
-   case GLX_BLIT_COMPLETE_INTEL:
+   case GLX_COPY_COMPLETE_INTEL:
       break;
    case GLX_FLIP_COMPLETE_INTEL:
       break;
@@ -245,7 +259,7 @@ FreeScreenConfigs(__GLXdisplayPrivate * priv)
       }
       Xfree((char *) psc->serverGLXexts);
 
-#ifdef GLX_DIRECT_RENDERING
+#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
       if (psc->driver_configs) {
          unsigned int j;
          for (j = 0; psc->driver_configs[j]; j++)
@@ -285,7 +299,7 @@ __glXFreeDisplayPrivate(XExtData * extension)
       priv->serverGLXversion = 0x0;     /* to protect against double free's */
    }
 
-#ifdef GLX_DIRECT_RENDERING
+#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
    /* Free the direct rendering per display data */
    if (priv->driswDisplay)
       (*priv->driswDisplay->destroyDisplay) (priv->driswDisplay);
@@ -358,7 +372,20 @@ QueryVersion(Display * dpy, int opcode, int *major, int *minor)
 #endif /* USE_XCB */
 }
 
+/* 
+ * We don't want to enable this GLX_OML_swap_method in glxext.h, 
+ * because we can't support it.  The X server writes it out though,
+ * so we should handle it somehow, to avoid false warnings.
+ */
+enum {
+    IGNORE_GLX_SWAP_METHOD_OML = 0x8060
+};
 
+
+/*
+ * getVisualConfigs uses the !tagged_only path.
+ * getFBConfigs uses the tagged_only path.
+ */
 _X_HIDDEN void
 __glXInitializeVisualConfigFromTags(__GLcontextModes * config, int count,
                                     const INT32 * bp, Bool tagged_only,
@@ -392,7 +419,14 @@ __glXInitializeVisualConfigFromTags(__GLcontextModes * config, int count,
       config->numAuxBuffers = *bp++;
       config->level = *bp++;
 
+#ifdef GLX_USE_APPLEGL
+       /* AppleSGLX supports pixmap and pbuffers with all config. */
+       config->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT;
+       /* Unfortunately this can create an ABI compatibility problem. */
+       count -= 18;
+#else
       count -= __GLX_MIN_CONFIG_PROPS;
+#endif
    }
 
    /*
@@ -405,7 +439,9 @@ __glXInitializeVisualConfigFromTags(__GLcontextModes * config, int count,
     config-> tag = ( fbconfig_style_tags ) ? *bp++ : 1
 
    for (i = 0; i < count; i += 2) {
-      switch (*bp++) {
+      long int tag = *bp++;
+      
+      switch (tag) {
       case GLX_RGBA:
          FETCH_OR_SET(rgbMode);
          break;
@@ -483,6 +519,10 @@ __glXInitializeVisualConfigFromTags(__GLcontextModes * config, int count,
          break;
       case GLX_DRAWABLE_TYPE:
          config->drawableType = *bp++;
+#ifdef GLX_USE_APPLEGL
+         /* AppleSGLX supports pixmap and pbuffers with all config. */
+         config->drawableType |= GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT;              
+#endif
          break;
       case GLX_RENDER_TYPE:
          config->renderType = *bp++;
@@ -502,6 +542,7 @@ __glXInitializeVisualConfigFromTags(__GLcontextModes * config, int count,
       case GLX_MAX_PBUFFER_PIXELS:
          config->maxPbufferPixels = *bp++;
          break;
+#ifndef GLX_USE_APPLEGL
       case GLX_OPTIMAL_PBUFFER_WIDTH_SGIX:
          config->optimalPbufferWidth = *bp++;
          break;
@@ -514,12 +555,19 @@ __glXInitializeVisualConfigFromTags(__GLcontextModes * config, int count,
       case GLX_SWAP_METHOD_OML:
          config->swapMethod = *bp++;
          break;
+#endif
       case GLX_SAMPLE_BUFFERS_SGIS:
          config->sampleBuffers = *bp++;
          break;
       case GLX_SAMPLES_SGIS:
          config->samples = *bp++;
          break;
+#ifdef GLX_USE_APPLEGL
+      case IGNORE_GLX_SWAP_METHOD_OML:
+         /* We ignore this tag.  See the comment above this function. */
+         ++bp;
+         break;
+#else
       case GLX_BIND_TO_TEXTURE_RGB_EXT:
          config->bindToTextureRgb = *bp++;
          break;
@@ -535,11 +583,24 @@ __glXInitializeVisualConfigFromTags(__GLcontextModes * config, int count,
       case GLX_Y_INVERTED_EXT:
          config->yInverted = *bp++;
          break;
+#endif
+      case GLX_USE_GL:
+         if (fbconfig_style_tags) *bp++;
+         break;
       case None:
          i = count;
          break;
       default:
-         break;
+         if(getenv("LIBGL_DIAGNOSTIC")) {
+             long int tagvalue = *bp++;
+             fprintf(stderr, "WARNING: unknown GLX tag from server: "
+                     "tag 0x%lx value 0x%lx\n", tag, tagvalue);
+         } else {
+             /* Ignore the unrecognized tag's value */
+             bp++;
+             break;
+         }
+              break;
       }
    }
 
@@ -587,9 +648,18 @@ createConfigsFromProperties(Display * dpy, int nvisuals, int nprops,
    m = modes;
    for (i = 0; i < nvisuals; i++) {
       _XRead(dpy, (char *) props, prop_size);
-      /* Older X servers don't send this so we default it here. */
+#ifdef GLX_USE_APPLEGL
+       /* Older X servers don't send this so we default it here. */
       m->drawableType = GLX_WINDOW_BIT;
-      __glXInitializeVisualConfigFromTags(m, nprops, props,
+#else
+      /* 
+       * The XQuartz 2.3.2.1 X server doesn't set this properly, so
+       * set the proper bits here.
+       * AppleSGLX supports windows, pixmaps, and pbuffers with all config.
+       */
+      m->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT;
+#endif
+       __glXInitializeVisualConfigFromTags(m, nprops, props,
                                           tagged_only, GL_TRUE);
       m->screen = screen;
       m = m->next;
@@ -710,13 +780,16 @@ AllocAndFetchScreenConfigs(Display * dpy, __GLXdisplayPrivate * priv)
       getVisualConfigs(dpy, priv, i);
       getFBConfigs(dpy, priv, i);
 
-#ifdef GLX_DIRECT_RENDERING
+#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
       psc->scr = i;
       psc->dpy = dpy;
       psc->drawHash = __glxHashCreate();
       if (psc->drawHash == NULL)
          continue;
 
+      /* Initialize per screen dynamic client GLX extensions */
+      psc->ext_list_first_time = GL_TRUE;
+
       if (priv->dri2Display)
          psc->driScreen = (*priv->dri2Display->createScreen) (psc, i, priv);
 
@@ -747,7 +820,7 @@ __glXInitialize(Display * dpy)
    __GLXdisplayPrivate *dpyPriv;
    XEDataObject dataObj;
    int major, minor;
-#ifdef GLX_DIRECT_RENDERING
+#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
    Bool glx_direct, glx_accel;
 #endif
 
@@ -804,7 +877,7 @@ __glXInitialize(Display * dpy)
    dpyPriv->serverGLXvendor = 0x0;
    dpyPriv->serverGLXversion = 0x0;
 
-#ifdef GLX_DIRECT_RENDERING
+#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
    glx_direct = (getenv("LIBGL_ALWAYS_INDIRECT") == NULL);
    glx_accel = (getenv("LIBGL_ALWAYS_SOFTWARE") == NULL);
 
@@ -820,8 +893,11 @@ __glXInitialize(Display * dpy)
    if (glx_direct)
       dpyPriv->driswDisplay = driswCreateDisplay(dpy);
 #endif
-
+#ifdef GLX_USE_APPLEGL
+   if (apple_init_glx(dpy) || !AllocAndFetchScreenConfigs(dpy, dpyPriv)) {
+#else
    if (!AllocAndFetchScreenConfigs(dpy, dpyPriv)) {
+#endif
       __glXUnlock();
       Xfree((char *) dpyPriv);
       Xfree((char *) private);