diff options
author | nyquist <nyquist@chromium.org> | 2016-02-11 16:15:04 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-12 00:16:29 +0000 |
commit | 16febb404edc59fb8dbb13a13c68ccecfb5a0bf1 (patch) | |
tree | 882135af7b509fdc7ccebb66193039c421871711 /cc | |
parent | 23258d3c881e5c053f7bb687a13f860ea55364ef (diff) | |
download | chromium_src-16febb404edc59fb8dbb13a13c68ccecfb5a0bf1.zip chromium_src-16febb404edc59fb8dbb13a13c68ccecfb5a0bf1.tar.gz chromium_src-16febb404edc59fb8dbb13a13c68ccecfb5a0bf1.tar.bz2 |
Add framework for (de)serialization of images in SkPicture
This CL adds Plumbing for picture serialization and deserialization
from //blimp to DrawingDisplayItem.
BUG=577262
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Review URL: https://codereview.chromium.org/1675763002
Cr-Commit-Position: refs/heads/master@{#375053}
Diffstat (limited to 'cc')
36 files changed, 340 insertions, 69 deletions
diff --git a/cc/BUILD.gn b/cc/BUILD.gn index 70f28d2..69c41c9 100644 --- a/cc/BUILD.gn +++ b/cc/BUILD.gn @@ -319,6 +319,7 @@ component("cc") { "proto/gfx_conversions.h", "proto/gpu_conversions.cc", "proto/gpu_conversions.h", + "proto/image_serialization_processor.h", "proto/skia_conversions.cc", "proto/skia_conversions.h", "quads/content_draw_quad_base.cc", @@ -584,6 +585,8 @@ source_set("test_support") { "test/fake_display_list_recording_source.h", "test/fake_external_begin_frame_source.cc", "test/fake_external_begin_frame_source.h", + "test/fake_image_serialization_processor.cc", + "test/fake_image_serialization_processor.h", "test/fake_impl_task_runner_provider.h", "test/fake_layer_tree_host.cc", "test/fake_layer_tree_host.h", @@ -381,6 +381,7 @@ 'proto/gfx_conversions.h', 'proto/gpu_conversions.cc', 'proto/gpu_conversions.h', + 'proto/image_serialization_processor.h', 'proto/skia_conversions.cc', 'proto/skia_conversions.h', 'quads/content_draw_quad_base.cc', diff --git a/cc/cc_tests.gyp b/cc/cc_tests.gyp index d9fe4b1..b8f5b1c 100644 --- a/cc/cc_tests.gyp +++ b/cc/cc_tests.gyp @@ -187,6 +187,8 @@ 'test/fake_display_list_recording_source.h', 'test/fake_external_begin_frame_source.cc', 'test/fake_external_begin_frame_source.h', + 'test/fake_image_serialization_processor.cc', + 'test/fake_image_serialization_processor.h', 'test/fake_impl_task_runner_provider.h', 'test/fake_layer_tree_host.cc', 'test/fake_layer_tree_host.h', diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc index f9df22cd..17c920f 100644 --- a/cc/layers/picture_layer.cc +++ b/cc/layers/picture_layer.cc @@ -195,7 +195,9 @@ void PictureLayer::LayerSpecificPropertiesToProto( DropRecordingSourceContentIfInvalid(); proto::PictureLayerProperties* picture = proto->mutable_picture(); - recording_source_->ToProtobuf(picture->mutable_recording_source()); + recording_source_->ToProtobuf( + picture->mutable_recording_source(), + layer_tree_host()->image_serialization_processor()); RegionToProto(*invalidation_.region(), picture->mutable_invalidation()); RectToProto(last_updated_visible_layer_rect_, picture->mutable_last_updated_visible_layer_rect()); @@ -211,7 +213,9 @@ void PictureLayer::FromLayerSpecificPropertiesProto( const proto::LayerProperties& proto) { Layer::FromLayerSpecificPropertiesProto(proto); const proto::PictureLayerProperties& picture = proto.picture(); - recording_source_->FromProtobuf(picture.recording_source()); + recording_source_->FromProtobuf( + picture.recording_source(), + layer_tree_host()->image_serialization_processor()); Region new_invalidation = RegionFromProto(picture.invalidation()); invalidation_.Swap(&new_invalidation); diff --git a/cc/layers/picture_layer_unittest.cc b/cc/layers/picture_layer_unittest.cc index 1ce7567..7c35d55 100644 --- a/cc/layers/picture_layer_unittest.cc +++ b/cc/layers/picture_layer_unittest.cc @@ -15,6 +15,7 @@ #include "cc/playback/display_item_list_settings.h" #include "cc/proto/layer.pb.h" #include "cc/test/fake_display_list_recording_source.h" +#include "cc/test/fake_image_serialization_processor.h" #include "cc/test/fake_layer_tree_host.h" #include "cc/test/fake_output_surface.h" #include "cc/test/fake_picture_layer.h" @@ -69,8 +70,14 @@ class TestSerializationPictureLayer : public PictureLayer { FakeLayerTreeHostClient host_client(FakeLayerTreeHostClient::DIRECT_3D); TestTaskGraphRunner task_graph_runner; + LayerTreeSettings settings; + scoped_ptr<FakeImageSerializationProcessor> + fake_image_serialization_processor = + make_scoped_ptr(new FakeImageSerializationProcessor); scoped_ptr<FakeLayerTreeHost> host = - FakeLayerTreeHost::Create(&host_client, &task_graph_runner); + FakeLayerTreeHost::Create(&host_client, &task_graph_runner, settings, + CompositorMode::SINGLE_THREADED, + fake_image_serialization_processor.get()); scoped_refptr<TestSerializationPictureLayer> layer = TestSerializationPictureLayer::Create(recording_source_viewport_); host->SetRootLayer(layer); @@ -104,8 +111,14 @@ namespace { TEST(PictureLayerTest, TestSetAllPropsSerializationDeserialization) { FakeLayerTreeHostClient host_client(FakeLayerTreeHostClient::DIRECT_3D); TestTaskGraphRunner task_graph_runner; + LayerTreeSettings settings; + scoped_ptr<FakeImageSerializationProcessor> + fake_image_serialization_processor = + make_scoped_ptr(new FakeImageSerializationProcessor); scoped_ptr<FakeLayerTreeHost> host = - FakeLayerTreeHost::Create(&host_client, &task_graph_runner); + FakeLayerTreeHost::Create(&host_client, &task_graph_runner, settings, + CompositorMode::SINGLE_THREADED, + fake_image_serialization_processor.get()); gfx::Size recording_source_viewport(256, 256); scoped_refptr<TestSerializationPictureLayer> layer = @@ -131,9 +144,16 @@ TEST(PictureLayerTest, TestSetAllPropsSerializationDeserialization) { TEST(PictureLayerTest, TestSerializationDeserialization) { FakeLayerTreeHostClient host_client(FakeLayerTreeHostClient::DIRECT_3D); TestTaskGraphRunner task_graph_runner; + LayerTreeSettings settings; + settings.verify_property_trees = true; + settings.use_compositor_animation_timelines = true; + scoped_ptr<FakeImageSerializationProcessor> + fake_image_serialization_processor = + make_scoped_ptr(new FakeImageSerializationProcessor); scoped_ptr<FakeLayerTreeHost> host = - FakeLayerTreeHost::Create(&host_client, &task_graph_runner); - + FakeLayerTreeHost::Create(&host_client, &task_graph_runner, settings, + CompositorMode::SINGLE_THREADED, + fake_image_serialization_processor.get()); gfx::Size recording_source_viewport(256, 256); scoped_refptr<TestSerializationPictureLayer> layer = TestSerializationPictureLayer::Create(recording_source_viewport); diff --git a/cc/playback/clip_display_item.cc b/cc/playback/clip_display_item.cc index 4ab8e5d..92166c1 100644 --- a/cc/playback/clip_display_item.cc +++ b/cc/playback/clip_display_item.cc @@ -18,6 +18,7 @@ #include "ui/gfx/skia_util.h" namespace cc { +class ImageSerializationProcessor; ClipDisplayItem::ClipDisplayItem( const gfx::Rect& clip_rect, @@ -46,7 +47,9 @@ void ClipDisplayItem::SetNew(const gfx::Rect& clip_rect, ClipDisplayItem::~ClipDisplayItem() {} -void ClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { +void ClipDisplayItem::ToProtobuf( + proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) const { proto->set_type(proto::DisplayItem::Type_Clip); proto::ClipDisplayItem* details = proto->mutable_clip_item(); @@ -117,7 +120,9 @@ EndClipDisplayItem::EndClipDisplayItem(const proto::DisplayItem& proto) { EndClipDisplayItem::~EndClipDisplayItem() { } -void EndClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { +void EndClipDisplayItem::ToProtobuf( + proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) const { proto->set_type(proto::DisplayItem::Type_EndClip); } diff --git a/cc/playback/clip_display_item.h b/cc/playback/clip_display_item.h index 97e877e..2715ce3 100644 --- a/cc/playback/clip_display_item.h +++ b/cc/playback/clip_display_item.h @@ -18,6 +18,7 @@ class SkCanvas; namespace cc { +class ImageSerializationProcessor; class CC_EXPORT ClipDisplayItem : public DisplayItem { public: @@ -26,7 +27,9 @@ class CC_EXPORT ClipDisplayItem : public DisplayItem { explicit ClipDisplayItem(const proto::DisplayItem& proto); ~ClipDisplayItem() override; - void ToProtobuf(proto::DisplayItem* proto) const override; + void ToProtobuf(proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) + const override; void Raster(SkCanvas* canvas, const gfx::Rect& canvas_target_playback_rect, SkPicture::AbortCallback* callback) const override; @@ -51,7 +54,9 @@ class CC_EXPORT EndClipDisplayItem : public DisplayItem { explicit EndClipDisplayItem(const proto::DisplayItem& proto); ~EndClipDisplayItem() override; - void ToProtobuf(proto::DisplayItem* proto) const override; + void ToProtobuf(proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) + const override; void Raster(SkCanvas* canvas, const gfx::Rect& canvas_target_playback_rect, SkPicture::AbortCallback* callback) const override; diff --git a/cc/playback/clip_path_display_item.cc b/cc/playback/clip_path_display_item.cc index 1a39af2..64ad813 100644 --- a/cc/playback/clip_path_display_item.cc +++ b/cc/playback/clip_path_display_item.cc @@ -14,6 +14,7 @@ #include "third_party/skia/include/core/SkCanvas.h" namespace cc { +class ImageSerializationProcessor; ClipPathDisplayItem::ClipPathDisplayItem(const SkPath& clip_path, SkRegion::Op clip_op, @@ -49,7 +50,9 @@ void ClipPathDisplayItem::SetNew(const SkPath& clip_path, antialias_ = antialias; } -void ClipPathDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { +void ClipPathDisplayItem::ToProtobuf( + proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) const { proto->set_type(proto::DisplayItem::Type_ClipPath); proto::ClipPathDisplayItem* details = proto->mutable_clip_path_item(); @@ -96,7 +99,9 @@ EndClipPathDisplayItem::EndClipPathDisplayItem( EndClipPathDisplayItem::~EndClipPathDisplayItem() { } -void EndClipPathDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { +void EndClipPathDisplayItem::ToProtobuf( + proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) const { proto->set_type(proto::DisplayItem::Type_EndClipPath); } diff --git a/cc/playback/clip_path_display_item.h b/cc/playback/clip_path_display_item.h index 0ad1eff..f946c14 100644 --- a/cc/playback/clip_path_display_item.h +++ b/cc/playback/clip_path_display_item.h @@ -16,6 +16,7 @@ class SkCanvas; namespace cc { +class ImageSerializationProcessor; class CC_EXPORT ClipPathDisplayItem : public DisplayItem { public: @@ -23,7 +24,9 @@ class CC_EXPORT ClipPathDisplayItem : public DisplayItem { explicit ClipPathDisplayItem(const proto::DisplayItem& proto); ~ClipPathDisplayItem() override; - void ToProtobuf(proto::DisplayItem* proto) const override; + void ToProtobuf(proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) + const override; void Raster(SkCanvas* canvas, const gfx::Rect& canvas_target_playback_rect, SkPicture::AbortCallback* callback) const override; @@ -52,7 +55,9 @@ class CC_EXPORT EndClipPathDisplayItem : public DisplayItem { return make_scoped_ptr(new EndClipPathDisplayItem()); } - void ToProtobuf(proto::DisplayItem* proto) const override; + void ToProtobuf(proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) + const override; void Raster(SkCanvas* canvas, const gfx::Rect& canvas_target_playback_rect, SkPicture::AbortCallback* callback) const override; diff --git a/cc/playback/compositing_display_item.cc b/cc/playback/compositing_display_item.cc index 6828fcf..964406a0 100644 --- a/cc/playback/compositing_display_item.cc +++ b/cc/playback/compositing_display_item.cc @@ -21,6 +21,7 @@ #include "ui/gfx/skia_util.h" namespace cc { +class ImageSerializationProcessor; CompositingDisplayItem::CompositingDisplayItem( uint8_t alpha, @@ -77,7 +78,9 @@ void CompositingDisplayItem::SetNew(uint8_t alpha, lcd_text_requires_opaque_layer_ = lcd_text_requires_opaque_layer; } -void CompositingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { +void CompositingDisplayItem::ToProtobuf( + proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) const { proto->set_type(proto::DisplayItem::Type_Compositing); proto::CompositingDisplayItem* details = proto->mutable_compositing_item(); @@ -139,7 +142,9 @@ EndCompositingDisplayItem::EndCompositingDisplayItem( EndCompositingDisplayItem::~EndCompositingDisplayItem() { } -void EndCompositingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { +void EndCompositingDisplayItem::ToProtobuf( + proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) const { proto->set_type(proto::DisplayItem::Type_EndCompositing); } diff --git a/cc/playback/compositing_display_item.h b/cc/playback/compositing_display_item.h index 4745208..d723ce1 100644 --- a/cc/playback/compositing_display_item.h +++ b/cc/playback/compositing_display_item.h @@ -20,6 +20,7 @@ class SkCanvas; namespace cc { +class ImageSerializationProcessor; class CC_EXPORT CompositingDisplayItem : public DisplayItem { public: @@ -31,7 +32,9 @@ class CC_EXPORT CompositingDisplayItem : public DisplayItem { explicit CompositingDisplayItem(const proto::DisplayItem& proto); ~CompositingDisplayItem() override; - void ToProtobuf(proto::DisplayItem* proto) const override; + void ToProtobuf(proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) + const override; void Raster(SkCanvas* canvas, const gfx::Rect& canvas_target_playback_rect, SkPicture::AbortCallback* callback) const override; @@ -67,7 +70,9 @@ class CC_EXPORT EndCompositingDisplayItem : public DisplayItem { return make_scoped_ptr(new EndCompositingDisplayItem()); } - void ToProtobuf(proto::DisplayItem* proto) const override; + void ToProtobuf(proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) + const override; void Raster(SkCanvas* canvas, const gfx::Rect& canvas_target_playback_rect, SkPicture::AbortCallback* callback) const override; diff --git a/cc/playback/display_item.h b/cc/playback/display_item.h index c4140f33..3f61adb 100644 --- a/cc/playback/display_item.h +++ b/cc/playback/display_item.h @@ -16,16 +16,19 @@ class SkCanvas; namespace cc { +class ImageSerializationProcessor; namespace proto { class DisplayItem; -} +} // namespace proto class CC_EXPORT DisplayItem { public: virtual ~DisplayItem() {} - virtual void ToProtobuf(proto::DisplayItem* proto) const = 0; + virtual void ToProtobuf( + proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) const = 0; virtual void Raster(SkCanvas* canvas, const gfx::Rect& canvas_target_playback_rect, SkPicture::AbortCallback* callback) const = 0; diff --git a/cc/playback/display_item_list.cc b/cc/playback/display_item_list.cc index 6f2f52c..be5b9d4 100644 --- a/cc/playback/display_item_list.cc +++ b/cc/playback/display_item_list.cc @@ -29,6 +29,7 @@ #include "ui/gfx/skia_util.h" namespace cc { +class ImageSerializationProcessor; namespace { @@ -56,7 +57,8 @@ scoped_refptr<DisplayItemList> DisplayItemList::Create( } scoped_refptr<DisplayItemList> DisplayItemList::CreateFromProto( - const proto::DisplayItemList& proto) { + const proto::DisplayItemList& proto, + ImageSerializationProcessor* image_serialization_processor) { gfx::Rect layer_rect = ProtoToRect(proto.layer_rect()); scoped_refptr<DisplayItemList> list = DisplayItemList::Create(ProtoToRect(proto.layer_rect()), @@ -64,8 +66,8 @@ scoped_refptr<DisplayItemList> DisplayItemList::CreateFromProto( for (int i = 0; i < proto.items_size(); i++) { const proto::DisplayItem& item_proto = proto.items(i); - DisplayItemProtoFactory::AllocateAndConstruct(layer_rect, list.get(), - item_proto); + DisplayItemProtoFactory::AllocateAndConstruct( + layer_rect, list.get(), item_proto, image_serialization_processor); } list->Finalize(); @@ -97,7 +99,9 @@ DisplayItemList::DisplayItemList(gfx::Rect layer_rect, DisplayItemList::~DisplayItemList() { } -void DisplayItemList::ToProtobuf(proto::DisplayItemList* proto) { +void DisplayItemList::ToProtobuf( + proto::DisplayItemList* proto, + ImageSerializationProcessor* image_serialization_processor) { // The flattened SkPicture approach is going away, and the proto // doesn't currently support serializing that flattened picture. DCHECK(retain_individual_display_items_); @@ -107,7 +111,7 @@ void DisplayItemList::ToProtobuf(proto::DisplayItemList* proto) { DCHECK_EQ(0, proto->items_size()); for (const auto& item : items_) - item.ToProtobuf(proto->add_items()); + item.ToProtobuf(proto->add_items(), image_serialization_processor); } void DisplayItemList::Raster(SkCanvas* canvas, diff --git a/cc/playback/display_item_list.h b/cc/playback/display_item_list.h index bab4c3f..d8b14b5 100644 --- a/cc/playback/display_item_list.h +++ b/cc/playback/display_item_list.h @@ -28,6 +28,7 @@ class SkPictureRecorder; namespace cc { class DisplayItem; class DrawingDisplayItem; +class ImageSerializationProcessor; namespace proto { class DisplayItemList; @@ -49,12 +50,14 @@ class CC_EXPORT DisplayItemList // TODO(dtrainor): Pass in a list of possible DisplayItems to reuse // (crbug.com/548434). static scoped_refptr<DisplayItemList> CreateFromProto( - const proto::DisplayItemList& proto); + const proto::DisplayItemList& proto, + ImageSerializationProcessor* image_serialization_processor); // Creates a Protobuf representing the state of this DisplayItemList. // TODO(dtrainor): Don't resend DisplayItems that were already serialized // (crbug.com/548434). - void ToProtobuf(proto::DisplayItemList* proto); + void ToProtobuf(proto::DisplayItemList* proto, + ImageSerializationProcessor* image_serialization_processor); void Raster(SkCanvas* canvas, SkPicture::AbortCallback* callback, diff --git a/cc/playback/display_item_list_unittest.cc b/cc/playback/display_item_list_unittest.cc index 60f9124..a6aac41 100644 --- a/cc/playback/display_item_list_unittest.cc +++ b/cc/playback/display_item_list_unittest.cc @@ -19,6 +19,7 @@ #include "cc/playback/float_clip_display_item.h" #include "cc/playback/transform_display_item.h" #include "cc/proto/display_item.pb.h" +#include "cc/test/fake_image_serialization_processor.h" #include "cc/test/skia_common.h" #include "skia/ext/refptr.h" #include "testing/gtest/include/gtest/gtest.h" @@ -79,11 +80,15 @@ void ValidateDisplayItemListSerialization(const gfx::Size& layer_size, scoped_refptr<DisplayItemList> list) { list->Finalize(); + scoped_ptr<FakeImageSerializationProcessor> + fake_image_serialization_processor = + make_scoped_ptr(new FakeImageSerializationProcessor); + // Serialize and deserialize the DisplayItemList. proto::DisplayItemList proto; - list->ToProtobuf(&proto); - scoped_refptr<DisplayItemList> new_list = - DisplayItemList::CreateFromProto(proto); + list->ToProtobuf(&proto, fake_image_serialization_processor.get()); + scoped_refptr<DisplayItemList> new_list = DisplayItemList::CreateFromProto( + proto, fake_image_serialization_processor.get()); EXPECT_TRUE( AreDisplayListDrawingResultsSame(gfx::Rect(layer_size), list, new_list)); diff --git a/cc/playback/display_item_proto_factory.cc b/cc/playback/display_item_proto_factory.cc index 88d5066..0dedda3 100644 --- a/cc/playback/display_item_proto_factory.cc +++ b/cc/playback/display_item_proto_factory.cc @@ -15,12 +15,14 @@ #include "ui/gfx/geometry/rect.h" namespace cc { +class ImageSerializationProcessor; // static void DisplayItemProtoFactory::AllocateAndConstruct( const gfx::Rect& visual_rect, DisplayItemList* list, - const proto::DisplayItem& proto) { + const proto::DisplayItem& proto, + ImageSerializationProcessor* image_serialization_processor) { switch (proto.type()) { case proto::DisplayItem::Type_Clip: list->CreateAndAppendItem<ClipDisplayItem>(visual_rect, proto); @@ -41,7 +43,8 @@ void DisplayItemProtoFactory::AllocateAndConstruct( list->CreateAndAppendItem<EndCompositingDisplayItem>(visual_rect, proto); return; case proto::DisplayItem::Type_Drawing: - list->CreateAndAppendItem<DrawingDisplayItem>(visual_rect, proto); + list->CreateAndAppendItem<DrawingDisplayItem>( + visual_rect, proto, image_serialization_processor); return; case proto::DisplayItem::Type_Filter: list->CreateAndAppendItem<FilterDisplayItem>(visual_rect, proto); diff --git a/cc/playback/display_item_proto_factory.h b/cc/playback/display_item_proto_factory.h index edc6118..f881e79 100644 --- a/cc/playback/display_item_proto_factory.h +++ b/cc/playback/display_item_proto_factory.h @@ -11,6 +11,7 @@ #include "cc/playback/display_item_list.h" namespace cc { +class ImageSerializationProcessor; namespace proto { class DisplayItem; @@ -18,9 +19,11 @@ class DisplayItem; class DisplayItemProtoFactory { public: - static void AllocateAndConstruct(const gfx::Rect& visual_rect, - DisplayItemList* list, - const proto::DisplayItem& proto); + static void AllocateAndConstruct( + const gfx::Rect& visual_rect, + DisplayItemList* list, + const proto::DisplayItem& proto, + ImageSerializationProcessor* image_serialization_processor); private: DisplayItemProtoFactory() {} diff --git a/cc/playback/display_list_recording_source.cc b/cc/playback/display_list_recording_source.cc index d4e6a3e..52c8277 100644 --- a/cc/playback/display_list_recording_source.cc +++ b/cc/playback/display_list_recording_source.cc @@ -34,6 +34,7 @@ DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER( } // namespace namespace cc { +class ImageSerializationProcessor; DisplayListRecordingSource::DisplayListRecordingSource() : slow_down_raster_scale_factor_for_debug_(0), @@ -49,7 +50,8 @@ DisplayListRecordingSource::~DisplayListRecordingSource() { } void DisplayListRecordingSource::ToProtobuf( - proto::DisplayListRecordingSource* proto) const { + proto::DisplayListRecordingSource* proto, + ImageSerializationProcessor* image_serialization_processor) const { RectToProto(recorded_viewport_, proto->mutable_recorded_viewport()); SizeToProto(size_, proto->mutable_size()); proto->set_slow_down_raster_scale_factor_for_debug( @@ -61,12 +63,15 @@ void DisplayListRecordingSource::ToProtobuf( proto->set_clear_canvas_with_debug_color(clear_canvas_with_debug_color_); proto->set_solid_color(static_cast<uint64_t>(solid_color_)); proto->set_background_color(static_cast<uint64_t>(background_color_)); - if (display_list_) - display_list_->ToProtobuf(proto->mutable_display_list()); + if (display_list_) { + display_list_->ToProtobuf(proto->mutable_display_list(), + image_serialization_processor); + } } void DisplayListRecordingSource::FromProtobuf( - const proto::DisplayListRecordingSource& proto) { + const proto::DisplayListRecordingSource& proto, + ImageSerializationProcessor* image_serialization_processor) { recorded_viewport_ = ProtoToRect(proto.recorded_viewport()); size_ = ProtoToSize(proto.size()); slow_down_raster_scale_factor_for_debug_ = @@ -83,7 +88,8 @@ void DisplayListRecordingSource::FromProtobuf( // DisplayListRecordingSource was null, wich can happen if |Clear()| is // called. if (proto.has_display_list()) { - display_list_ = DisplayItemList::CreateFromProto(proto.display_list()); + display_list_ = DisplayItemList::CreateFromProto( + proto.display_list(), image_serialization_processor); FinishDisplayItemListUpdate(); } else { display_list_ = nullptr; diff --git a/cc/playback/display_list_recording_source.h b/cc/playback/display_list_recording_source.h index 4fb2164..c69c114 100644 --- a/cc/playback/display_list_recording_source.h +++ b/cc/playback/display_list_recording_source.h @@ -19,11 +19,12 @@ namespace cc { namespace proto { class DisplayListRecordingSource; -} +} // namespace proto class ContentLayerClient; class DisplayItemList; class DisplayListRasterSource; +class ImageSerializationProcessor; class Region; class CC_EXPORT DisplayListRecordingSource { @@ -43,8 +44,11 @@ class CC_EXPORT DisplayListRecordingSource { DisplayListRecordingSource(); virtual ~DisplayListRecordingSource(); - void ToProtobuf(proto::DisplayListRecordingSource* proto) const; - void FromProtobuf(const proto::DisplayListRecordingSource& proto); + void ToProtobuf( + proto::DisplayListRecordingSource* proto, + ImageSerializationProcessor* image_serialization_processor) const; + void FromProtobuf(const proto::DisplayListRecordingSource& proto, + ImageSerializationProcessor* image_serialization_processor); bool UpdateAndExpandInvalidation(ContentLayerClient* painter, Region* invalidation, diff --git a/cc/playback/display_list_recording_source_unittest.cc b/cc/playback/display_list_recording_source_unittest.cc index 1649566..3b619bb 100644 --- a/cc/playback/display_list_recording_source_unittest.cc +++ b/cc/playback/display_list_recording_source_unittest.cc @@ -9,6 +9,7 @@ #include "cc/proto/display_list_recording_source.pb.h" #include "cc/test/fake_content_layer_client.h" #include "cc/test/fake_display_list_recording_source.h" +#include "cc/test/fake_image_serialization_processor.h" #include "cc/test/skia_common.h" #include "testing/gtest/include/gtest/gtest.h" @@ -33,11 +34,15 @@ scoped_refptr<DisplayListRasterSource> CreateRasterSource( void ValidateRecordingSourceSerialization( FakeDisplayListRecordingSource* source) { + scoped_ptr<FakeImageSerializationProcessor> + fake_image_serialization_processor = + make_scoped_ptr(new FakeImageSerializationProcessor); + proto::DisplayListRecordingSource proto; - source->ToProtobuf(&proto); + source->ToProtobuf(&proto, fake_image_serialization_processor.get()); FakeDisplayListRecordingSource new_source; - new_source.FromProtobuf(proto); + new_source.FromProtobuf(proto, fake_image_serialization_processor.get()); EXPECT_TRUE(source->EqualsTo(new_source)); } diff --git a/cc/playback/drawing_display_item.cc b/cc/playback/drawing_display_item.cc index 36181ae..f8832cb 100644 --- a/cc/playback/drawing_display_item.cc +++ b/cc/playback/drawing_display_item.cc @@ -13,6 +13,7 @@ #include "base/values.h" #include "cc/debug/picture_debug_util.h" #include "cc/proto/display_item.pb.h" +#include "cc/proto/image_serialization_processor.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkData.h" #include "third_party/skia/include/core/SkMatrix.h" @@ -29,7 +30,9 @@ DrawingDisplayItem::DrawingDisplayItem(skia::RefPtr<const SkPicture> picture) { SetNew(std::move(picture)); } -DrawingDisplayItem::DrawingDisplayItem(const proto::DisplayItem& proto) { +DrawingDisplayItem::DrawingDisplayItem( + const proto::DisplayItem& proto, + ImageSerializationProcessor* image_serialization_processor) { DCHECK_EQ(proto::DisplayItem::Type_Drawing, proto.type()); skia::RefPtr<SkPicture> picture; @@ -37,8 +40,8 @@ DrawingDisplayItem::DrawingDisplayItem(const proto::DisplayItem& proto) { if (details.has_picture()) { SkMemoryStream stream(details.picture().data(), details.picture().size()); - // TODO(dtrainor, nyquist): Add an image decoder. - picture = skia::AdoptRef(SkPicture::CreateFromStream(&stream, nullptr)); + picture = skia::AdoptRef(SkPicture::CreateFromStream( + &stream, image_serialization_processor->GetPixelDeserializer())); } SetNew(std::move(picture)); @@ -55,7 +58,9 @@ void DrawingDisplayItem::SetNew(skia::RefPtr<const SkPicture> picture) { picture_ = std::move(picture); } -void DrawingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { +void DrawingDisplayItem::ToProtobuf( + proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) const { proto->set_type(proto::DisplayItem::Type_Drawing); proto::DrawingDisplayItem* details = proto->mutable_drawing_item(); @@ -63,10 +68,8 @@ void DrawingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { // Just use skia's serialize() method for now. if (picture_) { SkDynamicMemoryWStream stream; - - // TODO(dtrainor, nyquist): Add an SkPixelSerializer to not serialize images - // more than once (crbug.com/548434). - picture_->serialize(&stream, nullptr); + picture_->serialize(&stream, + image_serialization_processor->GetPixelSerializer()); if (stream.bytesWritten() > 0) { SkAutoDataUnref data(stream.copyToData()); details->set_picture(data->data(), data->size()); diff --git a/cc/playback/drawing_display_item.h b/cc/playback/drawing_display_item.h index 225bda4..8045904 100644 --- a/cc/playback/drawing_display_item.h +++ b/cc/playback/drawing_display_item.h @@ -17,16 +17,21 @@ class SkCanvas; class SkPicture; namespace cc { +class ImageSerializationProcessor; class CC_EXPORT DrawingDisplayItem : public DisplayItem { public: DrawingDisplayItem(); explicit DrawingDisplayItem(skia::RefPtr<const SkPicture> picture); - explicit DrawingDisplayItem(const proto::DisplayItem& proto); + explicit DrawingDisplayItem( + const proto::DisplayItem& proto, + ImageSerializationProcessor* image_serialization_processor); explicit DrawingDisplayItem(const DrawingDisplayItem& item); ~DrawingDisplayItem() override; - void ToProtobuf(proto::DisplayItem* proto) const override; + void ToProtobuf(proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) + const override; void Raster(SkCanvas* canvas, const gfx::Rect& canvas_playback_rect, SkPicture::AbortCallback* callback) const override; diff --git a/cc/playback/filter_display_item.cc b/cc/playback/filter_display_item.cc index 0c6ebe0a..af42baa 100644 --- a/cc/playback/filter_display_item.cc +++ b/cc/playback/filter_display_item.cc @@ -19,6 +19,7 @@ #include "ui/gfx/skia_util.h" namespace cc { +class ImageSerializationProcessor; FilterDisplayItem::FilterDisplayItem(const FilterOperations& filters, const gfx::RectF& bounds) { @@ -45,7 +46,9 @@ void FilterDisplayItem::SetNew(const FilterOperations& filters, bounds_ = bounds; } -void FilterDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { +void FilterDisplayItem::ToProtobuf( + proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) const { proto->set_type(proto::DisplayItem::Type_Filter); proto::FilterDisplayItem* details = proto->mutable_filter_item(); @@ -95,7 +98,9 @@ EndFilterDisplayItem::EndFilterDisplayItem(const proto::DisplayItem& proto) { EndFilterDisplayItem::~EndFilterDisplayItem() {} -void EndFilterDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { +void EndFilterDisplayItem::ToProtobuf( + proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) const { proto->set_type(proto::DisplayItem::Type_EndFilter); } diff --git a/cc/playback/filter_display_item.h b/cc/playback/filter_display_item.h index d4506ed..b385538 100644 --- a/cc/playback/filter_display_item.h +++ b/cc/playback/filter_display_item.h @@ -16,6 +16,7 @@ class SkCanvas; namespace cc { +class ImageSerializationProcessor; class CC_EXPORT FilterDisplayItem : public DisplayItem { public: @@ -23,7 +24,9 @@ class CC_EXPORT FilterDisplayItem : public DisplayItem { explicit FilterDisplayItem(const proto::DisplayItem& proto); ~FilterDisplayItem() override; - void ToProtobuf(proto::DisplayItem* proto) const override; + void ToProtobuf(proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) + const override; void Raster(SkCanvas* canvas, const gfx::Rect& canvas_target_playback_rect, SkPicture::AbortCallback* callback) const override; @@ -51,7 +54,9 @@ class CC_EXPORT EndFilterDisplayItem : public DisplayItem { return make_scoped_ptr(new EndFilterDisplayItem()); } - void ToProtobuf(proto::DisplayItem* proto) const override; + void ToProtobuf(proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) + const override; void Raster(SkCanvas* canvas, const gfx::Rect& canvas_target_playback_rect, SkPicture::AbortCallback* callback) const override; diff --git a/cc/playback/float_clip_display_item.cc b/cc/playback/float_clip_display_item.cc index 3601e9d..621c4d9 100644 --- a/cc/playback/float_clip_display_item.cc +++ b/cc/playback/float_clip_display_item.cc @@ -14,6 +14,7 @@ #include "ui/gfx/skia_util.h" namespace cc { +class ImageSerializationProcessor; FloatClipDisplayItem::FloatClipDisplayItem(const gfx::RectF& clip_rect) { SetNew(clip_rect); @@ -35,7 +36,9 @@ void FloatClipDisplayItem::SetNew(const gfx::RectF& clip_rect) { clip_rect_ = clip_rect; } -void FloatClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { +void FloatClipDisplayItem::ToProtobuf( + proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) const { proto->set_type(proto::DisplayItem::Type_FloatClip); proto::FloatClipDisplayItem* details = proto->mutable_float_clip_item(); @@ -71,7 +74,9 @@ EndFloatClipDisplayItem::EndFloatClipDisplayItem( EndFloatClipDisplayItem::~EndFloatClipDisplayItem() { } -void EndFloatClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { +void EndFloatClipDisplayItem::ToProtobuf( + proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) const { proto->set_type(proto::DisplayItem::Type_EndFloatClip); } diff --git a/cc/playback/float_clip_display_item.h b/cc/playback/float_clip_display_item.h index 8c34c5f..41d9ace 100644 --- a/cc/playback/float_clip_display_item.h +++ b/cc/playback/float_clip_display_item.h @@ -17,6 +17,7 @@ class SkCanvas; namespace cc { +class ImageSerializationProcessor; class CC_EXPORT FloatClipDisplayItem : public DisplayItem { public: @@ -24,7 +25,9 @@ class CC_EXPORT FloatClipDisplayItem : public DisplayItem { explicit FloatClipDisplayItem(const proto::DisplayItem& proto); ~FloatClipDisplayItem() override; - void ToProtobuf(proto::DisplayItem* proto) const override; + void ToProtobuf(proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) + const override; void Raster(SkCanvas* canvas, const gfx::Rect& canvas_target_playback_rect, SkPicture::AbortCallback* callback) const override; @@ -51,7 +54,9 @@ class CC_EXPORT EndFloatClipDisplayItem : public DisplayItem { return make_scoped_ptr(new EndFloatClipDisplayItem()); } - void ToProtobuf(proto::DisplayItem* proto) const override; + void ToProtobuf(proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) + const override; void Raster(SkCanvas* canvas, const gfx::Rect& canvas_target_playback_rect, SkPicture::AbortCallback* callback) const override; diff --git a/cc/playback/transform_display_item.cc b/cc/playback/transform_display_item.cc index c4625ff..e3aa591 100644 --- a/cc/playback/transform_display_item.cc +++ b/cc/playback/transform_display_item.cc @@ -13,6 +13,7 @@ #include "third_party/skia/include/core/SkCanvas.h" namespace cc { +class ImageSerializationProcessor; TransformDisplayItem::TransformDisplayItem(const gfx::Transform& transform) : transform_(gfx::Transform::kSkipInitialization) { @@ -35,7 +36,9 @@ void TransformDisplayItem::SetNew(const gfx::Transform& transform) { transform_ = transform; } -void TransformDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { +void TransformDisplayItem::ToProtobuf( + proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) const { proto->set_type(proto::DisplayItem::Type_Transform); proto::TransformDisplayItem* details = proto->mutable_transform_item(); @@ -72,7 +75,9 @@ EndTransformDisplayItem::EndTransformDisplayItem( EndTransformDisplayItem::~EndTransformDisplayItem() { } -void EndTransformDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { +void EndTransformDisplayItem::ToProtobuf( + proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) const { proto->set_type(proto::DisplayItem::Type_EndTransform); } diff --git a/cc/playback/transform_display_item.h b/cc/playback/transform_display_item.h index 5b89136..7c1d934 100644 --- a/cc/playback/transform_display_item.h +++ b/cc/playback/transform_display_item.h @@ -15,6 +15,7 @@ class SkCanvas; namespace cc { +class ImageSerializationProcessor; class CC_EXPORT TransformDisplayItem : public DisplayItem { public: @@ -22,7 +23,9 @@ class CC_EXPORT TransformDisplayItem : public DisplayItem { explicit TransformDisplayItem(const proto::DisplayItem& proto); ~TransformDisplayItem() override; - void ToProtobuf(proto::DisplayItem* proto) const override; + void ToProtobuf(proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) + const override; void Raster(SkCanvas* canvas, const gfx::Rect& canvas_target_playback_rect, SkPicture::AbortCallback* callback) const override; @@ -49,7 +52,9 @@ class CC_EXPORT EndTransformDisplayItem : public DisplayItem { return make_scoped_ptr(new EndTransformDisplayItem()); } - void ToProtobuf(proto::DisplayItem* proto) const override; + void ToProtobuf(proto::DisplayItem* proto, + ImageSerializationProcessor* image_serialization_processor) + const override; void Raster(SkCanvas* canvas, const gfx::Rect& canvas_target_playback_rect, SkPicture::AbortCallback* callback) const override; diff --git a/cc/proto/image_serialization_processor.h b/cc/proto/image_serialization_processor.h new file mode 100644 index 0000000..75b9936 --- /dev/null +++ b/cc/proto/image_serialization_processor.h @@ -0,0 +1,30 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CC_PROTO_IMAGE_SERIALIZATION_PROCESSOR_H_ +#define CC_PROTO_IMAGE_SERIALIZATION_PROCESSOR_H_ + +#include "third_party/skia/include/core/SkPicture.h" +#include "third_party/skia/include/core/SkPixelSerializer.h" + +class SkPixelSerializer; + +namespace cc { + +// ImageSerializationProcessor provides functionality to serialize and +// deserialize Skia images. +class ImageSerializationProcessor { + public: + // The serializer returned from this function can be used to pass in to + // SkPicture::serialize(...) for serializing the SkPicture to a stream. + virtual SkPixelSerializer* GetPixelSerializer() = 0; + + // Returns a function pointer valid to use for deserializing images when using + // SkPicture::CreateFromStream to create an SkPicture from a stream. + virtual SkPicture::InstallPixelRefProc GetPixelDeserializer() = 0; +}; + +} // namespace cc + +#endif // CC_PROTO_IMAGE_SERIALIZATION_PROCESSOR_H_ diff --git a/cc/test/fake_image_serialization_processor.cc b/cc/test/fake_image_serialization_processor.cc new file mode 100644 index 0000000..c43b3e8 --- /dev/null +++ b/cc/test/fake_image_serialization_processor.cc @@ -0,0 +1,32 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cc/test/fake_image_serialization_processor.h" + +#include "third_party/skia/include/core/SkPicture.h" + +namespace { +bool NoopDecoder(const void* input, size_t input_size, SkBitmap* bitmap) { + return false; +} +} + +class SkPixelSerializer; + +namespace cc { + +FakeImageSerializationProcessor::FakeImageSerializationProcessor() {} + +FakeImageSerializationProcessor::~FakeImageSerializationProcessor() {} + +SkPixelSerializer* FakeImageSerializationProcessor::GetPixelSerializer() { + return nullptr; +} + +SkPicture::InstallPixelRefProc +FakeImageSerializationProcessor::GetPixelDeserializer() { + return &NoopDecoder; +} + +} // namespace cc diff --git a/cc/test/fake_image_serialization_processor.h b/cc/test/fake_image_serialization_processor.h new file mode 100644 index 0000000..613e93b --- /dev/null +++ b/cc/test/fake_image_serialization_processor.h @@ -0,0 +1,30 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CC_TEST_FAKE_IMAGE_SERIALIZATION_PROCESSOR_H_ +#define CC_TEST_FAKE_IMAGE_SERIALIZATION_PROCESSOR_H_ + +#include "base/macros.h" +#include "cc/proto/image_serialization_processor.h" + +class SkPixelSerializer; + +namespace cc { + +class FakeImageSerializationProcessor : public ImageSerializationProcessor { + public: + FakeImageSerializationProcessor(); + ~FakeImageSerializationProcessor(); + + // ImageSerializationProcessor implementation. + SkPixelSerializer* GetPixelSerializer() override; + SkPicture::InstallPixelRefProc GetPixelDeserializer() override; + + private: + DISALLOW_COPY_AND_ASSIGN(FakeImageSerializationProcessor); +}; + +} // namespace cc + +#endif // CC_TEST_FAKE_IMAGE_SERIALIZATION_PROCESSOR_H_ diff --git a/cc/test/fake_layer_tree_host.cc b/cc/test/fake_layer_tree_host.cc index 2a8d242..ca054a7 100644 --- a/cc/test/fake_layer_tree_host.cc +++ b/cc/test/fake_layer_tree_host.cc @@ -5,6 +5,7 @@ #include "cc/test/fake_layer_tree_host.h" #include "cc/layers/layer.h" +#include "cc/test/fake_image_serialization_processor.h" #include "cc/test/test_task_graph_runner.h" namespace cc { @@ -56,6 +57,20 @@ scoped_ptr<FakeLayerTreeHost> FakeLayerTreeHost::Create( return make_scoped_ptr(new FakeLayerTreeHost(client, ¶ms, mode)); } +scoped_ptr<FakeLayerTreeHost> FakeLayerTreeHost::Create( + FakeLayerTreeHostClient* client, + TestTaskGraphRunner* task_graph_runner, + const LayerTreeSettings& settings, + CompositorMode mode, + ImageSerializationProcessor* image_serialization_processor) { + LayerTreeHost::InitParams params; + params.client = client; + params.settings = &settings; + params.task_graph_runner = task_graph_runner; + params.image_serialization_processor = image_serialization_processor; + return make_scoped_ptr(new FakeLayerTreeHost(client, ¶ms, mode)); +} + FakeLayerTreeHost::~FakeLayerTreeHost() { client_->SetLayerTreeHost(NULL); } diff --git a/cc/test/fake_layer_tree_host.h b/cc/test/fake_layer_tree_host.h index b0b9cde..11fe0d2 100644 --- a/cc/test/fake_layer_tree_host.h +++ b/cc/test/fake_layer_tree_host.h @@ -15,6 +15,7 @@ #include "cc/trees/tree_synchronizer.h" namespace cc { +class ImageSerializationProcessor; class TestTaskGraphRunner; class FakeLayerTreeHost : public LayerTreeHost { @@ -31,7 +32,18 @@ class FakeLayerTreeHost : public LayerTreeHost { TestTaskGraphRunner* task_graph_runner, const LayerTreeSettings& settings, CompositorMode mode); - + static scoped_ptr<FakeLayerTreeHost> Create( + FakeLayerTreeHostClient* client, + TestTaskGraphRunner* task_graph_runner, + const LayerTreeSettings& settings, + CompositorMode mode, + InitParams params); + static scoped_ptr<FakeLayerTreeHost> Create( + FakeLayerTreeHostClient* client, + TestTaskGraphRunner* task_graph_runner, + const LayerTreeSettings& settings, + CompositorMode mode, + ImageSerializationProcessor* image_serialization_processor); ~FakeLayerTreeHost() override; const RendererCapabilities& GetRendererCapabilities() const override; diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index b7646a8..ce09a69 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc @@ -128,6 +128,7 @@ scoped_ptr<LayerTreeHost> LayerTreeHost::CreateRemoteServer( // remote mode. DCHECK(!params->settings->use_external_begin_frame_source); DCHECK(!params->external_begin_frame_source); + DCHECK(params->image_serialization_processor); scoped_ptr<LayerTreeHost> layer_tree_host( new LayerTreeHost(params, CompositorMode::REMOTE)); @@ -149,6 +150,7 @@ scoped_ptr<LayerTreeHost> LayerTreeHost::CreateRemoteClient( // source on the client LayerTreeHost. crbug/576962 DCHECK(!params->settings->use_external_begin_frame_source); DCHECK(!params->external_begin_frame_source); + DCHECK(params->image_serialization_processor); scoped_ptr<LayerTreeHost> layer_tree_host( new LayerTreeHost(params, CompositorMode::REMOTE)); @@ -193,6 +195,7 @@ LayerTreeHost::LayerTreeHost(InitParams* params, CompositorMode mode) shared_bitmap_manager_(params->shared_bitmap_manager), gpu_memory_buffer_manager_(params->gpu_memory_buffer_manager), task_graph_runner_(params->task_graph_runner), + image_serialization_processor_(params->image_serialization_processor), surface_id_namespace_(0u), next_surface_sequence_(1u) { DCHECK(task_graph_runner_); diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h index 36807ff..453c75f 100644 --- a/cc/trees/layer_tree_host.h +++ b/cc/trees/layer_tree_host.h @@ -58,6 +58,7 @@ class AnimationRegistrar; class AnimationHost; class BeginFrameSource; class HeadsUpDisplayLayer; +class ImageSerializationProcessor; class Layer; class LayerTreeHostImpl; class LayerTreeHostImplClient; @@ -92,6 +93,7 @@ class CC_EXPORT LayerTreeHost : public MutatorHostClient { LayerTreeSettings const* settings = nullptr; scoped_refptr<base::SingleThreadTaskRunner> main_task_runner; scoped_ptr<BeginFrameSource> external_begin_frame_source; + ImageSerializationProcessor* image_serialization_processor = nullptr; InitParams(); ~InitParams(); @@ -418,6 +420,10 @@ class CC_EXPORT LayerTreeHost : public MutatorHostClient { bool IsRemoteClient() const; void BuildPropertyTreesForTesting(); + ImageSerializationProcessor* image_serialization_processor() const { + return image_serialization_processor_; + } + protected: LayerTreeHost(InitParams* params, CompositorMode mode); void InitializeThreaded( @@ -572,6 +578,8 @@ class CC_EXPORT LayerTreeHost : public MutatorHostClient { gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_; TaskGraphRunner* task_graph_runner_; + ImageSerializationProcessor* image_serialization_processor_; + std::vector<scoped_ptr<SwapPromise>> swap_promise_list_; std::set<SwapPromiseMonitor*> swap_promise_monitor_; diff --git a/cc/trees/layer_tree_host_unittest_remote_server.cc b/cc/trees/layer_tree_host_unittest_remote_server.cc index d902cfa..9873dca 100644 --- a/cc/trees/layer_tree_host_unittest_remote_server.cc +++ b/cc/trees/layer_tree_host_unittest_remote_server.cc @@ -4,7 +4,9 @@ #include "cc/trees/layer_tree_host.h" +#include "base/memory/scoped_ptr.h" #include "base/thread_task_runner_handle.h" +#include "cc/test/fake_image_serialization_processor.h" #include "cc/test/test_task_graph_runner.h" #include "cc/trees/layer_tree_host_client.h" #include "cc/trees/proxy_common.h" @@ -19,12 +21,16 @@ class LayerTreeHostTestRemoteServer : public testing::Test, public RemoteProtoChannel, public LayerTreeHostClient { public: - LayerTreeHostTestRemoteServer() : calls_received_(0) { + LayerTreeHostTestRemoteServer() + : calls_received_(0), + image_serialization_processor_( + make_scoped_ptr(new FakeImageSerializationProcessor)) { LayerTreeHost::InitParams params; params.client = this; params.task_graph_runner = &task_graph_runner_; params.settings = &settings_; params.main_task_runner = base::ThreadTaskRunnerHandle::Get(); + params.image_serialization_processor = image_serialization_processor_.get(); layer_tree_host_ = LayerTreeHost::CreateRemoteServer(this, ¶ms); } @@ -66,6 +72,7 @@ class LayerTreeHostTestRemoteServer : public testing::Test, LayerTreeSettings settings_; scoped_ptr<LayerTreeHost> layer_tree_host_; RemoteProtoChannel::ProtoReceiver* receiver_; + scoped_ptr<FakeImageSerializationProcessor> image_serialization_processor_; private: DISALLOW_COPY_AND_ASSIGN(LayerTreeHostTestRemoteServer); |