Skip to content

Commit 5280b6b

Browse files
committed
Making render states abstract.
1 parent 837404b commit 5280b6b

File tree

7 files changed

+131
-71
lines changed

7 files changed

+131
-71
lines changed

cocos2d/CCConfiguration.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
extern Class CCGraphicsBufferClass;
3232
extern Class CCGraphicsBufferBindingsClass;
33+
extern Class CCRenderStateClass;
3334
extern Class CCRenderCommandDrawClass;
3435

3536
extern NSString* const CCSetupPixelFormat;

cocos2d/CCConfiguration.m

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141

4242
Class CCGraphicsBufferClass;
4343
Class CCGraphicsBufferBindingsClass;
44+
Class CCRenderStateClass;
4445
Class CCRenderCommandDrawClass;
4546

4647
NSString* const CCSetupPixelFormat = @"CCSetupPixelFormat";
@@ -141,12 +142,14 @@ -(CCGraphicsAPI)graphicsAPI
141142
if(__CC_METAL_SUPPORTED_AND_ENABLED && NSProtocolFromString(@"MTLDevice") && !getenv("CC_FORCE_GL")){
142143
CCGraphicsBufferClass = NSClassFromString(@"CCGraphicsBufferMetal");
143144
CCGraphicsBufferBindingsClass = NSClassFromString(@"CCGraphicsBufferBindingsMetal");
145+
CCRenderStateClass = NSClassFromString(@"CCRenderStateMetal");
144146
CCRenderCommandDrawClass = NSClassFromString(@"CCRenderCommandDrawMetal");
145147

146148
_graphicsAPI = CCGraphicsAPIMetal;
147149
} else {
148150
CCGraphicsBufferClass = NSClassFromString(@"CCGraphicsBufferGLBasic");
149151
CCGraphicsBufferBindingsClass = NSClassFromString(@"CCGraphicsBufferBindingsGL");
152+
CCRenderStateClass = NSClassFromString(@"CCRenderStateGL");
150153
CCRenderCommandDrawClass = NSClassFromString(@"CCRenderCommandDrawGL");
151154

152155
_graphicsAPI = CCGraphicsAPIGL;

cocos2d/CCEffect.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ -(void)end
256256

257257
-(void)enqueueTriangles
258258
{
259-
CCRenderState *renderState = [[CCRenderState alloc] initWithBlendMode:_blendMode shader:_shader shaderUniforms:_shaderUniforms copyUniforms:YES];
259+
CCRenderState *renderState = [CCRenderState renderStateWithBlendMode:_blendMode shader:_shader shaderUniforms:_shaderUniforms copyUniforms:YES];
260260

261261
CCRenderBuffer buffer = [_renderer enqueueTriangles:2 andVertexes:4 withState:renderState globalSortOrder:0];
262262
CCRenderBufferSetVertex(buffer, 0, CCVertexApplyTransform(_verts.bl, &_transform));

cocos2d/CCNoARC.m

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -168,24 +168,22 @@ -(CCRenderBuffer)enqueueLines:(NSUInteger)lineCount andVertexes:(NSUInteger)vert
168168

169169
@end
170170

171+
@interface CCRenderStateGL : CCRenderState @end
172+
@implementation CCRenderStateGL
171173

172-
@implementation CCRenderer(NoARCPrivate)
173-
174-
-(void)setRenderState:(CCRenderState *)renderState
174+
-(void)transitionRenderer:(CCRenderer *)renderer FromState:(CCRenderState *)previous
175175
{
176-
if(renderState == _renderState) return;
177-
178-
CCGL_DEBUG_PUSH_GROUP_MARKER("CCRenderer: Render State");
176+
CCGL_DEBUG_PUSH_GROUP_MARKER("CCRenderStateGL: Transition");
179177

180178
// Set the blending state.
181-
NSDictionary *blendOptions = renderState->_blendMode->_options;
182-
if(blendOptions != _blendOptions){
179+
if(previous == nil || _blendMode != previous->_blendMode){
183180
CCGL_DEBUG_INSERT_EVENT_MARKER("Blending mode");
184181

182+
NSDictionary *blendOptions = _blendMode->_options;
185183
if(blendOptions == CCBLEND_DISABLED_OPTIONS){
186-
if(_blendOptions != CCBLEND_DISABLED_OPTIONS) glDisable(GL_BLEND);
184+
glDisable(GL_BLEND);
187185
} else {
188-
if(_blendOptions == nil || _blendOptions == CCBLEND_DISABLED_OPTIONS) glEnable(GL_BLEND);
186+
glEnable(GL_BLEND);
189187

190188
glBlendFuncSeparate(
191189
[blendOptions[CCBlendFuncSrcColor] unsignedIntValue],
@@ -199,40 +197,29 @@ -(void)setRenderState:(CCRenderState *)renderState
199197
[blendOptions[CCBlendEquationAlpha] unsignedIntValue]
200198
);
201199
}
202-
203-
_blendOptions = blendOptions;
204200
}
205201

206202
// Bind the shader.
207-
CCShader *shader = renderState->_shader;
208-
if(shader != _shader){
203+
if(previous == nil || _shader != previous->_shader){
209204
CCGL_DEBUG_INSERT_EVENT_MARKER("Shader");
210205

211-
glUseProgram(shader->_program);
212-
213-
_shader = shader;
214-
_shaderUniforms = nil;
206+
glUseProgram(_shader->_program);
215207
}
216208

217209
// Set the shader's uniform state.
218-
NSDictionary *shaderUniforms = renderState->_shaderUniforms;
219-
NSDictionary *globalShaderUniforms = _globalShaderUniforms;
220-
if(shaderUniforms != _shaderUniforms){
210+
if(previous == nil || _shaderUniforms != previous->_shaderUniforms){
221211
CCGL_DEBUG_INSERT_EVENT_MARKER("Uniforms");
222212

223-
NSDictionary *setters = shader->_uniformSetters;
213+
NSDictionary *globalShaderUniforms = renderer->_globalShaderUniforms;
214+
NSDictionary *setters = _shader->_uniformSetters;
224215
for(NSString *uniformName in setters){
225216
CCUniformSetter setter = setters[uniformName];
226-
setter(self, shaderUniforms, globalShaderUniforms);
217+
setter(renderer, _shaderUniforms, globalShaderUniforms);
227218
}
228-
_shaderUniforms = shaderUniforms;
229219
}
230220

231221
CCGL_DEBUG_POP_GROUP_MARKER();
232222
CC_CHECK_GL_ERROR_DEBUG();
233-
234-
_renderState = renderState;
235-
return;
236223
}
237224

238225
@end

cocos2d/CCRenderer.m

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -267,12 +267,13 @@ +(void)initialize
267267
if(self != [CCRenderState class]) return;
268268

269269
CCRENDERSTATE_CACHE = [[CCRenderStateCache alloc] init];
270-
CCRENDERSTATE_DEBUGCOLOR = [[self alloc] initWithBlendMode:CCBLEND_DISABLED shader:[CCShader positionColorShader] shaderUniforms:@{}];
270+
CCRENDERSTATE_DEBUGCOLOR = [[CCRenderStateClass alloc] initWithBlendMode:CCBLEND_DISABLED shader:[CCShader positionColorShader] shaderUniforms:@{}];
271271
}
272272

273273
-(instancetype)initWithBlendMode:(CCBlendMode *)blendMode shader:(CCShader *)shader shaderUniforms:(NSDictionary *)shaderUniforms
274274
{
275-
return [self initWithBlendMode:blendMode shader:shader shaderUniforms:shaderUniforms copyUniforms:NO];
275+
// Allocate a new instance of the correct class instead of self. (This method was already deprecated).
276+
return [[CCRenderStateClass alloc] initWithBlendMode:blendMode shader:shader shaderUniforms:shaderUniforms copyUniforms:NO];
276277
}
277278

278279
-(instancetype)initWithBlendMode:(CCBlendMode *)blendMode shader:(CCShader *)shader shaderUniforms:(NSDictionary *)shaderUniforms copyUniforms:(BOOL)copyUniforms
@@ -296,30 +297,28 @@ +(instancetype)renderStateWithBlendMode:(CCBlendMode *)blendMode shader:(CCShade
296297
mainTexture = [CCTexture none];
297298
}
298299

299-
CCRenderState *renderState = [[self alloc] initWithBlendMode:blendMode shader:shader shaderUniforms:@{CCShaderUniformMainTexture: mainTexture} copyUniforms:YES];
300+
CCRenderState *renderState = [[CCRenderStateClass alloc] initWithBlendMode:blendMode shader:shader shaderUniforms:@{CCShaderUniformMainTexture: mainTexture} copyUniforms:YES];
300301
renderState->_mainTexture = mainTexture;
301302

302303
return [CCRENDERSTATE_CACHE objectForKey:renderState];
303304
}
304305

305306
+(instancetype)renderStateWithBlendMode:(CCBlendMode *)blendMode shader:(CCShader *)shader shaderUniforms:(NSDictionary *)shaderUniforms copyUniforms:(BOOL)copyUniforms
306307
{
307-
return [[self alloc] initWithBlendMode:blendMode shader:shader shaderUniforms:shaderUniforms copyUniforms:copyUniforms];
308+
return [[CCRenderStateClass alloc] initWithBlendMode:blendMode shader:shader shaderUniforms:shaderUniforms copyUniforms:copyUniforms];
308309
}
309310

310311
-(id)copyWithZone:(NSZone *)zone
311312
{
312313
if(_immutable){
313314
return self;
314315
} else {
315-
return [[CCRenderState allocWithZone:zone] initWithBlendMode:_blendMode shader:_shader shaderUniforms:_shaderUniforms copyUniforms:YES];
316+
return [[CCRenderStateClass allocWithZone:zone] initWithBlendMode:_blendMode shader:_shader shaderUniforms:_shaderUniforms copyUniforms:YES];
316317
}
317318
}
318319

319320
-(NSUInteger)hash
320321
{
321-
NSAssert(_mainTexture, @"Attempting to cache a renderstate that was nort created with renderStateWithBlendMode.");
322-
323322
// Not great, but acceptable. All values are unique by pointer.
324323
return ((NSUInteger)_blendMode ^ (NSUInteger)_shader ^ (NSUInteger)_mainTexture);
325324
}
@@ -341,6 +340,11 @@ +(instancetype)debugColor
341340
return CCRENDERSTATE_DEBUGCOLOR;
342341
}
343342

343+
-(void)transitionRenderer:(CCRenderer *)renderer FromState:(CCRenderer *)previous
344+
{
345+
NSAssert(NO, @"Must be overridden.");
346+
}
347+
344348
@end
345349

346350

@@ -521,9 +525,6 @@ -(void)invalidateState
521525
{
522526
_lastDrawCommand = nil;
523527
_renderState = nil;
524-
_blendOptions = nil;
525-
_shader = nil;
526-
_shaderUniforms = nil;
527528
_buffersBound = NO;
528529
}
529530

@@ -584,8 +585,15 @@ -(void)bindBuffers:(BOOL)bind
584585
}
585586
}
586587

