|
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