From 706790a7356fead7ee7600b0b5b5973c03944411 Mon Sep 17 00:00:00 2001 From: Jim Graham Date: Thu, 16 Sep 2021 21:36:12 -0700 Subject: [PATCH] hold DisplayList objects in SkiaGPUObject wrappers --- flow/layers/display_list_layer.cc | 12 ++++----- flow/layers/display_list_layer.h | 11 +++++---- flow/layers/display_list_layer_unittests.cc | 27 +++++++++++++++------ flow/testing/diff_context_test.cc | 3 ++- lib/ui/compositing/scene_builder.cc | 3 ++- lib/ui/painting/picture.cc | 15 ++++++------ lib/ui/painting/picture.h | 13 ++++++---- lib/ui/painting/picture_recorder.cc | 4 ++- 8 files changed, 54 insertions(+), 34 deletions(-) diff --git a/flow/layers/display_list_layer.cc b/flow/layers/display_list_layer.cc index 09c343b2d776b..4ad12cf2ca307 100644 --- a/flow/layers/display_list_layer.cc +++ b/flow/layers/display_list_layer.cc @@ -9,11 +9,11 @@ namespace flutter { DisplayListLayer::DisplayListLayer(const SkPoint& offset, - sk_sp display_list, + SkiaGPUObject display_list, bool is_complex, bool will_change) : offset_(offset), - display_list_(display_list), + display_list_(std::move(display_list)), is_complex_(is_complex), will_change_(will_change) {} @@ -42,15 +42,15 @@ void DisplayListLayer::Diff(DiffContext* context, const Layer* old_layer) { #endif } context->PushTransform(SkMatrix::Translate(offset_.x(), offset_.y())); - context->AddLayerBounds(display_list_->bounds()); + context->AddLayerBounds(display_list()->bounds()); context->SetLayerPaintRegion(this, context->CurrentSubtreeRegion()); } bool DisplayListLayer::Compare(DiffContext::Statistics& statistics, const DisplayListLayer* l1, const DisplayListLayer* l2) { - const auto& dl1 = l1->display_list_; - const auto& dl2 = l2->display_list_; + const auto& dl1 = l1->display_list_.skia_object(); + const auto& dl2 = l2->display_list_.skia_object(); if (dl1.get() == dl2.get()) { statistics.AddSameInstancePicture(); return true; @@ -101,7 +101,7 @@ void DisplayListLayer::Preroll(PrerollContext* context, void DisplayListLayer::Paint(PaintContext& context) const { TRACE_EVENT0("flutter", "DisplayListLayer::Paint"); - FML_DCHECK(display_list_.get()); + FML_DCHECK(display_list_.skia_object()); FML_DCHECK(needs_painting(context)); SkAutoCanvasRestore save(context.leaf_nodes_canvas, true); diff --git a/flow/layers/display_list_layer.h b/flow/layers/display_list_layer.h index 4760d2d200654..c3203da57ce8f 100644 --- a/flow/layers/display_list_layer.h +++ b/flow/layers/display_list_layer.h @@ -7,6 +7,7 @@ #include "flutter/flow/display_list.h" #include "flutter/flow/layers/layer.h" +#include "flutter/flow/skia_gpu_object.h" namespace flutter { @@ -15,11 +16,13 @@ class DisplayListLayer : public Layer { static constexpr size_t kMaxBytesToCompare = 10000; DisplayListLayer(const SkPoint& offset, - sk_sp display_list, + SkiaGPUObject display_list, bool is_complex, bool will_change); - DisplayList* display_list() const { return display_list_.get(); } + DisplayList* display_list() const { + return display_list_.skia_object().get(); + } #ifdef FLUTTER_ENABLE_DIFF_CONTEXT @@ -39,14 +42,12 @@ class DisplayListLayer : public Layer { private: SkPoint offset_; - sk_sp display_list_; + flutter::SkiaGPUObject display_list_; bool is_complex_ = false; bool will_change_ = false; #ifdef FLUTTER_ENABLE_DIFF_CONTEXT - sk_sp SerializedPicture() const; - mutable sk_sp cached_serialized_picture_; static bool Compare(DiffContext::Statistics& statistics, const DisplayListLayer* l1, const DisplayListLayer* l2); diff --git a/flow/layers/display_list_layer_unittests.cc b/flow/layers/display_list_layer_unittests.cc index ad1842b8c5a73..b83734f6c7b99 100644 --- a/flow/layers/display_list_layer_unittests.cc +++ b/flow/layers/display_list_layer_unittests.cc @@ -7,6 +7,7 @@ #include "flutter/flow/layers/display_list_layer.h" #include "flutter/flow/testing/diff_context_test.h" +#include "flutter/flow/testing/skia_gpu_object_layer_test.h" #include "flutter/fml/macros.h" #include "flutter/testing/mock_canvas.h" @@ -17,22 +18,27 @@ namespace flutter { namespace testing { -using DisplayListLayerTest = LayerTest; +using DisplayListLayerTest = SkiaGPUObjectLayerTest; #ifndef NDEBUG TEST_F(DisplayListLayerTest, PaintBeforePrerollInvalidDisplayListDies) { const SkPoint layer_offset = SkPoint::Make(0.0f, 0.0f); auto layer = std::make_shared( - layer_offset, sk_ref_sp(nullptr), false, false); + layer_offset, SkiaGPUObject(), false, false); EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()), - "display_list_\\.get\\(\\)"); + "display_list_\\.skia_object\\(\\)"); } TEST_F(DisplayListLayerTest, PaintBeforePrerollDies) { const SkPoint layer_offset = SkPoint::Make(0.0f, 0.0f); + const SkRect picture_bounds = SkRect::MakeLTRB(5.0f, 6.0f, 20.5f, 21.5f); + DisplayListBuilder builder; + builder.drawRect(picture_bounds); + auto display_list = builder.Build(); auto layer = std::make_shared( - layer_offset, sk_make_sp(), false, false); + layer_offset, SkiaGPUObject(display_list, unref_queue()), + false, false); EXPECT_EQ(layer->paint_bounds(), SkRect::MakeEmpty()); EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()), @@ -41,8 +47,13 @@ TEST_F(DisplayListLayerTest, PaintBeforePrerollDies) { TEST_F(DisplayListLayerTest, PaintingEmptyLayerDies) { const SkPoint layer_offset = SkPoint::Make(0.0f, 0.0f); + const SkRect picture_bounds = SkRect::MakeEmpty(); + DisplayListBuilder builder; + builder.drawRect(picture_bounds); + auto display_list = builder.Build(); auto layer = std::make_shared( - layer_offset, sk_make_sp(), false, false); + layer_offset, SkiaGPUObject(display_list, unref_queue()), + false, false); layer->Preroll(preroll_context(), SkMatrix()); EXPECT_EQ(layer->paint_bounds(), SkRect::MakeEmpty()); @@ -55,7 +66,7 @@ TEST_F(DisplayListLayerTest, PaintingEmptyLayerDies) { TEST_F(DisplayListLayerTest, InvalidDisplayListDies) { const SkPoint layer_offset = SkPoint::Make(0.0f, 0.0f); auto layer = std::make_shared( - layer_offset, sk_ref_sp(nullptr), false, false); + layer_offset, SkiaGPUObject(), false, false); // Crashes reading a nullptr. EXPECT_DEATH_IF_SUPPORTED(layer->Preroll(preroll_context(), SkMatrix()), ""); @@ -70,8 +81,8 @@ TEST_F(DisplayListLayerTest, SimpleDisplayList) { DisplayListBuilder builder; builder.drawRect(picture_bounds); auto display_list = builder.Build(); - auto layer = std::make_shared(layer_offset, display_list, - false, false); + auto layer = std::make_shared( + layer_offset, SkiaGPUObject(display_list, unref_queue()), false, false); layer->Preroll(preroll_context(), SkMatrix()); EXPECT_EQ(layer->paint_bounds(), diff --git a/flow/testing/diff_context_test.cc b/flow/testing/diff_context_test.cc index 74f26f780c659..54cafc36faa00 100644 --- a/flow/testing/diff_context_test.cc +++ b/flow/testing/diff_context_test.cc @@ -53,7 +53,8 @@ sk_sp DiffContextTest::CreateDisplayList(const SkRect& bounds, std::shared_ptr DiffContextTest::CreateDisplayListLayer( sk_sp display_list, const SkPoint& offset) { - return std::make_shared(offset, display_list, false, false); + return std::make_shared( + offset, SkiaGPUObject(display_list, unref_queue()), false, false); } std::shared_ptr DiffContextTest::CreateContainerLayer( diff --git a/lib/ui/compositing/scene_builder.cc b/lib/ui/compositing/scene_builder.cc index e7c2b3ea151cc..3250be0e82d21 100644 --- a/lib/ui/compositing/scene_builder.cc +++ b/lib/ui/compositing/scene_builder.cc @@ -273,7 +273,8 @@ void SceneBuilder::addPicture(double dx, AddLayer(std::move(layer)); } else { auto layer = std::make_unique( - SkPoint::Make(dx, dy), picture->display_list(), !!(hints & 1), + SkPoint::Make(dx, dy), + UIDartState::CreateGPUObject(picture->display_list()), !!(hints & 1), !!(hints & 2)); AddLayer(std::move(layer)); } diff --git a/lib/ui/painting/picture.cc b/lib/ui/painting/picture.cc index ca360610f3bf6..75e88558335e7 100644 --- a/lib/ui/painting/picture.cc +++ b/lib/ui/painting/picture.cc @@ -37,8 +37,9 @@ fml::RefPtr Picture::Create( return canvas_picture; } -fml::RefPtr Picture::Create(Dart_Handle dart_handle, - sk_sp display_list) { +fml::RefPtr Picture::Create( + Dart_Handle dart_handle, + flutter::SkiaGPUObject display_list) { auto canvas_picture = fml::MakeRefCounted(std::move(display_list)); canvas_picture->AssociateWithDartWrapper(dart_handle); @@ -48,7 +49,7 @@ fml::RefPtr Picture::Create(Dart_Handle dart_handle, Picture::Picture(flutter::SkiaGPUObject picture) : picture_(std::move(picture)) {} -Picture::Picture(sk_sp display_list) +Picture::Picture(flutter::SkiaGPUObject display_list) : display_list_(std::move(display_list)) {} Picture::~Picture() = default; @@ -56,9 +57,9 @@ Picture::~Picture() = default; Dart_Handle Picture::toImage(uint32_t width, uint32_t height, Dart_Handle raw_image_callback) { - if (display_list_) { + if (display_list_.skia_object()) { return RasterizeToImage( - [display_list = display_list_](SkCanvas* canvas) { + [display_list = display_list_.skia_object()](SkCanvas* canvas) { display_list->RenderTo(canvas); }, width, height, raw_image_callback); @@ -80,8 +81,8 @@ void Picture::dispose() { size_t Picture::GetAllocationSize() const { if (auto picture = picture_.skia_object()) { return picture->approximateBytesUsed() + sizeof(Picture); - } else if (display_list_) { - return display_list_->bytes() + sizeof(Picture); + } else if (auto display_list = display_list_.skia_object()) { + return display_list->bytes() + sizeof(Picture); } else { return sizeof(Picture); } diff --git a/lib/ui/painting/picture.h b/lib/ui/painting/picture.h index 6116b52b9d800..bcaf4ebbc8314 100644 --- a/lib/ui/painting/picture.h +++ b/lib/ui/painting/picture.h @@ -27,11 +27,14 @@ class Picture : public RefCountedDartWrappable { ~Picture() override; static fml::RefPtr Create(Dart_Handle dart_handle, flutter::SkiaGPUObject picture); - static fml::RefPtr Create(Dart_Handle dart_handle, - sk_sp display_list); + static fml::RefPtr Create( + Dart_Handle dart_handle, + flutter::SkiaGPUObject display_list); sk_sp picture() const { return picture_.skia_object(); } - sk_sp display_list() const { return display_list_; } + sk_sp display_list() const { + return display_list_.skia_object(); + } Dart_Handle toImage(uint32_t width, uint32_t height, @@ -56,10 +59,10 @@ class Picture : public RefCountedDartWrappable { private: Picture(flutter::SkiaGPUObject picture); - Picture(sk_sp display_list); + Picture(flutter::SkiaGPUObject display_list); flutter::SkiaGPUObject picture_; - sk_sp display_list_; + flutter::SkiaGPUObject display_list_; }; } // namespace flutter diff --git a/lib/ui/painting/picture_recorder.cc b/lib/ui/painting/picture_recorder.cc index ed6f88cfeda78..945b20c309aef 100644 --- a/lib/ui/painting/picture_recorder.cc +++ b/lib/ui/painting/picture_recorder.cc @@ -56,7 +56,9 @@ fml::RefPtr PictureRecorder::endRecording(Dart_Handle dart_picture) { fml::RefPtr picture; if (display_list_recorder_) { - picture = Picture::Create(dart_picture, display_list_recorder_->Build()); + picture = Picture::Create( + dart_picture, + UIDartState::CreateGPUObject(display_list_recorder_->Build())); display_list_recorder_ = nullptr; } else { picture = Picture::Create(