diff options
Diffstat (limited to 'xorg-server/hw/xquartz/GL/capabilities.c')
-rw-r--r-- | xorg-server/hw/xquartz/GL/capabilities.c | 651 |
1 files changed, 335 insertions, 316 deletions
diff --git a/xorg-server/hw/xquartz/GL/capabilities.c b/xorg-server/hw/xquartz/GL/capabilities.c index b718a4156..4624fd4db 100644 --- a/xorg-server/hw/xquartz/GL/capabilities.c +++ b/xorg-server/hw/xquartz/GL/capabilities.c @@ -38,313 +38,326 @@ #include "os.h" -static void handleBufferModes(struct glCapabilitiesConfig *c, GLint bufferModes) { - if(bufferModes & kCGLStereoscopicBit) { - c->stereo = true; +static void +handleBufferModes(struct glCapabilitiesConfig *c, GLint bufferModes) +{ + if (bufferModes & kCGLStereoscopicBit) { + c->stereo = true; } - if(bufferModes & kCGLDoubleBufferBit) { - c->buffers = 2; - } else { - c->buffers = 1; + if (bufferModes & kCGLDoubleBufferBit) { + c->buffers = 2; + } + else { + c->buffers = 1; } } -static void handleStencilModes(struct glCapabilitiesConfig *c, GLint smodes) { +static void +handleStencilModes(struct glCapabilitiesConfig *c, GLint smodes) +{ int offset = 0; - - if(kCGL0Bit & smodes) - c->stencil_bit_depths[offset++] = 0; - - if(kCGL1Bit & smodes) - c->stencil_bit_depths[offset++] = 1; - - if(kCGL2Bit & smodes) - c->stencil_bit_depths[offset++] = 2; - - if(kCGL3Bit & smodes) - c->stencil_bit_depths[offset++] = 3; - - if(kCGL4Bit & smodes) - c->stencil_bit_depths[offset++] = 4; - - if(kCGL5Bit & smodes) - c->stencil_bit_depths[offset++] = 5; - - if(kCGL6Bit & smodes) - c->stencil_bit_depths[offset++] = 6; - - if(kCGL8Bit & smodes) - c->stencil_bit_depths[offset++] = 8; - - if(kCGL10Bit & smodes) - c->stencil_bit_depths[offset++] = 10; - - if(kCGL12Bit & smodes) - c->stencil_bit_depths[offset++] = 12; - - if(kCGL16Bit & smodes) - c->stencil_bit_depths[offset++] = 16; - - if(kCGL24Bit & smodes) - c->stencil_bit_depths[offset++] = 24; - - if(kCGL32Bit & smodes) - c->stencil_bit_depths[offset++] = 32; - - if(kCGL48Bit & smodes) - c->stencil_bit_depths[offset++] = 48; - - if(kCGL64Bit & smodes) - c->stencil_bit_depths[offset++] = 64; - - if(kCGL96Bit & smodes) - c->stencil_bit_depths[offset++] = 96; - - if(kCGL128Bit & smodes) - c->stencil_bit_depths[offset++] = 128; + + if (kCGL0Bit & smodes) + c->stencil_bit_depths[offset++] = 0; + + if (kCGL1Bit & smodes) + c->stencil_bit_depths[offset++] = 1; + + if (kCGL2Bit & smodes) + c->stencil_bit_depths[offset++] = 2; + + if (kCGL3Bit & smodes) + c->stencil_bit_depths[offset++] = 3; + + if (kCGL4Bit & smodes) + c->stencil_bit_depths[offset++] = 4; + + if (kCGL5Bit & smodes) + c->stencil_bit_depths[offset++] = 5; + + if (kCGL6Bit & smodes) + c->stencil_bit_depths[offset++] = 6; + + if (kCGL8Bit & smodes) + c->stencil_bit_depths[offset++] = 8; + + if (kCGL10Bit & smodes) + c->stencil_bit_depths[offset++] = 10; + + if (kCGL12Bit & smodes) + c->stencil_bit_depths[offset++] = 12; + + if (kCGL16Bit & smodes) + c->stencil_bit_depths[offset++] = 16; + + if (kCGL24Bit & smodes) + c->stencil_bit_depths[offset++] = 24; + + if (kCGL32Bit & smodes) + c->stencil_bit_depths[offset++] = 32; + + if (kCGL48Bit & smodes) + c->stencil_bit_depths[offset++] = 48; + + if (kCGL64Bit & smodes) + c->stencil_bit_depths[offset++] = 64; + + if (kCGL96Bit & smodes) + c->stencil_bit_depths[offset++] = 96; + + if (kCGL128Bit & smodes) + c->stencil_bit_depths[offset++] = 128; assert(offset < GLCAPS_STENCIL_BIT_DEPTH_BUFFERS); c->total_stencil_bit_depths = offset; } -static int handleColorAndAccumulation(struct glColorBufCapabilities *c, - GLint cmodes, int forAccum) { +static int +handleColorAndAccumulation(struct glColorBufCapabilities *c, + GLint cmodes, int forAccum) +{ int offset = 0; - - /*1*/ - if(kCGLRGB444Bit & cmodes) { - c[offset].r = 4; - c[offset].g = 4; - c[offset].b = 4; - ++offset; - } - - /*2*/ - if(kCGLARGB4444Bit & cmodes) { - c[offset].a = 4; - c[offset].r = 4; - c[offset].g = 4; - c[offset].b = 4; - c[offset].is_argb = true; - ++offset; - } - - /*3*/ - if(kCGLRGB444A8Bit & cmodes) { - c[offset].r = 4; - c[offset].g = 4; - c[offset].b = 4; - c[offset].a = 8; - ++offset; - } - /*4*/ - if(kCGLRGB555Bit & cmodes) { - c[offset].r = 5; - c[offset].g = 5; - c[offset].b = 5; - ++offset; + /*1 */ + if (kCGLRGB444Bit & cmodes) { + c[offset].r = 4; + c[offset].g = 4; + c[offset].b = 4; + ++offset; } - /*5*/ - if(kCGLARGB1555Bit & cmodes) { - c[offset].a = 1; - c[offset].r = 5; - c[offset].g = 5; - c[offset].b = 5; - c[offset].is_argb = true; - ++offset; + /*2 */ + if (kCGLARGB4444Bit & cmodes) { + c[offset].a = 4; + c[offset].r = 4; + c[offset].g = 4; + c[offset].b = 4; + c[offset].is_argb = true; + ++offset; } - /*6*/ - if(kCGLRGB555A8Bit & cmodes) { - c[offset].r = 5; - c[offset].g = 5; - c[offset].b = 5; - c[offset].a = 8; - ++offset; + /*3 */ + if (kCGLRGB444A8Bit & cmodes) { + c[offset].r = 4; + c[offset].g = 4; + c[offset].b = 4; + c[offset].a = 8; + ++offset; } - /*7*/ - if(kCGLRGB565Bit & cmodes) { - c[offset].r = 5; - c[offset].g = 6; - c[offset].b = 5; - ++offset; + /*4 */ + if (kCGLRGB555Bit & cmodes) { + c[offset].r = 5; + c[offset].g = 5; + c[offset].b = 5; + ++offset; } - /*8*/ - if(kCGLRGB565A8Bit & cmodes) { - c[offset].r = 5; - c[offset].g = 6; - c[offset].b = 5; - c[offset].a = 8; - ++offset; + /*5 */ + if (kCGLARGB1555Bit & cmodes) { + c[offset].a = 1; + c[offset].r = 5; + c[offset].g = 5; + c[offset].b = 5; + c[offset].is_argb = true; + ++offset; } - /*9*/ - if(kCGLRGB888Bit & cmodes) { - c[offset].r = 8; - c[offset].g = 8; - c[offset].b = 8; - ++offset; + /*6 */ + if (kCGLRGB555A8Bit & cmodes) { + c[offset].r = 5; + c[offset].g = 5; + c[offset].b = 5; + c[offset].a = 8; + ++offset; } - /*10*/ - if(kCGLARGB8888Bit & cmodes) { - c[offset].a = 8; - c[offset].r = 8; - c[offset].g = 8; - c[offset].b = 8; - c[offset].is_argb = true; - ++offset; + /*7 */ + if (kCGLRGB565Bit & cmodes) { + c[offset].r = 5; + c[offset].g = 6; + c[offset].b = 5; + ++offset; } - /*11*/ - if(kCGLRGB888A8Bit & cmodes) { - c[offset].r = 8; - c[offset].g = 8; - c[offset].b = 8; - c[offset].a = 8; - ++offset; + /*8 */ + if (kCGLRGB565A8Bit & cmodes) { + c[offset].r = 5; + c[offset].g = 6; + c[offset].b = 5; + c[offset].a = 8; + ++offset; } - if(forAccum) { -//#if 0 - /* FIXME - * Disable this path, because some part of libGL, X, or Xplugin - * doesn't work with sizes greater than 8. - * When this is enabled and visuals are chosen using depths - * such as 16, the result is that the windows don't redraw - * and are often white, until a resize. - */ - - /*12*/ - if(kCGLRGB101010Bit & cmodes) { - c[offset].r = 10; - c[offset].g = 10; - c[offset].b = 10; - ++offset; + /*9 */ + if (kCGLRGB888Bit & cmodes) { + c[offset].r = 8; + c[offset].g = 8; + c[offset].b = 8; + ++offset; } - /*13*/ - if(kCGLARGB2101010Bit & cmodes) { - c[offset].a = 2; - c[offset].r = 10; - c[offset].g = 10; - c[offset].b = 10; - c[offset].is_argb = true; - ++offset; + /*10 */ + if (kCGLARGB8888Bit & cmodes) { + c[offset].a = 8; + c[offset].r = 8; + c[offset].g = 8; + c[offset].b = 8; + c[offset].is_argb = true; + ++offset; } - /*14*/ - if(kCGLRGB101010_A8Bit & cmodes) { - c[offset].r = 10; - c[offset].g = 10; - c[offset].b = 10; - c[offset].a = 8; - ++offset; + /*11 */ + if (kCGLRGB888A8Bit & cmodes) { + c[offset].r = 8; + c[offset].g = 8; + c[offset].b = 8; + c[offset].a = 8; + ++offset; } - /*15*/ - if(kCGLRGB121212Bit & cmodes) { - c[offset].r = 12; - c[offset].g = 12; - c[offset].b = 12; - ++offset; - } - - /*16*/ - if(kCGLARGB12121212Bit & cmodes) { - c[offset].a = 12; - c[offset].r = 12; - c[offset].g = 12; - c[offset].b = 12; - c[offset].is_argb = true; - ++offset; - } - - /*17*/ - if(kCGLRGB161616Bit & cmodes) { - c[offset].r = 16; - c[offset].g = 16; - c[offset].b = 16; - ++offset; - } - - /*18*/ - if(kCGLRGBA16161616Bit & cmodes) { - c[offset].r = 16; - c[offset].g = 16; - c[offset].b = 16; - c[offset].a = 16; - ++offset; - } + if (forAccum) { +//#if 0 + /* FIXME + * Disable this path, because some part of libGL, X, or Xplugin + * doesn't work with sizes greater than 8. + * When this is enabled and visuals are chosen using depths + * such as 16, the result is that the windows don't redraw + * and are often white, until a resize. + */ + + /*12 */ + if (kCGLRGB101010Bit & cmodes) { + c[offset].r = 10; + c[offset].g = 10; + c[offset].b = 10; + ++offset; + } + + /*13 */ + if (kCGLARGB2101010Bit & cmodes) { + c[offset].a = 2; + c[offset].r = 10; + c[offset].g = 10; + c[offset].b = 10; + c[offset].is_argb = true; + ++offset; + } + + /*14 */ + if (kCGLRGB101010_A8Bit & cmodes) { + c[offset].r = 10; + c[offset].g = 10; + c[offset].b = 10; + c[offset].a = 8; + ++offset; + } + + /*15 */ + if (kCGLRGB121212Bit & cmodes) { + c[offset].r = 12; + c[offset].g = 12; + c[offset].b = 12; + ++offset; + } + + /*16 */ + if (kCGLARGB12121212Bit & cmodes) { + c[offset].a = 12; + c[offset].r = 12; + c[offset].g = 12; + c[offset].b = 12; + c[offset].is_argb = true; + ++offset; + } + + /*17 */ + if (kCGLRGB161616Bit & cmodes) { + c[offset].r = 16; + c[offset].g = 16; + c[offset].b = 16; + ++offset; + } + + /*18 */ + if (kCGLRGBA16161616Bit & cmodes) { + c[offset].r = 16; + c[offset].g = 16; + c[offset].b = 16; + c[offset].a = 16; + ++offset; + } } //#endif /* FIXME should we handle the floating point color modes, and if so, how? */ - + return offset; } - -static void handleColorModes(struct glCapabilitiesConfig *c, GLint cmodes) { +static void +handleColorModes(struct glCapabilitiesConfig *c, GLint cmodes) +{ c->total_color_buffers = handleColorAndAccumulation(c->color_buffers, - cmodes, 0); - + cmodes, 0); + assert(c->total_color_buffers < GLCAPS_COLOR_BUFFERS); } -static void handleAccumulationModes(struct glCapabilitiesConfig *c, GLint cmodes) { +static void +handleAccumulationModes(struct glCapabilitiesConfig *c, GLint cmodes) +{ c->total_accum_buffers = handleColorAndAccumulation(c->accum_buffers, - cmodes, 1); + cmodes, 1); assert(c->total_accum_buffers < GLCAPS_COLOR_BUFFERS); } -static void handleDepthModes(struct glCapabilitiesConfig *c, GLint dmodes) { +static void +handleDepthModes(struct glCapabilitiesConfig *c, GLint dmodes) +{ int offset = 0; + #define DEPTH(flag,value) do { \ if(dmodes & flag) { \ c->depth_buffers[offset++] = value; \ } \ } while(0) - /*1*/ + /*1 */ DEPTH(kCGL0Bit, 0); - /*2*/ + /*2 */ DEPTH(kCGL1Bit, 1); - /*3*/ + /*3 */ DEPTH(kCGL2Bit, 2); - /*4*/ + /*4 */ DEPTH(kCGL3Bit, 3); - /*5*/ + /*5 */ DEPTH(kCGL4Bit, 4); - /*6*/ + /*6 */ DEPTH(kCGL5Bit, 5); - /*7*/ + /*7 */ DEPTH(kCGL6Bit, 6); - /*8*/ + /*8 */ DEPTH(kCGL8Bit, 8); - /*9*/ + /*9 */ DEPTH(kCGL10Bit, 10); - /*10*/ + /*10 */ DEPTH(kCGL12Bit, 12); - /*11*/ + /*11 */ DEPTH(kCGL16Bit, 16); - /*12*/ + /*12 */ DEPTH(kCGL24Bit, 24); - /*13*/ + /*13 */ DEPTH(kCGL32Bit, 32); - /*14*/ + /*14 */ DEPTH(kCGL48Bit, 48); - /*15*/ + /*15 */ DEPTH(kCGL64Bit, 64); - /*16*/ + /*16 */ DEPTH(kCGL96Bit, 96); - /*17*/ + /*17 */ DEPTH(kCGL128Bit, 128); #undef DEPTH @@ -354,95 +367,96 @@ static void handleDepthModes(struct glCapabilitiesConfig *c, GLint dmodes) { } /* Return non-zero if an error occured. */ -static CGLError handleRendererDescriptions(CGLRendererInfoObj info, GLint r, - struct glCapabilitiesConfig *c) { +static CGLError +handleRendererDescriptions(CGLRendererInfoObj info, GLint r, + struct glCapabilitiesConfig *c) +{ CGLError err; GLint accelerated = 0, flags = 0, aux = 0, samplebufs = 0, samples = 0; - err = CGLDescribeRenderer (info, r, kCGLRPAccelerated, &accelerated); + err = CGLDescribeRenderer(info, r, kCGLRPAccelerated, &accelerated); + + if (err) + return err; - if(err) - return err; - c->accelerated = accelerated; /* Buffering modes: single/double, stereo */ err = CGLDescribeRenderer(info, r, kCGLRPBufferModes, &flags); - if(err) - return err; - + if (err) + return err; + handleBufferModes(c, flags); - + /* AUX buffers */ err = CGLDescribeRenderer(info, r, kCGLRPMaxAuxBuffers, &aux); - if(err) - return err; - + if (err) + return err; + c->aux_buffers = aux; - /* Depth buffer size */ err = CGLDescribeRenderer(info, r, kCGLRPDepthModes, &flags); - - if(err) - return err; - handleDepthModes(c, flags); + if (err) + return err; + handleDepthModes(c, flags); /* Multisample buffers */ err = CGLDescribeRenderer(info, r, kCGLRPMaxSampleBuffers, &samplebufs); - if(err) - return err; + if (err) + return err; c->multisample_buffers = samplebufs; - /* Multisample samples per multisample buffer */ err = CGLDescribeRenderer(info, r, kCGLRPMaxSamples, &samples); - if(err) - return err; + if (err) + return err; c->multisample_samples = samples; - /* Stencil bit depths */ err = CGLDescribeRenderer(info, r, kCGLRPStencilModes, &flags); - if(err) - return err; - - handleStencilModes(c, flags); + if (err) + return err; + handleStencilModes(c, flags); /* Color modes (RGB/RGBA depths supported */ err = CGLDescribeRenderer(info, r, kCGLRPColorModes, &flags); - if(err) - return err; - + if (err) + return err; + handleColorModes(c, flags); err = CGLDescribeRenderer(info, r, kCGLRPAccumModes, &flags); - if(err) - return err; + if (err) + return err; handleAccumulationModes(c, flags); - + return kCGLNoError; } -static void initCapabilities(struct glCapabilities *cap) { +static void +initCapabilities(struct glCapabilities *cap) +{ cap->configurations = NULL; cap->total_configurations = 0; } -static void initConfig(struct glCapabilitiesConfig *c) { +static void +initConfig(struct glCapabilitiesConfig *c) +{ int i; c->accelerated = false; @@ -452,8 +466,8 @@ static void initConfig(struct glCapabilitiesConfig *c) { c->total_depth_buffer_depths = 0; - for(i = 0; i < GLCAPS_DEPTH_BUFFERS; ++i) { - c->depth_buffers[i] = GLCAPS_INVALID_DEPTH_VALUE; + for (i = 0; i < GLCAPS_DEPTH_BUFFERS; ++i) { + c->depth_buffers[i] = GLCAPS_INVALID_DEPTH_VALUE; } c->multisample_buffers = 0; @@ -461,83 +475,88 @@ static void initConfig(struct glCapabilitiesConfig *c) { c->total_stencil_bit_depths = 0; - for(i = 0; i < GLCAPS_STENCIL_BIT_DEPTH_BUFFERS; ++i) { - c->stencil_bit_depths[i] = GLCAPS_INVALID_STENCIL_DEPTH; + for (i = 0; i < GLCAPS_STENCIL_BIT_DEPTH_BUFFERS; ++i) { + c->stencil_bit_depths[i] = GLCAPS_INVALID_STENCIL_DEPTH; } - + c->total_color_buffers = 0; - for(i = 0; i < GLCAPS_COLOR_BUFFERS; ++i) { - c->color_buffers[i].r = c->color_buffers[i].g = - c->color_buffers[i].b = c->color_buffers[i].a = - GLCAPS_COLOR_BUF_INVALID_VALUE; - c->color_buffers[i].is_argb = false; - } + for (i = 0; i < GLCAPS_COLOR_BUFFERS; ++i) { + c->color_buffers[i].r = c->color_buffers[i].g = + c->color_buffers[i].b = c->color_buffers[i].a = + GLCAPS_COLOR_BUF_INVALID_VALUE; + c->color_buffers[i].is_argb = false; + } c->total_accum_buffers = 0; - for(i = 0; i < GLCAPS_COLOR_BUFFERS; ++i) { - c->accum_buffers[i].r = c->accum_buffers[i].g = - c->accum_buffers[i].b = c->accum_buffers[i].a = - GLCAPS_COLOR_BUF_INVALID_VALUE; - c->accum_buffers[i].is_argb = false; + for (i = 0; i < GLCAPS_COLOR_BUFFERS; ++i) { + c->accum_buffers[i].r = c->accum_buffers[i].g = + c->accum_buffers[i].b = c->accum_buffers[i].a = + GLCAPS_COLOR_BUF_INVALID_VALUE; + c->accum_buffers[i].is_argb = false; } c->next = NULL; } -void freeGlCapabilities(struct glCapabilities *cap) { +void +freeGlCapabilities(struct glCapabilities *cap) +{ struct glCapabilitiesConfig *conf, *next; - + conf = cap->configurations; - while(conf) { - next = conf->next; - free(conf); - conf = next; + while (conf) { + next = conf->next; + free(conf); + conf = next; } - cap->configurations = NULL; + cap->configurations = NULL; } /*Return true if an error occured. */ -bool getGlCapabilities(struct glCapabilities *cap) { - CGLRendererInfoObj info; +bool +getGlCapabilities(struct glCapabilities *cap) +{ + CGLRendererInfoObj info; CGLError err; - GLint numRenderers = 0, r; + GLint numRenderers = 0, r; initCapabilities(cap); - err = CGLQueryRendererInfo((GLuint)-1, &info, &numRenderers); - if(err) { - ErrorF("CGLQueryRendererInfo error: %s\n", CGLErrorString(err)); + err = CGLQueryRendererInfo((GLuint) - 1, &info, &numRenderers); + if (err) { + ErrorF("CGLQueryRendererInfo error: %s\n", CGLErrorString(err)); return err; - } + } - for(r = 0; r < numRenderers; r++) { - struct glCapabilitiesConfig tmpconf, *conf; + for (r = 0; r < numRenderers; r++) { + struct glCapabilitiesConfig tmpconf, *conf; - initConfig(&tmpconf); + initConfig(&tmpconf); - err = handleRendererDescriptions(info, r, &tmpconf); - if(err) { - ErrorF("handleRendererDescriptions returned error: %s\n", CGLErrorString(err)); + err = handleRendererDescriptions(info, r, &tmpconf); + if (err) { + ErrorF("handleRendererDescriptions returned error: %s\n", + CGLErrorString(err)); ErrorF("trying to continue...\n"); continue; - } + } - conf = malloc(sizeof(*conf)); - if(NULL == conf) { - FatalError("Unable to allocate memory for OpenGL capabilities\n"); - } + conf = malloc(sizeof(*conf)); + if (NULL == conf) { + FatalError("Unable to allocate memory for OpenGL capabilities\n"); + } - /* Copy the struct. */ - *conf = tmpconf; + /* Copy the struct. */ + *conf = tmpconf; - /* Now link the configuration into the list. */ - conf->next = cap->configurations; - cap->configurations = conf; - } + /* Now link the configuration into the list. */ + conf->next = cap->configurations; + cap->configurations = conf; + } CGLDestroyRendererInfo(info); |