summaryrefslogtreecommitdiffstats
path: root/libs/hwui/Program.cpp
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2010-12-07 20:09:23 -0800
committerRomain Guy <romainguy@google.com>2010-12-07 20:12:50 -0800
commit67f27952c1bcb2230beef9b5ca0bf42edad436a9 (patch)
tree9cfec6c807b64d51fba041e2f6dd50c6abe3577e /libs/hwui/Program.cpp
parentdbf78bdb7a9aed3b8393c247128a7e8c760343b5 (diff)
downloadframeworks_base-67f27952c1bcb2230beef9b5ca0bf42edad436a9.zip
frameworks_base-67f27952c1bcb2230beef9b5ca0bf42edad436a9.tar.gz
frameworks_base-67f27952c1bcb2230beef9b5ca0bf42edad436a9.tar.bz2
Correctly release the OpenGL Canvas on EGL error.
Change-Id: Ib31fd8445f7ce5f7aa7e0205de0e7db80d024fc2
Diffstat (limited to 'libs/hwui/Program.cpp')
-rw-r--r--libs/hwui/Program.cpp63
1 files changed, 39 insertions, 24 deletions
diff --git a/libs/hwui/Program.cpp b/libs/hwui/Program.cpp
index baed5fd..2187f24 100644
--- a/libs/hwui/Program.cpp
+++ b/libs/hwui/Program.cpp
@@ -26,39 +26,53 @@ namespace uirenderer {
///////////////////////////////////////////////////////////////////////////////
Program::Program(const char* vertex, const char* fragment) {
- vertexShader = buildShader(vertex, GL_VERTEX_SHADER);
- fragmentShader = buildShader(fragment, GL_FRAGMENT_SHADER);
-
- id = glCreateProgram();
- glAttachShader(id, vertexShader);
- glAttachShader(id, fragmentShader);
- glLinkProgram(id);
+ mInitialized = false;
- GLint status;
- glGetProgramiv(id, GL_LINK_STATUS, &status);
- if (status != GL_TRUE) {
- GLint infoLen = 0;
- glGetProgramiv(id, GL_INFO_LOG_LENGTH, &infoLen);
- if (infoLen > 1) {
- GLchar log[infoLen];
- glGetProgramInfoLog(id, infoLen, 0, &log[0]);
- LOGE("Error while linking shaders: %s", log);
+ vertexShader = buildShader(vertex, GL_VERTEX_SHADER);
+ if (vertexShader) {
+
+ fragmentShader = buildShader(fragment, GL_FRAGMENT_SHADER);
+ if (fragmentShader) {
+
+ id = glCreateProgram();
+ glAttachShader(id, vertexShader);
+ glAttachShader(id, fragmentShader);
+ glLinkProgram(id);
+
+ GLint status;
+ glGetProgramiv(id, GL_LINK_STATUS, &status);
+ if (status != GL_TRUE) {
+ LOGE("Error while linking shaders:");
+ GLint infoLen = 0;
+ glGetProgramiv(id, GL_INFO_LOG_LENGTH, &infoLen);
+ if (infoLen > 1) {
+ GLchar log[infoLen];
+ glGetProgramInfoLog(id, infoLen, 0, &log[0]);
+ LOGE("%s", log);
+ }
+ glDeleteShader(vertexShader);
+ glDeleteShader(fragmentShader);
+ glDeleteProgram(id);
+ } else {
+ mInitialized = true;
+ }
}
- glDeleteShader(vertexShader);
- glDeleteShader(fragmentShader);
- glDeleteProgram(id);
}
mUse = false;
- position = addAttrib("position");
- transform = addUniform("transform");
+ if (mInitialized) {
+ position = addAttrib("position");
+ transform = addUniform("transform");
+ }
}
Program::~Program() {
- glDeleteShader(vertexShader);
- glDeleteShader(fragmentShader);
- glDeleteProgram(id);
+ if (mInitialized) {
+ glDeleteShader(vertexShader);
+ glDeleteShader(fragmentShader);
+ glDeleteProgram(id);
+ }
}
int Program::addAttrib(const char* name) {
@@ -103,6 +117,7 @@ GLuint Program::buildShader(const char* source, GLenum type) {
glGetShaderInfoLog(shader, sizeof(log), 0, &log[0]);
LOGE("Error while compiling shader: %s", log);
glDeleteShader(shader);
+ return 0;
}
return shader;