| 61 | } |
| 62 | |
| 63 | bool CAGLProgram::initWithVertexShaderByteArray(const GLchar* vShaderByteArray, const GLchar* fShaderByteArray) |
| 64 | { |
| 65 | #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) |
| 66 | GLboolean hasCompiler = false; |
| 67 | glGetBooleanv(GL_SHADER_COMPILER, &hasCompiler); |
| 68 | m_hasShaderCompiler = (hasCompiler == GL_TRUE); |
| 69 | |
| 70 | if(!m_hasShaderCompiler) |
| 71 | { |
| 72 | return initWithPrecompiledProgramByteArray(vShaderByteArray,fShaderByteArray); |
| 73 | } |
| 74 | #endif |
| 75 | |
| 76 | m_uProgram = glCreateProgram(); |
| 77 | CHECK_GL_ERROR_DEBUG(); |
| 78 | |
| 79 | m_uVertShader = m_uFragShader = 0; |
| 80 | |
| 81 | if (vShaderByteArray) |
| 82 | { |
| 83 | if (!compileShader(&m_uVertShader, GL_VERTEX_SHADER, vShaderByteArray)) |
| 84 | { |
| 85 | CCLOG("CrossApp: ERROR: Failed to compile vertex shader"); |
| 86 | return false; |
| 87 | } |
| 88 | } |
| 89 | |
| 90 | // Create and compile fragment shader |
| 91 | if (fShaderByteArray) |
| 92 | { |
| 93 | if (!compileShader(&m_uFragShader, GL_FRAGMENT_SHADER, fShaderByteArray)) |
| 94 | { |
| 95 | CCLOG("CrossApp: ERROR: Failed to compile fragment shader"); |
| 96 | return false; |
| 97 | } |
| 98 | } |
| 99 | |
| 100 | if (m_uVertShader) |
| 101 | { |
| 102 | glAttachShader(m_uProgram, m_uVertShader); |
| 103 | } |
| 104 | CHECK_GL_ERROR_DEBUG(); |
| 105 | |
| 106 | if (m_uFragShader) |
| 107 | { |
| 108 | glAttachShader(m_uProgram, m_uFragShader); |
| 109 | } |
| 110 | m_pHashForUniforms = NULL; |
| 111 | |
| 112 | CHECK_GL_ERROR_DEBUG(); |
| 113 | |
| 114 | #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) |
| 115 | m_shaderId = CCPrecompiledShaders::sharedPrecompiledShaders()->addShaders(vShaderByteArray, fShaderByteArray); |
| 116 | #endif |
| 117 | |
| 118 | return true; |
| 119 | } |
| 120 |
no test coverage detected