in agdk/agdktunnel/app/src/main/cpp/shader.cpp [61:128]
void Shader::Compile() {
const char *vsrc = 0, *fsrc = 0;
GLint status = 0;
ALOGI("Compiling shader.");
ALOGI("Shader name: %s", GetShaderName());
vsrc = GetVertShaderSource();
fsrc = GetFragShaderSource();
mVertShaderH = glCreateShader(GL_VERTEX_SHADER);
mFragShaderH = glCreateShader(GL_FRAGMENT_SHADER);
if (!mVertShaderH || !mFragShaderH) {
ALOGE("*** Failed to create shader.");
ABORT_GAME;
}
glShaderSource(mVertShaderH, 1, &vsrc, NULL);
glCompileShader(mVertShaderH);
glGetShaderiv(mVertShaderH, GL_COMPILE_STATUS, &status);
if (status == 0) {
ALOGE("*** Vertex shader compilation failed.");
_printShaderLog(mVertShaderH);
ABORT_GAME;
}
ALOGI("Vertex shader compilation succeeded.");
glShaderSource(mFragShaderH, 1, &fsrc, NULL);
glCompileShader(mFragShaderH);
glGetShaderiv(mFragShaderH, GL_COMPILE_STATUS, &status);
if (status == 0) {
ALOGE("*** Fragment shader compilation failed, %d", status);
_printShaderLog(mFragShaderH);
ABORT_GAME;
}
ALOGI("Fragment shader compilation succeeded.");
mProgramH = glCreateProgram();
if (!mProgramH) {
ALOGE("*** Failed to create program");
_printProgramLog(mProgramH);
ABORT_GAME;
}
glAttachShader(mProgramH, mVertShaderH);
glAttachShader(mProgramH, mFragShaderH);
glLinkProgram(mProgramH);
glGetProgramiv(mProgramH, GL_LINK_STATUS, &status);
if (status == 0) {
ALOGE("*** Shader program link failed, %d", status);
_printProgramLog(mProgramH);
ABORT_GAME;
}
ALOGI("Program linking succeeded.");
glUseProgram(mProgramH);
mMVPMatrixLoc = glGetUniformLocation(mProgramH, "u_MVP");
if (mMVPMatrixLoc < 0) {
ALOGE("*** Couldn't get shader's u_MVP matrix location from shader.");
ABORT_GAME;
}
mPositionAttribLoc = glGetAttribLocation(mProgramH, "a_Position");
if (mPositionAttribLoc < 0) {
ALOGE("*** Couldn't get shader's a_Position attribute location.");
ABORT_GAME;
}
ALOGI("Shader compilation/linking successful.");
glUseProgram(0);
}