Line data Source code
1 0 : /* 2 : 3 : OOGraphicsResetManager.m 4 : 5 : 6 : Copyright (C) 2007-2013 Jens Ayton and contributors 7 : 8 : Permission is hereby granted, free of charge, to any person obtaining a copy 9 : of this software and associated documentation files (the "Software"), to deal 10 : in the Software without restriction, including without limitation the rights 11 : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 : copies of the Software, and to permit persons to whom the Software is 13 : furnished to do so, subject to the following conditions: 14 : 15 : The above copyright notice and this permission notice shall be included in all 16 : copies or substantial portions of the Software. 17 : 18 : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 : IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 : FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 : AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 : LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 : OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 : SOFTWARE. 25 : 26 : */ 27 : 28 : #import "OOGraphicsResetManager.h" 29 : #import "OOTexture.h" 30 : #import "OOOpenGLExtensionManager.h" 31 : 32 : 33 0 : static OOGraphicsResetManager *sSingleton = nil; 34 : 35 : 36 : @implementation OOGraphicsResetManager 37 : 38 0 : - (void) dealloc 39 : { 40 : if (sSingleton == self) sSingleton = nil; 41 : [clients release]; 42 : 43 : [super dealloc]; 44 : } 45 : 46 : 47 : + (OOGraphicsResetManager *) sharedManager 48 : { 49 : if (sSingleton == nil) sSingleton = [[self alloc] init]; 50 : return sSingleton; 51 : } 52 : 53 : 54 : - (void) registerClient:(id<OOGraphicsResetClient>)client 55 : { 56 : if (client != nil) 57 : { 58 : if (clients == nil) clients = [[NSMutableSet alloc] init]; 59 : [clients addObject:[NSValue valueWithPointer:client]]; 60 : } 61 : } 62 : 63 : 64 : - (void) unregisterClient:(id<OOGraphicsResetClient>)client 65 : { 66 : [clients removeObject:[NSValue valueWithPointer:client]]; 67 : } 68 : 69 : 70 : - (void) resetGraphicsState 71 : { 72 : NSEnumerator *clientEnum = nil; 73 : id client = nil; 74 : 75 : OOGL(glFinish()); 76 : 77 : OOLog(@"rendering.reset.start", @"%@", @"Resetting graphics state."); 78 : OOLogIndentIf(@"rendering.reset.start"); 79 : 80 : [[OOOpenGLExtensionManager sharedManager] reset]; 81 : [OOTexture rebindAllTextures]; 82 : 83 : for (clientEnum = [clients objectEnumerator]; (client = [[clientEnum nextObject] pointerValue]); ) 84 : { 85 : @try 86 : { 87 : [client resetGraphicsState]; 88 : } 89 : @catch (NSException *exception) 90 : { 91 : OOLog(kOOLogException, @"***** EXCEPTION -- %@ : %@ -- ignored during graphics reset.", [exception name], [exception reason]); 92 : } 93 : } 94 : 95 : OOLogOutdentIf(@"rendering.reset.start"); 96 : OOLog(@"rendering.reset.end", @"%@", @"End of graphics state reset."); 97 : } 98 : 99 : @end 100 : 101 : 102 : @implementation OOGraphicsResetManager (Singleton) 103 : 104 : /* Canonical singleton boilerplate. 105 : See Cocoa Fundamentals Guide: Creating a Singleton Instance. 106 : See also +sharedManager above. 107 : 108 : // NOTE: assumes single-threaded first access. 109 : */ 110 : 111 0 : + (id) allocWithZone:(NSZone *)inZone 112 : { 113 : if (sSingleton == nil) 114 : { 115 : sSingleton = [super allocWithZone:inZone]; 116 : return sSingleton; 117 : } 118 : return nil; 119 : } 120 : 121 : 122 0 : - (id) copyWithZone:(NSZone *)inZone 123 : { 124 : return self; 125 : } 126 : 127 : 128 0 : - (id) retain 129 : { 130 : return self; 131 : } 132 : 133 : 134 0 : - (NSUInteger) retainCount 135 : { 136 : return UINT_MAX; 137 : } 138 : 139 : 140 0 : - (void) release 141 : {} 142 : 143 : 144 0 : - (id) autorelease 145 : { 146 : return self; 147 : } 148 : 149 : @end