Dump GL errors and crash on failure to allocate texture for layer
bug:22029728
Change-Id: Ib6f778975225b36567b12e30967955640ec185b3
diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp
index d9b40ae..00add29 100644
--- a/libs/hwui/LayerRenderer.cpp
+++ b/libs/hwui/LayerRenderer.cpp
@@ -14,15 +14,13 @@
* limitations under the License.
*/
-#define LOG_TAG "OpenGLRenderer"
-#define ATRACE_TAG ATRACE_TAG_VIEW
-
#include "LayerCache.h"
#include "LayerRenderer.h"
#include "Matrix.h"
#include "Properties.h"
#include "Rect.h"
#include "renderstate/RenderState.h"
+#include "utils/GLUtils.h"
#include "utils/TraceUtils.h"
#include <ui/Rect.h>
@@ -238,8 +236,9 @@
layer->allocateTexture();
// This should only happen if we run out of memory
- if (glGetError() != GL_NO_ERROR) {
- ALOGE("Could not allocate texture for layer (fbo=%d %dx%d)", fbo, width, height);
+ if (CC_UNLIKELY(GLUtils::dumpGLErrors())) {
+ LOG_ALWAYS_FATAL("Could not allocate texture for layer (fbo=%d %dx%d)",
+ fbo, width, height);
renderState.bindFramebuffer(previousFbo);
layer->decStrong(nullptr);
return nullptr;
diff --git a/libs/hwui/utils/GLUtils.cpp b/libs/hwui/utils/GLUtils.cpp
index 9b298ca..55104de 100644
--- a/libs/hwui/utils/GLUtils.cpp
+++ b/libs/hwui/utils/GLUtils.cpp
@@ -14,8 +14,6 @@
* limitations under the License.
*/
-#define LOG_TAG "OpenGLRenderer"
-
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
@@ -26,9 +24,11 @@
namespace android {
namespace uirenderer {
-void GLUtils::dumpGLErrors() {
+bool GLUtils::dumpGLErrors() {
+ bool errorObserved = false;
GLenum status = GL_NO_ERROR;
while ((status = glGetError()) != GL_NO_ERROR) {
+ errorObserved = true;
switch (status) {
case GL_INVALID_ENUM:
ALOGE("GL error: GL_INVALID_ENUM");
@@ -46,6 +46,7 @@
ALOGE("GL error: 0x%x", status);
}
}
+ return errorObserved;
}
}; // namespace uirenderer
diff --git a/libs/hwui/utils/GLUtils.h b/libs/hwui/utils/GLUtils.h
index 890e374..7020461 100644
--- a/libs/hwui/utils/GLUtils.h
+++ b/libs/hwui/utils/GLUtils.h
@@ -20,12 +20,11 @@
namespace uirenderer {
class GLUtils {
-private:
public:
/**
- * Print out any GL errors with ALOGE
+ * Print out any GL errors with ALOGE, returns true if any errors were found.
*/
- static void dumpGLErrors();
+ static bool dumpGLErrors();
}; // class GLUtils