layer_tree_host_unittest_context.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_provider.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_resource_collection.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/io_surface_layer.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h" 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/layers/painted_scrollbar_layer.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/texture_layer.h" 17a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "cc/layers/texture_layer_impl.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer_impl.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/output/filter_operations.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_impl.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer_impl.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "cc/test/fake_output_surface_client.h" 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_painted_scrollbar_layer.h" 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_scoped_ui_resource.h" 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/test/fake_scrollbar.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_video_frame_provider.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_common.h" 350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_context_provider.h" 3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h" 370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/media.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using media::VideoFrame; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These tests deal with losing the 3d graphics context. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostContextTest : public LayerTreeTest { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest() 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeTest(), 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_(NULL), 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_(0), 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_(0), 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_draw_(0), 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_(0), 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_expect_create_failed_(0), 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_create_failed_(0), 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) committed_at_least_once_(false), 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) context_should_support_io_surface_(false), 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fallback_context_works_(false) { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::InitializeMediaLibraryForTesting(); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void LoseContext() { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_->loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_INNOCENT_CONTEXT_RESET_ARB); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_ = NULL; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return TestWebGraphicsContext3D::Create(); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OVERRIDE { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_fail_create_) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_fail_create_; 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectCreateToFail(); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<FakeOutputSurface>(); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> context3d = CreateContext3d(); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_ = context3d.get(); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (context_should_support_io_surface_) { 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context3d_->set_have_extension_io_surface(true); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context3d_->set_have_extension_egl_image(true); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegating_renderer()) 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return FakeOutputSurface::CreateDelegating3d(context3d.Pass()); 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return FakeOutputSurface::Create3d(context3d.Pass()); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(DRAW_SUCCESS, draw_result); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!times_to_lose_during_draw_) 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_lose_during_draw_; 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoseContext(); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_ = times_to_fail_recreate_; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) committed_at_least_once_ = true; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!times_to_lose_during_commit_) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_lose_during_commit_; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_ = times_to_fail_recreate_; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidFailToInitializeOutputSurface() OVERRIDE { 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++times_create_failed_; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown() OVERRIDE { 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeTest::TearDown(); 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(times_to_expect_create_failed_, times_create_failed_); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ExpectCreateToFail() { ++times_to_expect_create_failed_; } 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestWebGraphicsContext3D* context3d_; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_create_; 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_commit_; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_draw_; 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_recreate_; 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int times_to_expect_create_failed_; 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int times_create_failed_; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool committed_at_least_once_; 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool context_should_support_io_surface_; 149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool fallback_context_works_; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextSucceeds 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextSucceeds() 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostContextTest(), 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_case_(0), 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) num_losses_(0), 159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) num_losses_last_test_case_(-1), 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) recovered_context_(true), 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_(false) {} 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidInitializeOutputSurface() OVERRIDE { 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (first_initialized_) 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_losses_; 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_ = true; 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recovered_context_ = true; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void AfterTest() OVERRIDE { EXPECT_EQ(7u, test_case_); } 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the last frame had a context loss, then we'll commit again to 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // recover. 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!recovered_context_) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_lose_during_commit_) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_lose_during_draw_) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recovered_context_ = false; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (NextTestCase()) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvalidateAndSetNeedsCommit(); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InvalidateAndSetNeedsCommit() { 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Cause damage so we try to draw. 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetNeedsDisplay(); 196558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch layer_tree_host()->SetNeedsCommit(); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool NextTestCase() { 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const TestCase kTests[] = { 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Losing the context and failing to recreate it (or losing it again 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // immediately) a small number of times should succeed. 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {1, // times_to_lose_during_commit 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_lose_during_draw 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_fail_recreate 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, // fallback_context_works 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {0, // times_to_lose_during_commit 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, // times_to_lose_during_draw 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_fail_recreate 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, // fallback_context_works 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {1, // times_to_lose_during_commit 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_lose_during_draw 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3, // times_to_fail_recreate 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, // fallback_context_works 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {0, // times_to_lose_during_commit 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, // times_to_lose_during_draw 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3, // times_to_fail_recreate 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, // fallback_context_works 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Losing the context and recreating it any number of times should 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // succeed. 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {10, // times_to_lose_during_commit 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_lose_during_draw 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_fail_recreate 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, // fallback_context_works 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {0, // times_to_lose_during_commit 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10, // times_to_lose_during_draw 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_fail_recreate 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, // fallback_context_works 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Losing the context, failing to reinitialize it, and making a fallback 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // context should work. 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {0, // times_to_lose_during_commit 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, // times_to_lose_during_draw 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_fail_recreate 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) true, // fallback_context_works 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, }; 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (test_case_ >= arraysize(kTests)) 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Make sure that we lost our context at least once in the last test run so 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // the test did something. 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_GT(num_losses_, num_losses_last_test_case_); 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) num_losses_last_test_case_ = num_losses_; 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_ = 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTests[test_case_].times_to_lose_during_commit; 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) times_to_lose_during_draw_ = kTests[test_case_].times_to_lose_during_draw; 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = kTests[test_case_].times_to_fail_recreate; 254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fallback_context_works_ = kTests[test_case_].fallback_context_works; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++test_case_; 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct TestCase { 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_commit; 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_draw; 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_recreate; 263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool fallback_context_works; 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t test_case_; 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_losses_; 269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int num_losses_last_test_case_; 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool recovered_context_; 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool first_initialized_; 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLostContextSucceeds); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostClientNotReadyDoesNotCreateOutputSurface 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostContextTest { 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostClientNotReadyDoesNotCreateOutputSurface() 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : LayerTreeHostContextTest() {} 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void WillBeginTest() OVERRIDE { 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Override and do not signal SetLayerTreeHostClientReady. 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EndTest(); 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface(bool fallback) 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OVERRIDE { 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(false); 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<OutputSurface>(); 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidInitializeOutputSurface() OVERRIDE { EXPECT_TRUE(false); } 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE { 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostClientNotReadyDoesNotCreateOutputSurface); 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextSucceedsWithContent 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTestLostContextSucceeds { 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_ = Layer::Create(); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetBounds(gfx::Size(10, 10)); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetIsDrawable(true); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_ = FakeContentLayer::Create(&client_); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetBounds(gfx::Size(10, 10)); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetIsDrawable(true); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(content_); 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InvalidateAndSetNeedsCommit() OVERRIDE { 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Invalidate the render surface so we don't try to use a cached copy of the 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // surface. We want to make sure to test the drawing paths for drawing to 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a child surface. 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetNeedsDisplay(); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextSucceeds::InvalidateAndSetNeedsCommit(); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerImpl* content_impl = static_cast<FakeContentLayerImpl*>( 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->active_tree()->root_layer()->children()[0]); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Even though the context was lost, we should have a resource. The 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TestWebGraphicsContext3D ensures that this resource is created with 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the active context. 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(content_impl->HaveResourceForTileAt(0, 0)); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root_; 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> content_; 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// This test uses TiledLayer to check for a working context. 3475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuSINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F( 3485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu LayerTreeHostContextTestLostContextSucceedsWithContent); 349a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostContextTestCreateOutputSurfaceFails 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostContextTest { 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Run a test that initially fails OutputSurface creation |times_to_fail| 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // times. If |expect_fallback_attempt| is |true|, an attempt to create a 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // fallback/software OutputSurface is expected to occur. 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostContextTestCreateOutputSurfaceFails(int times_to_fail, 3575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool expect_fallback_attempt) 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : times_to_fail_(times_to_fail), 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expect_fallback_attempt_(expect_fallback_attempt), 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_attempt_fallback_(false), 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) times_initialized_(0) {} 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) times_to_fail_create_ = times_to_fail_; 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OVERRIDE { 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<FakeOutputSurface> surface = 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostContextTest::CreateFakeOutputSurface(fallback); 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (surface) 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(times_to_fail_, times_create_failed_); 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_attempt_fallback_ = fallback; 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return surface.Pass(); 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidInitializeOutputSurface() OVERRIDE { times_initialized_++; } 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EndTest(); 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE { 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(times_to_fail_, times_create_failed_); 3885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_NE(0, times_initialized_); 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expect_fallback_attempt_, did_attempt_fallback_); 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int times_to_fail_; 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool expect_fallback_attempt_; 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool did_attempt_fallback_; 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int times_initialized_; 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostContextTestCreateOutputSurfaceFailsOnce 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostContextTestCreateOutputSurfaceFails { 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostContextTestCreateOutputSurfaceFailsOnce() 4035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : LayerTreeHostContextTestCreateOutputSurfaceFails(1, false) {} 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostContextTestCreateOutputSurfaceFailsOnce); 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// After 4 failures we expect an attempt to create a fallback/software 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// OutputSurface. 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostContextTestCreateOutputSurfaceFailsWithFallback 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostContextTestCreateOutputSurfaceFails { 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostContextTestCreateOutputSurfaceFailsWithFallback() 4155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : LayerTreeHostContextTestCreateOutputSurfaceFails(4, true) {} 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostContextTestCreateOutputSurfaceFailsWithFallback); 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextAndEvictTextures 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextAndEvictTextures() 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostContextTest(), 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_(FakeContentLayer::Create(&client_)), 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl_host_(0), 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0) {} 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_->SetBounds(gfx::Size(10, 20)); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void PostEvictTextures() { 439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (HasImplThread()) { 440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImplThreadTaskRunner()->PostTask( 441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&LayerTreeHostContextTestLostContextAndEvictTextures:: 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EvictTexturesOnImplThread, 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugScopedSetImplThread impl(proxy()); 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EvictTexturesOnImplThread(); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void EvictTexturesOnImplThread() { 452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch impl_host_->EvictTexturesForTesting(); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (lose_after_evict_) 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (num_commits_ > 1) 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingAt(0, 0)); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostEvictTextures(); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (num_commits_ > 1) 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++num_commits_; 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!lose_after_evict_) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl_host_ = impl; 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidInitializeOutputSurface() OVERRIDE { EndTest(); } 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool lose_after_evict_; 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> layer_; 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* impl_host_; 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_commits_; 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 487a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_SingleThread_DirectRenderer) { 488a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = true; 489a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 490a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 491a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 492a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 493a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_SingleThread_DelegatingRenderer) { 494a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = true; 495a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 496a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 497a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 498a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 499a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_MultiThread_DirectRenderer_MainThreadPaint) { 500a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = true; 501a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 502a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 503a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 504a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 505a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_MultiThread_DelegatingRenderer_MainThreadPaint) { 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = true; 507a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Flaky on all platforms, http://crbug.com/310979 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 5121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DISABLED_LoseAfterEvict_MultiThread_DelegatingRenderer_ImplSidePaint) { 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = true; 514a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 515a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 516a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 517a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 518a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_SingleThread_DirectRenderer) { 519a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 520a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 521a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 522a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 523a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 524a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_SingleThread_DelegatingRenderer) { 525a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 526a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 530a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DirectRenderer_MainThreadPaint) { 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = false; 532a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 536a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DirectRenderer_ImplSidePaint) { 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = false; 538a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 539a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 540a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 541a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 542a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DelegatingRenderer_MainThreadPaint) { 543a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 544a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 545a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 546a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 547a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 548a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DelegatingRenderer_ImplSidePaint) { 549a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 550a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class LayerTreeHostContextTestLostContextWhileUpdatingResources 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LayerTreeHostContextTestLostContextWhileUpdatingResources() 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : parent_(FakeContentLayer::Create(&client_)), 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) num_children_(50), 559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_lose_on_end_query_(3) {} 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() OVERRIDE { 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> context = 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CreateContext3d(); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_lose_on_end_query_) { 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_lose_on_end_query_; 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->set_times_end_query_succeeds(5); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return context.Pass(); 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->SetBounds(gfx::Size(num_children_, 1)); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < num_children_; i++) { 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> child = 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayer::Create(&client_); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->SetPosition(gfx::PointF(i, 0.f)); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->SetBounds(gfx::Size(1, 1)); 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->AddChild(child); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(parent_); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, times_to_lose_on_end_query_); 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, times_to_lose_on_end_query_); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> parent_; 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_children_; 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_on_end_query_; 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F( 605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LayerTreeHostContextTestLostContextWhileUpdatingResources); 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostContextTestLayersNotified : public LayerTreeHostContextTest { 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLayersNotified() 6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : LayerTreeHostContextTest(), num_commits_(0) {} 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_ = FakeContentLayer::Create(&client_); 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_ = FakeContentLayer::Create(&client_); 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) grandchild_ = FakeContentLayer::Create(&client_); 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(child_); 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_->AddChild(grandchild_); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 6277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LayerTreeHostContextTest::DidActivateTreeOnThread(host_impl); 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerImpl* root = static_cast<FakeContentLayerImpl*>( 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->active_tree()->root_layer()); 6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FakeContentLayerImpl* child = 6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<FakeContentLayerImpl*>(root->children()[0]); 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FakeContentLayerImpl* grandchild = 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<FakeContentLayerImpl*>(child->children()[0]); 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++num_commits_; 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (num_commits_) { 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, root->lost_output_surface_count()); 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, child->lost_output_surface_count()); 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, grandchild->lost_output_surface_count()); 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lose the context and struggle to recreate it. 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_ = 1; 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_GE(1u, root->lost_output_surface_count()); 648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_GE(1u, child->lost_output_surface_count()); 649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_GE(1u, grandchild->lost_output_surface_count()); 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_commits_; 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_; 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_; 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> grandchild_; 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLayersNotified); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestDontUseLostResources 671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostContextTestDontUseLostResources() : lost_context_(false) { 6744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) context_should_support_io_surface_ = true; 6758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) child_output_surface_ = FakeOutputSurface::Create3d(); 6778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) child_output_surface_->BindToClient(&output_surface_client_); 67823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) shared_bitmap_manager_.reset(new TestSharedBitmapManager()); 6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_resource_provider_ = ResourceProvider::Create( 680010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) child_output_surface_.get(), shared_bitmap_manager_.get(), 0, false, 1, 681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) false); 6824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static void EmptyReleaseCallback(unsigned sync_point, bool lost) {} 6858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gpu::gles2::GLES2Interface* gl = 6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_output_surface_->context_provider()->ContextGL(); 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); 6918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<TestRenderPass> pass_for_quad = TestRenderPass::Create(); 6938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pass_for_quad->SetNew( 6948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // AppendOneOfEveryQuadType() makes a RenderPass quad with this id. 6958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RenderPass::Id(2, 1), 6968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 6978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 6988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Transform()); 6998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 7008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<TestRenderPass> pass = TestRenderPass::Create(); 7018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pass->SetNew(RenderPass::Id(1, 1), 7028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 7038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 7048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Transform()); 7058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pass->AppendOneOfEveryQuadType(child_resource_provider_.get(), 7068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RenderPass::Id(2, 1)); 7078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 7088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame_data->render_pass_list.push_back(pass_for_quad.PassAs<RenderPass>()); 7098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame_data->render_pass_list.push_back(pass.PassAs<RenderPass>()); 7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_resource_collection_ = new DelegatedFrameResourceCollection; 7124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_frame_provider_ = new DelegatedFrameProvider( 7134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_resource_collection_.get(), frame_data.Pass()); 7144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ResourceProvider::ResourceId resource = 7168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) child_resource_provider_->CreateResource( 7178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Size(4, 4), 7188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GL_CLAMP_TO_EDGE, 7198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ResourceProvider::TextureUsageAny, 7208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RGBA_8888); 7218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ResourceProvider::ScopedWriteLockGL lock(child_resource_provider_.get(), 7228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) resource); 7238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 7248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gpu::Mailbox mailbox; 7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gl->GenMailboxCHROMIUM(mailbox.name); 7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLuint sync_point = gl->InsertSyncPointCHROMIUM(); 7278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 7288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_refptr<Layer> root = Layer::Create(); 7298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) root->SetBounds(gfx::Size(10, 10)); 7308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) root->SetIsDrawable(true); 7318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 7324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<FakeDelegatedRendererLayer> delegated = 733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FakeDelegatedRendererLayer::Create(delegated_frame_provider_.get()); 7344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated->SetBounds(gfx::Size(10, 10)); 7354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated->SetIsDrawable(true); 7364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(delegated); 7374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<ContentLayer> content = ContentLayer::Create(&client_); 7394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content->SetBounds(gfx::Size(10, 10)); 7404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content->SetIsDrawable(true); 7414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(content); 7424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_refptr<TextureLayer> texture = TextureLayer::CreateForMailbox(NULL); 7444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) texture->SetBounds(gfx::Size(10, 10)); 7454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) texture->SetIsDrawable(true); 7468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) texture->SetTextureMailbox( 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TextureMailbox(mailbox, GL_TEXTURE_2D, sync_point), 7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SingleReleaseCallback::Create( 7495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&LayerTreeHostContextTestDontUseLostResources:: 7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EmptyReleaseCallback))); 7514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(texture); 7524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<ContentLayer> mask = ContentLayer::Create(&client_); 7544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mask->SetBounds(gfx::Size(10, 10)); 7554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<ContentLayer> content_with_mask = 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentLayer::Create(&client_); 7584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content_with_mask->SetBounds(gfx::Size(10, 10)); 7594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content_with_mask->SetIsDrawable(true); 7604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content_with_mask->SetMaskLayer(mask.get()); 7614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(content_with_mask); 7624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<VideoLayer> video_color = 7644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) VideoLayer::Create(&color_frame_provider_); 7654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_color->SetBounds(gfx::Size(10, 10)); 7664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_color->SetIsDrawable(true); 7674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(video_color); 7684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<VideoLayer> video_hw = 7704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) VideoLayer::Create(&hw_frame_provider_); 7714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_hw->SetBounds(gfx::Size(10, 10)); 7724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_hw->SetIsDrawable(true); 7734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(video_hw); 7744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<VideoLayer> video_scaled_hw = 7764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) VideoLayer::Create(&scaled_hw_frame_provider_); 7774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_scaled_hw->SetBounds(gfx::Size(10, 10)); 7784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_scaled_hw->SetIsDrawable(true); 7794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(video_scaled_hw); 780a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 7818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) color_video_frame_ = VideoFrame::CreateColorFrame( 7828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Size(4, 4), 0x80, 0x80, 0x80, base::TimeDelta()); 7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) hw_video_frame_ = 7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoFrame::WrapNativeTexture(make_scoped_ptr(new gpu::MailboxHolder( 7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mailbox, GL_TEXTURE_2D, sync_point)), 7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::VideoFrame::ReleaseMailboxCB(), 7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(4, 4), 7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect(0, 0, 4, 4), 7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(4, 4), 7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta(), 7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoFrame::ReadPixelsCB()); 7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scaled_hw_video_frame_ = 7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoFrame::WrapNativeTexture(make_scoped_ptr(new gpu::MailboxHolder( 7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mailbox, GL_TEXTURE_2D, sync_point)), 7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::VideoFrame::ReleaseMailboxCB(), 7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(4, 4), 7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect(0, 0, 3, 2), 7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(4, 4), 7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta(), 8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoFrame::ReadPixelsCB()); 8018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) color_frame_provider_.set_frame(color_video_frame_); 8038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) hw_frame_provider_.set_frame(hw_video_frame_); 8048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scaled_hw_frame_provider_.set_frame(scaled_hw_video_frame_); 8058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 806a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!delegating_renderer()) { 807a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // TODO(danakj): IOSurface layer can not be transported. crbug.com/239335 8084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<IOSurfaceLayer> io_surface = IOSurfaceLayer::Create(); 8094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) io_surface->SetBounds(gfx::Size(10, 10)); 8104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) io_surface->SetIsDrawable(true); 8114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) io_surface->SetIOSurfaceProperties(1, gfx::Size(10, 10)); 8124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(io_surface); 813a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Enable the hud. 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeDebugState debug_state; 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_state.show_property_changed_rects = true; 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetDebugState(debug_state); 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<PaintedScrollbarLayer> scrollbar = 8213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PaintedScrollbarLayer::Create( 8224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<Scrollbar>(new FakeScrollbar).Pass(), content->id()); 8234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scrollbar->SetBounds(gfx::Size(10, 10)); 8244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scrollbar->SetIsDrawable(true); 8254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(scrollbar); 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetRootLayer(root); 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(host_impl); 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 3) { 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On the third commit we're recovering from context loss. Hardware 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // video frames should not be reused by the VideoFrameProvider, but 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // software frames can be. 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hw_frame_provider_.set_frame(NULL); 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scaled_hw_frame_provider_.set_frame(NULL); 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 845cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 848cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 2) { 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lose the context during draw on the second commit. This will cause 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a third commit to recover. 8524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) context3d_->set_times_bind_texture_succeeds(0); 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OVERRIDE { 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This will get called twice: 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First when we create the initial output surface... 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (layer_tree_host()->source_frame_number() > 0) { 862a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // ... and then again after we forced the context to be lost. 8634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) lost_context_ = true; 8644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return LayerTreeHostContextTest::CreateFakeOutputSurface(fallback); 8664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 8674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(layer_tree_host()->hud_layer()); 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // End the test once we know the 3nd frame drew. 871a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (layer_tree_host()->source_frame_number() < 5) { 8724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->root_layer()->SetNeedsDisplay(); 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 8744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 8754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 8764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE { EXPECT_TRUE(lost_context_); } 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 8834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool lost_context_; 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FakeOutputSurfaceClient output_surface_client_; 8868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<FakeOutputSurface> child_output_surface_; 88723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 8888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<ResourceProvider> child_resource_provider_; 8898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<DelegatedFrameResourceCollection> 8914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_resource_collection_; 8924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<DelegatedFrameProvider> delegated_frame_provider_; 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoFrame> color_video_frame_; 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoFrame> hw_video_frame_; 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoFrame> scaled_hw_video_frame_; 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeVideoFrameProvider color_frame_provider_; 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeVideoFrameProvider hw_frame_provider_; 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeVideoFrameProvider scaled_hw_frame_provider_; 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestDontUseLostResources); 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ImplSidePaintingLayerTreeHostContextTest 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostContextTest { 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->impl_side_painting = true; 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestImplSidePainting 914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public ImplSidePaintingLayerTreeHostContextTest { 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root = Layer::Create(); 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->SetBounds(gfx::Size(10, 10)); 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->SetIsDrawable(true); 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PictureLayer> picture = PictureLayer::Create(&client_); 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) picture->SetBounds(gfx::Size(10, 10)); 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) picture->SetIsDrawable(true); 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->AddChild(picture); 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root); 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_ = 1; 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidInitializeOutputSurface() OVERRIDE { EndTest(); } 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostContextTestImplSidePainting); 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScrollbarLayerLostContext : public LayerTreeHostContextTest { 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollbarLayerLostContext() : commits_(0) {} 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> scroll_layer = Layer::Create(); 9515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scrollbar_layer_ = 9525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FakePaintedScrollbarLayer::Create(false, true, scroll_layer->id()); 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar_layer_->SetBounds(gfx::Size(10, 100)); 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(scrollbar_layer_); 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(scroll_layer); 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++commits_; 965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (commits_) { 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First (regular) update, we should upload 2 resources (thumb, and 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // backtrack). 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, scrollbar_layer_->update_count()); 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Second update, after the lost context, we should still upload 2 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resources even if the contents haven't changed. 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, scrollbar_layer_->update_count()); 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 97858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 3: 97958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Single thread proxy issues extra commits after context lost. 98058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // http://crbug.com/287250 98158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasImplThread()) 98258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 98358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int commits_; 9913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<FakePaintedScrollbarLayer> scrollbar_layer_; 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(ScrollbarLayerLostContext); 995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 996a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class UIResourceLostTest : public LayerTreeHostContextTest { 997a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 998a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceLostTest() : time_step_(0) {} 9990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 10000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) settings->texture_id_allocation_chunk_size = 1; 10010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 1002a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 1003a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1004a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 100558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This is called on the main thread after each commit and 100658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // DidActivateTreeOnThread, with the value of time_step_ at the time 100758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // of the call to DidActivateTreeOnThread. Similar tests will do 100858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // work on the main thread in DidCommit but that is unsuitable because 100958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the main thread work for these tests must happen after 101058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // DidActivateTreeOnThread, which happens after DidCommit with impl-side 101158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // painting. 101258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int time_step) = 0; 101358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 101458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Called after DidActivateTreeOnThread. If this is done during the commit, 101558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the call to StepCompleteOnMainThread will not occur until after 101658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the commit completes, because the main thread is blocked. 101758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void PostStepCompleteToMainThread() { 101858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) proxy()->MainThreadTaskRunner()->PostTask( 101958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 10205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&UIResourceLostTest::StepCompleteOnMainThreadInternal, 10215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this), 10225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) time_step_)); 102358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 102458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 102558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void PostLoseContextToImplThread() { 102658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 102758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::SingleThreadTaskRunner* task_runner = 102858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) HasImplThread() ? ImplThreadTaskRunner() 102958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : base::MessageLoopProxy::current(); 10305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) task_runner->PostTask(FROM_HERE, 10315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&LayerTreeHostContextTest::LoseContext, 10325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))); 103358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 103458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1035a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected: 1036a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int time_step_; 1037a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<FakeScopedUIResource> ui_resource_; 103858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 103958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 104058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void StepCompleteOnMainThreadInternal(int step) { 104158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 104258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StepCompleteOnMainThread(step); 104358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 1044a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 1045a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 104658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostTestSimple : public UIResourceLostTest { 1047a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 104858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This is called when the commit is complete and the new layer tree has been 104958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // activated. 105058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) = 0; 105158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1052a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 105358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!layer_tree_host()->settings().impl_side_painting) { 105458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StepCompleteOnImplThread(impl); 105558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostStepCompleteToMainThread(); 105658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ++time_step_; 105758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 105858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 105958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 106058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 106158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (layer_tree_host()->settings().impl_side_painting) { 106258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StepCompleteOnImplThread(impl); 106358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostStepCompleteToMainThread(); 106458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ++time_step_; 106558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 106658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 106758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 106858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 106958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Losing context after an UI resource has been created. 107058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostAfterCommit : public UIResourceLostTestSimple { 107158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 107258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int step) OVERRIDE { 107358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 107458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (step) { 1075a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 0: 1076a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 1077a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Expects a valid UIResourceId. 1078a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(0, ui_resource_->id()); 1079a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1080a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 108158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 4: 108258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Release resource before ending the test. 108358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_resource_.reset(); 108458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 108558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 108658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 5: 108758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Single thread proxy issues extra commits after context lost. 108858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // http://crbug.com/287250 108958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasImplThread()) 109058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 109158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 109258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 6: 109358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 109458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 109558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 109658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 109758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { 109858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 109958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (time_step_) { 1100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 1101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource should have been created on LTHI after the commit. 110258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 1103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 2: 1106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LoseContext(); 1107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 1109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resources should have been recreated. The bitmap callback should 1110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // have been called once with the resource_lost flag set to true. 1111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 1112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Resource Id on the impl-side have been recreated as well. Note 1113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // that the same UIResourceId persists after the context lost. 111458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 1115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 1120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostAfterCommit); 1122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Losing context before UI resource requests can be commited. Three sequences 1124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// of creation/deletion are considered: 1125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 1. Create one resource -> Context Lost => Expect the resource to have been 1126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// created. 1127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 2. Delete an exisiting resource (test_id0_) -> create a second resource 1128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// (test_id1_) -> Context Lost => Expect the test_id0_ to be removed and 1129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// test_id1_ to have been created. 1130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 3. Create one resource -> Delete that same resource -> Context Lost => Expect 1131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// the resource to not exist in the manager. 113258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostBeforeCommit : public UIResourceLostTestSimple { 1133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 11345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UIResourceLostBeforeCommit() : test_id0_(0), test_id1_(0) {} 1135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 113658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int step) OVERRIDE { 113758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (step) { 1138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 0: 1139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 114058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Lose the context on the impl thread before the commit. 114158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostLoseContextToImplThread(); 1142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 2: 1144a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sequence 2: 1145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Currently one resource has been created. 1146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_id0_ = ui_resource_->id(); 1147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Delete this resource. 1148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_.reset(); 1149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Create another resource. 1150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 1151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_id1_ = ui_resource_->id(); 1152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sanity check that two resource creations return different ids. 1153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(test_id0_, test_id1_); 115458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Lose the context on the impl thread before the commit. 115558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostLoseContextToImplThread(); 1156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 1158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Clear the manager of resources. 1159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_.reset(); 1160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 4: 1163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sequence 3: 1164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 1165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_id0_ = ui_resource_->id(); 1166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sanity check the UIResourceId should not be 0. 1167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(0, test_id0_); 1168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Usually ScopedUIResource are deleted from the manager in their 1169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // destructor (so usually ui_resource_.reset()). But here we need 1170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // ui_resource_ for the next step, so call DeleteUIResource directly. 1171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host()->DeleteUIResource(test_id0_); 117258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Delete the resouce and then lose the context. 117358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostLoseContextToImplThread(); 1174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 5: 117658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Release resource before ending the test. 1177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_.reset(); 1178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EndTest(); 1179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 118058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 6: 118158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Single thread proxy issues extra commits after context lost. 118258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // http://crbug.com/287250 118358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasImplThread()) 118458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 118558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 118658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 8: 118758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 1188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 119158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { 119258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 1193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (time_step_) { 1194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 119558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Sequence 1 (continued): 119658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The first context lost happens before the resources were created, 119758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // and because it resulted in no resources being destroyed, it does not 119858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // trigger resource re-creation. 119958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 120058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 120158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Resource Id on the impl-side has been created. 120258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 120558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Sequence 2 (continued): 120658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The previous resource should have been deleted. 120758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); 120858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasImplThread()) { 120958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The second resource should have been created. 1210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_)); 121158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 121258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The extra commit that happens at context lost in the single thread 121358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // proxy changes the timing so that the resource has been destroyed. 121458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // http://crbug.com/287250 121558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id1_)); 1216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 121758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The second resource called the resource callback once and since the 121858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // context is lost, a "resource lost" callback was also issued. 121958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(2, ui_resource_->resource_create_count); 122058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 1221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 5: 122358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Sequence 3 (continued): 122458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Expect the resource callback to have been called once. 122558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 122658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // No "resource lost" callbacks. 122758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 122858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The UI resource id should not be valid 122958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); 1230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1233a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 1235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceId test_id0_; 1236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceId test_id1_; 1237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 1238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostBeforeCommit); 1240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Losing UI resource before the pending trees is activated but after the 1242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// commit. Impl-side-painting only. 1243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class UIResourceLostBeforeActivateTree : public UIResourceLostTest { 124458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int step) OVERRIDE { 124558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 124658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (step) { 1247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 0: 1248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 1249a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 1252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_id_ = ui_resource_->id(); 1253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_.reset(); 1254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 5: 125758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Release resource before ending the test. 125858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_resource_.reset(); 1259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EndTest(); 1260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 126158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 6: 126258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make sure no extra commits happened. 126358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 1264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 126758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 126858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 1269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (time_step_) { 127058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 2: 127158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 127358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 4: 127458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 127558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 127658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 127758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 127858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 127958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 128058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (time_step_) { 1281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 1282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource creation callback has been called. 1283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 1284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource is not yet lost (sanity check). 1285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 1286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource should not have been created yet on the impl-side. 1287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 1288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LoseContext(); 1289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 1291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LoseContext(); 1292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1297a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerTreeHostContextTest::DidActivateTreeOnThread(impl); 1298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (time_step_) { 1299a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 1300a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The pending requests on the impl-side should have been processed. 1301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 1302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1303a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 2: 1304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The "lost resource" callback should have been called once. 1305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 1306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 4: 1308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource is deleted and should not be in the manager. Use 1309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // test_id_ since ui_resource_ has been deleted. 1310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id_)); 1311a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 131358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 131458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostStepCompleteToMainThread(); 1315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ++time_step_; 1316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 1319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceId test_id_; 1320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 1321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(UIResourceLostBeforeActivateTree, 1323a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RunMultiThread_DirectRenderer_ImplSidePaint) { 1324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RunTest(true, false, true); 1325a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 1326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(UIResourceLostBeforeActivateTree, 1328a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RunMultiThread_DelegatingRenderer_ImplSidePaint) { 1329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RunTest(true, true, true); 1330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 1331a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 133258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Resources evicted explicitly and by visibility changes. 133358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostEviction : public UIResourceLostTestSimple { 133458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 133558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int step) OVERRIDE { 133658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 133758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (step) { 133858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 0: 133958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 134058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0, ui_resource_->id()); 134158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 134258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 134358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 2: 134458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make the tree not visible. 134558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetVisibleToMainThread(false); 134658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 134758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 3: 134858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Release resource before ending the test. 134958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_resource_.reset(); 135058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 135158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 135258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 4: 135358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 135458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 135558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 135658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 135758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* impl, 135858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool visible) OVERRIDE { 13595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 136058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!visible) { 136158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // All resources should have been evicted. 136258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(0u, context->NumTextures()); 136358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 136458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(2, ui_resource_->resource_create_count); 136558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 136658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Drawing is disabled both because of the evicted resources and 136758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // because the renderer is not visible. 136858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(impl->CanDraw()); 136958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make the renderer visible again. 137058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetVisibleToMainThread(true); 137158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 137258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 137358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 137458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { 13755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 137658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 137758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (time_step_) { 137858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 1: 137958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The resource should have been created on LTHI after the commit. 138058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, context->NumTextures()); 138158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 138258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 138358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 138458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(impl->CanDraw()); 138558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Evict all UI resources. This will trigger a commit. 138658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) impl->EvictAllUIResources(); 138758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(0u, context->NumTextures()); 138858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 138958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 139058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 139158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(impl->CanDraw()); 139258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 139358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 2: 139458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The resource should have been recreated. 139558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, context->NumTextures()); 139658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 139758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(2, ui_resource_->resource_create_count); 139858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 139958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(impl->CanDraw()); 140058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 140158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 3: 140258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The resource should have been recreated after visibility was 140358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // restored. 140458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, context->NumTextures()); 140558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 140658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(3, ui_resource_->resource_create_count); 140758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(2, ui_resource_->lost_resource_count); 140858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(impl->CanDraw()); 140958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 141058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 141158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 141258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 141358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 141458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostEviction); 141558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostContextTestSurfaceCreateCallback 14174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostContextTest { 14184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 14194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostContextTestSurfaceCreateCallback() 14204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : LayerTreeHostContextTest(), 14215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_(FakeContentLayer::Create(&client_)) {} 14224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 14234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 14244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_->SetBounds(gfx::Size(10, 20)); 14254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 14264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 14274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 14284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 14295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 14304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 14314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 14325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (layer_tree_host()->source_frame_number()) { 14334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 14344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1u, layer_->output_surface_created_count()); 14354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 14364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 14374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 14384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1u, layer_->output_surface_created_count()); 14395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 14404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 14414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 14425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1u, layer_->output_surface_created_count()); 14435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 14445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 4: 14454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(2u, layer_->output_surface_created_count()); 14464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 14474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 14484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 14494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 14504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 14514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 14524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 14535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (LastCommittedSourceFrameNumber(impl)) { 14544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 0: 14554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 14564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 14574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 14584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 14594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LoseContext(); 14604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 14614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 14624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 14634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 14644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 14654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 14664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 14674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 14684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 14694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected: 14704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeContentLayerClient client_; 14714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<FakeContentLayer> layer_; 14724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 14734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 14744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestSurfaceCreateCallback); 14754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class LayerTreeHostContextTestLoseAfterSendingBeginMainFrame 1477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : public LayerTreeHostContextTest { 1478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected: 1479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 1480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) deferred_ = false; 1481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1484f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void ScheduledActionWillSendBeginMainFrame() OVERRIDE { 1485f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (deferred_) 1486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 1487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) deferred_ = true; 1488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Defer commits before the BeginFrame arrives, causing it to be delayed. 1490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MainThreadTaskRunner()->PostTask( 1491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FROM_HERE, 1492f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&LayerTreeHostContextTestLoseAfterSendingBeginMainFrame:: 1493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DeferCommitsOnMainThread, 1494f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Unretained(this), 1495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) true)); 1496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Meanwhile, lose the context while we are in defer commits. 1497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ImplThreadTaskRunner()->PostTask( 1498f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FROM_HERE, 1499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&LayerTreeHostContextTestLoseAfterSendingBeginMainFrame:: 1500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LoseContextOnImplThread, 1501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Unretained(this))); 1502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1503f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1504f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void LoseContextOnImplThread() { 1505f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LoseContext(); 1506f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // After losing the context, stop deferring commits. 1508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MainThreadTaskRunner()->PostTask( 1509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FROM_HERE, 1510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&LayerTreeHostContextTestLoseAfterSendingBeginMainFrame:: 1511f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DeferCommitsOnMainThread, 1512f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Unretained(this), 1513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false)); 1514f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1515f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1516f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void DeferCommitsOnMainThread(bool defer_commits) { 1517f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) layer_tree_host()->SetDeferCommits(defer_commits); 1518f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1519f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1520f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void WillBeginMainFrame() OVERRIDE { 1521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Don't begin a frame with a lost surface. 1522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(layer_tree_host()->output_surface_lost()); 1523f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { EndTest(); } 1526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1527f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1528f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1529f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool deferred_; 1530f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 1531f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1532f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// TODO(danakj): We don't use scheduler with SingleThreadProxy yet. 1533f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostContextTestLoseAfterSendingBeginMainFrame); 1534f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 1537