Loading core/java/android/view/HardwareRenderer.java +14 −3 Original line number Diff line number Diff line Loading @@ -50,7 +50,7 @@ public abstract class HardwareRenderer { private boolean mRequested = true; /** * Indicates that the current process cannot use hardware rendering. * Invoke this method to disable hardware rendering in the current process. * * @hide */ Loading Loading @@ -207,7 +207,7 @@ public abstract class HardwareRenderer { EGLSurface mEglSurface; GL mGl; GLES20Canvas mCanvas; HardwareCanvas mCanvas; final int mGlVersion; final boolean mTranslucent; Loading Loading @@ -279,6 +279,9 @@ public abstract class HardwareRenderer { if (error != EGL11.EGL_CONTEXT_LOST) { // we'll try again if it was context lost setRequested(false); } else { Log.w(LOG_TAG, "Mountain View, we've had a problem here. " + "Switching back to software rendering."); } Log.w(LOG_TAG, "EGL error: " + getEGLErrorString(error)); } Loading Loading @@ -653,6 +656,14 @@ public abstract class HardwareRenderer { mGlCanvas.onPostDraw(); } @Override void destroy(boolean full) { super.destroy(full); if (full && mGlCanvas != null) { mGlCanvas = null; } } @Override DisplayList createDisplayList() { return new GLES20DisplayList(); Loading libs/hwui/Program.cpp +39 −24 Original line number Diff line number Diff line Loading @@ -26,8 +26,13 @@ namespace uirenderer { /////////////////////////////////////////////////////////////////////////////// Program::Program(const char* vertex, const char* fragment) { mInitialized = false; vertexShader = buildShader(vertex, GL_VERTEX_SHADER); if (vertexShader) { fragmentShader = buildShader(fragment, GL_FRAGMENT_SHADER); if (fragmentShader) { id = glCreateProgram(); glAttachShader(id, vertexShader); Loading @@ -37,29 +42,38 @@ Program::Program(const char* vertex, const char* fragment) { 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("Error while linking shaders: %s", log); LOGE("%s", log); } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); glDeleteProgram(id); } else { mInitialized = true; } } } mUse = false; if (mInitialized) { position = addAttrib("position"); transform = addUniform("transform"); } } Program::~Program() { if (mInitialized) { glDeleteShader(vertexShader); glDeleteShader(fragmentShader); glDeleteProgram(id); } } int Program::addAttrib(const char* name) { int slot = glGetAttribLocation(id, name); Loading Loading @@ -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; Loading libs/hwui/Program.h +8 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,13 @@ public: return mUse; } /** * Indicates whether this program was correctly compiled and linked. */ inline bool isInitialized() const { return mInitialized; } /** * Binds the program with the specified projection, modelView and * transform matrices. Loading Loading @@ -126,6 +133,7 @@ private: KeyedVector<const char*, int> uniforms; bool mUse; bool mInitialized; }; // class Program }; // namespace uirenderer Loading libs/hwui/ProgramCache.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -298,6 +298,8 @@ ProgramCache::~ProgramCache() { /////////////////////////////////////////////////////////////////////////////// void ProgramCache::clear() { PROGRAM_LOGD("Clearing program cache"); size_t count = mCache.size(); for (size_t i = 0; i < count; i++) { delete mCache.valueAt(i); Loading Loading
core/java/android/view/HardwareRenderer.java +14 −3 Original line number Diff line number Diff line Loading @@ -50,7 +50,7 @@ public abstract class HardwareRenderer { private boolean mRequested = true; /** * Indicates that the current process cannot use hardware rendering. * Invoke this method to disable hardware rendering in the current process. * * @hide */ Loading Loading @@ -207,7 +207,7 @@ public abstract class HardwareRenderer { EGLSurface mEglSurface; GL mGl; GLES20Canvas mCanvas; HardwareCanvas mCanvas; final int mGlVersion; final boolean mTranslucent; Loading Loading @@ -279,6 +279,9 @@ public abstract class HardwareRenderer { if (error != EGL11.EGL_CONTEXT_LOST) { // we'll try again if it was context lost setRequested(false); } else { Log.w(LOG_TAG, "Mountain View, we've had a problem here. " + "Switching back to software rendering."); } Log.w(LOG_TAG, "EGL error: " + getEGLErrorString(error)); } Loading Loading @@ -653,6 +656,14 @@ public abstract class HardwareRenderer { mGlCanvas.onPostDraw(); } @Override void destroy(boolean full) { super.destroy(full); if (full && mGlCanvas != null) { mGlCanvas = null; } } @Override DisplayList createDisplayList() { return new GLES20DisplayList(); Loading
libs/hwui/Program.cpp +39 −24 Original line number Diff line number Diff line Loading @@ -26,8 +26,13 @@ namespace uirenderer { /////////////////////////////////////////////////////////////////////////////// Program::Program(const char* vertex, const char* fragment) { mInitialized = false; vertexShader = buildShader(vertex, GL_VERTEX_SHADER); if (vertexShader) { fragmentShader = buildShader(fragment, GL_FRAGMENT_SHADER); if (fragmentShader) { id = glCreateProgram(); glAttachShader(id, vertexShader); Loading @@ -37,29 +42,38 @@ Program::Program(const char* vertex, const char* fragment) { 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("Error while linking shaders: %s", log); LOGE("%s", log); } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); glDeleteProgram(id); } else { mInitialized = true; } } } mUse = false; if (mInitialized) { position = addAttrib("position"); transform = addUniform("transform"); } } Program::~Program() { if (mInitialized) { glDeleteShader(vertexShader); glDeleteShader(fragmentShader); glDeleteProgram(id); } } int Program::addAttrib(const char* name) { int slot = glGetAttribLocation(id, name); Loading Loading @@ -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; Loading
libs/hwui/Program.h +8 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,13 @@ public: return mUse; } /** * Indicates whether this program was correctly compiled and linked. */ inline bool isInitialized() const { return mInitialized; } /** * Binds the program with the specified projection, modelView and * transform matrices. Loading Loading @@ -126,6 +133,7 @@ private: KeyedVector<const char*, int> uniforms; bool mUse; bool mInitialized; }; // class Program }; // namespace uirenderer Loading
libs/hwui/ProgramCache.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -298,6 +298,8 @@ ProgramCache::~ProgramCache() { /////////////////////////////////////////////////////////////////////////////// void ProgramCache::clear() { PROGRAM_LOGD("Clearing program cache"); size_t count = mCache.size(); for (size_t i = 0; i < count; i++) { delete mCache.valueAt(i); Loading