Fix failing SkiaPipeline unit tests
Fix SkiaPipeline unit tests failure, caused by double deallocation of SkCanvas in DeferLayer. Test: build and ran angler-eng, ran HWUI unit tests. Change-Id: I4a0a0113588e40a8ed32093d57efc6af3c0d7745
This commit is contained in:
@@ -201,12 +201,11 @@ namespace {
|
||||
template <typename T>
|
||||
class DeferLayer : public SkSurface_Base {
|
||||
public:
|
||||
DeferLayer(T *canvas)
|
||||
: SkSurface_Base(canvas->imageInfo(), nullptr)
|
||||
, mCanvas(canvas) {
|
||||
DeferLayer()
|
||||
: SkSurface_Base(T().imageInfo(), nullptr) {
|
||||
}
|
||||
SkCanvas* onNewCanvas() override {
|
||||
return mCanvas;
|
||||
return new T();
|
||||
}
|
||||
sk_sp<SkSurface> onNewSurface(const SkImageInfo&) override {
|
||||
return sk_sp<SkSurface>();
|
||||
@@ -214,8 +213,8 @@ public:
|
||||
sk_sp<SkImage> onNewImageSnapshot(SkBudgeted, SkCopyPixelsMode) override {
|
||||
return sk_sp<SkImage>();
|
||||
}
|
||||
T* canvas() { return static_cast<T*>(getCanvas()); }
|
||||
void onCopyOnWrite(ContentChangeMode) override {}
|
||||
T* mCanvas; // bare pointer, not owned/ref'd
|
||||
};
|
||||
}
|
||||
|
||||
@@ -280,10 +279,9 @@ RENDERTHREAD_TEST(SkiaPipeline, deferRenderNodeScene) {
|
||||
LayerUpdateQueue layerUpdateQueue;
|
||||
SkRect dirty = SkRect::MakeWH(800, 600);
|
||||
auto pipeline = std::make_unique<SkiaOpenGLPipeline>(renderThread);
|
||||
DeferTestCanvas canvas;
|
||||
sk_sp<SkSurface> surface(new DeferLayer<DeferTestCanvas>(&canvas));
|
||||
sk_sp<DeferLayer<DeferTestCanvas>> surface(new DeferLayer<DeferTestCanvas>());
|
||||
pipeline->renderFrame(layerUpdateQueue, dirty, nodes, true, contentDrawBounds, surface);
|
||||
EXPECT_EQ(4, canvas.mDrawCounter);
|
||||
EXPECT_EQ(4, surface->canvas()->mDrawCounter);
|
||||
}
|
||||
|
||||
RENDERTHREAD_TEST(SkiaPipeline, clipped) {
|
||||
@@ -311,11 +309,10 @@ RENDERTHREAD_TEST(SkiaPipeline, clipped) {
|
||||
LayerUpdateQueue layerUpdateQueue;
|
||||
SkRect dirty = SkRect::MakeLTRB(10, 20, 30, 40);
|
||||
auto pipeline = std::make_unique<SkiaOpenGLPipeline>(renderThread);
|
||||
ClippedTestCanvas canvas;
|
||||
sk_sp<SkSurface> surface(new DeferLayer<ClippedTestCanvas>(&canvas));
|
||||
sk_sp<DeferLayer<ClippedTestCanvas>> surface(new DeferLayer<ClippedTestCanvas>());
|
||||
pipeline->renderFrame(layerUpdateQueue, dirty, nodes, true,
|
||||
SkRect::MakeWH(CANVAS_WIDTH, CANVAS_HEIGHT), surface);
|
||||
EXPECT_EQ(1, canvas.mDrawCounter);
|
||||
EXPECT_EQ(1, surface->canvas()->mDrawCounter);
|
||||
}
|
||||
|
||||
RENDERTHREAD_TEST(SkiaPipeline, clip_replace) {
|
||||
@@ -346,9 +343,8 @@ RENDERTHREAD_TEST(SkiaPipeline, clip_replace) {
|
||||
LayerUpdateQueue layerUpdateQueue;
|
||||
SkRect dirty = SkRect::MakeLTRB(10, 10, 40, 40);
|
||||
auto pipeline = std::make_unique<SkiaOpenGLPipeline>(renderThread);
|
||||
ClipReplaceTestCanvas canvas;
|
||||
sk_sp<SkSurface> surface(new DeferLayer<ClipReplaceTestCanvas>(&canvas));
|
||||
sk_sp<DeferLayer<ClipReplaceTestCanvas>> surface(new DeferLayer<ClipReplaceTestCanvas>());
|
||||
pipeline->renderFrame(layerUpdateQueue, dirty, nodes, true,
|
||||
SkRect::MakeWH(CANVAS_WIDTH, CANVAS_HEIGHT), surface);
|
||||
EXPECT_EQ(1, canvas.mDrawCounter);
|
||||
EXPECT_EQ(1, surface->canvas()->mDrawCounter);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user