diff options
| -rw-r--r-- | libs/hwui/RenderNode.cpp | 15 | ||||
| -rw-r--r-- | libs/hwui/pipeline/skia/SkiaPipeline.cpp | 17 | ||||
| -rw-r--r-- | libs/hwui/pipeline/skia/SkiaPipeline.h | 2 | ||||
| -rw-r--r-- | libs/hwui/renderthread/CanvasContext.h | 7 | ||||
| -rw-r--r-- | libs/hwui/renderthread/IRenderPipeline.h | 3 | ||||
| -rw-r--r-- | libs/hwui/renderthread/OpenGLPipeline.cpp | 20 | ||||
| -rw-r--r-- | libs/hwui/renderthread/OpenGLPipeline.h | 2 |
7 files changed, 45 insertions, 21 deletions
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index fedcc10abb64..d93a7578cfd7 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -243,24 +243,11 @@ void RenderNode::pushLayerUpdate(TreeInfo& info) { return; } - if (info.canvasContext.createOrUpdateLayer(this, *info.damageAccumulator)) { + if (info.canvasContext.createOrUpdateLayer(this, *info.damageAccumulator, info.errorHandler)) { damageSelf(info); } if (!hasLayer()) { - Caches::getInstance().dumpMemoryUsage(); - if (info.errorHandler) { - std::ostringstream err; - err << "Unable to create layer for " << getName(); - const int maxTextureSize = Caches::getInstance().maxTextureSize; - if (getWidth() > maxTextureSize || getHeight() > maxTextureSize) { - err << ", size " << getWidth() << "x" << getHeight() << " exceeds max size " - << maxTextureSize; - } else { - err << ", see logcat for more info"; - } - info.errorHandler->onError(err.str()); - } return; } diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp index 0cd1c151629d..07052cdab48b 100644 --- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp @@ -22,6 +22,7 @@ #include <SkOverdrawColorFilter.h> #include <SkPicture.h> #include <SkPictureRecorder.h> +#include "TreeInfo.h" #include "VectorDrawable.h" #include "utils/TraceUtils.h" @@ -158,7 +159,7 @@ void SkiaPipeline::renderLayersImpl(const LayerUpdateQueue& layers, bool opaque, } bool SkiaPipeline::createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator, - bool wideColorGamut) { + bool wideColorGamut, ErrorHandler* errorHandler) { // compute the size of the surface (i.e. texture) to be allocated for this layer const int surfaceWidth = ceilf(node->getWidth() / float(LAYER_SIZE)) * LAYER_SIZE; const int surfaceHeight = ceilf(node->getHeight() / float(LAYER_SIZE)) * LAYER_SIZE; @@ -182,6 +183,20 @@ bool SkiaPipeline::createOrUpdateLayer(RenderNode* node, const DamageAccumulator Matrix4 windowTransform; damageAccumulator.computeCurrentTransform(&windowTransform); node->getSkiaLayer()->inverseTransformInWindow = windowTransform; + } else { + String8 cachesOutput; + mRenderThread.cacheManager().dumpMemoryUsage(cachesOutput, + &mRenderThread.renderState()); + ALOGE("%s", cachesOutput.string()); + if (errorHandler) { + std::ostringstream err; + err << "Unable to create layer for " << node->getName(); + const int maxTextureSize = DeviceInfo::get()->maxTextureSize(); + err << ", size " << info.width() << "x" << info.height() << " max size " + << maxTextureSize << " color type " << (int)info.colorType() + << " has context " << (int)(mRenderThread.getGrContext() != nullptr); + errorHandler->onError(err.str()); + } } return true; } diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.h b/libs/hwui/pipeline/skia/SkiaPipeline.h index 3800194440f9..38ad9c09a8aa 100644 --- a/libs/hwui/pipeline/skia/SkiaPipeline.h +++ b/libs/hwui/pipeline/skia/SkiaPipeline.h @@ -47,7 +47,7 @@ public: const BakedOpRenderer::LightInfo& lightInfo) override; bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator, - bool wideColorGamut) override; + bool wideColorGamut, ErrorHandler* errorHandler) override; void renderFrame(const LayerUpdateQueue& layers, const SkRect& clip, const std::vector<sp<RenderNode>>& nodes, bool opaque, bool wideColorGamut, diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index d80a24737a7a..c2cc72a6917f 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -49,6 +49,7 @@ namespace uirenderer { class AnimationContext; class DeferredLayerUpdater; +class ErrorHandler; class Layer; class Rect; class RenderState; @@ -74,8 +75,10 @@ public: * * @return true if the layer has been created or updated */ - bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& dmgAccumulator) { - return mRenderPipeline->createOrUpdateLayer(node, dmgAccumulator, mWideColorGamut); + bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& dmgAccumulator, + ErrorHandler* errorHandler) { + return mRenderPipeline->createOrUpdateLayer(node, dmgAccumulator, mWideColorGamut, + errorHandler); } /** diff --git a/libs/hwui/renderthread/IRenderPipeline.h b/libs/hwui/renderthread/IRenderPipeline.h index 246ab269b838..b1de49733c09 100644 --- a/libs/hwui/renderthread/IRenderPipeline.h +++ b/libs/hwui/renderthread/IRenderPipeline.h @@ -31,6 +31,7 @@ class Surface; namespace uirenderer { class DeferredLayerUpdater; +class ErrorHandler; namespace renderthread { @@ -68,7 +69,7 @@ public: const BakedOpRenderer::LightInfo& lightInfo) = 0; virtual TaskManager* getTaskManager() = 0; virtual bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator, - bool wideColorGamut) = 0; + bool wideColorGamut, ErrorHandler* errorHandler) = 0; virtual bool pinImages(std::vector<SkImage*>& mutableImages) = 0; virtual bool pinImages(LsaVector<sk_sp<Bitmap>>& images) = 0; virtual void unpinImages() = 0; diff --git a/libs/hwui/renderthread/OpenGLPipeline.cpp b/libs/hwui/renderthread/OpenGLPipeline.cpp index f3103fd0cbb4..876af47e256f 100644 --- a/libs/hwui/renderthread/OpenGLPipeline.cpp +++ b/libs/hwui/renderthread/OpenGLPipeline.cpp @@ -23,6 +23,7 @@ #include "OpenGLReadback.h" #include "ProfileRenderer.h" #include "renderstate/RenderState.h" +#include "TreeInfo.h" #include <cutils/properties.h> #include <strings.h> @@ -202,7 +203,8 @@ static bool layerMatchesWH(OffscreenBuffer* layer, int width, int height) { bool OpenGLPipeline::createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator, - bool wideColorGamut) { + bool wideColorGamut, + ErrorHandler* errorHandler) { RenderState& renderState = mRenderThread.renderState(); OffscreenBufferPool& layerPool = renderState.layerPool(); bool transformUpdateNeeded = false; @@ -228,6 +230,22 @@ bool OpenGLPipeline::createOrUpdateLayer(RenderNode* node, node->getLayer()->setWindowTransform(windowTransform); } + if (!node->hasLayer()) { + Caches::getInstance().dumpMemoryUsage(); + if (errorHandler) { + std::ostringstream err; + err << "Unable to create layer for " << node->getName(); + const int maxTextureSize = Caches::getInstance().maxTextureSize; + if (node->getWidth() > maxTextureSize || node->getHeight() > maxTextureSize) { + err << ", size " << node->getWidth() << "x" << node->getHeight() + << " exceeds max size " << maxTextureSize; + } else { + err << ", see logcat for more info"; + } + errorHandler->onError(err.str()); + } + } + return transformUpdateNeeded; } diff --git a/libs/hwui/renderthread/OpenGLPipeline.h b/libs/hwui/renderthread/OpenGLPipeline.h index 118007c6a46c..9859e931fd85 100644 --- a/libs/hwui/renderthread/OpenGLPipeline.h +++ b/libs/hwui/renderthread/OpenGLPipeline.h @@ -53,7 +53,7 @@ public: const BakedOpRenderer::LightInfo& lightInfo) override; TaskManager* getTaskManager() override; bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator, - bool wideColorGamut) override; + bool wideColorGamut, ErrorHandler* errorHandler) override; bool pinImages(std::vector<SkImage*>& mutableImages) override { return false; } bool pinImages(LsaVector<sk_sp<Bitmap>>& images) override; void unpinImages() override; |