Better error handling in the OpenGL renderer.
Add a glGetError() check on every frame
Don't attempt to create textures larger than the maximum size allowed
Change-Id: Iee4afae16089406dbe8bf10fc93b674f1271a0ca
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index f187d3e..670d049 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -124,6 +124,8 @@
if (maxTextureUnits < REQUIRED_TEXTURE_UNITS_COUNT) {
LOGW("At least %d texture units are required!", REQUIRED_TEXTURE_UNITS_COUNT);
}
+
+ glGetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize);
}
OpenGLRenderer::~OpenGLRenderer() {
@@ -161,6 +163,15 @@
mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
}
+void OpenGLRenderer::finish() {
+#if DEBUG_OPENGL
+ GLenum status = GL_NO_ERROR;
+ while ((status = glGetError()) != GL_NO_ERROR) {
+ LOGD("GL error from OpenGLRenderer: 0x%x", status);
+ }
+#endif
+}
+
void OpenGLRenderer::acquireContext() {
if (mCaches.currentProgram) {
if (mCaches.currentProgram->isInUse()) {
@@ -342,7 +353,10 @@
// Layers only make sense if they are in the framebuffer's bounds
bounds.intersect(*mSnapshot->clipRect);
- if (bounds.isEmpty()) return false;
+ if (bounds.isEmpty() || bounds.getWidth() > mMaxTextureSize ||
+ bounds.getHeight() > mMaxTextureSize) {
+ return false;
+ }
LayerSize size(bounds.getWidth(), bounds.getHeight());
Layer* layer = mCaches.layerCache.get(size);