588+
-(void)setRenderState:(CCRenderState *)renderState
589+
{
590+
if(renderState != _renderState){
591+
[renderState transitionRenderer:self FromState:_renderState];
592+
_renderState = renderState;
593+
}
594+
}
595+
587596
//Implemented in CCNoARC.m
588-
//-(void)setRenderState:(CCRenderState *)renderState
589597
//-(CCRenderBuffer)enqueueTriangles:(NSUInteger)triangleCount andVertexes:(NSUInteger)vertexCount withState:(CCRenderState *)renderState globalSortOrder:(NSInteger)globalSortOrder;
590598
//-(CCRenderBuffer)enqueueLines:(NSUInteger)lineCount andVertexes:(NSUInteger)vertexCount withState:(CCRenderState *)renderState globalSortOrder:(NSInteger)globalSortOrder;
591599

cocos2d/CCRenderer_private.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ extern NSDictionary *CCBLEND_DISABLED_OPTIONS;
7777
NSDictionary *_shaderUniforms;
7878
}
7979

80+
-(void)transitionRenderer:(CCRenderer *)renderer FromState:(CCRenderState *)previous;
81+
8082
@end
8183

8284

@@ -174,8 +176,6 @@ CCGraphicsBufferPushElements(CCGraphicsBuffer *buffer, size_t requestedCount, CC
174176
@public
175177
CCGraphicsBuffer *_vertexBuffer;
176178
CCGraphicsBuffer *_elementBuffer;
177-
178-
@private
179179
id<CCGraphicsBufferBindings> _bufferBindings;
180180

181181
NSDictionary *_globalShaderUniforms;
@@ -186,9 +186,6 @@ CCGraphicsBufferPushElements(CCGraphicsBuffer *buffer, size_t requestedCount, CC
186186
// Current renderer bindings for fast state checking.
187187
// Invalidated at the end of each frame.
188188
__unsafe_unretained CCRenderState *_renderState;
189-
__unsafe_unretained NSDictionary *_blendOptions;
190-
__unsafe_unretained CCShader *_shader;
191-
__unsafe_unretained NSDictionary *_shaderUniforms;
192189
__unsafe_unretained CCRenderCommandDraw *_lastDrawCommand;
193190
BOOL _buffersBound;
194191
}

0 commit comments

Comments
 (0)