summaryrefslogtreecommitdiffstats
path: root/cc/layers/content_layer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cc/layers/content_layer.cc')
-rw-r--r--cc/layers/content_layer.cc114
1 files changed, 114 insertions, 0 deletions
diff --git a/cc/layers/content_layer.cc b/cc/layers/content_layer.cc
new file mode 100644
index 0000000..b6c8d7b
--- /dev/null
+++ b/cc/layers/content_layer.cc
@@ -0,0 +1,114 @@
+// Copyright 2010 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/layers/content_layer.h"
+
+#include "base/auto_reset.h"
+#include "base/metrics/histogram.h"
+#include "base/time.h"
+#include "cc/layers/content_layer_client.h"
+#include "cc/resources/bitmap_content_layer_updater.h"
+#include "cc/resources/bitmap_skpicture_content_layer_updater.h"
+#include "cc/resources/layer_painter.h"
+#include "cc/trees/layer_tree_host.h"
+
+namespace cc {
+
+ContentLayerPainter::ContentLayerPainter(ContentLayerClient* client)
+ : client_(client) {}
+
+scoped_ptr<ContentLayerPainter> ContentLayerPainter::Create(
+ ContentLayerClient* client) {
+ return make_scoped_ptr(new ContentLayerPainter(client));
+}
+
+void ContentLayerPainter::Paint(SkCanvas* canvas,
+ gfx::Rect content_rect,
+ gfx::RectF* opaque) {
+ base::TimeTicks paint_start = base::TimeTicks::HighResNow();
+ client_->PaintContents(canvas, content_rect, opaque);
+ base::TimeTicks paint_end = base::TimeTicks::HighResNow();
+ double pixels_per_sec = (content_rect.width() * content_rect.height()) /
+ (paint_end - paint_start).InSecondsF();
+ UMA_HISTOGRAM_CUSTOM_COUNTS("Renderer4.AccelContentPaintDurationMS",
+ (paint_end - paint_start).InMilliseconds(),
+ 0,
+ 120,
+ 30);
+ UMA_HISTOGRAM_CUSTOM_COUNTS("Renderer4.AccelContentPaintMegapixPerSecond",
+ pixels_per_sec / 1000000,
+ 10,
+ 210,
+ 30);
+}
+
+scoped_refptr<ContentLayer> ContentLayer::Create(ContentLayerClient* client) {
+ return make_scoped_refptr(new ContentLayer(client));
+}
+
+ContentLayer::ContentLayer(ContentLayerClient* client)
+ : TiledLayer(),
+ client_(client) {}
+
+ContentLayer::~ContentLayer() {}
+
+bool ContentLayer::DrawsContent() const {
+ return TiledLayer::DrawsContent() && client_;
+}
+
+void ContentLayer::SetTexturePriorities(
+ const PriorityCalculator& priority_calc) {
+ // Update the tile data before creating all the layer's tiles.
+ UpdateTileSizeAndTilingOption();
+
+ TiledLayer::SetTexturePriorities(priority_calc);
+}
+
+void ContentLayer::Update(ResourceUpdateQueue* queue,
+ const OcclusionTracker* occlusion,
+ RenderingStats* stats) {
+ {
+ base::AutoReset<bool> ignore_set_needs_commit(&ignore_set_needs_commit_,
+ true);
+
+ CreateUpdaterIfNeeded();
+ }
+
+ TiledLayer::Update(queue, occlusion, stats);
+ needs_display_ = false;
+}
+
+bool ContentLayer::NeedMoreUpdates() {
+ return NeedsIdlePaint();
+}
+
+LayerUpdater* ContentLayer::Updater() const {
+ return updater_.get();
+}
+
+void ContentLayer::CreateUpdaterIfNeeded() {
+ if (updater_)
+ return;
+ scoped_ptr<LayerPainter> painter =
+ ContentLayerPainter::Create(client_).PassAs<LayerPainter>();
+ if (layer_tree_host()->settings().acceleratePainting)
+ updater_ = SkPictureContentLayerUpdater::Create(painter.Pass());
+ else if (layer_tree_host()->settings().perTilePaintingEnabled)
+ updater_ = BitmapSkPictureContentLayerUpdater::Create(painter.Pass());
+ else
+ updater_ = BitmapContentLayerUpdater::Create(painter.Pass());
+ updater_->SetOpaque(contents_opaque());
+
+ unsigned texture_format =
+ layer_tree_host()->GetRendererCapabilities().best_texture_format;
+ SetTextureFormat(texture_format);
+}
+
+void ContentLayer::SetContentsOpaque(bool opaque) {
+ Layer::SetContentsOpaque(opaque);
+ if (updater_)
+ updater_->SetOpaque(opaque);
+}
+
+} // namespace cc