| 71 | } |
| 72 | |
| 73 | GLuint createProgram(const char* vtxSrc, const char* fragSrc) { |
| 74 | GLuint vtxShader = 0; |
| 75 | GLuint fragShader = 0; |
| 76 | GLuint program = 0; |
| 77 | GLint linked = GL_FALSE; |
| 78 | |
| 79 | vtxShader = createShader(GL_VERTEX_SHADER, vtxSrc); |
| 80 | if (!vtxShader) goto exit; |
| 81 | |
| 82 | fragShader = createShader(GL_FRAGMENT_SHADER, fragSrc); |
| 83 | if (!fragShader) goto exit; |
| 84 | |
| 85 | program = glCreateProgram(); |
| 86 | if (!program) { |
| 87 | checkGlError("glCreateProgram"); |
| 88 | goto exit; |
| 89 | } |
| 90 | glAttachShader(program, vtxShader); |
| 91 | glAttachShader(program, fragShader); |
| 92 | |
| 93 | glLinkProgram(program); |
| 94 | glGetProgramiv(program, GL_LINK_STATUS, &linked); |
| 95 | if (!linked) { |
| 96 | ALOGE("Could not link program"); |
| 97 | GLint infoLogLen = 0; |
| 98 | glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLen); |
| 99 | if (infoLogLen) { |
| 100 | GLchar* infoLog = (GLchar*)malloc(infoLogLen); |
| 101 | if (infoLog) { |
| 102 | glGetProgramInfoLog(program, infoLogLen, NULL, infoLog); |
| 103 | ALOGE("Could not link program:\n%s\n", infoLog); |
| 104 | free(infoLog); |
| 105 | } |
| 106 | } |
| 107 | glDeleteProgram(program); |
| 108 | program = 0; |
| 109 | } |
| 110 | |
| 111 | exit: |
| 112 | glDeleteShader(vtxShader); |
| 113 | glDeleteShader(fragShader); |
| 114 | return program; |
| 115 | } |
| 116 | |
| 117 | static void printGlString(const char* name, GLenum s) { |
| 118 | const char* v = (const char*)glGetString(s); |
no test coverage detected