summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Staplin <gstaplin@apple.com>2008-11-28 13:57:45 -0700
committerJeremy Huddleston <jeremyhu@freedesktop.org>2008-11-28 13:18:27 -0800
commit01eaebdc98f30fdf543af6337cdf012d3ff16f09 (patch)
tree9f1b7940001296d239849284bb8ff1f3d08144eb
parent3d527b91b4bfa31e78d5fc7a1447a4026876f14e (diff)
XQuartz: GL: Make various changes to makeFormat, so that it works better. Now glxgears looks normal with the old libGL.
Add various GLX extensions to the list of supported extensions. Reformat the oddly formatted code in some areas. Use xalloc and xfree instead of malloc and free. (cherry picked from commit 755f53eb40c4329d8c82a31cb910c31fdd4ea12e)
-rw-r--r--hw/xquartz/GL/indirect.c153
1 files changed, 54 insertions, 99 deletions
diff --git a/hw/xquartz/GL/indirect.c b/hw/xquartz/GL/indirect.c
index 4de49355d..32b9dd4f3 100644
--- a/hw/xquartz/GL/indirect.c
+++ b/hw/xquartz/GL/indirect.c
@@ -138,20 +138,20 @@ typedef struct __GLXAquaContext __GLXAquaContext;
typedef struct __GLXAquaDrawable __GLXAquaDrawable;
struct __GLXAquaScreen {
- __GLXscreen base;
- int index;
+ __GLXscreen base;
+ int index;
int num_vis;
- __GLcontextModes *modes;
+ //__GLcontextModes *modes;
};
static __GLXAquaScreen glAquaScreens[MAXSCREENS];
struct __GLXAquaContext {
- __GLXcontext base;
- CGLContextObj ctx;
- CGLPixelFormatObj pixelFormat;
- xp_surface_id sid;
- unsigned isAttached :1;
+ __GLXcontext base;
+ CGLContextObj ctx;
+ CGLPixelFormatObj pixelFormat;
+ xp_surface_id sid;
+ unsigned isAttached :1;
};
struct __GLXAquaDrawable {
@@ -171,8 +171,10 @@ __glXAquaScreenCreateContext(__GLXscreen *screen,
GLAQUA_DEBUG_MSG("glXAquaScreenCreateContext\n");
- context = malloc (sizeof (__GLXAquaContext));
- if (context == NULL) return NULL;
+ context = xalloc (sizeof (__GLXAquaContext));
+
+ if (context == NULL)
+ return NULL;
memset(context, 0, sizeof *context);
@@ -186,8 +188,9 @@ __glXAquaScreenCreateContext(__GLXscreen *screen,
/*FIXME verify that the context->base is fully initialized. */
context->pixelFormat = makeFormat(conf);
+
if (!context->pixelFormat) {
- free(context);
+ xfree(context);
return NULL;
}
@@ -199,7 +202,7 @@ __glXAquaScreenCreateContext(__GLXscreen *screen,
if (gl_err != 0) {
ErrorF("CGLCreateContext error: %s\n", CGLErrorString(gl_err));
CGLDestroyPixelFormat(context->pixelFormat);
- free(context);
+ xfree(context);
return NULL;
}
@@ -238,11 +241,13 @@ static void __glXAquaContextDestroy(__GLXcontext *baseContext) {
x_hash_table_insert(surface_hash, x_cvt_uint_to_vptr(context->sid), lst);
}
- if (context->ctx != NULL) CGLDestroyContext(context->ctx);
+ if (context->ctx != NULL)
+ CGLDestroyContext(context->ctx);
- if (context->pixelFormat != NULL) CGLDestroyPixelFormat(context->pixelFormat);
+ if (context->pixelFormat != NULL)
+ CGLDestroyPixelFormat(context->pixelFormat);
- free(context);
+ xfree(context);
}
}
@@ -433,21 +438,22 @@ static GLboolean __glXAquaDrawableResize(__GLXdrawable *base) {
static GLboolean __glXAquaDrawableSwapBuffers(__GLXdrawable *base) {
CGLError gl_err;
- __GLXAquaContext * drawableCtx;
-// GLAQUA_DEBUG_MSG("glAquaDrawableSwapBuffers(%p)\n",base);
+ __GLXAquaContext * drawableCtx;
+ // GLAQUA_DEBUG_MSG("glAquaDrawableSwapBuffers(%p)\n",base);
- if(!base) {
- ErrorF("glXAquaDrawbleSwapBuffers passed NULL\n");
- return GL_FALSE;
- }
+ if(!base) {
+ ErrorF("glXAquaDrawbleSwapBuffers passed NULL\n");
+ return GL_FALSE;
+ }
drawableCtx = (__GLXAquaContext *)base->drawGlxc;
-
+
if (drawableCtx != NULL && drawableCtx->ctx != NULL) {
gl_err = CGLFlushDrawable(drawableCtx->ctx);
if (gl_err != 0)
ErrorF("CGLFlushDrawable error: %s\n", CGLErrorString(gl_err));
}
+
return GL_TRUE;
}
@@ -470,7 +476,21 @@ static CGLPixelFormatObj makeFormat(__GLXconfig *conf) {
attr[i++] = kCGLPFAAlphaSize;
attr[i++] = conf->alphaBits;
- /*TODO add accum, depth, and stencil. */
+ if((conf->accumRedBits + conf->accumGreenBits + conf->accumBlueBits +
+ conf->accumAlphaBits) > 0) {
+
+ attr[i++] = kCGLPFAAccumSize;
+ attr[i++] = conf->accumRedBits + conf->accumGreenBits
+ + conf->accumBlueBits + conf->accumAlphaBits;
+ }
+
+ attr[i++] = kCGLPFADepthSize;
+ attr[i++] = conf->depthBits;
+
+ if(conf->stencilBits) {
+ attr[i++] = kCGLPFAStencilSize;
+ attr[i++] = conf->stencilBits;
+ }
if(conf->numAuxBuffers > 0) {
attr[i++] = kCGLPFAAuxBuffers;
@@ -495,80 +515,6 @@ static CGLPixelFormatObj makeFormat(__GLXconfig *conf) {
return fobj;
}
-#if 0
-static CGLPixelFormatObj makeFormat(__GLcontextModes *mode) {
- int i;
- CGLPixelFormatAttribute attr[64]; // currently uses max of 30
- CGLPixelFormatObj result;
- GLint n_formats;
- CGLError gl_err;
-
- GLAQUA_DEBUG_MSG("makeFormat\n");
-
- if (!mode->rgbMode)
- return NULL;
-
- i = 0;
-
- // attr [i++] = kCGLPFAAcelerated; // require hwaccel - BAD for multiscreen
- // attr [i++] = kCGLPFANoRecovery; // disable fallback renderers - BAD
-
- if (mode->stereoMode) {
- attr[i++] = kCGLPFAStereo;
- }
- if (mode->doubleBufferMode) {
- attr[i++] = kCGLPFADoubleBuffer;
- }
-
- if (mode->colorIndexMode) {
- /* ignored */
- }
-
- if (mode->rgbMode) {
- attr[i++] = kCGLPFAColorSize;
- attr[i++] = mode->redBits + mode->greenBits + mode->blueBits;
- attr[i++] = kCGLPFAAlphaSize;
- attr[i++] = 1; /* FIXME: ignoring mode->alphaBits which is always 0 */
- }
-
- if (mode->haveAccumBuffer) {
- attr[i++] = kCGLPFAAccumSize;
- attr[i++] = mode->accumRedBits + mode->accumGreenBits
- + mode->accumBlueBits + mode->accumAlphaBits;
- }
-
- if (mode->haveDepthBuffer) {
- attr[i++] = kCGLPFADepthSize;
- attr[i++] = mode->depthBits;
- }
-
- if (mode->haveStencilBuffer) {
- attr[i++] = kCGLPFAStencilSize;
- attr[i++] = mode->stencilBits;
- }
-
- attr[i++] = kCGLPFAAuxBuffers;
- attr[i++] = mode->numAuxBuffers;
-
- /* mode->level ignored */
-
- /* mode->pixmapMode ? */
-
- attr[i++] = 0;
-
- GLAQUA_DEBUG_MSG("makeFormat almost done\n");
-
- result = NULL;
- gl_err = CGLChoosePixelFormat(attr, &result, &n_formats);
- if (gl_err != 0)
- ErrorF("CGLChoosePixelFormat error: %s\n", CGLErrorString(gl_err));
-
- GLAQUA_DEBUG_MSG("makeFormat done (0x%x)\n", (unsigned int) result);
-
- return result;
-}
-#endif
-
// Originally copied from Mesa
static int numConfigs = 0;
@@ -1210,7 +1156,9 @@ static void init_screen_visuals(__GLXAquaScreen *screen) {
#endif
}
-/* This will eventually need to use the capabilities.c code. */
+/* This will eventually need to use the capabilities.c code.
+ * We can probably update the visualConfigs.c code to work with __GLXconfig.
+ */
static __GLXconfig *createConfigs(void) {
__GLXconfig *conf;
@@ -1333,8 +1281,15 @@ static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen) {
screen->base.GLextensions = "";
screen->base.GLXvendor = "Apple";
screen->base.GLXversion = "1.4";
- screen->base.GLXextensions = "";
+ screen->base.GLXextensions = "GLX_SGIX_fbconfig "
+ "GLX_SGIS_multisample "
+ "GLX_ARB_multisample "
+ "GLX_EXT_visual_info "
+ "GLX_EXT_import_context "
+ "GLX_EXT_texture_from_pixmap ";
+ /*We may be able to add more GLXextensions at a later time. */
+
/*
* These are both commented out, because they cause problems with
* the other visual config code, and visuals.