| 68 | } |
| 69 | |
| 70 | GL::GLuint CompileProgram(const UString &vertexSource, const UString &fragmentSource) |
| 71 | { |
| 72 | GL::GLuint prog = 0; |
| 73 | GL::GLuint vShader = CreateShader(GL::VERTEX_SHADER, vertexSource); |
| 74 | if (!vShader) |
| 75 | { |
| 76 | LogError("Failed to compile vertex shader"); |
| 77 | return 0; |
| 78 | } |
| 79 | GL::GLuint fShader = CreateShader(GL::FRAGMENT_SHADER, fragmentSource); |
| 80 | if (!fShader) |
| 81 | { |
| 82 | LogError("Failed to compile fragment shader"); |
| 83 | gl->DeleteShader(vShader); |
| 84 | return 0; |
| 85 | } |
| 86 | |
| 87 | prog = gl->CreateProgram(); |
| 88 | gl->AttachShader(prog, vShader); |
| 89 | gl->AttachShader(prog, fShader); |
| 90 | |
| 91 | gl->DeleteShader(vShader); |
| 92 | gl->DeleteShader(fShader); |
| 93 | |
| 94 | gl->LinkProgram(prog); |
| 95 | |
| 96 | GL::GLint linkStatus; |
| 97 | gl->GetProgramiv(prog, GL::LINK_STATUS, &linkStatus); |
| 98 | if (linkStatus == GL::TRUE) |
| 99 | return prog; |
| 100 | |
| 101 | GL::GLint logLength; |
| 102 | gl->GetProgramiv(prog, GL::INFO_LOG_LENGTH, &logLength); |
| 103 | |
| 104 | std::unique_ptr<char[]> log(new char[logLength]); |
| 105 | gl->GetProgramInfoLog(prog, logLength, NULL, log.get()); |
| 106 | |
| 107 | LogError("Program link error: %s", log.get()); |
| 108 | |
| 109 | gl->DeleteProgram(prog); |
| 110 | return 0; |
| 111 | } |
| 112 | |
| 113 | struct SpriteDescription |
| 114 | { |
no test coverage detected