@@ -263,6 +263,7 @@ -(void)flush
263263
264264@implementation CCRenderState {
265265 CCTexture *_mainTexture;
266+ BOOL _immutable;
266267
267268 @public
268269 CCBlendMode *_blendMode;
@@ -280,11 +281,19 @@ +(void)initialize
280281}
281282
282283-(instancetype )initWithBlendMode : (CCBlendMode *)blendMode shader : (CCShader *)shader shaderUniforms : (NSDictionary *)shaderUniforms
284+ {
285+ return [self initWithBlendMode: blendMode shader: shader shaderUniforms: shaderUniforms copyUniforms: NO ];
286+ }
287+
288+ -(instancetype )initWithBlendMode : (CCBlendMode *)blendMode shader : (CCShader *)shader shaderUniforms : (NSDictionary *)shaderUniforms copyUniforms : (BOOL )copyUniforms
283289{
284290 if ((self = [super init ])){
285291 _blendMode = blendMode;
286292 _shader = shader;
287- _shaderUniforms = shaderUniforms;
293+ _shaderUniforms = (copyUniforms ? [shaderUniforms copy ] : shaderUniforms);
294+
295+ // The renderstate as a whole is immutable if the uniforms are copied.
296+ _immutable = copyUniforms;
288297 }
289298
290299 return self;
@@ -297,25 +306,24 @@ +(instancetype)renderStateWithBlendMode:(CCBlendMode *)blendMode shader:(CCShade
297306 mainTexture = [CCTexture none ];
298307 }
299308
300- CCRenderState *renderState = [[self alloc ] initWithBlendMode: blendMode shader: shader shaderUniforms: @{CCShaderUniformMainTexture: mainTexture}];
309+ CCRenderState *renderState = [[self alloc ] initWithBlendMode: blendMode shader: shader shaderUniforms: @{CCShaderUniformMainTexture: mainTexture} copyUniforms: YES ];
301310 renderState->_mainTexture = mainTexture;
302311
303312 return [CCRENDERSTATE_CACHE objectForKey: renderState];
304313}
305314
306315-(id )copyWithZone : (NSZone *)zone
307316{
308- NSDictionary *shaderUniforms = [_shaderUniforms copy ];
309- if (shaderUniforms == _shaderUniforms){
317+ if (_immutable){
310318 return self;
311319 } else {
312- return [[CCRenderState allocWithZone: zone] initWithBlendMode: _blendMode shader: _shader shaderUniforms: shaderUniforms ];
320+ return [[CCRenderState allocWithZone: zone] initWithBlendMode: _blendMode shader: _shader shaderUniforms: _shaderUniforms copyUniforms: YES ];
313321 }
314322}
315323
316324-(NSUInteger )hash
317325{
318- NSAssert (_mainTexture, @" Attempting to cache a renderstate without a mainTexture value ." );
326+ NSAssert (_mainTexture, @" Attempting to cache a renderstate that was nort created with renderStateWithBlendMode ." );
319327
320328 // Not great, but acceptable. All values are unique by pointer.
321329 return ((NSUInteger )_blendMode ^ (NSUInteger )_shader ^ (NSUInteger )_mainTexture);
0 commit comments