/* * cocos2d for iPhone: http://www.cocos2d-iphone.org * * Copyright (c) 2010 Ricardo Quesada * Copyright (c) 2011 Zynga Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #import #ifdef __IPHONE_OS_VERSION_MAX_ALLOWED #import // Needed for UIDevice #endif #import "Platforms/CCGL.h" #import "CCBlockSupport.h" #import "CCConfiguration.h" #import "ccMacros.h" #import "ccConfig.h" #import "Support/OpenGL_Internal.h" @implementation CCConfiguration @synthesize maxTextureSize = maxTextureSize_; @synthesize supportsPVRTC = supportsPVRTC_; @synthesize maxModelviewStackDepth = maxModelviewStackDepth_; @synthesize supportsNPOT = supportsNPOT_; @synthesize supportsBGRA8888 = supportsBGRA8888_; @synthesize supportsDiscardFramebuffer = supportsDiscardFramebuffer_; @synthesize OSVersion = OSVersion_; // // singleton stuff // static CCConfiguration *_sharedConfiguration = nil; static char * glExtensions; + (CCConfiguration *)sharedConfiguration { if (!_sharedConfiguration) _sharedConfiguration = [[self alloc] init]; return _sharedConfiguration; } +(id)alloc { NSAssert(_sharedConfiguration == nil, @"Attempted to allocate a second instance of a singleton."); return [super alloc]; } #ifdef __IPHONE_OS_VERSION_MAX_ALLOWED #elif defined(__MAC_OS_X_VERSION_MAX_ALLOWED) - (NSString*)getMacVersion { SInt32 versionMajor, versionMinor, versionBugFix; Gestalt(gestaltSystemVersionMajor, &versionMajor); Gestalt(gestaltSystemVersionMinor, &versionMinor); Gestalt(gestaltSystemVersionBugFix, &versionBugFix); return [NSString stringWithFormat:@"%d.%d.%d", versionMajor, versionMinor, versionBugFix]; } #endif // __MAC_OS_X_VERSION_MAX_ALLOWED -(id) init { if( (self=[super init])) { // Obtain iOS version OSVersion_ = 0; #ifdef __IPHONE_OS_VERSION_MAX_ALLOWED NSString *OSVer = [[UIDevice currentDevice] systemVersion]; #elif defined(__MAC_OS_X_VERSION_MAX_ALLOWED) NSString *OSVer = [self getMacVersion]; #endif NSArray *arr = [OSVer componentsSeparatedByString:@"."]; int idx=0x01000000; for( NSString *str in arr ) { int value = [str intValue]; OSVersion_ += value * idx; idx = idx >> 8; } CCLOG(@"cocos2d: OS version: %@ (0x%08x)", OSVer, OSVersion_); CCLOG(@"cocos2d: GL_VENDOR: %s", glGetString(GL_VENDOR) ); CCLOG(@"cocos2d: GL_RENDERER: %s", glGetString ( GL_RENDERER ) ); CCLOG(@"cocos2d: GL_VERSION: %s", glGetString ( GL_VERSION ) ); glExtensions = (char*) glGetString(GL_EXTENSIONS); glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize_); glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH, &maxModelviewStackDepth_); #ifdef __IPHONE_OS_VERSION_MAX_ALLOWED if( OSVersion_ >= kCCiOSVersion_4_0 ) glGetIntegerv(GL_MAX_SAMPLES_APPLE, &maxSamplesAllowed_); else maxSamplesAllowed_ = 0; #elif defined(__MAC_OS_X_VERSION_MAX_ALLOWED) glGetIntegerv(GL_MAX_SAMPLES, &maxSamplesAllowed_); #endif supportsPVRTC_ = [self checkForGLExtension:@"GL_IMG_texture_compression_pvrtc"]; #ifdef __IPHONE_OS_VERSION_MAX_ALLOWED supportsNPOT_ = [self checkForGLExtension:@"GL_APPLE_texture_2D_limited_npot"]; #elif defined(__MAC_OS_X_VERSION_MAX_ALLOWED) supportsNPOT_ = [self checkForGLExtension:@"GL_ARB_texture_non_power_of_two"]; #endif // It seems that somewhere between firmware iOS 3.0 and 4.2 Apple renamed // GL_IMG_... to GL_APPLE.... So we should check both names #ifdef __IPHONE_OS_VERSION_MAX_ALLOWED BOOL bgra8a = [self checkForGLExtension:@"GL_IMG_texture_format_BGRA8888"]; BOOL bgra8b = [self checkForGLExtension:@"GL_APPLE_texture_format_BGRA8888"]; supportsBGRA8888_ = bgra8a | bgra8b; #elif defined(__MAC_OS_X_VERSION_MAX_ALLOWED) supportsBGRA8888_ = [self checkForGLExtension:@"GL_EXT_bgra"]; #endif supportsDiscardFramebuffer_ = [self checkForGLExtension:@"GL_EXT_discard_framebuffer"]; CCLOG(@"cocos2d: GL_MAX_TEXTURE_SIZE: %d", maxTextureSize_); CCLOG(@"cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH: %d",maxModelviewStackDepth_); CCLOG(@"cocos2d: GL_MAX_SAMPLES: %d", maxSamplesAllowed_); CCLOG(@"cocos2d: GL supports PVRTC: %s", (supportsPVRTC_ ? "YES" : "NO") ); CCLOG(@"cocos2d: GL supports BGRA8888 textures: %s", (supportsBGRA8888_ ? "YES" : "NO") ); CCLOG(@"cocos2d: GL supports NPOT textures: %s", (supportsNPOT_ ? "YES" : "NO") ); CCLOG(@"cocos2d: GL supports discard_framebuffer: %s", (supportsDiscardFramebuffer_ ? "YES" : "NO") ); CCLOG(@"cocos2d: compiled with NPOT support: %s", #if CC_TEXTURE_NPOT_SUPPORT "YES" #else "NO" #endif ); CCLOG(@"cocos2d: compiled with VBO support in TextureAtlas : %s", #if CC_USES_VBO "YES" #else "NO" #endif ); CCLOG(@"cocos2d: compiled with Affine Matrix transformation in CCNode : %s", #if CC_NODE_TRANSFORM_USING_AFFINE_MATRIX "YES" #else "NO" #endif ); CCLOG(@"cocos2d: compiled with Profiling Support: %s", #if CC_ENABLE_PROFILERS "YES - *** Disable it when you finish profiling ***" #else "NO" #endif ); CHECK_GL_ERROR(); } return self; } - (BOOL) checkForGLExtension:(NSString *)searchName { // For best results, extensionsNames should be stored in your renderer so that it does not // need to be recreated on each invocation. NSString *extensionsString = [NSString stringWithCString:glExtensions encoding: NSASCIIStringEncoding]; NSArray *extensionsNames = [extensionsString componentsSeparatedByString:@" "]; return [extensionsNames containsObject: searchName]; } @end