diff options
-rw-r--r-- | hw/xquartz/GL/indirect.c | 451 |
1 files changed, 190 insertions, 261 deletions
diff --git a/hw/xquartz/GL/indirect.c b/hw/xquartz/GL/indirect.c index 32b9dd4f3..fbf13cecf 100644 --- a/hw/xquartz/GL/indirect.c +++ b/hw/xquartz/GL/indirect.c @@ -1,8 +1,8 @@ /* * GLX implementation that uses Apple's OpenGL.framework - * (Indirect rendering path) + * (Indirect rendering path -- it's also used for some direct mode code too) * - * Copyright (c) 2007 Apple Inc. + * Copyright (c) 2007, 2008, 2009 Apple Inc. * Copyright (c) 2004 Torrey T. Lyons. All Rights Reserved. * Copyright (c) 2002 Greg Parker. All Rights Reserved. * @@ -76,6 +76,8 @@ #include "x-hash.h" #include "x-list.h" +#include "capabilities.h" + #include <dispatch.h> #define GLAPIENTRYP * typedef unsigned long long GLuint64EXT; @@ -212,6 +214,7 @@ __glXAquaScreenCreateContext(__GLXscreen *screen, return &context->base; } +/* Nothing seems to use these anymore... */ static __GLXextensionInfo __glDDXExtensionInfo = { GL_CORE_APPLE, glAquaResetExtension, @@ -930,100 +933,6 @@ static Bool init_visuals(int *nvisualp, VisualPtr *visualp, return FALSE; } -Bool enable_stereo = FALSE; -/* based on code in i830_dri.c - This ends calling glAquaSetVisualConfigs to set the static - numconfigs, etc. */ -static void -glAquaInitVisualConfigs(void) -{ -#if 0 - int lclNumConfigs = 0; - __GLXvisualConfig *lclVisualConfigs = NULL; - void **lclVisualPrivates = NULL; - - int stereo, depth, aux, buffers, stencil, accum; - int i = 0; - - GLAQUA_DEBUG_MSG("glAquaInitVisualConfigs "); - - /* count num configs: - 2 stereo (on, off) (optional) - 2 Z buffer (0, 24 bit) - 2 AUX buffer (0, 2) - 2 buffers (single, double) - 2 stencil (0, 8 bit) - 2 accum (0, 64 bit) - = 64 configs with stereo, or 32 without */ - - if (enable_stereo) lclNumConfigs = 2 * 2 * 2 * 2 * 2 * 2; /* 64 */ - else lclNumConfigs = 2 * 2 * 2 * 2 * 2; /* 32 */ - - /* alloc */ - lclVisualConfigs = xcalloc(sizeof(__GLXvisualConfig), lclNumConfigs); - lclVisualPrivates = xcalloc(sizeof(void *), lclNumConfigs); - - /* fill in configs */ - if (NULL != lclVisualConfigs) { - i = 0; /* current buffer */ - for (stereo = 0; stereo < (enable_stereo ? 2 : 1); stereo++) { - for (depth = 0; depth < 2; depth++) { - for (aux = 0; aux < 2; aux++) { - for (buffers = 0; buffers < 2; buffers++) { - for (stencil = 0; stencil < 2; stencil++) { - for (accum = 0; accum < 2; accum++) { - lclVisualConfigs[i].vid = -1; - lclVisualConfigs[i].class = -1; - lclVisualConfigs[i].rgba = TRUE; - lclVisualConfigs[i].redSize = -1; - lclVisualConfigs[i].greenSize = -1; - lclVisualConfigs[i].blueSize = -1; - lclVisualConfigs[i].redMask = -1; - lclVisualConfigs[i].greenMask = -1; - lclVisualConfigs[i].blueMask = -1; - lclVisualConfigs[i].alphaMask = 0; - if (accum) { - lclVisualConfigs[i].accumRedSize = 16; - lclVisualConfigs[i].accumGreenSize = 16; - lclVisualConfigs[i].accumBlueSize = 16; - lclVisualConfigs[i].accumAlphaSize = 16; - } else { - lclVisualConfigs[i].accumRedSize = 0; - lclVisualConfigs[i].accumGreenSize = 0; - lclVisualConfigs[i].accumBlueSize = 0; - lclVisualConfigs[i].accumAlphaSize = 0; - } - lclVisualConfigs[i].doubleBuffer = buffers ? TRUE : FALSE; - lclVisualConfigs[i].stereo = stereo ? TRUE : FALSE; - lclVisualConfigs[i].bufferSize = -1; - - lclVisualConfigs[i].depthSize = depth? 24 : 0; - lclVisualConfigs[i].stencilSize = stencil ? 8 : 0; - lclVisualConfigs[i].auxBuffers = aux ? 2 : 0; - lclVisualConfigs[i].level = 0; - lclVisualConfigs[i].visualRating = GLX_NONE_EXT; - lclVisualConfigs[i].transparentPixel = 0; - lclVisualConfigs[i].transparentRed = 0; - lclVisualConfigs[i].transparentGreen = 0; - lclVisualConfigs[i].transparentBlue = 0; - lclVisualConfigs[i].transparentAlpha = 0; - lclVisualConfigs[i].transparentIndex = 0; - i++; - } - } - } - } - } - } - } - if (i != lclNumConfigs) - GLAQUA_DEBUG_MSG("glAquaInitVisualConfigs failed to alloc visual configs"); - - GlxSetVisualConfigs(lclNumConfigs, lclVisualConfigs, lclVisualPrivates); -#endif -} - - static void glAquaSetVisualConfigs(int nconfigs, __GLXvisualConfig *configs, void **privates) { @@ -1044,9 +953,6 @@ static Bool glAquaInitVisuals(VisualPtr *visualp, DepthPtr *depthp, { GLAQUA_DEBUG_MSG("glAquaInitVisuals\n"); - if (numConfigs == 0) /* if no configs */ - glAquaInitVisualConfigs(); /* ensure the visual configs are setup */ - /* * setup the visuals supported by this particular screen. */ @@ -1096,157 +1002,193 @@ static void __glXAquaScreenDestroy(__GLXscreen *screen) { xfree(screen); } -static void init_screen_visuals(__GLXAquaScreen *screen) { -#if 0 - ScreenPtr pScreen = screen->base.pScreen; - __GLcontextModes *modes; - int *used; - int i, j; - - GLAQUA_DEBUG_MSG("init_screen_visuals\n"); +static __GLXconfig *CreateConfigs(int *numConfigsPtr, int screenNumber) { + __GLXconfig *c, *result; + struct glCapabilities cap; + struct glCapabilitiesConfig *conf = NULL; + int numConfigs = 0; + int i; - /* FIXME: Change 'used' to be a array of bits (rather than of ints), - * FIXME: create a stack array of 8 or 16 bytes. If 'numVisuals' is less - * FIXME: than 64 or 128 the stack array can be used instead of calling - * FIXME: malloc / free. If nothing else, convert 'used' to - * FIXME: array of bytes instead of ints! - */ - used = (int *)malloc(pScreen->numVisuals * sizeof(int)); - memset(used, 0, pScreen->numVisuals * sizeof(int)); + if(getGlCapabilities(&cap)) + FatalError("error from getGlCapabilities() in %s\n", __func__); - i = 0; - for ( modes = screen -> base.modes - ; modes != NULL - ; modes = modes->next ) { - const int vis_class = _gl_convert_to_x_visual_type( modes->visualType ); - const int nplanes = (modes->rgbBits - modes->alphaBits); - const VisualPtr pVis = pScreen->visuals; + assert(NULL != cap.configurations); - for (j = 0; j < pScreen->numVisuals; j++) { - if (pVis[j].class == vis_class && - pVis[j].nplanes == nplanes && - pVis[j].redMask == modes->redMask && - pVis[j].greenMask == modes->greenMask && - pVis[j].blueMask == modes->blueMask && - !used[j]) { - - /* set the VisualID */ - modes->visualID = pVis[j].vid; - - /* Mark this visual used */ - used[j] = 1; - break; - } - } - if ( j == pScreen->numVisuals ) { - ErrorF("No matching visual for __GLcontextMode with " - "visual class = %d (%d), nplanes = %u\n", - vis_class, - (int)modes->visualType, - (unsigned int)(modes->rgbBits - modes->alphaBits) ); - } - else if ( modes->visualID == -1 ) { - FatalError( "Matching visual found, but visualID still -1!\n" ); - } + for(conf = cap.configurations; conf; conf = conf->next) { + if(conf->total_color_buffers <= 0) + continue; - i++; + numConfigs += (conf->stereo ? 2 : 1) + * (conf->aux_buffers ? 2 : 1) + * conf->buffers + * ((conf->total_stencil_bit_depths > 0) ? + conf->total_stencil_bit_depths : 1) + * conf->total_color_buffers + * ((conf->total_accum_buffers > 0) ? conf->total_accum_buffers : 1) + * conf->total_depth_buffer_depths + * (conf->multisample_buffers + 1); } - free(used); -#endif -} - -/* 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; - - conf = xalloc(sizeof *conf); + *numConfigsPtr = numConfigs; + + c = xalloc(sizeof(*c) * numConfigs); - if(NULL == conf) + if(NULL == c) return NULL; - conf->next = NULL; - conf->doubleBufferMode = GL_TRUE; - conf->stereoMode = GL_FALSE; - conf->redBits = 8; - conf->greenBits = 8; - conf->blueBits = 8; - conf->alphaBits = 0; - - conf->redMask = -1; - conf->greenMask = -1; - conf->blueMask = -1; - conf->alphaMask = -1; - - conf->rgbBits = conf->redBits + conf->greenBits + conf->blueBits + conf->alphaBits; - conf->indexBits = 0; - - conf->accumRedBits = 0; - conf->accumGreenBits = 0; - conf->accumBlueBits = 0; - conf->accumAlphaBits = 0; - conf->depthBits = 24; - conf->stencilBits = 0; - - conf->numAuxBuffers = 0; + result = c; - conf->level = 0; + memset(result, 0, sizeof(*c) * numConfigs); - conf->pixmapMode = 0; - - conf->visualID = -1; - conf->visualType = GLX_TRUE_COLOR; - conf->visualRating = 0; - - conf->transparentPixel = 0; - conf->transparentRed = 0; - conf->transparentGreen = 0; - conf->transparentAlpha = 0; - conf->transparentIndex = 0; + i = 0; + + for(conf = cap.configurations; conf; conf = conf->next) { + int stereo, aux, buffers, stencil, color, accum, depth, msample; + + for(stereo = 0; stereo < (conf->stereo ? 2 : 1); ++stereo) { + for(aux = 0; aux < (conf->aux_buffers ? 2 : 1); ++aux) { + for(buffers = 0; buffers < conf->buffers; ++buffers) { + for(stencil = 0; stencil < ((conf->total_stencil_bit_depths > 0) ? + conf->total_stencil_bit_depths : 1); ++stencil) { + for(color = 0; color < conf->total_color_buffers; ++color) { + for(accum = 0; accum < ((conf->total_accum_buffers > 0) ? + conf->total_accum_buffers : 1); ++accum) { + for(depth = 0; depth < conf->total_depth_buffer_depths; ++depth) { + for(msample = 0; msample < (conf->multisample_buffers + 1); ++msample) { + if((i + 1) < numConfigs) { + c->next = c + 1; + } else { + c->next = NULL; + } + + c->doubleBufferMode = buffers ? GL_TRUE : GL_FALSE; + c->stereoMode = stereo ? GL_TRUE : GL_FALSE; + + c->redBits = conf->color_buffers[color].r; + c->greenBits = conf->color_buffers[color].g; + c->blueBits = conf->color_buffers[color].b; + c->alphaBits = 0; + + if(GLCAPS_COLOR_BUF_INVALID_VALUE != conf->color_buffers[color].a) { + c->alphaBits = conf->color_buffers[color].a; + } + + c->redMask = -1; + c->greenMask = -1; + c->blueMask = -1; + c->alphaMask = -1; + + c->rgbBits = c->redBits + c->greenBits + c->blueBits + c->alphaBits; + c->indexBits = 0; + + c->accumRedBits = 0; + c->accumGreenBits = 0; + c->accumBlueBits = 0; + c->accumAlphaBits = 0; + + if(conf->total_accum_buffers > 0) { + c->accumRedBits = conf->accum_buffers[accum].r; + c->accumGreenBits = conf->accum_buffers[accum].g; + c->accumBlueBits = conf->accum_buffers[accum].b; + if(GLCAPS_COLOR_BUF_INVALID_VALUE != conf->accum_buffers[accum].a) { + c->accumAlphaBits = conf->accum_buffers[accum].a; + } + } + + c->depthBits = conf->depth_buffers[depth]; + + c->stencilBits = 0; + + if(conf->total_stencil_bit_depths > 0) { + c->stencilBits = conf->stencil_bit_depths[stencil]; + } + + + c->numAuxBuffers = aux ? conf->aux_buffers : 0; + + c->level = 0; + /*TODO what should this be? */ + c->pixmapMode = 0; + + c->visualID = -1; + c->visualType = GLX_TRUE_COLOR; + + if(conf->accelerated) { + c->visualRating = GLX_NONE; + } else { + c->visualRating = GLX_SLOW_VISUAL_EXT; + } + + c->transparentPixel = GLX_NONE; + c->transparentRed = GLX_NONE; + c->transparentGreen = GLX_NONE; + c->transparentAlpha = GLX_NONE; + c->transparentIndex = GLX_NONE; + + c->sampleBuffers = 0; + c->samples = 0; + + if(msample > 0) { + c->sampleBuffers = conf->multisample_buffers; + c->samples = conf->multisample_samples; + } + + /* SGIX_fbconfig / GLX 1.3 */ + c->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT; + c->renderType = /*FIXME*/ GL_TRUE; + c->xRenderable = GL_TRUE; + c->fbconfigID = -1; + + /*TODO add querying code to capabilities.c for the Pbuffer maximums. + *I'm not sure we can even use CGL for Pbuffers yet... + */ + /* SGIX_pbuffer / GLX 1.3 */ + c->maxPbufferWidth = 0; + c->maxPbufferHeight = 0; + c->maxPbufferPixels = 0; + c->optimalPbufferWidth = 0; + c->optimalPbufferHeight = 0; + c->visualSelectGroup = 0; + + c->swapMethod = GLX_SWAP_UNDEFINED_OML; + + c->screen = screenNumber; + + /* EXT_texture_from_pixmap */ + c->bindToTextureRgb = 0; + c->bindToTextureRgba = 0; + c->bindToMipmapTexture = 0; + c->bindToTextureTargets = 0; + c->yInverted = 0; + + if(c->next) + c = c->next; + + ++i; + } + } + } + } + } + } + } + } + } + + if(i != numConfigs) + FatalError("The number of __GLXconfig generated does not match the initial calculation!\n"); - conf->sampleBuffers = 0; - conf->samples = 0; - - /* SGIX_fbconfig / GLX 1.3 */ - conf->drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT; - conf->renderType = GL_TRUE; - conf->xRenderable = GL_TRUE; - conf->fbconfigID = -1; - - /*TODO add querying code to capabilities.c for the Pbuffer maximums. */ - /* SGIX_pbuffer / GLX 1.3 */ - conf->maxPbufferWidth = 0; - conf->maxPbufferHeight = 0; - conf->maxPbufferPixels = 0; - conf->optimalPbufferWidth = 0; - conf->optimalPbufferHeight = 0; - - conf->visualSelectGroup = 0; - - conf->swapMethod = GLX_SWAP_UNDEFINED_OML; - - /* FIXME */ - conf->screen = 0; - - /* EXT_texture_from_pixmap */ - conf->bindToTextureRgb = 0; - conf->bindToTextureRgba = 0; - conf->bindToMipmapTexture = 0; - conf->bindToTextureTargets = 0; - conf->yInverted = 0; - - return conf; -} + freeGlCapabilities(&cap); + + return result; +} /* This is called by __glXInitScreens(). */ static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen) { __GLXAquaScreen *screen; - __GLXconfig *configs; GLAQUA_DEBUG_MSG("glXAquaScreenProbe\n"); @@ -1265,41 +1207,28 @@ static __GLXscreen * __glXAquaScreenProbe(ScreenPtr pScreen) { screen->base.swapBarrierFuncs = NULL; screen->base.pScreen = pScreen; - configs = createConfigs(); - - screen->base.fbconfigs = configs; - screen->base.numFBConfigs = 1; - - screen->base.visuals = NULL; - screen->base.numVisuals = 0; - + screen->base.fbconfigs = CreateConfigs(&screen->base.numFBConfigs, + pScreen->myNum); + + /* This seems odd, but visuals is a __GLXconfig too. */ + screen->base.visuals = screen->base.fbconfigs; + screen->base.numVisuals = screen->base.numFBConfigs; + GlxSetVisualConfig(GLX_ALL_VISUALS); __glXScreenInit(&screen->base, pScreen); /* __glXScreenInit initializes these, so the order here is important, if we need these... */ - screen->base.GLextensions = ""; - screen->base.GLXvendor = "Apple"; - screen->base.GLXversion = "1.4"; - 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. */ + // screen->base.GLextensions = ""; + // screen->base.GLXvendor = "Apple"; + screen->base.GLXversion = xstrdup("1.4"); + screen->base.GLXextensions = xstrdup("GLX_SGIX_fbconfig " + "GLX_SGIS_multisample " + "GLX_ARB_multisample " + "GLX_EXT_visual_info " + "GLX_EXT_import_context "); - - /* - * These are both commented out, because they cause problems with - * the other visual config code, and visuals. - * This probe function is called normally on startup in direct - * mode too. - * They don't seem to be needed now that we have better visual - * setup. - */ - //init_screen_visuals(screen); - //glAquaInitVisualConfigs(); + /*We may be able to add more GLXextensions at a later time. */ return &screen->base; } @@ -1359,7 +1288,7 @@ __glXAquaScreenCreateDrawable(__GLXscreen *screen, glxPriv->base.destroy = __glXAquaDrawableDestroy; glxPriv->base.resize = __glXAquaDrawableResize; glxPriv->base.swapBuffers = __glXAquaDrawableSwapBuffers; - glxPriv->base.copySubBuffer = __glXAquaDrawableCopySubBuffer; + glxPriv->base.copySubBuffer = NULL; /* __glXAquaDrawableCopySubBuffer; */ return &glxPriv->base; } |