Throw ISE on too-big-views-with-layers
Bug: 12971954
Change-Id: I3ef995e91f236014b0a72a90846ef19ce6dc42b1
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index 05f4edf..3d93383 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -20,6 +20,7 @@
#include "RenderNode.h"
#include <algorithm>
+#include <string>
#include <SkCanvas.h>
#include <algorithm>
@@ -158,7 +159,10 @@
applyLayerPropertiesToLayer(info);
damageSelf(info);
} else if (mLayer->layer.getWidth() != getWidth() || mLayer->layer.getHeight() != getHeight()) {
- LayerRenderer::resizeLayer(mLayer, getWidth(), getHeight());
+ if (!LayerRenderer::resizeLayer(mLayer, getWidth(), getHeight())) {
+ LayerRenderer::destroyLayer(mLayer);
+ mLayer = 0;
+ }
damageSelf(info);
}
@@ -166,6 +170,15 @@
info.damageAccumulator->peekAtDirty(&dirty);
info.damageAccumulator->popTransform();
+ if (!mLayer) {
+ if (info.errorHandler) {
+ std::string msg = "Unable to create layer for ";
+ msg += getName();
+ info.errorHandler->onError(msg);
+ }
+ return;
+ }
+
if (!dirty.isEmpty()) {
mLayer->updateDeferred(this, dirty.fLeft, dirty.fTop, dirty.fRight, dirty.fBottom);
}
diff --git a/libs/hwui/TreeInfo.h b/libs/hwui/TreeInfo.h
index 0fc0cef..f67e434 100644
--- a/libs/hwui/TreeInfo.h
+++ b/libs/hwui/TreeInfo.h
@@ -16,6 +16,8 @@
#ifndef TREEINFO_H
#define TREEINFO_H
+#include <string>
+
#include <utils/Timers.h>
#include "DamageAccumulator.h"
@@ -35,6 +37,13 @@
~AnimationHook() {}
};
+class ErrorHandler {
+public:
+ virtual void onError(const std::string& message) = 0;
+protected:
+ ~ErrorHandler() {}
+};
+
// This would be a struct, but we want to PREVENT_COPY_AND_ASSIGN
class TreeInfo {
PREVENT_COPY_AND_ASSIGN(TreeInfo);
@@ -65,6 +74,7 @@
, prepareTextures(mode == MODE_FULL)
, damageAccumulator(NullDamageAccumulator::instance())
, renderer(0)
+ , errorHandler(0)
{}
const TraversalMode mode;
@@ -78,6 +88,7 @@
// The renderer that will be drawing the next frame. Use this to push any
// layer updates or similar. May be NULL.
OpenGLRenderer* renderer;
+ ErrorHandler* errorHandler;
struct Out {
Out()