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) |