| 104 | } |
| 105 | |
| 106 | unsigned CreateGLProgram(tgfx::Context* context, const std::string& vertex, |
| 107 | const std::string& fragment) { |
| 108 | auto vertexShader = LoadGLShader(context, GL_VERTEX_SHADER, vertex); |
| 109 | if (vertexShader == 0) { |
| 110 | return 0; |
| 111 | } |
| 112 | auto fragmentShader = LoadGLShader(context, GL_FRAGMENT_SHADER, fragment); |
| 113 | if (fragmentShader == 0) { |
| 114 | return 0; |
| 115 | } |
| 116 | auto gl = tgfx::GLFunctions::Get(context); |
| 117 | auto programHandle = gl->createProgram(); |
| 118 | gl->attachShader(programHandle, vertexShader); |
| 119 | gl->attachShader(programHandle, fragmentShader); |
| 120 | gl->linkProgram(programHandle); |
| 121 | int success; |
| 122 | gl->getProgramiv(programHandle, GL_LINK_STATUS, &success); |
| 123 | if (!success) { |
| 124 | char infoLog[512]; |
| 125 | gl->getProgramInfoLog(programHandle, 512, nullptr, infoLog); |
| 126 | gl->deleteProgram(programHandle); |
| 127 | } |
| 128 | gl->deleteShader(vertexShader); |
| 129 | gl->deleteShader(fragmentShader); |
| 130 | return programHandle; |
| 131 | } |
| 132 | |
| 133 | void ActiveGLTexture(tgfx::Context* context, int unitIndex, const tgfx::GLTextureInfo* sampler) { |
| 134 | if (sampler == nullptr) { |