|
139 | 139 | typedef void (* GetShaderivFunc) (GLuint shader, GLenum pname, GLint* param); |
140 | 140 | typedef void (* GetShaderInfoLogFunc) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); |
141 | 141 |
|
| 142 | +// Returns NO if there is an error |
142 | 143 | static BOOL |
143 | 144 | CCCheckShaderError(GLint obj, GLenum status, GetShaderivFunc getiv, GetShaderInfoLogFunc getInfoLog) |
144 | 145 | { |
|
183 | 184 | glShaderSource(shader, 3, sources, NULL); |
184 | 185 | glCompileShader(shader); |
185 | 186 |
|
186 | | - NSCAssert(CCCheckShaderError(shader, GL_COMPILE_STATUS, glGetShaderiv, glGetShaderInfoLog), @"Error compiling shader"); |
187 | | - |
188 | | - return shader; |
| 187 | + if(CCCheckShaderError(shader, GL_COMPILE_STATUS, glGetShaderiv, glGetShaderInfoLog)){ |
| 188 | + return shader; |
| 189 | + } else { |
| 190 | + glDeleteShader(shader); |
| 191 | + return 0; |
| 192 | + } |
189 | 193 | } |
190 | 194 |
|
191 | 195 |
|
@@ -564,7 +568,7 @@ -(instancetype)initWithGLProgram:(GLuint)program uniformSetters:(NSDictionary *) |
564 | 568 | -(instancetype)initWithMetalVertexFunction:(id<MTLFunction>)vertexFunction fragmentFunction:(id<MTLFunction>)fragmentFunction |
565 | 569 | { |
566 | 570 | if((self = [super init])){ |
567 | | - NSAssert(vertexFunction && fragmentFunction, @"Must create have both a vertex and fragment function to make a CCShader."); |
| 571 | + NSAssert(vertexFunction && fragmentFunction, @"Must have both a vertex and fragment function to make a CCShader."); |
568 | 572 |
|
569 | 573 | _vertexFunction = vertexFunction; |
570 | 574 | _fragmentFunction = fragmentFunction; |
@@ -630,14 +634,18 @@ -(instancetype)initWithGLVertexShaderSource:(NSString *)vertexSource fragmentSha |
630 | 634 | glAttachShader(program, fshader); |
631 | 635 |
|
632 | 636 | glLinkProgram(program); |
633 | | - NSCAssert(CCCheckShaderError(program, GL_LINK_STATUS, glGetProgramiv, glGetProgramInfoLog), @"Error linking shader program"); |
634 | 637 |
|
635 | 638 | glDeleteShader(vshader); |
636 | 639 | glDeleteShader(fshader); |
637 | 640 |
|
638 | 641 | CCGL_DEBUG_POP_GROUP_MARKER(); |
639 | 642 |
|
640 | | - blockself = [blockself initWithGLProgram:program uniformSetters:GLUniformSettersForProgram(program) ownsProgram:YES]; |
| 643 | + if(CCCheckShaderError(program, GL_LINK_STATUS, glGetProgramiv, glGetProgramInfoLog)){ |
| 644 | + blockself = [blockself initWithGLProgram:program uniformSetters:GLUniformSettersForProgram(program) ownsProgram:YES]; |
| 645 | + } else { |
| 646 | + glDeleteProgram(program); |
| 647 | + blockself = nil; |
| 648 | + } |
641 | 649 | }); |
642 | 650 |
|
643 | 651 | return blockself; |
|
0 commit comments