bool GLProgram::link() { CCASSERT(_program != 0, "Cannot link invalid program"); GLint status = GL_TRUE; bindPredefinedVertexAttribs(); glLinkProgram(_program); parseVertexAttribs(); parseUniforms(); clearShader(); #if DEBUG || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) glGetProgramiv(_program, GL_LINK_STATUS, &status); if (status == GL_FALSE) { CCLOG("cocos2d: ERROR: Failed to link program: %i", _program); GL::deleteProgram(_program); _program = 0; } #endif return (status == GL_TRUE); }
bool GLProgram::link() { CCASSERT(_program != 0, "Cannot link invalid program"); GLint status = GL_TRUE; bindPredefinedVertexAttribs(); glLinkProgram(_program); // Calling glGetProgramiv(...GL_LINK_STATUS...) will force linking of the program at this moment. // Otherwise, they might be linked when they are used for the first time. (I guess this depends on the driver implementation) // So it might slow down the "booting" process on certain devices. But, on the other hand it is important to know if the shader // linked successfully. Some shaders might be downloaded in runtime so, release version should have this check. // For more info, see Github issue #16231 glGetProgramiv(_program, GL_LINK_STATUS, &status); if (status == GL_FALSE) { CCLOG("cocos2d: ERROR: Failed to link program: %i", _program); GL::deleteProgram(_program); _program = 0; } else { parseVertexAttribs(); parseUniforms(); clearShader(); } return (status == GL_TRUE); }
bool GLProgram::link() { CCASSERT(_program != 0, "Cannot link invalid program"); #if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) if(!_hasShaderCompiler) { // precompiled shader program is already linked //bindPredefinedVertexAttribs(); parseVertexAttribs(); parseUniforms(); return true; } #endif GLint status = GL_TRUE; bindPredefinedVertexAttribs(); glLinkProgram(_program); parseVertexAttribs(); parseUniforms(); if (_vertShader) { glDeleteShader(_vertShader); } if (_fragShader) { glDeleteShader(_fragShader); } _vertShader = _fragShader = 0; #if DEBUG || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) glGetProgramiv(_program, GL_LINK_STATUS, &status); if (status == GL_FALSE) { CCLOG("cocos2d: ERROR: Failed to link program: %i", _program); GL::deleteProgram(_program); _program = 0; } #endif #if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || defined(WP8_SHADER_COMPILER) if (status == GL_TRUE) { CCPrecompiledShaders::getInstance()->addProgram(_program, _shaderId); } #endif return (status == GL_TRUE); }