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

Side by Side Diff: cc/trees/layer_tree_host_unittest.cc

Issue 671653005: SetNeedsRedraw directly when updating a visible tile. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: pinchblurmerge-test: comments Created 6 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/trees/layer_tree_host.h" 5 #include "cc/trees/layer_tree_host.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/synchronization/lock.h" 10 #include "base/synchronization/lock.h"
11 #include "cc/animation/timing_function.h" 11 #include "cc/animation/timing_function.h"
12 #include "cc/base/swap_promise.h" 12 #include "cc/base/swap_promise.h"
13 #include "cc/debug/frame_rate_counter.h" 13 #include "cc/debug/frame_rate_counter.h"
14 #include "cc/layers/content_layer.h" 14 #include "cc/layers/content_layer.h"
15 #include "cc/layers/content_layer_client.h" 15 #include "cc/layers/content_layer_client.h"
16 #include "cc/layers/io_surface_layer.h" 16 #include "cc/layers/io_surface_layer.h"
17 #include "cc/layers/layer_impl.h" 17 #include "cc/layers/layer_impl.h"
18 #include "cc/layers/painted_scrollbar_layer.h" 18 #include "cc/layers/painted_scrollbar_layer.h"
19 #include "cc/layers/picture_layer.h" 19 #include "cc/layers/picture_layer.h"
20 #include "cc/layers/solid_color_layer.h" 20 #include "cc/layers/solid_color_layer.h"
21 #include "cc/layers/video_layer.h" 21 #include "cc/layers/video_layer.h"
22 #include "cc/output/begin_frame_args.h" 22 #include "cc/output/begin_frame_args.h"
23 #include "cc/output/compositor_frame_ack.h" 23 #include "cc/output/compositor_frame_ack.h"
24 #include "cc/output/copy_output_request.h" 24 #include "cc/output/copy_output_request.h"
25 #include "cc/output/copy_output_result.h" 25 #include "cc/output/copy_output_result.h"
26 #include "cc/output/output_surface.h" 26 #include "cc/output/output_surface.h"
27 #include "cc/quads/draw_quad.h" 27 #include "cc/quads/draw_quad.h"
28 #include "cc/quads/io_surface_draw_quad.h" 28 #include "cc/quads/io_surface_draw_quad.h"
29 #include "cc/quads/tile_draw_quad.h"
29 #include "cc/resources/prioritized_resource.h" 30 #include "cc/resources/prioritized_resource.h"
30 #include "cc/resources/prioritized_resource_manager.h" 31 #include "cc/resources/prioritized_resource_manager.h"
31 #include "cc/resources/resource_update_queue.h" 32 #include "cc/resources/resource_update_queue.h"
32 #include "cc/test/fake_content_layer.h" 33 #include "cc/test/fake_content_layer.h"
33 #include "cc/test/fake_content_layer_client.h" 34 #include "cc/test/fake_content_layer_client.h"
34 #include "cc/test/fake_content_layer_impl.h" 35 #include "cc/test/fake_content_layer_impl.h"
35 #include "cc/test/fake_layer_tree_host_client.h" 36 #include "cc/test/fake_layer_tree_host_client.h"
36 #include "cc/test/fake_output_surface.h" 37 #include "cc/test/fake_output_surface.h"
37 #include "cc/test/fake_painted_scrollbar_layer.h" 38 #include "cc/test/fake_painted_scrollbar_layer.h"
38 #include "cc/test/fake_picture_layer.h" 39 #include "cc/test/fake_picture_layer.h"
(...skipping 4146 matching lines...) Expand 10 before | Expand all | Expand 10 after
4185 void InitializeSettings(LayerTreeSettings* settings) override { 4186 void InitializeSettings(LayerTreeSettings* settings) override {
4186 settings->impl_side_painting = true; 4187 settings->impl_side_painting = true;
4187 settings->use_zero_copy = false; 4188 settings->use_zero_copy = false;
4188 settings->use_one_copy = false; 4189 settings->use_one_copy = false;
4189 } 4190 }
4190 4191
4191 scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface( 4192 scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(
4192 bool fallback) override { 4193 bool fallback) override {
4193 scoped_refptr<TestContextProvider> context_provider = 4194 scoped_refptr<TestContextProvider> context_provider =
4194 TestContextProvider::Create(); 4195 TestContextProvider::Create();
4195 context_provider->SetMaxTransferBufferUsageBytes(1024 * 1024); 4196 context_provider->SetMaxTransferBufferUsageBytes(512 * 512);
4196 if (delegating_renderer()) 4197 if (delegating_renderer())
4197 return FakeOutputSurface::CreateDelegating3d(context_provider); 4198 return FakeOutputSurface::CreateDelegating3d(context_provider);
4198 else 4199 else
4199 return FakeOutputSurface::Create3d(context_provider); 4200 return FakeOutputSurface::Create3d(context_provider);
4200 } 4201 }
4201 4202
4202 void SetupTree() override { 4203 void SetupTree() override {
4203 client_.set_fill_with_nonsolid_color(true); 4204 client_.set_fill_with_nonsolid_color(true);
4204 scoped_refptr<FakePictureLayer> root_layer = 4205 scoped_refptr<FakePictureLayer> root_layer =
4205 FakePictureLayer::Create(&client_); 4206 FakePictureLayer::Create(&client_);
4206 root_layer->SetBounds(gfx::Size(6000, 6000)); 4207 root_layer->SetBounds(gfx::Size(1024, 1024));
4207 root_layer->SetIsDrawable(true); 4208 root_layer->SetIsDrawable(true);
4208 4209
4209 layer_tree_host()->SetRootLayer(root_layer); 4210 layer_tree_host()->SetRootLayer(root_layer);
4210 LayerTreeHostTest::SetupTree(); 4211 LayerTreeHostTest::SetupTree();
4211 } 4212 }
4212 4213
4213 void BeginTest() override { PostSetNeedsCommitToMainThread(); } 4214 void BeginTest() override { PostSetNeedsCommitToMainThread(); }
4214 4215
4215 void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override { 4216 void DidActivateTreeOnThread(LayerTreeHostImpl* impl) override {
4216 TestWebGraphicsContext3D* context = TestContext(); 4217 TestWebGraphicsContext3D* context = TestContext();
4217 4218
4218 // Expect that the transfer buffer memory used is equal to the 4219 // Expect that the transfer buffer memory used is equal to the
4219 // MaxTransferBufferUsageBytes value set in CreateOutputSurface. 4220 // MaxTransferBufferUsageBytes value set in CreateOutputSurface.
4220 EXPECT_EQ(1024 * 1024u, context->max_used_transfer_buffer_usage_bytes()); 4221 EXPECT_EQ(512 * 512u, context->max_used_transfer_buffer_usage_bytes());
4221 EndTest(); 4222 EndTest();
4222 } 4223 }
4223 4224
4224 void AfterTest() override {} 4225 void AfterTest() override {}
4225 4226
4226 private: 4227 private:
4227 FakeContentLayerClient client_; 4228 FakeContentLayerClient client_;
4228 }; 4229 };
4229 4230
4230 // Impl-side painting is a multi-threaded compositor feature. 4231 // Impl-side painting is a multi-threaded compositor feature.
(...skipping 967 matching lines...) Expand 10 before | Expand all | Expand 10 after
5198 5199
5199 void AfterTest() override { 5200 void AfterTest() override {
5200 EXPECT_TRUE(deltas_sent_to_client_); 5201 EXPECT_TRUE(deltas_sent_to_client_);
5201 } 5202 }
5202 5203
5203 ScrollAndScaleSet info_; 5204 ScrollAndScaleSet info_;
5204 bool deltas_sent_to_client_; 5205 bool deltas_sent_to_client_;
5205 }; 5206 };
5206 5207
5207 MULTI_THREAD_TEST_F(LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer); 5208 MULTI_THREAD_TEST_F(LayerTreeHostAcceptsDeltasFromImplWithoutRootLayer);
5209
5210 class LayerTreeHostTestCrispUpAfterPinchEnds : public LayerTreeHostTest {
5211 protected:
5212 void InitializeSettings(LayerTreeSettings* settings) override {
5213 settings->impl_side_painting = true;
5214 }
5215
5216 void SetupTree() override {
5217 frame_ = 1;
5218 posted_ = false;
5219 client_.set_fill_with_nonsolid_color(true);
5220
5221 scoped_refptr<Layer> root = Layer::Create();
5222 root->SetBounds(gfx::Size(500, 500));
5223
5224 scoped_refptr<Layer> pinch = Layer::Create();
5225 pinch->SetBounds(gfx::Size(500, 500));
5226 pinch->SetScrollClipLayerId(root->id());
5227 pinch->SetIsContainerForFixedPositionLayers(true);
5228 root->AddChild(pinch);
5229
5230 scoped_refptr<FakePictureLayer> layer = FakePictureLayer::Create(&client_);
5231 layer->SetBounds(gfx::Size(500, 500));
5232 layer->SetContentsOpaque(true);
5233 pinch->AddChild(layer);
5234
5235 layer_tree_host()->RegisterViewportLayers(root, pinch, pinch);
5236 layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 1.f, 4.f);
5237 layer_tree_host()->SetRootLayer(root);
5238 LayerTreeHostTest::SetupTree();
5239 }
5240
5241 // Returns the delta scale of all quads in the frame's root pass from their
5242 // ideal, or 0 if they are not all the same.
5243 float FrameQuadScaleDeltaFromIdeal(LayerTreeHostImpl::FrameData* frame_data) {
5244 if (frame_data->has_no_damage)
5245 return 0.f;
5246 float frame_scale = 0.f;
5247 RenderPass* root_pass = frame_data->render_passes.back();
5248 for (const auto& draw_quad : root_pass->quad_list) {
5249 // Checkerboards mean an incomplete frame.
5250 if (draw_quad->material != DrawQuad::TILED_CONTENT)
5251 return 0.f;
5252 const TileDrawQuad* quad = TileDrawQuad::MaterialCast(draw_quad);
5253 float quad_scale =
5254 quad->tex_coord_rect.width() / static_cast<float>(quad->rect.width());
5255 float transform_scale =
5256 SkMScalarToFloat(quad->quadTransform().matrix().get(0, 0));
5257 float scale = quad_scale / transform_scale;
5258 if (frame_scale != 0.f && frame_scale != scale)
5259 return 0.f;
5260 frame_scale = scale;
5261 }
5262 return frame_scale;
5263 }
5264
5265 void BeginTest() override { PostSetNeedsCommitToMainThread(); }
5266
5267 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
5268 LayerTreeHostImpl::FrameData* frame_data,
5269 DrawResult draw_result) override {
5270 float quad_scale_delta = FrameQuadScaleDeltaFromIdeal(frame_data);
5271 switch (frame_) {
5272 case 1:
5273 // Drew at scale 1 before any pinching.
5274 EXPECT_EQ(1.f, host_impl->active_tree()->total_page_scale_factor());
5275 EXPECT_EQ(1.f, quad_scale_delta);
5276 PostNextAfterDraw(host_impl);
5277 break;
5278 case 2:
5279 if (quad_scale_delta != 1.f)
5280 break;
5281 // Drew at scale 2.2 after pinching in.
5282 EXPECT_EQ(2.2f, host_impl->active_tree()->total_page_scale_factor());
5283 EXPECT_EQ(1.f, quad_scale_delta);
5284 PostNextAfterDraw(host_impl);
5285 break;
5286 case 3:
5287 if (quad_scale_delta != 1.1f)
5288 break;
5289 // Drew at scale 1 with the 1.1 tiling while pinching out.
5290 EXPECT_EQ(1.f, host_impl->active_tree()->total_page_scale_factor());
5291 EXPECT_EQ(1.1f, quad_scale_delta);
5292 PostNextAfterDraw(host_impl);
5293 break;
5294 case 4:
5295 // Drew at scale 1 with the 1.1 tiling after pinching out completed
5296 // while waiting for texture uploads to complete.
5297 EXPECT_EQ(1.f, host_impl->active_tree()->total_page_scale_factor());
5298 // This frame may not have any damage, since it's actually the same as
5299 // the last frame, and should contain incomplete tiles. We just want to
5300 // make sure we drew here at least once after the pinch ended to be sure
5301 // that drawing after pinch doesn't leave us at the wrong scale forever.
5302 if (!frame_data->has_no_damage)
5303 EXPECT_EQ(1.1f, quad_scale_delta);
5304 PostNextAfterDraw(host_impl);
5305 break;
5306 case 5:
5307 if (quad_scale_delta != 1.f)
5308 break;
5309 // Drew at scale 1 after texture uploads are done.
5310 EXPECT_EQ(1.f, host_impl->active_tree()->total_page_scale_factor());
5311 EXPECT_EQ(1.f, quad_scale_delta);
5312 EndTest();
5313 break;
5314 }
5315 return draw_result;
5316 }
5317
5318 void PostNextAfterDraw(LayerTreeHostImpl* host_impl) {
5319 if (posted_)
5320 return;
5321 posted_ = true;
5322 ImplThreadTaskRunner()->PostDelayedTask(
5323 FROM_HERE,
5324 base::Bind(&LayerTreeHostTestCrispUpAfterPinchEnds::Next,
5325 base::Unretained(this),
5326 host_impl),
5327 // Use a delay to allow raster/upload to happen in between frames. This
5328 // should cause flakiness if we fail to block raster/upload when
5329 // desired.
5330 base::TimeDelta::FromMilliseconds(16 * 6));
5331 }
5332
5333 void Next(LayerTreeHostImpl* host_impl) {
5334 ++frame_;
5335 posted_ = false;
5336 switch (frame_) {
5337 case 2:
5338 // Pinch zoom in.
5339 host_impl->PinchGestureBegin();
5340 host_impl->PinchGestureUpdate(2.2f, gfx::Point(100, 100));
5341 host_impl->PinchGestureEnd();
5342 break;
5343 case 3:
5344 // Pinch zoom back to 1.f but don't end it.
5345 host_impl->PinchGestureBegin();
5346 host_impl->PinchGestureUpdate(1.f / 2.2f, gfx::Point(100, 100));
5347 break;
5348 case 4:
5349 // End the pinch, but delay texture uploads.
5350 TestContext()->set_query_result_available_ext(0);
5351 host_impl->PinchGestureEnd();
5352 break;
5353 case 5:
5354 // Let texture uploads complete.
5355 TestContext()->set_query_result_available_ext(1);
5356 break;
5357 }
5358 }
5359
5360 void NotifyTileStateChangedOnThread(LayerTreeHostImpl* host_impl,
5361 const Tile* tile) override {
5362 // On frame_ == 4, we are preventing texture uploads from completing,
5363 // so this verifies they are not completing before frame_ == 5.
5364 // Flaky failures here indicate we're failing to prevent uploads from
5365 // completing.
5366 EXPECT_NE(4, frame_);
5367 }
5368
5369 void AfterTest() override {}
5370
5371 FakeContentLayerClient client_;
5372 int frame_;
5373 bool posted_;
5374 };
5375
5376 MULTI_THREAD_TEST_F(LayerTreeHostTestCrispUpAfterPinchEnds);
5377
5378 class LayerTreeHostTestContinuousDrawWhenCreatingVisibleTiles
5379 : public LayerTreeHostTest {
5380 protected:
5381 void InitializeSettings(LayerTreeSettings* settings) override {
5382 settings->impl_side_painting = true;
5383 }
5384
5385 void SetupTree() override {
5386 step_ = 1;
5387 continuous_draws_ = 0;
5388 client_.set_fill_with_nonsolid_color(true);
5389
5390 scoped_refptr<Layer> root = Layer::Create();
5391 root->SetBounds(gfx::Size(500, 500));
5392
5393 scoped_refptr<Layer> pinch = Layer::Create();
5394 pinch->SetBounds(gfx::Size(500, 500));
5395 pinch->SetScrollClipLayerId(root->id());
5396 pinch->SetIsContainerForFixedPositionLayers(true);
5397 root->AddChild(pinch);
5398
5399 scoped_refptr<FakePictureLayer> layer = FakePictureLayer::Create(&client_);
5400 layer->SetBounds(gfx::Size(500, 500));
5401 layer->SetContentsOpaque(true);
5402 pinch->AddChild(layer);
5403
5404 layer_tree_host()->RegisterViewportLayers(root, pinch, pinch);
5405 layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 1.f, 4.f);
5406 layer_tree_host()->SetRootLayer(root);
5407 LayerTreeHostTest::SetupTree();
5408 }
5409
5410 // Returns the delta scale of all quads in the frame's root pass from their
5411 // ideal, or 0 if they are not all the same.
5412 float FrameQuadScaleDeltaFromIdeal(LayerTreeHostImpl::FrameData* frame_data) {
5413 if (frame_data->has_no_damage)
5414 return 0.f;
5415 float frame_scale = 0.f;
5416 RenderPass* root_pass = frame_data->render_passes.back();
5417 for (const auto& draw_quad : root_pass->quad_list) {
5418 const TileDrawQuad* quad = TileDrawQuad::MaterialCast(draw_quad);
5419 float quad_scale =
5420 quad->tex_coord_rect.width() / static_cast<float>(quad->rect.width());
5421 float transform_scale =
5422 SkMScalarToFloat(quad->quadTransform().matrix().get(0, 0));
5423 float scale = quad_scale / transform_scale;
5424 if (frame_scale != 0.f && frame_scale != scale)
5425 return 0.f;
5426 frame_scale = scale;
5427 }
5428 return frame_scale;
5429 }
5430
5431 void BeginTest() override { PostSetNeedsCommitToMainThread(); }
5432
5433 DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
5434 LayerTreeHostImpl::FrameData* frame_data,
5435 DrawResult draw_result) override {
5436 float quad_scale_delta = FrameQuadScaleDeltaFromIdeal(frame_data);
5437 switch (step_) {
5438 case 1:
5439 // Drew at scale 1 before any pinching.
5440 EXPECT_EQ(1.f, host_impl->active_tree()->total_page_scale_factor());
5441 EXPECT_EQ(1.f, quad_scale_delta);
5442 break;
5443 case 2:
5444 // Drew at scale 1 still though the ideal is 1.5.
5445 EXPECT_EQ(1.5f, host_impl->active_tree()->total_page_scale_factor());
5446 EXPECT_EQ(1.f / 1.5f, quad_scale_delta);
5447 break;
5448 case 3:
5449 // Continuous draws are attempted but fail.
5450 EXPECT_TRUE(frame_data->has_no_damage);
5451 break;
5452 case 4:
5453 if (quad_scale_delta != 1.f)
5454 break;
5455 // Drew at scale 1.5 when all the tiles completed.
5456 EXPECT_EQ(1.5f, host_impl->active_tree()->total_page_scale_factor());
5457 EXPECT_EQ(1.f, quad_scale_delta);
5458
5459 // We should not continue to draw any more. End the test after a timeout
5460 // to watch for any extraneous draws.
5461 EndTestAfterDelayMs(16 * 4);
5462 ++step_;
5463 break;
5464 case 5:
5465 // No draws should happen once we have a complete frame.
5466 EXPECT_TRUE(false);
5467 break;
5468 }
5469 return draw_result;
5470 }
5471
5472 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override {
5473 switch (step_) {
5474 case 1:
5475 // Prevent texture uploads from completing.
5476 TestContext()->set_query_result_available_ext(0);
5477 // Pinch zoom in to cause new tiles to be required.
5478 host_impl->PinchGestureBegin();
5479 host_impl->PinchGestureUpdate(1.5f, gfx::Point(100, 100));
5480 host_impl->PinchGestureEnd();
5481 ++step_;
5482 break;
5483 case 2:
5484 ++step_;
5485 break;
5486 case 3:
5487 // We should continue to try draw while there are incomplete visible
5488 // tiles.
5489 if (++continuous_draws_ > 5) {
5490 // Allow the tiles to complete.
5491 TestContext()->set_query_result_available_ext(1);
reveman 2014/10/31 20:28:39 I don't think this is a reliable way to block tile
danakj 2014/10/31 20:43:02 It doesn't work for those, and turning them on by
reveman 2014/10/31 21:38:13 Raster is asynchronous. You might have trouble get
5492 ++step_;
5493 }
5494 break;
5495 }
5496 }
5497
5498 void NotifyTileStateChangedOnThread(LayerTreeHostImpl* host_impl,
5499 const Tile* tile) override {
5500 // On step_ == 2, we are preventing texture uploads from completing,
5501 // so this verifies they are not completing before step_ == 3.
5502 // Flaky failures here indicate we're failing to prevent uploads from
5503 // completing.
5504 EXPECT_NE(2, step_);
5505 }
5506
5507 void AfterTest() override { EXPECT_GT(continuous_draws_, 5); }
5508
5509 FakeContentLayerClient client_;
5510 int step_;
5511 int continuous_draws_;
5512 };
5513
5514 MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousDrawWhenCreatingVisibleTiles);
5515
5208 } // namespace cc 5516 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698