Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(889)

Unified Diff: cc/trees/layer_tree_host_pixeltest_tiles.cc

Issue 1139063002: cc: Partial tile update for one-copy raster. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: monocle: rebase Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/layer_tree_host_impl.cc ('k') | cc/trees/layer_tree_settings.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/layer_tree_host_pixeltest_tiles.cc
diff --git a/cc/trees/layer_tree_host_pixeltest_tiles.cc b/cc/trees/layer_tree_host_pixeltest_tiles.cc
new file mode 100644
index 0000000000000000000000000000000000000000..eef2d2d7ce282632dddd2c4fb6242c7bf6ca30ba
--- /dev/null
+++ b/cc/trees/layer_tree_host_pixeltest_tiles.cc
@@ -0,0 +1,188 @@
+// Copyright 2015 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_client.h"
+#include "cc/layers/picture_layer.h"
+#include "cc/output/copy_output_request.h"
+#include "cc/playback/display_item_list.h"
+#include "cc/playback/drawing_display_item.h"
+#include "cc/test/layer_tree_pixel_test.h"
+#include "cc/test/test_gpu_memory_buffer_manager.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkPictureRecorder.h"
+
+#if !defined(OS_ANDROID)
+
+namespace cc {
+namespace {
+
+enum RasterMode {
+ PARTIAL_ONE_COPY,
+ FULL_ONE_COPY,
+};
+
+class LayerTreeHostTilesPixelTest : public LayerTreePixelTest {
+ protected:
+ void InitializeSettings(LayerTreeSettings* settings) override {
+ LayerTreePixelTest::InitializeSettings(settings);
+ settings->use_display_lists = true;
+ switch (raster_mode_) {
+ case PARTIAL_ONE_COPY:
+ settings->use_one_copy = true;
+ settings->use_zero_copy = false;
+ settings->use_persistent_map_for_gpu_memory_buffers = true;
+ break;
+ case FULL_ONE_COPY:
+ settings->use_one_copy = true;
+ settings->use_zero_copy = false;
+ settings->use_persistent_map_for_gpu_memory_buffers = false;
+ break;
+ }
+ }
+
+ void BeginTest() override {
+ // Don't set up a readback target at the start of the test.
+ PostSetNeedsCommitToMainThread();
+ }
+
+ void DoReadback() {
+ Layer* target =
+ readback_target_ ? readback_target_ : layer_tree_host()->root_layer();
+ target->RequestCopyOfOutput(CreateCopyOutputRequest().Pass());
+ }
+
+ void RunRasterPixelTest(bool threaded,
+ RasterMode mode,
+ scoped_refptr<Layer> content_root,
+ base::FilePath file_name) {
+ raster_mode_ = mode;
+
+ PixelTestType test_type = PIXEL_TEST_SOFTWARE;
+ switch (mode) {
+ case PARTIAL_ONE_COPY:
+ case FULL_ONE_COPY:
+ test_type = PIXEL_TEST_GL;
+ break;
+ }
+
+ if (threaded)
+ RunPixelTest(test_type, content_root, file_name);
+ else
+ RunSingleThreadedPixelTest(test_type, content_root, file_name);
+ }
+
+ base::FilePath ref_file_;
+ scoped_ptr<SkBitmap> result_bitmap_;
+ RasterMode raster_mode_;
+};
+
+class BlueYellowClient : public ContentLayerClient {
+ public:
+ explicit BlueYellowClient(const gfx::Size& size)
+ : size_(size), blue_top_(true) {}
+
+ void PaintContents(SkCanvas* canvas,
+ const gfx::Rect& clip,
+ PaintingControlSetting painting_status) override {}
+
+ scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ PaintingControlSetting painting_status) override {
+ bool use_cached_picture = false;
+ scoped_refptr<DisplayItemList> display_list =
+ DisplayItemList::Create(clip, use_cached_picture);
+
+ SkPictureRecorder recorder;
+ skia::RefPtr<SkCanvas> canvas = skia::SharePtr(
+ recorder.beginRecording(gfx::RectToSkRect(gfx::Rect(size_))));
+ gfx::Rect top(0, 0, size_.width(), size_.height() / 2);
+ gfx::Rect bottom(0, size_.height() / 2, size_.width(), size_.height() / 2);
+
+ gfx::Rect blue_rect = blue_top_ ? top : bottom;
+ gfx::Rect yellow_rect = blue_top_ ? bottom : top;
+
+ SkPaint paint;
+ paint.setStyle(SkPaint::kFill_Style);
+
+ paint.setColor(SK_ColorBLUE);
+ canvas->drawRect(gfx::RectToSkRect(blue_rect), paint);
+ paint.setColor(SK_ColorYELLOW);
+ canvas->drawRect(gfx::RectToSkRect(yellow_rect), paint);
+
+ skia::RefPtr<SkPicture> picture =
+ skia::AdoptRef(recorder.endRecordingAsPicture());
+
+ auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>();
+ item->SetNew(picture.Pass());
+
+ display_list->Finalize();
+ return display_list;
+ }
+
+ bool FillsBoundsCompletely() const override { return true; }
+
+ void set_blue_top(bool b) { blue_top_ = b; }
+
+ private:
+ gfx::Size size_;
+ bool blue_top_;
+};
+
+class LayerTreeHostTilesTestPartialInvalidation
+ : public LayerTreeHostTilesPixelTest {
+ public:
+ LayerTreeHostTilesTestPartialInvalidation()
+ : client_(gfx::Size(200, 200)),
+ picture_layer_(PictureLayer::Create(layer_settings(), &client_)) {
+ picture_layer_->SetBounds(gfx::Size(200, 200));
+ picture_layer_->SetIsDrawable(true);
+ }
+
+ void DidCommitAndDrawFrame() override {
+ switch (layer_tree_host()->source_frame_number()) {
+ case 1:
+ // We have done one frame, so the layer's content has been rastered.
+ // Now we change the picture behind it to record something completely
+ // different, but we give a smaller invalidation rect. The layer should
+ // only re-raster the stuff in the rect. If it doesn't do partial raster
+ // it would re-raster the whole thing instead.
+ client_.set_blue_top(false);
+ picture_layer_->SetNeedsDisplayRect(gfx::Rect(50, 50, 100, 100));
+
+ // Add a copy request to see what happened!
+ DoReadback();
+ break;
+ }
+ }
+
+ protected:
+ BlueYellowClient client_;
+ scoped_refptr<PictureLayer> picture_layer_;
+};
+
+TEST_F(LayerTreeHostTilesTestPartialInvalidation,
+ PartialRaster_SingleThread_OneCopy) {
+ RunRasterPixelTest(
+ false, PARTIAL_ONE_COPY, picture_layer_,
+ base::FilePath(FILE_PATH_LITERAL("blue_yellow_partial_flipped.png")));
+}
+
+TEST_F(LayerTreeHostTilesTestPartialInvalidation,
+ FullRaster_SingleThread_OneCopy) {
+ RunRasterPixelTest(
+ false, FULL_ONE_COPY, picture_layer_,
+ base::FilePath(FILE_PATH_LITERAL("blue_yellow_flipped.png")));
+}
+
+TEST_F(LayerTreeHostTilesTestPartialInvalidation,
+ FullRaster_MultiThread_OneCopy) {
+ RunRasterPixelTest(
+ true, FULL_ONE_COPY, picture_layer_,
+ base::FilePath(FILE_PATH_LITERAL("blue_yellow_flipped.png")));
+}
+
+} // namespace
+} // namespace cc
+
+#endif // !defined(OS_ANDROID)
« no previous file with comments | « cc/trees/layer_tree_host_impl.cc ('k') | cc/trees/layer_tree_settings.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698