Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 216b1572 authored by Stan Iliev's avatar Stan Iliev
Browse files

Better error reporting for createOrUpdateLayer

Pass error handler down to the pipeline object, which allows
skia pipelines to print cache memory usage.
In case of an error, print arguments that were used to invoke
SkSurface::MakeRenderTarget.

Test: Ran android build on a device
Bug: 76115654
Change-Id: I5baddfa66debd505eddc3117cf94aa6ae69bedaa
parent 294ad785
Loading
Loading
Loading
Loading
+1 −14
Original line number Original line Diff line number Diff line
@@ -243,24 +243,11 @@ void RenderNode::pushLayerUpdate(TreeInfo& info) {
        return;
        return;
    }
    }


    if (info.canvasContext.createOrUpdateLayer(this, *info.damageAccumulator)) {
    if (info.canvasContext.createOrUpdateLayer(this, *info.damageAccumulator, info.errorHandler)) {
        damageSelf(info);
        damageSelf(info);
    }
    }


    if (!hasLayer()) {
    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;
        return;
    }
    }


+16 −1
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@
#include <SkOverdrawColorFilter.h>
#include <SkOverdrawColorFilter.h>
#include <SkPicture.h>
#include <SkPicture.h>
#include <SkPictureRecorder.h>
#include <SkPictureRecorder.h>
#include "TreeInfo.h"
#include "VectorDrawable.h"
#include "VectorDrawable.h"
#include "utils/TraceUtils.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 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
    // 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 surfaceWidth = ceilf(node->getWidth() / float(LAYER_SIZE)) * LAYER_SIZE;
    const int surfaceHeight = ceilf(node->getHeight() / 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;
            Matrix4 windowTransform;
            damageAccumulator.computeCurrentTransform(&windowTransform);
            damageAccumulator.computeCurrentTransform(&windowTransform);
            node->getSkiaLayer()->inverseTransformInWindow = 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;
        return true;
    }
    }
+1 −1
Original line number Original line Diff line number Diff line
@@ -47,7 +47,7 @@ public:
                      const BakedOpRenderer::LightInfo& lightInfo) override;
                      const BakedOpRenderer::LightInfo& lightInfo) override;


    bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
    bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
                             bool wideColorGamut) override;
                             bool wideColorGamut, ErrorHandler* errorHandler) override;


    void renderFrame(const LayerUpdateQueue& layers, const SkRect& clip,
    void renderFrame(const LayerUpdateQueue& layers, const SkRect& clip,
                     const std::vector<sp<RenderNode>>& nodes, bool opaque, bool wideColorGamut,
                     const std::vector<sp<RenderNode>>& nodes, bool opaque, bool wideColorGamut,
+5 −2
Original line number Original line Diff line number Diff line
@@ -49,6 +49,7 @@ namespace uirenderer {


class AnimationContext;
class AnimationContext;
class DeferredLayerUpdater;
class DeferredLayerUpdater;
class ErrorHandler;
class Layer;
class Layer;
class Rect;
class Rect;
class RenderState;
class RenderState;
@@ -74,8 +75,10 @@ public:
     *
     *
     *  @return true if the layer has been created or updated
     *  @return true if the layer has been created or updated
     */
     */
    bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& dmgAccumulator) {
    bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& dmgAccumulator,
        return mRenderPipeline->createOrUpdateLayer(node, dmgAccumulator, mWideColorGamut);
                             ErrorHandler* errorHandler) {
        return mRenderPipeline->createOrUpdateLayer(node, dmgAccumulator, mWideColorGamut,
                errorHandler);
    }
    }


    /**
    /**
+2 −1
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@ class Surface;
namespace uirenderer {
namespace uirenderer {


class DeferredLayerUpdater;
class DeferredLayerUpdater;
class ErrorHandler;


namespace renderthread {
namespace renderthread {


@@ -68,7 +69,7 @@ public:
                              const BakedOpRenderer::LightInfo& lightInfo) = 0;
                              const BakedOpRenderer::LightInfo& lightInfo) = 0;
    virtual TaskManager* getTaskManager() = 0;
    virtual TaskManager* getTaskManager() = 0;
    virtual bool createOrUpdateLayer(RenderNode* node, const DamageAccumulator& damageAccumulator,
    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(std::vector<SkImage*>& mutableImages) = 0;
    virtual bool pinImages(LsaVector<sk_sp<Bitmap>>& images) = 0;
    virtual bool pinImages(LsaVector<sk_sp<Bitmap>>& images) = 0;
    virtual void unpinImages() = 0;
    virtual void unpinImages() = 0;
Loading