static int Open(void * hwnd) { CGLRendererInfoObj renderer; long numRenderer; CGDirectDisplayID l[32]; CGDisplayCount count; SYS_ASSERT(g_pCGLC == 0); UNUSED(hwnd); CGGetActiveDisplayList (sizeof(l), l, &count); #ifdef _DEBUG // Debug in multiple monitor. Use the secondary monitor for rendering g_cgDisplayID = l[count-1]; #else g_cgDisplayID = CGMainDisplayID (); #endif g_cgPrevDisplayMode = CGDisplayCurrentMode (g_cgDisplayID); g_cgDisplayModeList = CGDisplayAvailableModes (g_cgDisplayID); CGLQueryRendererInfo(CGDisplayIDToOpenGLDisplayMask(g_cgDisplayID), &renderer, &numRenderer); CGLDestroyRendererInfo(renderer); return 0; }
static int checkAppleVideoCard(void) { CGLRendererInfoObj rend; long theErr; unsigned long display_mask; long nrend; int j; long value; long maxvram = 0; /* we get always more than 1 renderer, check one, at least, has 8 Mo */ display_mask = CGDisplayIDToOpenGLDisplayMask (CGMainDisplayID() ); theErr = CGLQueryRendererInfo( display_mask, &rend, &nrend); if (theErr == 0) { theErr = CGLDescribeRenderer (rend, 0, kCGLRPRendererCount, &nrend); if (theErr == 0) { for (j = 0; j < nrend; j++) { theErr = CGLDescribeRenderer (rend, j, kCGLRPVideoMemory, &value); if (value > maxvram) maxvram = value; if ((theErr == 0) && (value >= 20000000)) { theErr = CGLDescribeRenderer (rend, j, kCGLRPAccelerated, &value); if ((theErr == 0) && (value != 0)) { theErr = CGLDescribeRenderer (rend, j, kCGLRPCompliant, &value); if ((theErr == 0) && (value != 0)) { /*fprintf(stderr,"make it big\n");*/ CGLDestroyRendererInfo (rend); macPrefState = 8; return 1; } } } } } } if (maxvram < 7500000 ) { /* put a standard alert and quit*/ SInt16 junkHit; char inError[] = "* Not enough VRAM "; char inText[] = "* blender needs at least 8Mb "; inError[0] = 16; inText[0] = 28; fprintf(stderr, " vram is %li . not enough, aborting\n", maxvram); StandardAlert ( kAlertStopAlert, (ConstStr255Param) &inError, (ConstStr255Param)&inText,NULL,&junkHit); abort(); } CGLDestroyRendererInfo (rend); return 0; }
unsigned char HaveOpenGLCapsChanged (GLCaps aDisplayCaps[], CGDisplayCount dspyCnt) { CGDisplayCount maxDisplays = 32; CGDirectDisplayID activeDspys[32]; CGDisplayErr theError; short i; CGDisplayCount newDspyCnt = 0; if (NULL == aDisplayCaps) return 1; theError = CGGetActiveDisplayList(maxDisplays, activeDspys, &newDspyCnt); // if theError getting list mark as changed if (theError) return 1; // if number of displays not equal if (dspyCnt != newDspyCnt) return 1; for (i = 0; i < dspyCnt; i++) { // get device ids if (aDisplayCaps[i].cgDisplayID != activeDspys[i]) return 1; if (aDisplayCaps[i].cglDisplayMask != CGDisplayIDToOpenGLDisplayMask(activeDspys[i])) return 1; // get current geometry { CGRect displayRect = CGDisplayBounds (activeDspys[i]); // get mode dictionary CFDictionaryRef dispMode = CGDisplayCurrentMode (activeDspys[i]); // check for all geometry matches if (aDisplayCaps[i].deviceWidth != (long) displayRect.size.width) return 1; if (aDisplayCaps[i].deviceHeight != (long) displayRect.size.height) return 1; if (aDisplayCaps[i].deviceOriginX != (long) displayRect.origin.x) return 1; if (aDisplayCaps[i].deviceOriginY != (long) displayRect.origin.y) return 1; if (aDisplayCaps[i].deviceDepth != (short) _getDictLong (dispMode, kCGDisplayBitsPerPixel)) return 1; if (aDisplayCaps[i].deviceRefresh != (short)(_getDictDouble (dispMode, kCGDisplayRefreshRate) + 0.5)) return 1; // round to GLint } // get renderer info based on gDevice { CGLRendererInfoObj info; long j; GLint numRenderers = 0, rv = 0; CGLError theErr = 0; GLint deviceVRAM; // video memory in bytes unsigned long rendererID; // renderer ID theErr = CGLQueryRendererInfo (aDisplayCaps[i].cglDisplayMask, &info, &numRenderers); if(0 == theErr) { CGLDescribeRenderer (info, 0, kCGLRPRendererCount, &numRenderers); for (j = 0; j < numRenderers; j++) { // find accelerated renderer (assume only one) CGLDescribeRenderer (info, j, kCGLRPAccelerated, &rv); if (true == rv) { // if accelerated // what is the renderer ID CGLDescribeRenderer (info, j, kCGLRPRendererID, (GLint *)&rendererID); if (rendererID != aDisplayCaps[i].rendererID) // check match return 1; // what is the VRAM CGLDescribeRenderer (info, j, kCGLRPVideoMemory, &deviceVRAM); if (deviceVRAM != aDisplayCaps[i].deviceVRAM) // check match return 1; break; // done } } } CGLDestroyRendererInfo (info); } } return 0; }
void CheckOpenGLCaps (CGDisplayCount maxDspys, GLCaps dCaps[], CGDisplayCount * dCnt) { CGLContextObj curr_ctx = 0; CGDirectDisplayID dspys[32]; CGDisplayErr theErr; short i; short size = sizeof (GLCaps); // no devices *dCnt = 0; if (maxDspys == 0) { // find number of displays *dCnt = 0; theErr = CGGetActiveDisplayList (32, dspys, dCnt); if (theErr) // theErr getting list *dCnt = 0; // 0 displays since can't correctly find any // zero list to ensure the routines are used correctly memset (dspys, 0, sizeof (CGDirectDisplayID) * *dCnt); return; // return dCnt } if (NULL == dCaps) return; theErr = CGGetActiveDisplayList(maxDspys, dspys, dCnt); if (theErr) return; // theErr getting list if (0 == *dCnt) return; // no displays memset (dCaps, 0, size * *dCnt); // zero memory for (i = 0; i < *dCnt; i++) { // get device ids dCaps[i].cgDisplayID = dspys[i]; dCaps[i].cglDisplayMask = CGDisplayIDToOpenGLDisplayMask(dspys[i]); { // get current geometry CGRect displayRect = CGDisplayBounds (dspys[i]); // get mode dictionary CFDictionaryRef dispMode = CGDisplayCurrentMode (dspys[i]); dCaps[i].deviceWidth = (long) displayRect.size.width; dCaps[i].deviceHeight = (long) displayRect.size.height; dCaps[i].deviceOriginX = (long) displayRect.origin.x; dCaps[i].deviceOriginY = (long) displayRect.origin.y; dCaps[i].deviceDepth = (short) _getDictLong (dispMode, kCGDisplayBitsPerPixel); dCaps[i].deviceRefresh = (short) (_getDictDouble (dispMode, kCGDisplayRefreshRate) + 0.5); } { // get renderer info based on gDevice CGLRendererInfoObj info; long j; GLint numRenderers = 0; GLint rv = 0; CGLError theErr2 = 0; theErr2 = CGLQueryRendererInfo (dCaps[i].cglDisplayMask, &info, &numRenderers); if(0 == theErr2) { CGLDescribeRenderer (info, 0, kCGLRPRendererCount, &numRenderers); for (j = 0; j < numRenderers; j++) { // find accelerated renderer (assume only one) CGLDescribeRenderer (info, j, kCGLRPAccelerated, &rv); if (true == rv) { // if accelerated // what is the renderer ID CGLDescribeRenderer (info, j, kCGLRPRendererID, &dCaps[i].rendererID); // can we do full screen? CGLDescribeRenderer (info, j, kCGLRPFullScreen, &rv); dCaps[i].fullScreenCapable = (bool) rv; // what is the VRAM? CGLDescribeRenderer (info, j, kCGLRPVideoMemory, &dCaps[i].deviceVRAM); // what is the current texture memory? CGLDescribeRenderer (info, j, kCGLRPTextureMemory, &dCaps[i].deviceTextureRAM); break; // done } } } CGLDestroyRendererInfo (info); } { // build context and context specific info CGLPixelFormatAttribute attribs[] = { kCGLPFADisplayMask, dCaps[i].cglDisplayMask, (CGLPixelFormatAttribute)0 }; CGLPixelFormatObj pixelFormat = NULL; GLint numPixelFormats = 0; CGLContextObj cglContext; curr_ctx = CGLGetCurrentContext (); // get current CGL context CGLChoosePixelFormat (attribs, &pixelFormat, &numPixelFormats); if (pixelFormat) { CGLCreateContext(pixelFormat, NULL, &cglContext); CGLDestroyPixelFormat (pixelFormat); CGLSetCurrentContext (cglContext); if (cglContext) { const GLubyte * strExt; const GLubyte * strRend; const GLubyte * strVers; const GLubyte * strVend; // get renderer strings strRend = glGetString (GL_RENDERER); strncpy (dCaps[i].strRendererName, (char *) strRend, 255); strVend = glGetString (GL_VENDOR); strncpy (dCaps[i].strRendererVendor, (char *) strVend, 255); strVers = glGetString (GL_VERSION); strncpy (dCaps[i].strRendererVersion, (char *) strVers, 255); { // get BCD version short j = 0; short shiftVal = 8; while (((strVers[j] <= '9') && (strVers[j] >= '0')) || (strVers[j] == '.')) { // get only basic version info (until first non-digit or non-.) if ((strVers[j] <= '9') && (strVers[j] >= '0')) { dCaps[i].glVersion += (strVers[j] - '0') << shiftVal; shiftVal -= 4; } j++; } } strExt = glGetString (GL_EXTENSIONS); // get caps glGetIntegerv (GL_MAX_TEXTURE_UNITS, &dCaps[i].textureUnits); glGetIntegerv (GL_MAX_TEXTURE_SIZE, &dCaps[i].maxTextureSize); glGetIntegerv (GL_MAX_3D_TEXTURE_SIZE, &dCaps[i].max3DTextureSize); glGetIntegerv (GL_MAX_CUBE_MAP_TEXTURE_SIZE, &dCaps[i].maxCubeMapTextureSize); // get functionality info dCaps[i].fSpecularVector = gluCheckExtension ((const GLubyte *) "GL_APPLE_specular_vector", strExt); dCaps[i].fTransformHint = gluCheckExtension ((const GLubyte *) "GL_APPLE_transform_hint", strExt); dCaps[i].fPackedPixels = gluCheckExtension ((const GLubyte *) "GL_APPLE_packed_pixels", strExt) || gluCheckExtension ((const GLubyte *) "GL_APPLE_packed_pixel", strExt) || (dCaps[i].glVersion >= 0x0120); dCaps[i].fClientStorage = gluCheckExtension ((const GLubyte *) "GL_APPLE_client_storage", strExt); dCaps[i].fYCbCr = gluCheckExtension ((const GLubyte *) "GL_APPLE_ycbcr_422", strExt); dCaps[i].fTextureRange = gluCheckExtension ((const GLubyte *) "GL_APPLE_texture_range", strExt); dCaps[i].fFence = gluCheckExtension ((const GLubyte *) "GL_APPLE_fence", strExt); dCaps[i].fVAR = gluCheckExtension ((const GLubyte *) "GL_APPLE_vertex_array_range", strExt); dCaps[i].fVAO = gluCheckExtension ((const GLubyte *) "GL_APPLE_vertex_array_object", strExt); dCaps[i].fElementArray = gluCheckExtension ((const GLubyte *) "GL_APPLE_element_array", strExt); dCaps[i].fVPEvals = gluCheckExtension ((const GLubyte *) "GL_APPLE_vertex_program_evaluators",strExt); dCaps[i].fFloatPixels = gluCheckExtension ((const GLubyte *) "GL_APPLE_float_pixels", strExt); dCaps[i].fFlushRenderer = gluCheckExtension ((const GLubyte *) "GL_APPLE_flush_render", strExt); dCaps[i].fPixelBuffer = gluCheckExtension ((const GLubyte *) "GL_APPLE_pixel_buffer", strExt); dCaps[i].fImaging = gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fTransposeMatrix = gluCheckExtension ((const GLubyte *) "GL_ARB_transpose_matrix", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fMultitexture = gluCheckExtension ((const GLubyte *) "GL_ARB_multitexture", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fTexEnvAdd = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_env_add", strExt) || gluCheckExtension ((const GLubyte *) "GL_EXT_texture_env_add", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fTexEnvCombine = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_env_combine", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fTexEnvDot3 = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_env_dot3", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fTexEnvCrossbar = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_env_crossbar", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fTexCubeMap = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_cube_map", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fTexCompress = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_compression", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fMultisample = gluCheckExtension ((const GLubyte *) "GL_ARB_multisample", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fTexBorderClamp = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_border_clamp", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fPointParam = gluCheckExtension ((const GLubyte *) "GL_ARB_point_parameters", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fVertexProg = gluCheckExtension ((const GLubyte *) "GL_ARB_vertex_program", strExt); dCaps[i].fFragmentProg = gluCheckExtension ((const GLubyte *) "GL_ARB_fragment_program", strExt); dCaps[i].fTexMirrorRepeat = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_mirrored_repeat", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fDepthTex = gluCheckExtension ((const GLubyte *) "GL_ARB_depth_texture", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fShadow = gluCheckExtension ((const GLubyte *) "GL_ARB_shadow", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fShadowAmbient = gluCheckExtension ((const GLubyte *) "GL_ARB_shadow_ambient", strExt); dCaps[i].fVertexBlend = gluCheckExtension ((const GLubyte *) "GL_ARB_vertex_blend", strExt); dCaps[i].fWindowPos = gluCheckExtension ((const GLubyte *) "GL_ARB_window_pos", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fTex3D = gluCheckExtension ((const GLubyte *) "GL_EXT_texture3D", strExt) || (dCaps[i].glVersion >= 0x0120); dCaps[i].fClipVolHint = gluCheckExtension ((const GLubyte *) "GL_EXT_clip_volume_hint", strExt); dCaps[i].fRescaleNorm = gluCheckExtension ((const GLubyte *) "GL_EXT_rescale_normal", strExt) || (dCaps[i].glVersion >= 0x0120); dCaps[i].fBlendColor = gluCheckExtension ((const GLubyte *) "GL_EXT_blend_color", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fBlendMinMax = gluCheckExtension ((const GLubyte *) "GL_EXT_blend_minmax", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fBlendSub = gluCheckExtension ((const GLubyte *) "GL_EXT_blend_subtract", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fCVA = gluCheckExtension ((const GLubyte *) "GL_EXT_compiled_vertex_array", strExt); dCaps[i].fTexLODBias = gluCheckExtension ((const GLubyte *) "GL_EXT_texture_lod_bias", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fABGR = gluCheckExtension ((const GLubyte *) "GL_EXT_abgr", strExt); dCaps[i].fBGRA = gluCheckExtension ((const GLubyte *) "GL_EXT_bgra", strExt) || (dCaps[i].glVersion >= 0x0120); dCaps[i].fTexFilterAniso = gluCheckExtension ((const GLubyte *) "GL_EXT_texture_filter_anisotropic",strExt); dCaps[i].fPaletteTex = gluCheckExtension ((const GLubyte *) "GL_EXT_paletted_texture", strExt); dCaps[i].fShareTexPalette = gluCheckExtension ((const GLubyte *) "GL_EXT_shared_texture_palette", strExt); dCaps[i].fSecColor = gluCheckExtension ((const GLubyte *) "GL_EXT_secondary_color", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fTexCompressS3TC = gluCheckExtension ((const GLubyte *) "GL_EXT_texture_compression_s3tc", strExt); dCaps[i].fTexRect = gluCheckExtension ((const GLubyte *) "GL_EXT_texture_rectangle", strExt); dCaps[i].fFogCoord = gluCheckExtension ((const GLubyte *) "GL_EXT_fog_coord", strExt); dCaps[i].fDrawRangeElements = gluCheckExtension ((const GLubyte *) "GL_EXT_draw_range_elements", strExt); dCaps[i].fStencilWrap = gluCheckExtension ((const GLubyte *) "GL_EXT_stencil_wrap", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fBlendFuncSep = gluCheckExtension ((const GLubyte *) "GL_EXT_blend_func_separate", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fMultiDrawArrays = gluCheckExtension ((const GLubyte *) "GL_EXT_multi_draw_arrays", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fShadowFunc = gluCheckExtension ((const GLubyte *) "GL_EXT_shadow_funcs", strExt); dCaps[i].fStencil2Side = gluCheckExtension ((const GLubyte *) "GL_EXT_stencil_two_side", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fColorSubtable = gluCheckExtension ((const GLubyte *) "GL_EXT_color_subtable", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fConvolution = gluCheckExtension ((const GLubyte *) "GL_EXT_convolution", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fHistogram = gluCheckExtension ((const GLubyte *) "GL_EXT_histogram", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fColorTable = gluCheckExtension ((const GLubyte *) "GL_SGI_color_table", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fColorMatrix = gluCheckExtension ((const GLubyte *) "GL_SGI_color_matrix", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fTexEdgeClamp = gluCheckExtension ((const GLubyte *) "GL_SGIS_texture_edge_clamp", strExt) || (dCaps[i].glVersion >= 0x0120); dCaps[i].fGenMipmap = gluCheckExtension ((const GLubyte *) "GL_SGIS_generate_mipmap", strExt); dCaps[i].fTexLOD = gluCheckExtension ((const GLubyte *) "GL_SGIS_texture_lod", strExt) || (dCaps[i].glVersion >= 0x0120); dCaps[i].fPointCull = gluCheckExtension ((const GLubyte *) "GL_ATI_point_cull_mode", strExt); dCaps[i].fTexMirrorOnce = gluCheckExtension ((const GLubyte *) "GL_ATI_texture_mirror_once", strExt); dCaps[i].fPNtriangles = gluCheckExtension ((const GLubyte *) "GL_ATI_pn_triangles", strExt) || gluCheckExtension ((const GLubyte *) "GL_ATIX_pn_triangles", strExt); dCaps[i].fTextFragShader = gluCheckExtension ((const GLubyte *) "GL_ATI_text_fragment_shader", strExt); dCaps[i].fATIBlendEqSep = gluCheckExtension ((const GLubyte *) "GL_ATI_blend_equation_separate", strExt); dCaps[i].fBlendWeightMinMax = gluCheckExtension ((const GLubyte *) "GL_ATI_blend_weighted_minmax", strExt); dCaps[i].fCombine3 = gluCheckExtension ((const GLubyte *) "GL_ATI_texture_env_combine3", strExt); dCaps[i].fSepStencil = gluCheckExtension ((const GLubyte *) "GL_ATI_separate_stencil", strExt); dCaps[i].fArrayRevComps4Byte = gluCheckExtension ((const GLubyte *) "GL_ATI_array_rev_comps_in_4_bytes",strExt); dCaps[i].fNVPointSprite = gluCheckExtension ((const GLubyte *) "GL_NV_point_sprite", strExt); dCaps[i].fRegCombiners = gluCheckExtension ((const GLubyte *) "GL_NV_register_combiners", strExt); dCaps[i].fRegCombiners2 = gluCheckExtension ((const GLubyte *) "GL_NV_register_combiners2", strExt); dCaps[i].fTexEnvCombine4 = gluCheckExtension ((const GLubyte *) "GL_NV_texture_env_combine4", strExt); dCaps[i].fBlendSquare = gluCheckExtension ((const GLubyte *) "GL_NV_blend_square", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fFogDist = gluCheckExtension ((const GLubyte *) "GL_NV_fog_distance", strExt); dCaps[i].fMultisampleFilterHint = gluCheckExtension ((const GLubyte *) "GL_NV_multisample_filter_hint", strExt); dCaps[i].fTexGenReflect = gluCheckExtension ((const GLubyte *) "GL_NV_texgen_reflection", strExt); dCaps[i].fTexShader = gluCheckExtension ((const GLubyte *) "GL_NV_texture_shader", strExt); dCaps[i].fTexShader2 = gluCheckExtension ((const GLubyte *) "GL_NV_texture_shader2", strExt); dCaps[i].fTexShader3 = gluCheckExtension ((const GLubyte *) "GL_NV_texture_shader3", strExt); dCaps[i].fDepthClamp = gluCheckExtension ((const GLubyte *) "GL_NV_depth_clamp", strExt); dCaps[i].fLightMaxExp = gluCheckExtension ((const GLubyte *) "GL_NV_light_max_exponent", strExt); dCaps[i].fRasterPosClip = gluCheckExtension ((const GLubyte *) "GL_IBM_rasterpos_clip", strExt); dCaps[i].fConvBorderModes = gluCheckExtension ((const GLubyte *) "GL_HP_convolution_border_modes", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fAuxDeptStencil = gluCheckExtension ((const GLubyte *) "GL_APPLE_aux_depth_stencil", strExt); dCaps[i].fFlushBufferRange = gluCheckExtension ((const GLubyte *) "GL_APPLE_flush_buffer_range", strExt); dCaps[i].fObjectPurgeable = gluCheckExtension ((const GLubyte *) "GL_APPLE_object_purgeable", strExt); dCaps[i].fDrawBuffers = gluCheckExtension ((const GLubyte *) "GL_ARB_draw_buffers", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fFragmentProgShadow = gluCheckExtension ((const GLubyte *) "GL_ARB_fragment_program_shadow", strExt); dCaps[i].fFragmentShader = gluCheckExtension ((const GLubyte *) "GL_ARB_fragment_shader", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fHalfFloatPixel = gluCheckExtension ((const GLubyte *) "GL_ARB_half_float_pixel", strExt); dCaps[i].fOcclusionQuery = gluCheckExtension ((const GLubyte *) "GL_ARB_occlusion_query", strExt) || (dCaps[i].glVersion >= 0x0150); dCaps[i].fPBO = gluCheckExtension ((const GLubyte *) "GL_ARB_pixel_buffer_object", strExt) || (dCaps[i].glVersion >= 0x0210); dCaps[i].fPointSprite = gluCheckExtension ((const GLubyte *) "GL_ARB_point_sprite", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fShaderObjects = gluCheckExtension ((const GLubyte *) "GL_ARB_shader_objects", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fShaderTextureLOD = gluCheckExtension ((const GLubyte *) "GL_ARB_shader_texture_lod", strExt); dCaps[i].fShadingLanguage100 = gluCheckExtension ((const GLubyte *) "GL_ARB_shading_language_100", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fTexFloat = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_float", strExt); dCaps[i].fTexNPOT = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_non_power_of_two", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fVBO = gluCheckExtension ((const GLubyte *) "GL_ARB_vertex_buffer_object", strExt) || (dCaps[i].glVersion >= 0x0150); dCaps[i].fVertexShader = gluCheckExtension ((const GLubyte *) "GL_ARB_vertex_shader", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fTexComp3dc = gluCheckExtension ((const GLubyte *) "GL_ATI_texture_compression_3dc", strExt); dCaps[i].fTexATIfloat = gluCheckExtension ((const GLubyte *) "GL_ATI_texture_float", strExt); dCaps[i].fBlendEqSep = gluCheckExtension ((const GLubyte *) "GL_EXT_blend_equation_separate", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fDepthBounds = gluCheckExtension ((const GLubyte *) "GL_EXT_depth_bounds_test", strExt); dCaps[i].fFBOblit = gluCheckExtension ((const GLubyte *) "GL_EXT_framebuffer_blit", strExt); dCaps[i].fFBO = gluCheckExtension ((const GLubyte *) "GL_EXT_framebuffer_object", strExt); dCaps[i].fGeometryShader4 = gluCheckExtension ((const GLubyte *) "GL_EXT_geometry_shader4", strExt); dCaps[i].fGPUProgParams = gluCheckExtension ((const GLubyte *) "GL_EXT_gpu_program_parameters", strExt); dCaps[i].fGPUShader4 = gluCheckExtension ((const GLubyte *) "GL_EXT_gpu_shader4", strExt); dCaps[i].fDepthStencil = gluCheckExtension ((const GLubyte *) "GL_EXT_packed_depth_stencil", strExt); dCaps[i].fSepSpecColor = gluCheckExtension ((const GLubyte *) "GL_EXT_separate_specular_color", strExt) || (dCaps[i].glVersion >= 0x0120); dCaps[i].fTexCompDXT1 = gluCheckExtension ((const GLubyte *) "GL_EXT_texture_compression_dxt1", strExt); dCaps[i].fTexMirrorClamp = gluCheckExtension ((const GLubyte *) "GL_EXT_texture_mirror_clamp", strExt); dCaps[i].fTexSRGB = gluCheckExtension ((const GLubyte *) "GL_EXT_texture_sRGB", strExt) || (dCaps[i].glVersion >= 0x0210); if (dCaps[i].fTexRect) // only check if extension supported glGetIntegerv (GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT, &dCaps[i].maxRectTextureSize); else dCaps[i].maxRectTextureSize = 0; CGLDestroyContext (cglContext); } } CGLSetCurrentContext (curr_ctx); // reset current CGL context } } }