#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"
/* 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",
}
+#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)
break;
case GLX_EXCHANGE_COMPLETE_INTEL:
break;
- case GLX_BLIT_COMPLETE_INTEL:
+ case GLX_COPY_COMPLETE_INTEL:
break;
case GLX_FLIP_COMPLETE_INTEL:
break;
}
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++)
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);
#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,
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
}
/*
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;
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++;
case GLX_MAX_PBUFFER_PIXELS:
config->maxPbufferPixels = *bp++;
break;
+#ifndef GLX_USE_APPLEGL
case GLX_OPTIMAL_PBUFFER_WIDTH_SGIX:
config->optimalPbufferWidth = *bp++;
break;
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;
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;
}
}
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;
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);
__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
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);
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);