| 14 | } |
| 15 | |
| 16 | GLuint gltLoadShaderPair(const char *szVertexProg, const char *szFragmentProg) |
| 17 | { |
| 18 | assert(glGetError() == GL_NO_ERROR); |
| 19 | |
| 20 | // Temporary Shader objects |
| 21 | GLuint hVertexShader; |
| 22 | GLuint hFragmentShader; |
| 23 | GLuint hReturn = 0; |
| 24 | GLint testVal; |
| 25 | |
| 26 | // Create shader objects |
| 27 | hVertexShader = glCreateShader(GL_VERTEX_SHADER); |
| 28 | hFragmentShader = glCreateShader(GL_FRAGMENT_SHADER); |
| 29 | |
| 30 | gltLoadShaderSrc(szVertexProg, hVertexShader); |
| 31 | gltLoadShaderSrc(szFragmentProg, hFragmentShader); |
| 32 | |
| 33 | // Compile them |
| 34 | glCompileShader(hVertexShader); |
| 35 | assert(glGetError() == GL_NO_ERROR); |
| 36 | |
| 37 | glGetShaderiv(hVertexShader, GL_COMPILE_STATUS, &testVal); |
| 38 | if (testVal == GL_FALSE) |
| 39 | { |
| 40 | char temp[256] = ""; |
| 41 | glGetShaderInfoLog(hVertexShader, 256, NULL, temp); |
| 42 | fprintf(stderr, "Compile failed:\n%s\n", temp); |
| 43 | assert(0); |
| 44 | return 0; |
| 45 | glDeleteShader(hVertexShader); |
| 46 | glDeleteShader(hFragmentShader); |
| 47 | return (GLuint)0; |
| 48 | } |
| 49 | |
| 50 | assert(glGetError() == GL_NO_ERROR); |
| 51 | |
| 52 | glCompileShader(hFragmentShader); |
| 53 | assert(glGetError() == GL_NO_ERROR); |
| 54 | |
| 55 | glGetShaderiv(hFragmentShader, GL_COMPILE_STATUS, &testVal); |
| 56 | if (testVal == GL_FALSE) |
| 57 | { |
| 58 | char temp[256] = ""; |
| 59 | glGetShaderInfoLog(hFragmentShader, 256, NULL, temp); |
| 60 | fprintf(stderr, "Compile failed:\n%s\n", temp); |
| 61 | assert(0); |
| 62 | exit(EXIT_FAILURE); |
| 63 | glDeleteShader(hVertexShader); |
| 64 | glDeleteShader(hFragmentShader); |
| 65 | return (GLuint)0; |
| 66 | } |
| 67 | |
| 68 | assert(glGetError() == GL_NO_ERROR); |
| 69 | |
| 70 | // Check for errors |
| 71 | |
| 72 | // Link them - assuming it works... |
| 73 | hReturn = glCreateProgram(); |
no test coverage detected