| 83 | } |
| 84 | |
| 85 | void GlslProgram::build() |
| 86 | { |
| 87 | MX_TRACE_FUNCTION(Tracing::Category::Render); |
| 88 | |
| 89 | clearBuiltData(); |
| 90 | |
| 91 | GLint glStatus = GL_FALSE; |
| 92 | int glInfoLogLength = 0; |
| 93 | StringVec errors; |
| 94 | |
| 95 | unsigned int stagesBuilt = 0; |
| 96 | unsigned int desiredStages = 0; |
| 97 | for (const auto& it : _stages) |
| 98 | { |
| 99 | if (!it.second.empty()) |
| 100 | { |
| 101 | desiredStages++; |
| 102 | } |
| 103 | } |
| 104 | |
| 105 | // Compile vertex shader, if any |
| 106 | GLuint vertexShaderId = UNDEFINED_OPENGL_RESOURCE_ID; |
| 107 | const string& vertexShaderSource = _stages[Stage::VERTEX]; |
| 108 | if (!vertexShaderSource.empty()) |
| 109 | { |
| 110 | vertexShaderId = glCreateShader(GL_VERTEX_SHADER); |
| 111 | |
| 112 | // Compile vertex shader |
| 113 | const char* vertexChar = vertexShaderSource.c_str(); |
| 114 | glShaderSource(vertexShaderId, 1, &vertexChar, nullptr); |
| 115 | glCompileShader(vertexShaderId); |
| 116 | |
| 117 | // Check vertex shader |
| 118 | glGetShaderiv(vertexShaderId, GL_COMPILE_STATUS, &glStatus); |
| 119 | if (glStatus == GL_FALSE) |
| 120 | { |
| 121 | errors.push_back("Error in compiling vertex shader:"); |
| 122 | glGetShaderiv(vertexShaderId, GL_INFO_LOG_LENGTH, &glInfoLogLength); |
| 123 | if (glInfoLogLength > 0) |
| 124 | { |
| 125 | std::vector<char> vsErrorMessage((size_t) glInfoLogLength + 1); |
| 126 | glGetShaderInfoLog(vertexShaderId, glInfoLogLength, nullptr, &vsErrorMessage[0]); |
| 127 | errors.push_back(&vsErrorMessage[0]); |
| 128 | } |
| 129 | } |
| 130 | else |
| 131 | { |
| 132 | stagesBuilt++; |
| 133 | } |
| 134 | } |
| 135 | |
| 136 | // Compile fragment shader, if any |
| 137 | GLuint fragmentShaderId = UNDEFINED_OPENGL_RESOURCE_ID; |
| 138 | const string& fragmentShaderSource = _stages[Stage::PIXEL]; |
| 139 | if (!fragmentShaderSource.empty()) |
| 140 | { |
| 141 | fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER); |
| 142 |
no test coverage detected