Commit 3b006fb5 authored by enne's avatar enne Committed by Commit bot

cc: Shrink size of display item

This removes all of the base class members from display item and instead
calculates them during allocation.  This is done by processing each item
as it is added, which requires passing in all the ctor args to
CreateAndAppendItem.  This reduces the size of all display items by 16
bytes so that the largest is now "only" 80 bytes and the smallest is 8.

Also, DisplayItemList had a bug where it would allocate an item,
(maybe) process all added items, and then SetNew on that last item.  In
that case, the processing would skip the final item because it was just
a newly allocated item.  This patch fixes that by the above changes
to CreateAndAppendItem.

R=vmpstr@chromium.org,chrishtr@chromium.org
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel

Review URL: https://codereview.chromium.org/1494223003

Cr-Commit-Position: refs/heads/master@{#364437}
parent 2238dfbf
...@@ -50,13 +50,11 @@ void WebDisplayItemListImpl::appendDrawingItem( ...@@ -50,13 +50,11 @@ void WebDisplayItemListImpl::appendDrawingItem(
const blink::WebRect& visual_rect, const blink::WebRect& visual_rect,
const SkPicture* picture) { const SkPicture* picture) {
if (display_item_list_->RetainsIndividualDisplayItems()) { if (display_item_list_->RetainsIndividualDisplayItems()) {
auto* item = display_item_list_->CreateAndAppendItem<cc::DrawingDisplayItem>(
display_item_list_->CreateAndAppendItem<cc::DrawingDisplayItem>( visual_rect, skia::SharePtr(const_cast<SkPicture*>(picture)));
visual_rect);
item->SetNew(skia::SharePtr(const_cast<SkPicture*>(picture)));
} else { } else {
cc::DrawingDisplayItem item; cc::DrawingDisplayItem item(
item.SetNew(skia::SharePtr(const_cast<SkPicture*>(picture))); skia::SharePtr(const_cast<SkPicture*>(picture)));
display_item_list_->RasterIntoCanvas(item); display_item_list_->RasterIntoCanvas(item);
} }
} }
...@@ -70,12 +68,10 @@ void WebDisplayItemListImpl::appendClipItem( ...@@ -70,12 +68,10 @@ void WebDisplayItemListImpl::appendClipItem(
rounded_rects.push_back(rounded_clip_rects[i]); rounded_rects.push_back(rounded_clip_rects[i]);
} }
if (display_item_list_->RetainsIndividualDisplayItems()) { if (display_item_list_->RetainsIndividualDisplayItems()) {
auto* item = display_item_list_->CreateAndAppendItem<cc::ClipDisplayItem>( display_item_list_->CreateAndAppendItem<cc::ClipDisplayItem>(
visual_rect); visual_rect, clip_rect, rounded_rects);
item->SetNew(clip_rect, rounded_rects);
} else { } else {
cc::ClipDisplayItem item; cc::ClipDisplayItem item(clip_rect, rounded_rects);
item.SetNew(clip_rect, rounded_rects);
display_item_list_->RasterIntoCanvas(item); display_item_list_->RasterIntoCanvas(item);
} }
} }
...@@ -96,13 +92,10 @@ void WebDisplayItemListImpl::appendClipPathItem( ...@@ -96,13 +92,10 @@ void WebDisplayItemListImpl::appendClipPathItem(
SkRegion::Op clip_op, SkRegion::Op clip_op,
bool antialias) { bool antialias) {
if (display_item_list_->RetainsIndividualDisplayItems()) { if (display_item_list_->RetainsIndividualDisplayItems()) {
auto* item = display_item_list_->CreateAndAppendItem<cc::ClipPathDisplayItem>(
display_item_list_->CreateAndAppendItem<cc::ClipPathDisplayItem>( visual_rect, clip_path, clip_op, antialias);
visual_rect);
item->SetNew(clip_path, clip_op, antialias);
} else { } else {
cc::ClipPathDisplayItem item; cc::ClipPathDisplayItem item(clip_path, clip_op, antialias);
item.SetNew(clip_path, clip_op, antialias);
display_item_list_->RasterIntoCanvas(item); display_item_list_->RasterIntoCanvas(item);
} }
} }
...@@ -121,13 +114,10 @@ void WebDisplayItemListImpl::appendFloatClipItem( ...@@ -121,13 +114,10 @@ void WebDisplayItemListImpl::appendFloatClipItem(
const blink::WebRect& visual_rect, const blink::WebRect& visual_rect,
const blink::WebFloatRect& clip_rect) { const blink::WebFloatRect& clip_rect) {
if (display_item_list_->RetainsIndividualDisplayItems()) { if (display_item_list_->RetainsIndividualDisplayItems()) {
auto* item = display_item_list_->CreateAndAppendItem<cc::FloatClipDisplayItem>(
display_item_list_->CreateAndAppendItem<cc::FloatClipDisplayItem>( visual_rect, clip_rect);
visual_rect);
item->SetNew(clip_rect);
} else { } else {
cc::FloatClipDisplayItem item; cc::FloatClipDisplayItem item(clip_rect);
item.SetNew(clip_rect);
display_item_list_->RasterIntoCanvas(item); display_item_list_->RasterIntoCanvas(item);
} }
} }
...@@ -149,13 +139,10 @@ void WebDisplayItemListImpl::appendTransformItem( ...@@ -149,13 +139,10 @@ void WebDisplayItemListImpl::appendTransformItem(
transform.matrix() = matrix; transform.matrix() = matrix;
if (display_item_list_->RetainsIndividualDisplayItems()) { if (display_item_list_->RetainsIndividualDisplayItems()) {
auto* item = display_item_list_->CreateAndAppendItem<cc::TransformDisplayItem>(
display_item_list_->CreateAndAppendItem<cc::TransformDisplayItem>( visual_rect, transform);
visual_rect);
item->SetNew(transform);
} else { } else {
cc::TransformDisplayItem item; cc::TransformDisplayItem item(transform);
item.SetNew(transform);
display_item_list_->RasterIntoCanvas(item); display_item_list_->RasterIntoCanvas(item);
} }
} }
...@@ -182,15 +169,13 @@ void WebDisplayItemListImpl::appendCompositingItem( ...@@ -182,15 +169,13 @@ void WebDisplayItemListImpl::appendCompositingItem(
// value, but that breaks slimming paint reftests. // value, but that breaks slimming paint reftests.
if (display_item_list_->RetainsIndividualDisplayItems()) { if (display_item_list_->RetainsIndividualDisplayItems()) {
auto* item = display_item_list_->CreateAndAppendItem<cc::CompositingDisplayItem>(
display_item_list_->CreateAndAppendItem<cc::CompositingDisplayItem>( visual_rect, static_cast<uint8_t>(gfx::ToFlooredInt(255 * opacity)),
visual_rect); xfermode, bounds, skia::SharePtr(color_filter));
item->SetNew(static_cast<uint8_t>(gfx::ToFlooredInt(255 * opacity)),
xfermode, bounds, skia::SharePtr(color_filter));
} else { } else {
cc::CompositingDisplayItem item; cc::CompositingDisplayItem item(
item.SetNew(static_cast<uint8_t>(gfx::ToFlooredInt(255 * opacity)), static_cast<uint8_t>(gfx::ToFlooredInt(255 * opacity)), xfermode,
xfermode, bounds, skia::SharePtr(color_filter)); bounds, skia::SharePtr(color_filter));
display_item_list_->RasterIntoCanvas(item); display_item_list_->RasterIntoCanvas(item);
} }
} }
...@@ -213,12 +198,10 @@ void WebDisplayItemListImpl::appendFilterItem( ...@@ -213,12 +198,10 @@ void WebDisplayItemListImpl::appendFilterItem(
static_cast<const WebFilterOperationsImpl&>(filters); static_cast<const WebFilterOperationsImpl&>(filters);
if (display_item_list_->RetainsIndividualDisplayItems()) { if (display_item_list_->RetainsIndividualDisplayItems()) {
auto* item = display_item_list_->CreateAndAppendItem<cc::FilterDisplayItem>( display_item_list_->CreateAndAppendItem<cc::FilterDisplayItem>(
visual_rect); visual_rect, filters_impl.AsFilterOperations(), bounds);
item->SetNew(filters_impl.AsFilterOperations(), bounds);
} else { } else {
cc::FilterDisplayItem item; cc::FilterDisplayItem item(filters_impl.AsFilterOperations(), bounds);
item.SetNew(filters_impl.AsFilterOperations(), bounds);
display_item_list_->RasterIntoCanvas(item); display_item_list_->RasterIntoCanvas(item);
} }
} }
......
...@@ -83,9 +83,8 @@ scoped_refptr<DisplayItemList> PictureImageLayer::PaintContentsToDisplayList( ...@@ -83,9 +83,8 @@ scoped_refptr<DisplayItemList> PictureImageLayer::PaintContentsToDisplayList(
skia::RefPtr<SkPicture> picture = skia::RefPtr<SkPicture> picture =
skia::AdoptRef(recorder.endRecordingAsPicture()); skia::AdoptRef(recorder.endRecordingAsPicture());
auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>(PaintableRegion(),
display_list->CreateAndAppendItem<DrawingDisplayItem>(PaintableRegion()); std::move(picture));
item->SetNew(std::move(picture));
display_list->Finalize(); display_list->Finalize();
return display_list; return display_list;
......
...@@ -17,24 +17,33 @@ ...@@ -17,24 +17,33 @@
namespace cc { namespace cc {
ClipDisplayItem::ClipDisplayItem() { ClipDisplayItem::ClipDisplayItem(
const gfx::Rect& clip_rect,
const std::vector<SkRRect>& rounded_clip_rects) {
SetNew(clip_rect, rounded_clip_rects);
} }
ClipDisplayItem::~ClipDisplayItem() { ClipDisplayItem::ClipDisplayItem(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_Clip, proto.type());
const proto::ClipDisplayItem& details = proto.clip_item();
gfx::Rect clip_rect = ProtoToRect(details.clip_rect());
std::vector<SkRRect> rounded_clip_rects;
rounded_clip_rects.reserve(details.rounded_rects_size());
for (int i = 0; i < details.rounded_rects_size(); i++) {
rounded_clip_rects.push_back(ProtoToSkRRect(details.rounded_rects(i)));
}
SetNew(clip_rect, rounded_clip_rects);
} }
void ClipDisplayItem::SetNew(gfx::Rect clip_rect, void ClipDisplayItem::SetNew(const gfx::Rect& clip_rect,
const std::vector<SkRRect>& rounded_clip_rects) { const std::vector<SkRRect>& rounded_clip_rects) {
clip_rect_ = clip_rect; clip_rect_ = clip_rect;
rounded_clip_rects_ = rounded_clip_rects; rounded_clip_rects_ = rounded_clip_rects;
size_t external_memory_usage =
rounded_clip_rects_.capacity() * sizeof(rounded_clip_rects_[0]);
DisplayItem::SetNew(true /* suitable_for_gpu_raster */, 1 /* op_count */,
external_memory_usage);
} }
ClipDisplayItem::~ClipDisplayItem() {}
void ClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { void ClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
proto->set_type(proto::DisplayItem::Type_Clip); proto->set_type(proto::DisplayItem::Type_Clip);
...@@ -46,19 +55,6 @@ void ClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { ...@@ -46,19 +55,6 @@ void ClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
} }
} }
void ClipDisplayItem::FromProtobuf(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_Clip, proto.type());
const proto::ClipDisplayItem& details = proto.clip_item();
gfx::Rect clip_rect = ProtoToRect(details.clip_rect());
std::vector<SkRRect> rounded_clip_rects;
rounded_clip_rects.reserve(details.rounded_rects_size());
for (int i = 0; i < details.rounded_rects_size(); i++) {
rounded_clip_rects.push_back(ProtoToSkRRect(details.rounded_rects(i)));
}
SetNew(clip_rect, rounded_clip_rects);
}
void ClipDisplayItem::Raster(SkCanvas* canvas, void ClipDisplayItem::Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const { SkPicture::AbortCallback* callback) const {
...@@ -104,9 +100,14 @@ void ClipDisplayItem::AsValueInto(const gfx::Rect& visual_rect, ...@@ -104,9 +100,14 @@ void ClipDisplayItem::AsValueInto(const gfx::Rect& visual_rect,
array->AppendString(value); array->AppendString(value);
} }
EndClipDisplayItem::EndClipDisplayItem() { size_t ClipDisplayItem::ExternalMemoryUsage() const {
DisplayItem::SetNew(true /* suitable_for_gpu_raster */, 0 /* op_count */, return rounded_clip_rects_.capacity() * sizeof(rounded_clip_rects_[0]);
0 /* external_memory_usage */); }
EndClipDisplayItem::EndClipDisplayItem() {}
EndClipDisplayItem::EndClipDisplayItem(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_EndClip, proto.type());
} }
EndClipDisplayItem::~EndClipDisplayItem() { EndClipDisplayItem::~EndClipDisplayItem() {
...@@ -116,10 +117,6 @@ void EndClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { ...@@ -116,10 +117,6 @@ void EndClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
proto->set_type(proto::DisplayItem::Type_EndClip); proto->set_type(proto::DisplayItem::Type_EndClip);
} }
void EndClipDisplayItem::FromProtobuf(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_EndClip, proto.type());
}
void EndClipDisplayItem::Raster(SkCanvas* canvas, void EndClipDisplayItem::Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const { SkPicture::AbortCallback* callback) const {
...@@ -133,4 +130,8 @@ void EndClipDisplayItem::AsValueInto( ...@@ -133,4 +130,8 @@ void EndClipDisplayItem::AsValueInto(
visual_rect.ToString().c_str())); visual_rect.ToString().c_str()));
} }
size_t EndClipDisplayItem::ExternalMemoryUsage() const {
return 0;
}
} // namespace cc } // namespace cc
...@@ -19,21 +19,26 @@ namespace cc { ...@@ -19,21 +19,26 @@ namespace cc {
class CC_EXPORT ClipDisplayItem : public DisplayItem { class CC_EXPORT ClipDisplayItem : public DisplayItem {
public: public:
ClipDisplayItem(); ClipDisplayItem(const gfx::Rect& clip_rect,
const std::vector<SkRRect>& rounded_clip_rects);
explicit ClipDisplayItem(const proto::DisplayItem& proto);
~ClipDisplayItem() override; ~ClipDisplayItem() override;
void SetNew(gfx::Rect clip_rect,
const std::vector<SkRRect>& rounded_clip_rects);
void ToProtobuf(proto::DisplayItem* proto) const override; void ToProtobuf(proto::DisplayItem* proto) const override;
void FromProtobuf(const proto::DisplayItem& proto) override;
void Raster(SkCanvas* canvas, void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override; SkPicture::AbortCallback* callback) const override;
void AsValueInto(const gfx::Rect& visual_rect, void AsValueInto(const gfx::Rect& visual_rect,
base::trace_event::TracedValue* array) const override; base::trace_event::TracedValue* array) const override;
size_t ExternalMemoryUsage() const override;
int ApproximateOpCount() const { return 1; }
bool IsSuitableForGpuRasterization() const { return true; }
private: private:
void SetNew(const gfx::Rect& clip_rect,
const std::vector<SkRRect>& rounded_clip_rects);
gfx::Rect clip_rect_; gfx::Rect clip_rect_;
std::vector<SkRRect> rounded_clip_rects_; std::vector<SkRRect> rounded_clip_rects_;
}; };
...@@ -41,15 +46,19 @@ class CC_EXPORT ClipDisplayItem : public DisplayItem { ...@@ -41,15 +46,19 @@ class CC_EXPORT ClipDisplayItem : public DisplayItem {
class CC_EXPORT EndClipDisplayItem : public DisplayItem { class CC_EXPORT EndClipDisplayItem : public DisplayItem {
public: public:
EndClipDisplayItem(); EndClipDisplayItem();
explicit EndClipDisplayItem(const proto::DisplayItem& proto);
~EndClipDisplayItem() override; ~EndClipDisplayItem() override;
void ToProtobuf(proto::DisplayItem* proto) const override; void ToProtobuf(proto::DisplayItem* proto) const override;
void FromProtobuf(const proto::DisplayItem& proto) override;
void Raster(SkCanvas* canvas, void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override; SkPicture::AbortCallback* callback) const override;
void AsValueInto(const gfx::Rect& visual_rect, void AsValueInto(const gfx::Rect& visual_rect,
base::trace_event::TracedValue* array) const override; base::trace_event::TracedValue* array) const override;
size_t ExternalMemoryUsage() const override;
int ApproximateOpCount() const { return 0; }
bool IsSuitableForGpuRasterization() const { return true; }
}; };
} // namespace cc } // namespace cc
......
...@@ -12,7 +12,27 @@ ...@@ -12,7 +12,27 @@
namespace cc { namespace cc {
ClipPathDisplayItem::ClipPathDisplayItem() { ClipPathDisplayItem::ClipPathDisplayItem(const SkPath& clip_path,
SkRegion::Op clip_op,
bool antialias) {
SetNew(clip_path, clip_op, antialias);
}
ClipPathDisplayItem::ClipPathDisplayItem(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_ClipPath, proto.type());
const proto::ClipPathDisplayItem& details = proto.clip_path_item();
SkRegion::Op clip_op = SkRegionOpFromProto(details.clip_op());
bool antialias = details.antialias();
SkPath clip_path;
if (details.has_clip_path()) {
size_t bytes_read = clip_path.readFromMemory(details.clip_path().data(),
details.clip_path().size());
DCHECK_EQ(details.clip_path().size(), bytes_read);
}
SetNew(clip_path, clip_op, antialias);
} }
ClipPathDisplayItem::~ClipPathDisplayItem() { ClipPathDisplayItem::~ClipPathDisplayItem() {
...@@ -24,11 +44,6 @@ void ClipPathDisplayItem::SetNew(const SkPath& clip_path, ...@@ -24,11 +44,6 @@ void ClipPathDisplayItem::SetNew(const SkPath& clip_path,
clip_path_ = clip_path; clip_path_ = clip_path;
clip_op_ = clip_op; clip_op_ = clip_op;
antialias_ = antialias; antialias_ = antialias;
// The size of SkPath's external storage is not currently accounted for (and
// may well be shared anyway).
DisplayItem::SetNew(true /* suitable_for_gpu_raster */, 1 /* op_count */,
0 /* external_memory_usage */);
} }
void ClipPathDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { void ClipPathDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
...@@ -47,23 +62,6 @@ void ClipPathDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { ...@@ -47,23 +62,6 @@ void ClipPathDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
} }
} }
void ClipPathDisplayItem::FromProtobuf(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_ClipPath, proto.type());
const proto::ClipPathDisplayItem& details = proto.clip_path_item();
SkRegion::Op clip_op = SkRegionOpFromProto(details.clip_op());
bool antialias = details.antialias();
SkPath clip_path;
if (details.has_clip_path()) {
size_t bytes_read = clip_path.readFromMemory(details.clip_path().data(),
details.clip_path().size());
DCHECK_EQ(details.clip_path().size(), bytes_read);
}
SetNew(clip_path, clip_op, antialias);
}
void ClipPathDisplayItem::Raster(SkCanvas* canvas, void ClipPathDisplayItem::Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const { SkPicture::AbortCallback* callback) const {
...@@ -79,9 +77,17 @@ void ClipPathDisplayItem::AsValueInto( ...@@ -79,9 +77,17 @@ void ClipPathDisplayItem::AsValueInto(
clip_path_.countPoints(), visual_rect.ToString().c_str())); clip_path_.countPoints(), visual_rect.ToString().c_str()));
} }
EndClipPathDisplayItem::EndClipPathDisplayItem() { size_t ClipPathDisplayItem::ExternalMemoryUsage() const {
DisplayItem::SetNew(true /* suitable_for_gpu_raster */, 0 /* op_count */, // The size of SkPath's external storage is not currently accounted for (and
0 /* external_memory_usage */); // may well be shared anyway).
return 0;
}
EndClipPathDisplayItem::EndClipPathDisplayItem() {}
EndClipPathDisplayItem::EndClipPathDisplayItem(
const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_EndClipPath, proto.type());
} }
EndClipPathDisplayItem::~EndClipPathDisplayItem() { EndClipPathDisplayItem::~EndClipPathDisplayItem() {
...@@ -91,10 +97,6 @@ void EndClipPathDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { ...@@ -91,10 +97,6 @@ void EndClipPathDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
proto->set_type(proto::DisplayItem::Type_EndClipPath); proto->set_type(proto::DisplayItem::Type_EndClipPath);
} }
void EndClipPathDisplayItem::FromProtobuf(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_EndClipPath, proto.type());
}
void EndClipPathDisplayItem::Raster( void EndClipPathDisplayItem::Raster(
SkCanvas* canvas, SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
...@@ -110,4 +112,8 @@ void EndClipPathDisplayItem::AsValueInto( ...@@ -110,4 +112,8 @@ void EndClipPathDisplayItem::AsValueInto(
visual_rect.ToString().c_str())); visual_rect.ToString().c_str()));
} }
size_t EndClipPathDisplayItem::ExternalMemoryUsage() const {
return 0;
}
} // namespace cc } // namespace cc
...@@ -17,20 +17,24 @@ namespace cc { ...@@ -17,20 +17,24 @@ namespace cc {
class CC_EXPORT ClipPathDisplayItem : public DisplayItem { class CC_EXPORT ClipPathDisplayItem : public DisplayItem {
public: public:
ClipPathDisplayItem(); ClipPathDisplayItem(const SkPath& path, SkRegion::Op clip_op, bool antialias);
explicit ClipPathDisplayItem(const proto::DisplayItem& proto);
~ClipPathDisplayItem() override; ~ClipPathDisplayItem() override;
void SetNew(const SkPath& path, SkRegion::Op clip_op, bool antialias);
void ToProtobuf(proto::DisplayItem* proto) const override; void ToProtobuf(proto::DisplayItem* proto) const override;
void FromProtobuf(const proto::DisplayItem& proto) override;
void Raster(SkCanvas* canvas, void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override; SkPicture::AbortCallback* callback) const override;
void AsValueInto(const gfx::Rect& visual_rect, void AsValueInto(const gfx::Rect& visual_rect,
base::trace_event::TracedValue* array) const override; base::trace_event::TracedValue* array) const override;
size_t ExternalMemoryUsage() const override;
int ApproximateOpCount() const { return 1; }
bool IsSuitableForGpuRasterization() const { return true; }
private: private:
void SetNew(const SkPath& path, SkRegion::Op clip_op, bool antialias);
SkPath clip_path_; SkPath clip_path_;
SkRegion::Op clip_op_; SkRegion::Op clip_op_;
bool antialias_; bool antialias_;
...@@ -39,6 +43,7 @@ class CC_EXPORT ClipPathDisplayItem : public DisplayItem { ...@@ -39,6 +43,7 @@ class CC_EXPORT ClipPathDisplayItem : public DisplayItem {
class CC_EXPORT EndClipPathDisplayItem : public DisplayItem { class CC_EXPORT EndClipPathDisplayItem : public DisplayItem {
public: public:
EndClipPathDisplayItem(); EndClipPathDisplayItem();
explicit EndClipPathDisplayItem(const proto::DisplayItem& proto);
~EndClipPathDisplayItem() override; ~EndClipPathDisplayItem() override;
static scoped_ptr<EndClipPathDisplayItem> Create() { static scoped_ptr<EndClipPathDisplayItem> Create() {
...@@ -46,12 +51,15 @@ class CC_EXPORT EndClipPathDisplayItem : public DisplayItem { ...@@ -46,12 +51,15 @@ class CC_EXPORT EndClipPathDisplayItem : public DisplayItem {
} }
void ToProtobuf(proto::DisplayItem* proto) const override; void ToProtobuf(proto::DisplayItem* proto) const override;
void FromProtobuf(const proto::DisplayItem& proto) override;
void Raster(SkCanvas* canvas, void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override; SkPicture::AbortCallback* callback) const override;
void AsValueInto(const gfx::Rect& visual_rect, void AsValueInto(const gfx::Rect& visual_rect,
base::trace_event::TracedValue* array) const override; base::trace_event::TracedValue* array) const override;
size_t ExternalMemoryUsage() const override;
int ApproximateOpCount() const { return 0; }
bool IsSuitableForGpuRasterization() const { return true; }
}; };
} // namespace cc } // namespace cc
......
...@@ -19,7 +19,35 @@ ...@@ -19,7 +19,35 @@
namespace cc { namespace cc {
CompositingDisplayItem::CompositingDisplayItem() { CompositingDisplayItem::CompositingDisplayItem(uint8_t alpha,
SkXfermode::Mode xfermode,
SkRect* bounds,
skia::RefPtr<SkColorFilter> cf) {
SetNew(alpha, xfermode, bounds, std::move(cf));
}
CompositingDisplayItem::CompositingDisplayItem(
const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_Compositing, proto.type());
const proto::CompositingDisplayItem& details = proto.compositing_item();
uint8_t alpha = static_cast<uint8_t>(details.alpha());
SkXfermode::Mode xfermode = SkXfermodeModeFromProto(details.mode());
scoped_ptr<SkRect> bounds;
if (details.has_bounds()) {
bounds.reset(
new SkRect(gfx::RectFToSkRect(ProtoToRectF(details.bounds()))));
}
skia::RefPtr<SkColorFilter> filter;
if (details.has_color_filter()) {
SkFlattenable* flattenable = SkValidatingDeserializeFlattenable(
details.color_filter().c_str(), details.color_filter().size(),
SkColorFilter::GetFlattenableType());
filter = skia::AdoptRef(static_cast<SkColorFilter*>(flattenable));
}
SetNew(alpha, xfermode, bounds.get(), std::move(filter));
} }
CompositingDisplayItem::~CompositingDisplayItem() { CompositingDisplayItem::~CompositingDisplayItem() {
...@@ -34,12 +62,7 @@ void CompositingDisplayItem::SetNew(uint8_t alpha, ...@@ -34,12 +62,7 @@ void CompositingDisplayItem::SetNew(uint8_t alpha,
has_bounds_ = !!bounds; has_bounds_ = !!bounds;
if (bounds) if (bounds)
bounds_ = SkRect(*bounds); bounds_ = SkRect(*bounds);
color_filter_ = cf; color_filter_ = std::move(cf);
// TODO(pdr): Include color_filter's memory here.
size_t external_memory_usage = 0;
DisplayItem::SetNew(true /* suitable_for_gpu_raster */, 1 /* op_count */,
external_memory_usage);
} }
void CompositingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { void CompositingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
...@@ -59,29 +82,6 @@ void CompositingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { ...@@ -59,29 +82,6 @@ void CompositingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
} }
} }
void CompositingDisplayItem::FromProtobuf(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_Compositing, proto.type());
const proto::CompositingDisplayItem& details = proto.compositing_item();
uint8_t alpha = static_cast<uint8_t>(details.alpha());
SkXfermode::Mode xfermode = SkXfermodeModeFromProto(details.mode());
scoped_ptr<SkRect> bounds;
if (details.has_bounds()) {
bounds.reset(
new SkRect(gfx::RectFToSkRect(ProtoToRectF(details.bounds()))));
}
skia::RefPtr<SkColorFilter> filter;
if (details.has_color_filter()) {
SkFlattenable* flattenable = SkValidatingDeserializeFlattenable(
details.color_filter().c_str(), details.color_filter().size(),
SkColorFilter::GetFlattenableType());
filter = skia::AdoptRef(static_cast<SkColorFilter*>(flattenable));
}
SetNew(alpha, xfermode, bounds.get(), std::move(filter));
}
void CompositingDisplayItem::Raster( void CompositingDisplayItem::Raster(
SkCanvas* canvas, SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
...@@ -106,9 +106,16 @@ void CompositingDisplayItem::AsValueInto( ...@@ -106,9 +106,16 @@ void CompositingDisplayItem::AsValueInto(
static_cast<float>(bounds_.height()))); static_cast<float>(bounds_.height())));
} }
EndCompositingDisplayItem::EndCompositingDisplayItem() { size_t CompositingDisplayItem::ExternalMemoryUsage() const {
DisplayItem::SetNew(true /* suitable_for_gpu_raster */, 0 /* op_count */, // TODO(pdr): Include color_filter's memory here.
0 /* external_memory_usage */); return 0;
}
EndCompositingDisplayItem::EndCompositingDisplayItem() {}
EndCompositingDisplayItem::EndCompositingDisplayItem(
const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_EndCompositing, proto.type());
} }
EndCompositingDisplayItem::~EndCompositingDisplayItem() { EndCompositingDisplayItem::~EndCompositingDisplayItem() {
...@@ -118,10 +125,6 @@ void EndCompositingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { ...@@ -118,10 +125,6 @@ void EndCompositingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
proto->set_type(proto::DisplayItem::Type_EndCompositing); proto->set_type(proto::DisplayItem::Type_EndCompositing);
} }
void EndCompositingDisplayItem::FromProtobuf(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_EndCompositing, proto.type());
}
void EndCompositingDisplayItem::Raster( void EndCompositingDisplayItem::Raster(
SkCanvas* canvas, SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
...@@ -137,4 +140,8 @@ void EndCompositingDisplayItem::AsValueInto( ...@@ -137,4 +140,8 @@ void EndCompositingDisplayItem::AsValueInto(
visual_rect.ToString().c_str())); visual_rect.ToString().c_str()));
} }
size_t EndCompositingDisplayItem::ExternalMemoryUsage() const {
return 0;
}
} // namespace cc } // namespace cc
...@@ -20,23 +20,30 @@ namespace cc { ...@@ -20,23 +20,30 @@ namespace cc {
class CC_EXPORT CompositingDisplayItem : public DisplayItem { class CC_EXPORT CompositingDisplayItem : public DisplayItem {
public: public:
CompositingDisplayItem(); CompositingDisplayItem(uint8_t alpha,
SkXfermode::Mode xfermode,
SkRect* bounds,
skia::RefPtr<SkColorFilter> color_filter);
explicit CompositingDisplayItem(const proto::DisplayItem& proto);
~CompositingDisplayItem() override; ~CompositingDisplayItem() override;
void SetNew(uint8_t alpha,
SkXfermode::Mode xfermode,
SkRect* bounds,
skia::RefPtr<SkColorFilter> color_filter);
void ToProtobuf(proto::DisplayItem* proto) const override; void ToProtobuf(proto::DisplayItem* proto) const override;
void FromProtobuf(const proto::DisplayItem& proto) override;
void Raster(SkCanvas* canvas, void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override; SkPicture::AbortCallback* callback) const override;
void AsValueInto(const gfx::Rect& visual_rect, void AsValueInto(const gfx::Rect& visual_rect,
base::trace_event::TracedValue* array) const override; base::trace_event::TracedValue* array) const override;
size_t ExternalMemoryUsage() const override;
int ApproximateOpCount() const { return 1; }
bool IsSuitableForGpuRasterization() const { return true; }
private: private:
void SetNew(uint8_t alpha,
SkXfermode::Mode xfermode,
SkRect* bounds,
skia::RefPtr<SkColorFilter> color_filter);
uint8_t alpha_; uint8_t alpha_;
SkXfermode::Mode xfermode_; SkXfermode::Mode xfermode_;
bool has_bounds_; bool has_bounds_;
...@@ -47,6 +54,7 @@ class CC_EXPORT CompositingDisplayItem : public DisplayItem { ...@@ -47,6 +54,7 @@ class CC_EXPORT CompositingDisplayItem : public DisplayItem {
class CC_EXPORT EndCompositingDisplayItem : public DisplayItem { class CC_EXPORT EndCompositingDisplayItem : public DisplayItem {
public: public:
EndCompositingDisplayItem(); EndCompositingDisplayItem();
explicit EndCompositingDisplayItem(const proto::DisplayItem& proto);
~EndCompositingDisplayItem() override; ~EndCompositingDisplayItem() override;
static scoped_ptr<EndCompositingDisplayItem> Create() { static scoped_ptr<EndCompositingDisplayItem> Create() {
...@@ -54,12 +62,15 @@ class CC_EXPORT EndCompositingDisplayItem : public DisplayItem { ...@@ -54,12 +62,15 @@ class CC_EXPORT EndCompositingDisplayItem : public DisplayItem {
} }
void ToProtobuf(proto::DisplayItem* proto) const override; void ToProtobuf(proto::DisplayItem* proto) const override;
void FromProtobuf(const proto::DisplayItem& proto) override;
void Raster(SkCanvas* canvas, void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override; SkPicture::AbortCallback* callback) const override;
void AsValueInto(const gfx::Rect& visual_rect, void AsValueInto(const gfx::Rect& visual_rect,
base::trace_event::TracedValue* array) const override; base::trace_event::TracedValue* array) const override;
size_t ExternalMemoryUsage() const override;
int ApproximateOpCount() const { return 0; }
bool IsSuitableForGpuRasterization() const { return true; }
}; };
} // namespace cc } // namespace cc
......
...@@ -23,37 +23,17 @@ class CC_EXPORT DisplayItem { ...@@ -23,37 +23,17 @@ class CC_EXPORT DisplayItem {
public: public:
virtual ~DisplayItem() {} virtual ~DisplayItem() {}
void SetNew(bool is_suitable_for_gpu_rasterization,
int approximate_op_count,
size_t external_memory_usage) {
is_suitable_for_gpu_rasterization_ = is_suitable_for_gpu_rasterization;
approximate_op_count_ = approximate_op_count;
external_memory_usage_ = external_memory_usage;
}
virtual void ToProtobuf(proto::DisplayItem* proto) const = 0; virtual void ToProtobuf(proto::DisplayItem* proto) const = 0;
virtual void FromProtobuf(const proto::DisplayItem& proto) = 0;
virtual void Raster(SkCanvas* canvas, virtual void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const = 0; SkPicture::AbortCallback* callback) const = 0;
virtual void AsValueInto(const gfx::Rect& visual_rect, virtual void AsValueInto(const gfx::Rect& visual_rect,
base::trace_event::TracedValue* array) const = 0; base::trace_event::TracedValue* array) const = 0;
// For tracing.
bool is_suitable_for_gpu_rasterization() const { virtual size_t ExternalMemoryUsage() const = 0;
return is_suitable_for_gpu_rasterization_;
}
int approximate_op_count() const { return approximate_op_count_; }
size_t external_memory_usage() const { return external_memory_usage_; }
protected: protected:
DisplayItem(); DisplayItem();
bool is_suitable_for_gpu_rasterization_;
int approximate_op_count_;
// The size, in bytes, of the memory owned by this display item but not
// allocated within it (e.g. held through scoped_ptr or vector).
size_t external_memory_usage_;
}; };
} // namespace cc } // namespace cc
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "cc/debug/traced_value.h" #include "cc/debug/traced_value.h"
#include "cc/playback/display_item_list_settings.h" #include "cc/playback/display_item_list_settings.h"
#include "cc/playback/display_item_proto_factory.h" #include "cc/playback/display_item_proto_factory.h"
#include "cc/playback/drawing_display_item.h"
#include "cc/playback/largest_display_item.h" #include "cc/playback/largest_display_item.h"
#include "cc/proto/display_item.pb.h" #include "cc/proto/display_item.pb.h"
#include "cc/proto/gfx_conversions.h" #include "cc/proto/gfx_conversions.h"
...@@ -61,10 +62,8 @@ scoped_refptr<DisplayItemList> DisplayItemList::CreateFromProto( ...@@ -61,10 +62,8 @@ scoped_refptr<DisplayItemList> DisplayItemList::CreateFromProto(
for (int i = 0; i < proto.items_size(); i++) { for (int i = 0; i < proto.items_size(); i++) {
const proto::DisplayItem& item_proto = proto.items(i); const proto::DisplayItem& item_proto = proto.items(i);
DisplayItem* item = DisplayItemProtoFactory::AllocateAndConstruct( DisplayItemProtoFactory::AllocateAndConstruct(layer_rect, list.get(),
layer_rect, list.get(), item_proto); item_proto);
if (item)
item->FromProtobuf(item_proto);
} }
return list; return list;
...@@ -80,11 +79,7 @@ DisplayItemList::DisplayItemList(gfx::Rect layer_rect, ...@@ -80,11 +79,7 @@ DisplayItemList::DisplayItemList(gfx::Rect layer_rect,
layer_rect_(layer_rect), layer_rect_(layer_rect),
is_suitable_for_gpu_rasterization_(true), is_suitable_for_gpu_rasterization_(true),
approximate_op_count_(0), approximate_op_count_(0),
picture_memory_usage_(0), picture_memory_usage_(0) {
external_memory_usage_(0) {
#if DCHECK_IS_ON()
needs_process_ = false;
#endif
if (settings_.use_cached_picture) { if (settings_.use_cached_picture) {
SkRTreeFactory factory; SkRTreeFactory factory;
recorder_.reset(new SkPictureRecorder()); recorder_.reset(new SkPictureRecorder());
...@@ -115,7 +110,6 @@ void DisplayItemList::Raster(SkCanvas* canvas, ...@@ -115,7 +110,6 @@ void DisplayItemList::Raster(SkCanvas* canvas,
SkPicture::AbortCallback* callback, SkPicture::AbortCallback* callback,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
float contents_scale) const { float contents_scale) const {
DCHECK(ProcessAppendedItemsCalled());
if (!settings_.use_cached_picture) { if (!settings_.use_cached_picture) {
canvas->save(); canvas->save();
canvas->scale(contents_scale, contents_scale); canvas->scale(contents_scale, contents_scale);
...@@ -142,53 +136,19 @@ void DisplayItemList::Raster(SkCanvas* canvas, ...@@ -142,53 +136,19 @@ void DisplayItemList::Raster(SkCanvas* canvas,
} }
} }
void DisplayItemList::ProcessAppendedItemsOnTheFly() { void DisplayItemList::ProcessAppendedItem(const DisplayItem* item) {
if (retain_individual_display_items_) if (settings_.use_cached_picture) {
return; DCHECK(canvas_);
if (items_.size() >= kDefaultNumDisplayItemsToReserve) { item->Raster(canvas_.get(), gfx::Rect(), nullptr);
ProcessAppendedItems();
// This function exists to keep the |items_| from growing indefinitely if
// we're not going to store them anyway. So the items better be deleted
// after |items_| grows too large and we process it.
DCHECK(items_.empty());
}
}
void DisplayItemList::ProcessAppendedItems() {
#if DCHECK_IS_ON()
needs_process_ = false;
#endif
for (const DisplayItem& item : items_) {
if (settings_.use_cached_picture) {
// When using a cached picture we will calculate gpu suitability on the
// entire cached picture instead of the items. This is more permissive
// since none of the items might individually trigger a veto even though
// they collectively have enough "bad" operations that a corresponding
// Picture would get vetoed. See crbug.com/513016.
DCHECK(canvas_);
approximate_op_count_ += item.approximate_op_count();
item.Raster(canvas_.get(), gfx::Rect(), nullptr);
} else {
is_suitable_for_gpu_rasterization_ &=
item.is_suitable_for_gpu_rasterization();
approximate_op_count_ += item.approximate_op_count();
}
if (retain_individual_display_items_) {
// Warning: this double-counts SkPicture data if use_cached_picture is
// also true.
external_memory_usage_ += item.external_memory_usage();
}
} }
if (!retain_individual_display_items_) {
if (!retain_individual_display_items_)
items_.Clear(); items_.Clear();
}
} }
void DisplayItemList::RasterIntoCanvas(const DisplayItem& item) { void DisplayItemList::RasterIntoCanvas(const DisplayItem& item) {
DCHECK(canvas_); DCHECK(canvas_);
DCHECK(!retain_individual_display_items_); DCHECK(!retain_individual_display_items_);
approximate_op_count_ += item.approximate_op_count();
item.Raster(canvas_.get(), gfx::Rect(), nullptr); item.Raster(canvas_.get(), gfx::Rect(), nullptr);
} }
...@@ -197,15 +157,6 @@ bool DisplayItemList::RetainsIndividualDisplayItems() const { ...@@ -197,15 +157,6 @@ bool DisplayItemList::RetainsIndividualDisplayItems() const {
return retain_individual_display_items_; return retain_individual_display_items_;
} }
void DisplayItemList::RemoveLast() {
// We cannot remove the last item if it has been squashed into a picture.
// The last item should not have been handled by ProcessAppendedItems, so we
// don't need to remove it from approximate_op_count_, etc.
DCHECK(retain_individual_display_items_);
DCHECK(!settings_.use_cached_picture);
items_.RemoveLast();
}
void DisplayItemList::Finalize() { void DisplayItemList::Finalize() {
// TODO(wkorman): Uncomment the assert below once we've investigated // TODO(wkorman): Uncomment the assert below once we've investigated
// and resolved issues. http://crbug.com/557905 // and resolved issues. http://crbug.com/557905
...@@ -216,8 +167,6 @@ void DisplayItemList::Finalize() { ...@@ -216,8 +167,6 @@ void DisplayItemList::Finalize() {
// them to stick around post-Finalize. http://crbug.com/527245 // them to stick around post-Finalize. http://crbug.com/527245
visual_rects_.clear(); visual_rects_.clear();
ProcessAppendedItems();
if (settings_.use_cached_picture) { if (settings_.use_cached_picture) {
// Convert to an SkPicture for faster rasterization. // Convert to an SkPicture for faster rasterization.
DCHECK(settings_.use_cached_picture); DCHECK(settings_.use_cached_picture);
...@@ -228,23 +177,18 @@ void DisplayItemList::Finalize() { ...@@ -228,23 +177,18 @@ void DisplayItemList::Finalize() {
SkPictureUtils::ApproximateBytesUsed(picture_.get()); SkPictureUtils::ApproximateBytesUsed(picture_.get());
recorder_.reset(); recorder_.reset();
canvas_.clear(); canvas_.clear();
is_suitable_for_gpu_rasterization_ =
picture_->suitableForGpuRasterization(nullptr);
} }
} }
bool DisplayItemList::IsSuitableForGpuRasterization() const { bool DisplayItemList::IsSuitableForGpuRasterization() const {
DCHECK(ProcessAppendedItemsCalled());
return is_suitable_for_gpu_rasterization_; return is_suitable_for_gpu_rasterization_;
} }
int DisplayItemList::ApproximateOpCount() const { int DisplayItemList::ApproximateOpCount() const {
DCHECK(ProcessAppendedItemsCalled());
return approximate_op_count_; return approximate_op_count_;
} }
size_t DisplayItemList::ApproximateMemoryUsage() const { size_t DisplayItemList::ApproximateMemoryUsage() const {
DCHECK(ProcessAppendedItemsCalled());
// We double-count in this case. Produce zero to avoid being misleading. // We double-count in this case. Produce zero to avoid being misleading.
if (settings_.use_cached_picture && retain_individual_display_items_) if (settings_.use_cached_picture && retain_individual_display_items_)
return 0; return 0;
...@@ -253,8 +197,17 @@ size_t DisplayItemList::ApproximateMemoryUsage() const { ...@@ -253,8 +197,17 @@ size_t DisplayItemList::ApproximateMemoryUsage() const {
size_t memory_usage = sizeof(*this); size_t memory_usage = sizeof(*this);
size_t external_memory_usage = 0;
if (retain_individual_display_items_) {
// Warning: this double-counts SkPicture data if use_cached_picture is
// also true.
for (const auto& item : items_) {
external_memory_usage += item.ExternalMemoryUsage();
}
}
// Memory outside this class due to |items_|. // Memory outside this class due to |items_|.
memory_usage += items_.GetCapacityInBytes() + external_memory_usage_; memory_usage += items_.GetCapacityInBytes() + external_memory_usage;
// Memory outside this class due to |picture|. // Memory outside this class due to |picture|.
memory_usage += picture_memory_usage_; memory_usage += picture_memory_usage_;
...@@ -271,7 +224,6 @@ bool DisplayItemList::ShouldBeAnalyzedForSolidColor() const { ...@@ -271,7 +224,6 @@ bool DisplayItemList::ShouldBeAnalyzedForSolidColor() const {
scoped_refptr<base::trace_event::ConvertableToTraceFormat> scoped_refptr<base::trace_event::ConvertableToTraceFormat>
DisplayItemList::AsValue(bool include_items) const { DisplayItemList::AsValue(bool include_items) const {
DCHECK(ProcessAppendedItemsCalled());
scoped_refptr<base::trace_event::TracedValue> state = scoped_refptr<base::trace_event::TracedValue> state =
new base::trace_event::TracedValue(); new base::trace_event::TracedValue();
...@@ -310,7 +262,6 @@ DisplayItemList::AsValue(bool include_items) const { ...@@ -310,7 +262,6 @@ DisplayItemList::AsValue(bool include_items) const {
} }
void DisplayItemList::EmitTraceSnapshot() const { void DisplayItemList::EmitTraceSnapshot() const {
DCHECK(ProcessAppendedItemsCalled());
TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
TRACE_DISABLED_BY_DEFAULT("cc.debug.display_items") "," TRACE_DISABLED_BY_DEFAULT("cc.debug.display_items") ","
TRACE_DISABLED_BY_DEFAULT("cc.debug.picture") "," TRACE_DISABLED_BY_DEFAULT("cc.debug.picture") ","
...@@ -321,7 +272,6 @@ void DisplayItemList::EmitTraceSnapshot() const { ...@@ -321,7 +272,6 @@ void DisplayItemList::EmitTraceSnapshot() const {
} }
void DisplayItemList::GenerateDiscardableImagesMetadata() { void DisplayItemList::GenerateDiscardableImagesMetadata() {
DCHECK(ProcessAppendedItemsCalled());
// This should be only called once, and only after CreateAndCacheSkPicture. // This should be only called once, and only after CreateAndCacheSkPicture.
DCHECK(image_map_.empty()); DCHECK(image_map_.empty());
DCHECK(!settings_.use_cached_picture || picture_); DCHECK(!settings_.use_cached_picture || picture_);
......
...@@ -22,6 +22,8 @@ class SkCanvas; ...@@ -22,6 +22,8 @@ class SkCanvas;
class SkPictureRecorder; class SkPictureRecorder;
namespace cc { namespace cc {
class DisplayItem;
class DrawingDisplayItem;
namespace proto { namespace proto {
class DisplayItemList; class DisplayItemList;
...@@ -60,21 +62,24 @@ class CC_EXPORT DisplayItemList ...@@ -60,21 +62,24 @@ class CC_EXPORT DisplayItemList
// is_suitable_for_gpu_rasterization_ and approximate_op_count_. // is_suitable_for_gpu_rasterization_ and approximate_op_count_.
void RasterIntoCanvas(const DisplayItem& display_item); void RasterIntoCanvas(const DisplayItem& display_item);
template <typename DisplayItemType> // Because processing happens in this function, all the set up for
DisplayItemType* CreateAndAppendItem(const gfx::Rect& visual_rect) { // this item should be done via the args, which is why the return
#if DCHECK_IS_ON() // type needs to be const, to prevent set-after-processing mistakes.
needs_process_ = true; template <typename DisplayItemType, typename... Args>
#endif const DisplayItemType& CreateAndAppendItem(const gfx::Rect& visual_rect,
const Args&... args) {
visual_rects_.push_back(visual_rect); visual_rects_.push_back(visual_rect);
ProcessAppendedItemsOnTheFly(); // TODO(enne): This should forward the args.
return &items_.AllocateAndConstruct<DisplayItemType>(); auto* item = &items_.AllocateAndConstruct<DisplayItemType>(args...);
approximate_op_count_ += item->ApproximateOpCount();
// TODO(crbug.com/513016): None of the items might individually trigger a
// veto even though they collectively have enough "bad" operations that a
// corresponding flattened Picture would get vetoed.
is_suitable_for_gpu_rasterization_ &= item->IsSuitableForGpuRasterization();
ProcessAppendedItem(item);
return *item;
} }
// Removes the last item. This cannot be called on lists with cached pictures
// (since the data may already have been incorporated into cached picture
// sizes, etc).
void RemoveLast();
// Called after all items are appended, to process the items and, if // Called after all items are appended, to process the items and, if
// applicable, create an internally cached SkPicture. // applicable, create an internally cached SkPicture.
void Finalize(); void Finalize();
...@@ -104,16 +109,7 @@ class CC_EXPORT DisplayItemList ...@@ -104,16 +109,7 @@ class CC_EXPORT DisplayItemList
bool retain_individual_display_items); bool retain_individual_display_items);
~DisplayItemList(); ~DisplayItemList();
// While appending new items, if they are not being retained, this can process void ProcessAppendedItem(const DisplayItem* item);
// periodically to avoid retaining all the items and processing at the end.
void ProcessAppendedItemsOnTheFly();
void ProcessAppendedItems();
#if DCHECK_IS_ON()
bool ProcessAppendedItemsCalled() const { return !needs_process_; }
bool needs_process_;
#else
bool ProcessAppendedItemsCalled() const { return true; }
#endif
ContiguousContainer<DisplayItem> items_; ContiguousContainer<DisplayItem> items_;
// The visual rects associated with each of the display items in the // The visual rects associated with each of the display items in the
...@@ -136,9 +132,6 @@ class CC_EXPORT DisplayItemList ...@@ -136,9 +132,6 @@ class CC_EXPORT DisplayItemList
// Memory usage due to the cached SkPicture. // Memory usage due to the cached SkPicture.
size_t picture_memory_usage_; size_t picture_memory_usage_;
// Memory usage due to external data held by display items.
size_t external_memory_usage_;
DiscardableImageMap image_map_; DiscardableImageMap image_map_;
friend class base::RefCountedThreadSafe<DisplayItemList>; friend class base::RefCountedThreadSafe<DisplayItemList>;
......
This diff is collapsed.
...@@ -17,41 +17,53 @@ ...@@ -17,41 +17,53 @@
namespace cc { namespace cc {
// static // static
DisplayItem* DisplayItemProtoFactory::AllocateAndConstruct( void DisplayItemProtoFactory::AllocateAndConstruct(
const gfx::Rect& visual_rect, const gfx::Rect& visual_rect,
DisplayItemList* list, DisplayItemList* list,
const proto::DisplayItem& proto) { const proto::DisplayItem& proto) {
switch (proto.type()) { switch (proto.type()) {
case proto::DisplayItem::Type_Clip: case proto::DisplayItem::Type_Clip:
return list->CreateAndAppendItem<ClipDisplayItem>(visual_rect); list->CreateAndAppendItem<ClipDisplayItem>(visual_rect, proto);
return;
case proto::DisplayItem::Type_EndClip: case proto::DisplayItem::Type_EndClip:
return list->CreateAndAppendItem<EndClipDisplayItem>(visual_rect); list->CreateAndAppendItem<EndClipDisplayItem>(visual_rect, proto);
return;
case proto::DisplayItem::Type_ClipPath: case proto::DisplayItem::Type_ClipPath:
return list->CreateAndAppendItem<ClipPathDisplayItem>(visual_rect); list->CreateAndAppendItem<ClipPathDisplayItem>(visual_rect, proto);
return;
case proto::DisplayItem::Type_EndClipPath: case proto::DisplayItem::Type_EndClipPath:
return list->CreateAndAppendItem<EndClipPathDisplayItem>(visual_rect); list->CreateAndAppendItem<EndClipPathDisplayItem>(visual_rect, proto);
return;
case proto::DisplayItem::Type_Compositing: case proto::DisplayItem::Type_Compositing:
return list->CreateAndAppendItem<CompositingDisplayItem>(visual_rect); list->CreateAndAppendItem<CompositingDisplayItem>(visual_rect, proto);
return;
case proto::DisplayItem::Type_EndCompositing: case proto::DisplayItem::Type_EndCompositing:
return list->CreateAndAppendItem<EndCompositingDisplayItem>(visual_rect); list->CreateAndAppendItem<EndCompositingDisplayItem>(visual_rect, proto);
return;
case proto::DisplayItem::Type_Drawing: case proto::DisplayItem::Type_Drawing:
return list->CreateAndAppendItem<DrawingDisplayItem>(visual_rect); list->CreateAndAppendItem<DrawingDisplayItem>(visual_rect, proto);
return;
case proto::DisplayItem::Type_Filter: case proto::DisplayItem::Type_Filter:
return list->CreateAndAppendItem<FilterDisplayItem>(visual_rect); list->CreateAndAppendItem<FilterDisplayItem>(visual_rect, proto);
return;
case proto::DisplayItem::Type_EndFilter: case proto::DisplayItem::Type_EndFilter:
return list->CreateAndAppendItem<EndFilterDisplayItem>(visual_rect); list->CreateAndAppendItem<EndFilterDisplayItem>(visual_rect, proto);
return;
case proto::DisplayItem::Type_FloatClip: case proto::DisplayItem::Type_FloatClip:
return list->CreateAndAppendItem<FloatClipDisplayItem>(visual_rect); list->CreateAndAppendItem<FloatClipDisplayItem>(visual_rect, proto);
return;
case proto::DisplayItem::Type_EndFloatClip: case proto::DisplayItem::Type_EndFloatClip:
return list->CreateAndAppendItem<EndFloatClipDisplayItem>(visual_rect); list->CreateAndAppendItem<EndFloatClipDisplayItem>(visual_rect, proto);
return;
case proto::DisplayItem::Type_Transform: case proto::DisplayItem::Type_Transform:
return list->CreateAndAppendItem<TransformDisplayItem>(visual_rect); list->CreateAndAppendItem<TransformDisplayItem>(visual_rect, proto);
return;
case proto::DisplayItem::Type_EndTransform: case proto::DisplayItem::Type_EndTransform:
return list->CreateAndAppendItem<EndTransformDisplayItem>(visual_rect); list->CreateAndAppendItem<EndTransformDisplayItem>(visual_rect, proto);
return;
} }
NOTREACHED(); NOTREACHED();
return nullptr;
} }
} // namespace cc } // namespace cc
...@@ -18,9 +18,9 @@ class DisplayItem; ...@@ -18,9 +18,9 @@ class DisplayItem;
class DisplayItemProtoFactory { class DisplayItemProtoFactory {
public: public:
static DisplayItem* AllocateAndConstruct(const gfx::Rect& visual_rect, static void AllocateAndConstruct(const gfx::Rect& visual_rect,
DisplayItemList* list, DisplayItemList* list,
const proto::DisplayItem& proto); const proto::DisplayItem& proto);
private: private:
DisplayItemProtoFactory() {} DisplayItemProtoFactory() {}
......
...@@ -21,7 +21,29 @@ ...@@ -21,7 +21,29 @@
namespace cc { namespace cc {
DrawingDisplayItem::DrawingDisplayItem() { DrawingDisplayItem::DrawingDisplayItem() {}
DrawingDisplayItem::DrawingDisplayItem(skia::RefPtr<SkPicture> picture) {
SetNew(std::move(picture));
}
DrawingDisplayItem::DrawingDisplayItem(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_Drawing, proto.type());
skia::RefPtr<SkPicture> picture;
const proto::DrawingDisplayItem& details = proto.drawing_item();
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));
}
SetNew(std::move(picture));
}
DrawingDisplayItem::DrawingDisplayItem(const DrawingDisplayItem& item) {
item.CloneTo(this);
} }
DrawingDisplayItem::~DrawingDisplayItem() { DrawingDisplayItem::~DrawingDisplayItem() {
...@@ -29,9 +51,6 @@ DrawingDisplayItem::~DrawingDisplayItem() { ...@@ -29,9 +51,6 @@ DrawingDisplayItem::~DrawingDisplayItem() {
void DrawingDisplayItem::SetNew(skia::RefPtr<SkPicture> picture) { void DrawingDisplayItem::SetNew(skia::RefPtr<SkPicture> picture) {
picture_ = std::move(picture); picture_ = std::move(picture);
DisplayItem::SetNew(picture_->suitableForGpuRasterization(NULL),
picture_->approximateOpCount(),
SkPictureUtils::ApproximateBytesUsed(picture_.get()));
} }
void DrawingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { void DrawingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
...@@ -53,21 +72,6 @@ void DrawingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { ...@@ -53,21 +72,6 @@ void DrawingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
} }
} }
void DrawingDisplayItem::FromProtobuf(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_Drawing, proto.type());
skia::RefPtr<SkPicture> picture;
const proto::DrawingDisplayItem& details = proto.drawing_item();
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));
}
SetNew(std::move(picture));
}
void DrawingDisplayItem::Raster(SkCanvas* canvas, void DrawingDisplayItem::Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const { SkPicture::AbortCallback* callback) const {
...@@ -119,4 +123,16 @@ void DrawingDisplayItem::CloneTo(DrawingDisplayItem* item) const { ...@@ -119,4 +123,16 @@ void DrawingDisplayItem::CloneTo(DrawingDisplayItem* item) const {
item->SetNew(picture_); item->SetNew(picture_);
} }
size_t DrawingDisplayItem::ExternalMemoryUsage() const {
return SkPictureUtils::ApproximateBytesUsed(picture_.get());
}
int DrawingDisplayItem::ApproximateOpCount() const {
return picture_->approximateOpCount();
}
bool DrawingDisplayItem::IsSuitableForGpuRasterization() const {
return picture_->suitableForGpuRasterization(NULL);
}
} // namespace cc } // namespace cc
...@@ -19,21 +19,27 @@ namespace cc { ...@@ -19,21 +19,27 @@ namespace cc {
class CC_EXPORT DrawingDisplayItem : public DisplayItem { class CC_EXPORT DrawingDisplayItem : public DisplayItem {
public: public:
DrawingDisplayItem(); DrawingDisplayItem();
explicit DrawingDisplayItem(skia::RefPtr<SkPicture> picture);
explicit DrawingDisplayItem(const proto::DisplayItem& proto);
explicit DrawingDisplayItem(const DrawingDisplayItem& item);
~DrawingDisplayItem() override; ~DrawingDisplayItem() override;
void SetNew(skia::RefPtr<SkPicture> picture);
void ToProtobuf(proto::DisplayItem* proto) const override; void ToProtobuf(proto::DisplayItem* proto) const override;
void FromProtobuf(const proto::DisplayItem& proto) override;
void Raster(SkCanvas* canvas, void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_playback_rect, const gfx::Rect& canvas_playback_rect,
SkPicture::AbortCallback* callback) const override; SkPicture::AbortCallback* callback) const override;
void AsValueInto(const gfx::Rect& visual_rect, void AsValueInto(const gfx::Rect& visual_rect,
base::trace_event::TracedValue* array) const override; base::trace_event::TracedValue* array) const override;
size_t ExternalMemoryUsage() const override;
int ApproximateOpCount() const;
bool IsSuitableForGpuRasterization() const;
void CloneTo(DrawingDisplayItem* item) const; void CloneTo(DrawingDisplayItem* item) const;
private: private:
void SetNew(skia::RefPtr<SkPicture> picture);
skia::RefPtr<SkPicture> picture_; skia::RefPtr<SkPicture> picture_;
}; };
......
...@@ -18,22 +18,29 @@ ...@@ -18,22 +18,29 @@
namespace cc { namespace cc {
FilterDisplayItem::FilterDisplayItem() { FilterDisplayItem::FilterDisplayItem(const FilterOperations& filters,
const gfx::RectF& bounds) {
SetNew(filters, bounds);
} }
FilterDisplayItem::~FilterDisplayItem() { FilterDisplayItem::FilterDisplayItem(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_Filter, proto.type());
const proto::FilterDisplayItem& details = proto.filter_item();
gfx::RectF bounds = ProtoToRectF(details.bounds());
// TODO(dtrainor): Support deserializing FilterOperations (crbug.com/541321).
FilterOperations filters;
SetNew(filters, bounds);
} }
FilterDisplayItem::~FilterDisplayItem() {}
void FilterDisplayItem::SetNew(const FilterOperations& filters, void FilterDisplayItem::SetNew(const FilterOperations& filters,
const gfx::RectF& bounds) { const gfx::RectF& bounds) {
filters_ = filters; filters_ = filters;
bounds_ = bounds; bounds_ = bounds;
// FilterOperations doesn't expose its capacity, but size is probably good
// enough.
size_t external_memory_usage = filters_.size() * sizeof(filters_.at(0));
DisplayItem::SetNew(true /* suitable_for_gpu_raster */, 1 /* op_count */,
external_memory_usage);
} }
void FilterDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { void FilterDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
...@@ -45,18 +52,6 @@ void FilterDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { ...@@ -45,18 +52,6 @@ void FilterDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
// TODO(dtrainor): Support serializing FilterOperations (crbug.com/541321). // TODO(dtrainor): Support serializing FilterOperations (crbug.com/541321).
} }
void FilterDisplayItem::FromProtobuf(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_Filter, proto.type());
const proto::FilterDisplayItem& details = proto.filter_item();
gfx::RectF bounds = ProtoToRectF(details.bounds());
// TODO(dtrainor): Support deserializing FilterOperations (crbug.com/541321).
FilterOperations filters;
SetNew(filters, bounds);
}
void FilterDisplayItem::Raster(SkCanvas* canvas, void FilterDisplayItem::Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const { SkPicture::AbortCallback* callback) const {
...@@ -84,22 +79,24 @@ void FilterDisplayItem::AsValueInto( ...@@ -84,22 +79,24 @@ void FilterDisplayItem::AsValueInto(
bounds_.ToString().c_str(), visual_rect.ToString().c_str())); bounds_.ToString().c_str(), visual_rect.ToString().c_str()));
} }
EndFilterDisplayItem::EndFilterDisplayItem() { size_t FilterDisplayItem::ExternalMemoryUsage() const {
DisplayItem::SetNew(true /* suitable_for_gpu_raster */, 0 /* op_count */, // FilterOperations doesn't expose its capacity, but size is probably good
0 /* external_memory_usage */); // enough.
return filters_.size() * sizeof(filters_.at(0));
} }
EndFilterDisplayItem::~EndFilterDisplayItem() { EndFilterDisplayItem::EndFilterDisplayItem() {}
EndFilterDisplayItem::EndFilterDisplayItem(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_EndFilter, proto.type());
} }
EndFilterDisplayItem::~EndFilterDisplayItem() {}
void EndFilterDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { void EndFilterDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
proto->set_type(proto::DisplayItem::Type_EndFilter); proto->set_type(proto::DisplayItem::Type_EndFilter);
} }
void EndFilterDisplayItem::FromProtobuf(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_EndFilter, proto.type());
}
void EndFilterDisplayItem::Raster(SkCanvas* canvas, void EndFilterDisplayItem::Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const { SkPicture::AbortCallback* callback) const {
...@@ -115,4 +112,8 @@ void EndFilterDisplayItem::AsValueInto( ...@@ -115,4 +112,8 @@ void EndFilterDisplayItem::AsValueInto(
visual_rect.ToString().c_str())); visual_rect.ToString().c_str()));
} }
size_t EndFilterDisplayItem::ExternalMemoryUsage() const {
return 0;
}
} // namespace cc } // namespace cc
...@@ -17,20 +17,24 @@ namespace cc { ...@@ -17,20 +17,24 @@ namespace cc {
class CC_EXPORT FilterDisplayItem : public DisplayItem { class CC_EXPORT FilterDisplayItem : public DisplayItem {
public: public:
FilterDisplayItem(); FilterDisplayItem(const FilterOperations& filters, const gfx::RectF& bounds);
explicit FilterDisplayItem(const proto::DisplayItem& proto);
~FilterDisplayItem() override; ~FilterDisplayItem() override;
void SetNew(const FilterOperations& filters, const gfx::RectF& bounds);
void ToProtobuf(proto::DisplayItem* proto) const override; void ToProtobuf(proto::DisplayItem* proto) const override;
void FromProtobuf(const proto::DisplayItem& proto) override;
void Raster(SkCanvas* canvas, void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override; SkPicture::AbortCallback* callback) const override;
void AsValueInto(const gfx::Rect& visual_rect, void AsValueInto(const gfx::Rect& visual_rect,
base::trace_event::TracedValue* array) const override; base::trace_event::TracedValue* array) const override;
size_t ExternalMemoryUsage() const override;
int ApproximateOpCount() const { return 1; }
bool IsSuitableForGpuRasterization() const { return true; }
private: private:
void SetNew(const FilterOperations& filters, const gfx::RectF& bounds);
FilterOperations filters_; FilterOperations filters_;
gfx::RectF bounds_; gfx::RectF bounds_;
}; };
...@@ -38,6 +42,7 @@ class CC_EXPORT FilterDisplayItem : public DisplayItem { ...@@ -38,6 +42,7 @@ class CC_EXPORT FilterDisplayItem : public DisplayItem {
class CC_EXPORT EndFilterDisplayItem : public DisplayItem { class CC_EXPORT EndFilterDisplayItem : public DisplayItem {
public: public:
EndFilterDisplayItem(); EndFilterDisplayItem();
explicit EndFilterDisplayItem(const proto::DisplayItem& proto);
~EndFilterDisplayItem() override; ~EndFilterDisplayItem() override;
static scoped_ptr<EndFilterDisplayItem> Create() { static scoped_ptr<EndFilterDisplayItem> Create() {
...@@ -45,12 +50,15 @@ class CC_EXPORT EndFilterDisplayItem : public DisplayItem { ...@@ -45,12 +50,15 @@ class CC_EXPORT EndFilterDisplayItem : public DisplayItem {
} }
void ToProtobuf(proto::DisplayItem* proto) const override; void ToProtobuf(proto::DisplayItem* proto) const override;
void FromProtobuf(const proto::DisplayItem& proto) override;
void Raster(SkCanvas* canvas, void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override; SkPicture::AbortCallback* callback) const override;
void AsValueInto(const gfx::Rect& visual_rect, void AsValueInto(const gfx::Rect& visual_rect,
base::trace_event::TracedValue* array) const override; base::trace_event::TracedValue* array) const override;
size_t ExternalMemoryUsage() const override;
int ApproximateOpCount() const { return 0; }
bool IsSuitableForGpuRasterization() const { return true; }
}; };
} // namespace cc } // namespace cc
......
...@@ -13,7 +13,17 @@ ...@@ -13,7 +13,17 @@
namespace cc { namespace cc {
FloatClipDisplayItem::FloatClipDisplayItem() { FloatClipDisplayItem::FloatClipDisplayItem(const gfx::RectF& clip_rect) {
SetNew(clip_rect);
}
FloatClipDisplayItem::FloatClipDisplayItem(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_FloatClip, proto.type());
const proto::FloatClipDisplayItem& details = proto.float_clip_item();
gfx::RectF clip_rect = ProtoToRectF(details.clip_rect());
SetNew(clip_rect);
} }
FloatClipDisplayItem::~FloatClipDisplayItem() { FloatClipDisplayItem::~FloatClipDisplayItem() {
...@@ -21,9 +31,6 @@ FloatClipDisplayItem::~FloatClipDisplayItem() { ...@@ -21,9 +31,6 @@ FloatClipDisplayItem::~FloatClipDisplayItem() {
void FloatClipDisplayItem::SetNew(const gfx::RectF& clip_rect) { void FloatClipDisplayItem::SetNew(const gfx::RectF& clip_rect) {
clip_rect_ = clip_rect; clip_rect_ = clip_rect;
DisplayItem::SetNew(true /* suitable_for_gpu_raster */, 1 /* op_count */,
0 /* external_memory_usage */);
} }
void FloatClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { void FloatClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
...@@ -33,15 +40,6 @@ void FloatClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { ...@@ -33,15 +40,6 @@ void FloatClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
RectFToProto(clip_rect_, details->mutable_clip_rect()); RectFToProto(clip_rect_, details->mutable_clip_rect());
} }
void FloatClipDisplayItem::FromProtobuf(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_FloatClip, proto.type());
const proto::FloatClipDisplayItem& details = proto.float_clip_item();
gfx::RectF clip_rect = ProtoToRectF(details.clip_rect());
SetNew(clip_rect);
}
void FloatClipDisplayItem::Raster(SkCanvas* canvas, void FloatClipDisplayItem::Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const { SkPicture::AbortCallback* callback) const {
...@@ -57,9 +55,15 @@ void FloatClipDisplayItem::AsValueInto( ...@@ -57,9 +55,15 @@ void FloatClipDisplayItem::AsValueInto(
clip_rect_.ToString().c_str(), visual_rect.ToString().c_str())); clip_rect_.ToString().c_str(), visual_rect.ToString().c_str()));
} }
EndFloatClipDisplayItem::EndFloatClipDisplayItem() { size_t FloatClipDisplayItem::ExternalMemoryUsage() const {
DisplayItem::SetNew(true /* suitable_for_gpu_raster */, 0 /* op_count */, return 0;
0 /* external_memory_usage */); }
EndFloatClipDisplayItem::EndFloatClipDisplayItem() {}
EndFloatClipDisplayItem::EndFloatClipDisplayItem(
const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_EndFloatClip, proto.type());
} }
EndFloatClipDisplayItem::~EndFloatClipDisplayItem() { EndFloatClipDisplayItem::~EndFloatClipDisplayItem() {
...@@ -69,10 +73,6 @@ void EndFloatClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { ...@@ -69,10 +73,6 @@ void EndFloatClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
proto->set_type(proto::DisplayItem::Type_EndFloatClip); proto->set_type(proto::DisplayItem::Type_EndFloatClip);
} }
void EndFloatClipDisplayItem::FromProtobuf(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_EndFloatClip, proto.type());
}
void EndFloatClipDisplayItem::Raster( void EndFloatClipDisplayItem::Raster(
SkCanvas* canvas, SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
...@@ -88,4 +88,8 @@ void EndFloatClipDisplayItem::AsValueInto( ...@@ -88,4 +88,8 @@ void EndFloatClipDisplayItem::AsValueInto(
visual_rect.ToString().c_str())); visual_rect.ToString().c_str()));
} }
size_t EndFloatClipDisplayItem::ExternalMemoryUsage() const {
return 0;
}
} // namespace cc } // namespace cc
...@@ -18,26 +18,31 @@ namespace cc { ...@@ -18,26 +18,31 @@ namespace cc {
class CC_EXPORT FloatClipDisplayItem : public DisplayItem { class CC_EXPORT FloatClipDisplayItem : public DisplayItem {
public: public:
FloatClipDisplayItem(); explicit FloatClipDisplayItem(const gfx::RectF& clip_rect);
explicit FloatClipDisplayItem(const proto::DisplayItem& proto);
~FloatClipDisplayItem() override; ~FloatClipDisplayItem() override;
void SetNew(const gfx::RectF& clip_rect);
void ToProtobuf(proto::DisplayItem* proto) const override; void ToProtobuf(proto::DisplayItem* proto) const override;
void FromProtobuf(const proto::DisplayItem& proto) override;
void Raster(SkCanvas* canvas, void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override; SkPicture::AbortCallback* callback) const override;
void AsValueInto(const gfx::Rect& visual_rect, void AsValueInto(const gfx::Rect& visual_rect,
base::trace_event::TracedValue* array) const override; base::trace_event::TracedValue* array) const override;
size_t ExternalMemoryUsage() const override;
int ApproximateOpCount() const { return 1; }
bool IsSuitableForGpuRasterization() const { return true; }
private: private:
void SetNew(const gfx::RectF& clip_rect);
gfx::RectF clip_rect_; gfx::RectF clip_rect_;
}; };
class CC_EXPORT EndFloatClipDisplayItem : public DisplayItem { class CC_EXPORT EndFloatClipDisplayItem : public DisplayItem {
public: public:
EndFloatClipDisplayItem(); EndFloatClipDisplayItem();
explicit EndFloatClipDisplayItem(const proto::DisplayItem& proto);
~EndFloatClipDisplayItem() override; ~EndFloatClipDisplayItem() override;
static scoped_ptr<EndFloatClipDisplayItem> Create() { static scoped_ptr<EndFloatClipDisplayItem> Create() {
...@@ -45,12 +50,15 @@ class CC_EXPORT EndFloatClipDisplayItem : public DisplayItem { ...@@ -45,12 +50,15 @@ class CC_EXPORT EndFloatClipDisplayItem : public DisplayItem {
} }
void ToProtobuf(proto::DisplayItem* proto) const override; void ToProtobuf(proto::DisplayItem* proto) const override;
void FromProtobuf(const proto::DisplayItem& proto) override;
void Raster(SkCanvas* canvas, void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override; SkPicture::AbortCallback* callback) const override;
void AsValueInto(const gfx::Rect& visual_rect, void AsValueInto(const gfx::Rect& visual_rect,
base::trace_event::TracedValue* array) const override; base::trace_event::TracedValue* array) const override;
size_t ExternalMemoryUsage() const override;
int ApproximateOpCount() const { return 0; }
bool IsSuitableForGpuRasterization() const { return true; }
}; };
} // namespace cc } // namespace cc
......
...@@ -12,8 +12,18 @@ ...@@ -12,8 +12,18 @@
namespace cc { namespace cc {
TransformDisplayItem::TransformDisplayItem() TransformDisplayItem::TransformDisplayItem(const gfx::Transform& transform)
: transform_(gfx::Transform::kSkipInitialization) { : transform_(gfx::Transform::kSkipInitialization) {
SetNew(transform);
}
TransformDisplayItem::TransformDisplayItem(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_Transform, proto.type());
const proto::TransformDisplayItem& details = proto.transform_item();
gfx::Transform transform = ProtoToTransform(details.transform());
SetNew(transform);
} }
TransformDisplayItem::~TransformDisplayItem() { TransformDisplayItem::~TransformDisplayItem() {
...@@ -21,9 +31,6 @@ TransformDisplayItem::~TransformDisplayItem() { ...@@ -21,9 +31,6 @@ TransformDisplayItem::~TransformDisplayItem() {
void TransformDisplayItem::SetNew(const gfx::Transform& transform) { void TransformDisplayItem::SetNew(const gfx::Transform& transform) {
transform_ = transform; transform_ = transform;
DisplayItem::SetNew(true /* suitable_for_gpu_raster */, 1 /* op_count */,
0 /* external_memory_usage */);
} }
void TransformDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { void TransformDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
...@@ -33,15 +40,6 @@ void TransformDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { ...@@ -33,15 +40,6 @@ void TransformDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
TransformToProto(transform_, details->mutable_transform()); TransformToProto(transform_, details->mutable_transform());
} }
void TransformDisplayItem::FromProtobuf(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_Transform, proto.type());
const proto::TransformDisplayItem& details = proto.transform_item();
gfx::Transform transform = ProtoToTransform(details.transform());
SetNew(transform);
}
void TransformDisplayItem::Raster(SkCanvas* canvas, void TransformDisplayItem::Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const { SkPicture::AbortCallback* callback) const {
...@@ -58,9 +56,15 @@ void TransformDisplayItem::AsValueInto( ...@@ -58,9 +56,15 @@ void TransformDisplayItem::AsValueInto(
transform_.ToString().c_str(), visual_rect.ToString().c_str())); transform_.ToString().c_str(), visual_rect.ToString().c_str()));
} }
EndTransformDisplayItem::EndTransformDisplayItem() { size_t TransformDisplayItem::ExternalMemoryUsage() const {
DisplayItem::SetNew(true /* suitable_for_gpu_raster */, 0 /* op_count */, return 0;
0 /* external_memory_usage */); }
EndTransformDisplayItem::EndTransformDisplayItem() {}
EndTransformDisplayItem::EndTransformDisplayItem(
const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_EndTransform, proto.type());
} }
EndTransformDisplayItem::~EndTransformDisplayItem() { EndTransformDisplayItem::~EndTransformDisplayItem() {
...@@ -70,10 +74,6 @@ void EndTransformDisplayItem::ToProtobuf(proto::DisplayItem* proto) const { ...@@ -70,10 +74,6 @@ void EndTransformDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
proto->set_type(proto::DisplayItem::Type_EndTransform); proto->set_type(proto::DisplayItem::Type_EndTransform);
} }
void EndTransformDisplayItem::FromProtobuf(const proto::DisplayItem& proto) {
DCHECK_EQ(proto::DisplayItem::Type_EndTransform, proto.type());
}
void EndTransformDisplayItem::Raster( void EndTransformDisplayItem::Raster(
SkCanvas* canvas, SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
...@@ -89,4 +89,8 @@ void EndTransformDisplayItem::AsValueInto( ...@@ -89,4 +89,8 @@ void EndTransformDisplayItem::AsValueInto(
visual_rect.ToString().c_str())); visual_rect.ToString().c_str()));
} }
size_t EndTransformDisplayItem::ExternalMemoryUsage() const {
return 0;
}
} // namespace cc } // namespace cc
...@@ -16,26 +16,31 @@ namespace cc { ...@@ -16,26 +16,31 @@ namespace cc {
class CC_EXPORT TransformDisplayItem : public DisplayItem { class CC_EXPORT TransformDisplayItem : public DisplayItem {
public: public:
TransformDisplayItem(); explicit TransformDisplayItem(const gfx::Transform& transform);
explicit TransformDisplayItem(const proto::DisplayItem& proto);
~TransformDisplayItem() override; ~TransformDisplayItem() override;
void SetNew(const gfx::Transform& transform);
void ToProtobuf(proto::DisplayItem* proto) const override; void ToProtobuf(proto::DisplayItem* proto) const override;
void FromProtobuf(const proto::DisplayItem& proto) override;
void Raster(SkCanvas* canvas, void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override; SkPicture::AbortCallback* callback) const override;
void AsValueInto(const gfx::Rect& visual_rect, void AsValueInto(const gfx::Rect& visual_rect,
base::trace_event::TracedValue* array) const override; base::trace_event::TracedValue* array) const override;
size_t ExternalMemoryUsage() const override;
int ApproximateOpCount() const { return 1; }
bool IsSuitableForGpuRasterization() const { return true; }
private: private:
void SetNew(const gfx::Transform& transform);
gfx::Transform transform_; gfx::Transform transform_;
}; };
class CC_EXPORT EndTransformDisplayItem : public DisplayItem { class CC_EXPORT EndTransformDisplayItem : public DisplayItem {
public: public:
EndTransformDisplayItem(); EndTransformDisplayItem();
explicit EndTransformDisplayItem(const proto::DisplayItem& proto);
~EndTransformDisplayItem() override; ~EndTransformDisplayItem() override;
static scoped_ptr<EndTransformDisplayItem> Create() { static scoped_ptr<EndTransformDisplayItem> Create() {
...@@ -43,12 +48,15 @@ class CC_EXPORT EndTransformDisplayItem : public DisplayItem { ...@@ -43,12 +48,15 @@ class CC_EXPORT EndTransformDisplayItem : public DisplayItem {
} }
void ToProtobuf(proto::DisplayItem* proto) const override; void ToProtobuf(proto::DisplayItem* proto) const override;
void FromProtobuf(const proto::DisplayItem& proto) override;
void Raster(SkCanvas* canvas, void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect, const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override; SkPicture::AbortCallback* callback) const override;
void AsValueInto(const gfx::Rect& visual_rect, void AsValueInto(const gfx::Rect& visual_rect,
base::trace_event::TracedValue* array) const override; base::trace_event::TracedValue* array) const override;
size_t ExternalMemoryUsage() const override;
int ApproximateOpCount() const { return 0; }
bool IsSuitableForGpuRasterization() const { return true; }
}; };
} // namespace cc } // namespace cc
......
...@@ -52,7 +52,6 @@ FakeContentLayerClient::PaintContentsToDisplayList( ...@@ -52,7 +52,6 @@ FakeContentLayerClient::PaintContentsToDisplayList(
DisplayItemList::Create(PaintableRegion(), settings); DisplayItemList::Create(PaintableRegion(), settings);
SkPictureRecorder recorder; SkPictureRecorder recorder;
skia::RefPtr<SkCanvas> canvas; skia::RefPtr<SkCanvas> canvas;
skia::RefPtr<SkPicture> picture;
for (RectPaintVector::const_iterator it = draw_rects_.begin(); for (RectPaintVector::const_iterator it = draw_rects_.begin();
it != draw_rects_.end(); ++it) { it != draw_rects_.end(); ++it) {
...@@ -61,27 +60,23 @@ FakeContentLayerClient::PaintContentsToDisplayList( ...@@ -61,27 +60,23 @@ FakeContentLayerClient::PaintContentsToDisplayList(
canvas = canvas =
skia::SharePtr(recorder.beginRecording(gfx::RectFToSkRect(draw_rect))); skia::SharePtr(recorder.beginRecording(gfx::RectFToSkRect(draw_rect)));
canvas->drawRect(gfx::RectFToSkRect(draw_rect), paint); canvas->drawRect(gfx::RectFToSkRect(draw_rect), paint);
picture = skia::AdoptRef(recorder.endRecordingAsPicture()); display_list->CreateAndAppendItem<DrawingDisplayItem>(
auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>( ToEnclosingRect(draw_rect),
ToEnclosingRect(draw_rect)); skia::AdoptRef(recorder.endRecordingAsPicture()));
item->SetNew(std::move(picture));
} }
for (ImageVector::const_iterator it = draw_images_.begin(); for (ImageVector::const_iterator it = draw_images_.begin();
it != draw_images_.end(); ++it) { it != draw_images_.end(); ++it) {
if (!it->transform.IsIdentity()) { if (!it->transform.IsIdentity()) {
auto* item = display_list->CreateAndAppendItem<TransformDisplayItem>( display_list->CreateAndAppendItem<TransformDisplayItem>(PaintableRegion(),
PaintableRegion()); it->transform);
item->SetNew(it->transform);
} }
canvas = skia::SharePtr( canvas = skia::SharePtr(
recorder.beginRecording(it->image->width(), it->image->height())); recorder.beginRecording(it->image->width(), it->image->height()));
canvas->drawImage(it->image.get(), it->point.x(), it->point.y(), canvas->drawImage(it->image.get(), it->point.x(), it->point.y(),
&it->paint); &it->paint);
picture = skia::AdoptRef(recorder.endRecordingAsPicture()); display_list->CreateAndAppendItem<DrawingDisplayItem>(
auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>( PaintableRegion(), skia::AdoptRef(recorder.endRecordingAsPicture()));
PaintableRegion());
item->SetNew(std::move(picture));
if (!it->transform.IsIdentity()) { if (!it->transform.IsIdentity()) {
display_list->CreateAndAppendItem<EndTransformDisplayItem>( display_list->CreateAndAppendItem<EndTransformDisplayItem>(
PaintableRegion()); PaintableRegion());
...@@ -97,10 +92,8 @@ FakeContentLayerClient::PaintContentsToDisplayList( ...@@ -97,10 +92,8 @@ FakeContentLayerClient::PaintContentsToDisplayList(
canvas = canvas =
skia::SharePtr(recorder.beginRecording(gfx::RectToSkRect(draw_rect))); skia::SharePtr(recorder.beginRecording(gfx::RectToSkRect(draw_rect)));
canvas->drawIRect(gfx::RectToSkIRect(draw_rect), paint); canvas->drawIRect(gfx::RectToSkIRect(draw_rect), paint);
picture = skia::AdoptRef(recorder.endRecordingAsPicture()); display_list->CreateAndAppendItem<DrawingDisplayItem>(
auto* item = draw_rect, skia::AdoptRef(recorder.endRecordingAsPicture()));
display_list->CreateAndAppendItem<DrawingDisplayItem>(draw_rect);
item->SetNew(std::move(picture));
draw_rect.Inset(1, 1); draw_rect.Inset(1, 1);
} }
} }
......
...@@ -39,11 +39,9 @@ SolidColorContentLayerClient::PaintContentsToDisplayList( ...@@ -39,11 +39,9 @@ SolidColorContentLayerClient::PaintContentsToDisplayList(
settings.use_cached_picture = false; settings.use_cached_picture = false;
scoped_refptr<DisplayItemList> display_list = scoped_refptr<DisplayItemList> display_list =
DisplayItemList::Create(clip, settings); DisplayItemList::Create(clip, settings);
auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>(clip);
skia::RefPtr<SkPicture> picture = display_list->CreateAndAppendItem<DrawingDisplayItem>(
skia::AdoptRef(recorder.endRecordingAsPicture()); clip, skia::AdoptRef(recorder.endRecordingAsPicture()));
item->SetNew(std::move(picture));
display_list->Finalize(); display_list->Finalize();
return display_list; return display_list;
......
...@@ -58,12 +58,8 @@ class MaskContentLayerClient : public ContentLayerClient { ...@@ -58,12 +58,8 @@ class MaskContentLayerClient : public ContentLayerClient {
scoped_refptr<DisplayItemList> display_list = scoped_refptr<DisplayItemList> display_list =
DisplayItemList::Create(PaintableRegion(), DisplayItemListSettings()); DisplayItemList::Create(PaintableRegion(), DisplayItemListSettings());
auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>( display_list->CreateAndAppendItem<DrawingDisplayItem>(
PaintableRegion()); PaintableRegion(), skia::AdoptRef(recorder.endRecordingAsPicture()));
skia::RefPtr<SkPicture> picture =
skia::AdoptRef(recorder.endRecordingAsPicture());
item->SetNew(std::move(picture));
display_list->Finalize(); display_list->Finalize();
return display_list; return display_list;
...@@ -337,12 +333,8 @@ class CheckerContentLayerClient : public ContentLayerClient { ...@@ -337,12 +333,8 @@ class CheckerContentLayerClient : public ContentLayerClient {
scoped_refptr<DisplayItemList> display_list = scoped_refptr<DisplayItemList> display_list =
DisplayItemList::Create(PaintableRegion(), DisplayItemListSettings()); DisplayItemList::Create(PaintableRegion(), DisplayItemListSettings());
auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>( display_list->CreateAndAppendItem<DrawingDisplayItem>(
PaintableRegion()); PaintableRegion(), skia::AdoptRef(recorder.endRecordingAsPicture()));
skia::RefPtr<SkPicture> picture =
skia::AdoptRef(recorder.endRecordingAsPicture());
item->SetNew(std::move(picture));
display_list->Finalize(); display_list->Finalize();
return display_list; return display_list;
...@@ -379,11 +371,8 @@ class CircleContentLayerClient : public ContentLayerClient { ...@@ -379,11 +371,8 @@ class CircleContentLayerClient : public ContentLayerClient {
scoped_refptr<DisplayItemList> display_list = scoped_refptr<DisplayItemList> display_list =
DisplayItemList::Create(PaintableRegion(), DisplayItemListSettings()); DisplayItemList::Create(PaintableRegion(), DisplayItemListSettings());
auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>( display_list->CreateAndAppendItem<DrawingDisplayItem>(
PaintableRegion()); PaintableRegion(), skia::AdoptRef(recorder.endRecordingAsPicture()));
skia::RefPtr<SkPicture> picture =
skia::AdoptRef(recorder.endRecordingAsPicture());
item->SetNew(std::move(picture));
display_list->Finalize(); display_list->Finalize();
return display_list; return display_list;
......
...@@ -130,13 +130,8 @@ class BlueYellowClient : public ContentLayerClient { ...@@ -130,13 +130,8 @@ class BlueYellowClient : public ContentLayerClient {
paint.setColor(SK_ColorYELLOW); paint.setColor(SK_ColorYELLOW);
canvas->drawRect(gfx::RectToSkRect(yellow_rect), paint); canvas->drawRect(gfx::RectToSkRect(yellow_rect), paint);
skia::RefPtr<SkPicture> picture = display_list->CreateAndAppendItem<DrawingDisplayItem>(
skia::AdoptRef(recorder.endRecordingAsPicture()); PaintableRegion(), skia::AdoptRef(recorder.endRecordingAsPicture()));
auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>(
PaintableRegion());
item->SetNew(std::move(picture));
display_list->Finalize(); display_list->Finalize();
return display_list; return display_list;
} }
......
...@@ -48,9 +48,8 @@ static gfx::Rect PathToEnclosingRect(const gfx::Path& path) { ...@@ -48,9 +48,8 @@ static gfx::Rect PathToEnclosingRect(const gfx::Path& path) {
void ClipRecorder::ClipRect(const gfx::Rect& clip_rect) { void ClipRecorder::ClipRect(const gfx::Rect& clip_rect) {
gfx::Rect clip_in_layer_space = context_.ToLayerSpaceRect(clip_rect); gfx::Rect clip_in_layer_space = context_.ToLayerSpaceRect(clip_rect);
auto* item = context_.list_->CreateAndAppendItem<cc::ClipDisplayItem>( context_.list_->CreateAndAppendItem<cc::ClipDisplayItem>(
clip_in_layer_space); clip_in_layer_space, clip_rect, std::vector<SkRRect>());
item->SetNew(clip_rect, std::vector<SkRRect>());
RecordCloser(clip_in_layer_space, CLIP_RECT); RecordCloser(clip_in_layer_space, CLIP_RECT);
} }
...@@ -58,9 +57,8 @@ void ClipRecorder::ClipPath(const gfx::Path& clip_path) { ...@@ -58,9 +57,8 @@ void ClipRecorder::ClipPath(const gfx::Path& clip_path) {
bool anti_alias = false; bool anti_alias = false;
gfx::Rect clip_in_layer_space = gfx::Rect clip_in_layer_space =
context_.ToLayerSpaceRect(PathToEnclosingRect(clip_path)); context_.ToLayerSpaceRect(PathToEnclosingRect(clip_path));
auto* item = context_.list_->CreateAndAppendItem<cc::ClipPathDisplayItem>( context_.list_->CreateAndAppendItem<cc::ClipPathDisplayItem>(
clip_in_layer_space); clip_in_layer_space, clip_path, SkRegion::kIntersect_Op, anti_alias);
item->SetNew(clip_path, SkRegion::kIntersect_Op, anti_alias);
RecordCloser(clip_in_layer_space, CLIP_PATH); RecordCloser(clip_in_layer_space, CLIP_PATH);
} }
...@@ -68,9 +66,8 @@ void ClipRecorder::ClipPathWithAntiAliasing(const gfx::Path& clip_path) { ...@@ -68,9 +66,8 @@ void ClipRecorder::ClipPathWithAntiAliasing(const gfx::Path& clip_path) {
bool anti_alias = true; bool anti_alias = true;
gfx::Rect clip_in_layer_space = gfx::Rect clip_in_layer_space =
context_.ToLayerSpaceRect(PathToEnclosingRect(clip_path)); context_.ToLayerSpaceRect(PathToEnclosingRect(clip_path));
auto* item = context_.list_->CreateAndAppendItem<cc::ClipPathDisplayItem>( context_.list_->CreateAndAppendItem<cc::ClipPathDisplayItem>(
clip_in_layer_space); clip_in_layer_space, clip_path, SkRegion::kIntersect_Op, anti_alias);
item->SetNew(clip_path, SkRegion::kIntersect_Op, anti_alias);
RecordCloser(clip_in_layer_space, CLIP_PATH); RecordCloser(clip_in_layer_space, CLIP_PATH);
} }
......
...@@ -20,10 +20,9 @@ CompositingRecorder::CompositingRecorder(const PaintContext& context, ...@@ -20,10 +20,9 @@ CompositingRecorder::CompositingRecorder(const PaintContext& context,
if (!saved_) if (!saved_)
return; return;
auto* item = context_.list_->CreateAndAppendItem<cc::CompositingDisplayItem>( context_.list_->CreateAndAppendItem<cc::CompositingDisplayItem>(
bounds_in_layer_); bounds_in_layer_, alpha, SkXfermode::kSrcOver_Mode,
item->SetNew(alpha, SkXfermode::kSrcOver_Mode, nullptr /* no bounds */, nullptr /* no bounds */, skia::RefPtr<SkColorFilter>());
skia::RefPtr<SkColorFilter>());
} }
CompositingRecorder::~CompositingRecorder() { CompositingRecorder::~CompositingRecorder() {
......
...@@ -21,14 +21,13 @@ bool PaintCache::UseCache(const PaintContext& context, ...@@ -21,14 +21,13 @@ bool PaintCache::UseCache(const PaintContext& context,
return false; return false;
DCHECK(context.list_); DCHECK(context.list_);
gfx::Rect bounds_in_layer = context.ToLayerSpaceBounds(size_in_context); gfx::Rect bounds_in_layer = context.ToLayerSpaceBounds(size_in_context);
auto* item = context.list_->CreateAndAppendItem<cc::DrawingDisplayItem>( context.list_->CreateAndAppendItem<cc::DrawingDisplayItem>(bounds_in_layer,
bounds_in_layer); display_item_);
display_item_.CloneTo(item);
return true; return true;
} }
void PaintCache::SetCache(const cc::DrawingDisplayItem* item) { void PaintCache::SetCache(const cc::DrawingDisplayItem& item) {
item->CloneTo(&display_item_); item.CloneTo(&display_item_);
has_cache_ = true; has_cache_ = true;
} }
......
...@@ -30,7 +30,7 @@ class COMPOSITOR_EXPORT PaintCache { ...@@ -30,7 +30,7 @@ class COMPOSITOR_EXPORT PaintCache {
// Only PaintRecorder can modify these. // Only PaintRecorder can modify these.
friend PaintRecorder; friend PaintRecorder;
void SetCache(const cc::DrawingDisplayItem* item); void SetCache(const cc::DrawingDisplayItem& item);
bool has_cache_; bool has_cache_;
cc::DrawingDisplayItem display_item_; cc::DrawingDisplayItem display_item_;
......
...@@ -41,10 +41,10 @@ PaintRecorder::~PaintRecorder() { ...@@ -41,10 +41,10 @@ PaintRecorder::~PaintRecorder() {
#if DCHECK_IS_ON() #if DCHECK_IS_ON()
context_.inside_paint_recorder_ = false; context_.inside_paint_recorder_ = false;
#endif #endif
const auto& item =
auto* item = context_.list_->CreateAndAppendItem<cc::DrawingDisplayItem>( context_.list_->CreateAndAppendItem<cc::DrawingDisplayItem>(
bounds_in_layer_); bounds_in_layer_,
item->SetNew(skia::AdoptRef(context_.recorder_->endRecordingAsPicture())); skia::AdoptRef(context_.recorder_->endRecordingAsPicture()));
if (cache_) if (cache_)
cache_->SetCache(item); cache_->SetCache(item);
} }
......
...@@ -23,9 +23,8 @@ void TransformRecorder::Transform(const gfx::Transform& transform, ...@@ -23,9 +23,8 @@ void TransformRecorder::Transform(const gfx::Transform& transform,
const gfx::Size& size_in_context) { const gfx::Size& size_in_context) {
DCHECK(!transformed_); DCHECK(!transformed_);
bounds_in_layer_ = context_.ToLayerSpaceBounds(size_in_context); bounds_in_layer_ = context_.ToLayerSpaceBounds(size_in_context);
auto* item = context_.list_->CreateAndAppendItem<cc::TransformDisplayItem>( context_.list_->CreateAndAppendItem<cc::TransformDisplayItem>(
bounds_in_layer_); bounds_in_layer_, transform);
item->SetNew(transform);
transformed_ = true; transformed_ = true;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment