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" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/resources/single_release_callback.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_impl.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer_impl.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "cc/test/fake_output_surface_client.h" 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_painted_scrollbar_layer.h" 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/test/fake_picture_layer.h" 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/test/fake_picture_layer_impl.h" 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_scoped_ui_resource.h" 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/test/fake_scrollbar.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_video_frame_provider.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_common.h" 380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_context_provider.h" 3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h" 400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/media.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using media::VideoFrame; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These tests deal with losing the 3d graphics context. 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostContextTest : public LayerTreeTest { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest() 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeTest(), 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_(NULL), 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_(0), 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_(0), 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_draw_(0), 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_(0), 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_expect_create_failed_(0), 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_create_failed_(0), 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) committed_at_least_once_(false), 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) context_should_support_io_surface_(false), 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fallback_context_works_(false), 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci async_output_surface_creation_(false) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::InitializeMediaLibraryForTesting(); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void LoseContext() { 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // For sanity-checking tests, they should only call this when the 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // context is not lost. 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CHECK(context3d_); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_->loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_INNOCENT_CONTEXT_RESET_ARB); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_ = NULL; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return TestWebGraphicsContext3D::Create(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OVERRIDE { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_fail_create_) { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_fail_create_; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectCreateToFail(); 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<FakeOutputSurface>(); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> context3d = CreateContext3d(); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_ = context3d.get(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (context_should_support_io_surface_) { 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context3d_->set_have_extension_io_surface(true); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context3d_->set_have_extension_egl_image(true); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (delegating_renderer()) 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return FakeOutputSurface::CreateDelegating3d(context3d.Pass()); 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return FakeOutputSurface::Create3d(context3d.Pass()); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(DRAW_SUCCESS, draw_result); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!times_to_lose_during_draw_) 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_lose_during_draw_; 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LoseContext(); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_ = times_to_fail_recreate_; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) committed_at_least_once_ = true; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!times_to_lose_during_commit_) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_lose_during_commit_; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_ = times_to_fail_recreate_; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidFailToInitializeOutputSurface() OVERRIDE { 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++times_create_failed_; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown() OVERRIDE { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeTest::TearDown(); 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(times_to_expect_create_failed_, times_create_failed_); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ExpectCreateToFail() { ++times_to_expect_create_failed_; } 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestWebGraphicsContext3D* context3d_; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_create_; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_commit_; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_draw_; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_recreate_; 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int times_to_expect_create_failed_; 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int times_create_failed_; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool committed_at_least_once_; 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool context_should_support_io_surface_; 156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool fallback_context_works_; 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool async_output_surface_creation_; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextSucceeds 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextSucceeds() 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostContextTest(), 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_case_(0), 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) num_losses_(0), 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) num_losses_last_test_case_(-1), 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) recovered_context_(true), 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_(false) {} 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void RequestNewOutputSurface(bool fallback) OVERRIDE { 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (async_output_surface_creation_) { 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MainThreadTaskRunner()->PostTask( 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FROM_HERE, 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&LayerTreeHostContextTestLostContextSucceeds:: 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateAndSetOutputSurface, 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(this), 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fallback)); 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateAndSetOutputSurface(fallback); 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void CreateAndSetOutputSurface(bool fallback) { 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_tree_host()->SetOutputSurface( 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LayerTreeHostContextTest::CreateOutputSurface(fallback)); 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidInitializeOutputSurface() OVERRIDE { 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (first_initialized_) 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_losses_; 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_ = true; 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recovered_context_ = true; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void AfterTest() OVERRIDE { EXPECT_EQ(11u, test_case_); } 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the last frame had a context loss, then we'll commit again to 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // recover. 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!recovered_context_) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_lose_during_commit_) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_lose_during_draw_) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recovered_context_ = false; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (NextTestCase()) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvalidateAndSetNeedsCommit(); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InvalidateAndSetNeedsCommit() { 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Cause damage so we try to draw. 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetNeedsDisplay(); 222558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch layer_tree_host()->SetNeedsCommit(); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool NextTestCase() { 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const TestCase kTests[] = { 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Losing the context and failing to recreate it (or losing it again 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // immediately) a small number of times should succeed. 2296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 2306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1, // times_to_lose_during_commit 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_lose_during_draw 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_fail_recreate 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, // fallback_context_works 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, // async_output_surface_creation 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 2366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 2376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (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) false, // fallback_context_works 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, // async_output_surface_creation 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 2436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 2446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1, // times_to_lose_during_commit 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_lose_during_draw 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3, // times_to_fail_recreate 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, // fallback_context_works 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, // async_output_surface_creation 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, // times_to_lose_during_commit 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1, // times_to_lose_during_draw 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3, // times_to_fail_recreate 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, // fallback_context_works 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, // async_output_surface_creation 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 2576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 0, // times_to_lose_during_commit 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, // times_to_lose_during_draw 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3, // times_to_fail_recreate 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, // fallback_context_works 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, // async_output_surface_creation 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Losing the context and recreating it any number of times should 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // succeed. 2666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 2676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 10, // times_to_lose_during_commit 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_lose_during_draw 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_fail_recreate 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, // fallback_context_works 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, // async_output_surface_creation 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 2736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 2746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 0, // times_to_lose_during_commit 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10, // times_to_lose_during_draw 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_fail_recreate 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, // fallback_context_works 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, // async_output_surface_creation 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10, // times_to_lose_during_commit 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, // times_to_lose_during_draw 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, // times_to_fail_recreate 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, // fallback_context_works 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, // async_output_surface_creation 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, // times_to_lose_during_commit 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10, // times_to_lose_during_draw 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, // times_to_fail_recreate 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, // fallback_context_works 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, // async_output_surface_creation 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }, 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Losing the context, failing to reinitialize it, and making a fallback 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // context should work. 2966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, // times_to_lose_during_commit 2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1, // times_to_lose_during_draw 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, // times_to_fail_recreate 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, // fallback_context_works 3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, // async_output_surface_creation 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }, 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 3046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 0, // times_to_lose_during_commit 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, // times_to_lose_during_draw 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, // times_to_fail_recreate 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) true, // fallback_context_works 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, // async_output_surface_creation 3096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) }, 3106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) }; 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (test_case_ >= arraysize(kTests)) 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Make sure that we lost our context at least once in the last test run so 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // the test did something. 316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_GT(num_losses_, num_losses_last_test_case_); 317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) num_losses_last_test_case_ = num_losses_; 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_ = 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTests[test_case_].times_to_lose_during_commit; 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) times_to_lose_during_draw_ = kTests[test_case_].times_to_lose_during_draw; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = kTests[test_case_].times_to_fail_recreate; 323a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fallback_context_works_ = kTests[test_case_].fallback_context_works; 3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci async_output_surface_creation_ = 3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kTests[test_case_].async_output_surface_creation; 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++test_case_; 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct TestCase { 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_commit; 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_draw; 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_recreate; 334a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool fallback_context_works; 3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool async_output_surface_creation; 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t test_case_; 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_losses_; 341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int num_losses_last_test_case_; 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool recovered_context_; 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool first_initialized_; 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLostContextSucceeds); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostClientNotReadyDoesNotCreateOutputSurface 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostContextTest { 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostClientNotReadyDoesNotCreateOutputSurface() 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : LayerTreeHostContextTest() {} 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void WillBeginTest() OVERRIDE { 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Override and do not signal SetLayerTreeHostClientReady. 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EndTest(); 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface(bool fallback) 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OVERRIDE { 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(false); 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return scoped_ptr<OutputSurface>(); 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidInitializeOutputSurface() OVERRIDE { EXPECT_TRUE(false); } 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE { 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 37603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) LayerTreeHostClientNotReadyDoesNotCreateOutputSurface); 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextSucceedsWithContent 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTestLostContextSucceeds { 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_ = Layer::Create(); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetBounds(gfx::Size(10, 10)); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetIsDrawable(true); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Paint non-solid color. 3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SkPaint paint; 3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci paint.setColor(SkColorSetARGB(100, 80, 200, 200)); 3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci client_.add_draw_rect(gfx::Rect(0, 0, 5, 5), paint); 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) 3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_ = FakePictureLayer::Create(&client_); 3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_ = FakeContentLayer::Create(&client_); 3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_->SetBounds(gfx::Size(10, 10)); 3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_->SetIsDrawable(true); 3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_->AddChild(layer_); 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InvalidateAndSetNeedsCommit() OVERRIDE { 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Invalidate the render surface so we don't try to use a cached copy of the 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // surface. We want to make sure to test the drawing paths for drawing to 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a child surface. 4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_->SetNeedsDisplay(); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextSucceeds::InvalidateAndSetNeedsCommit(); 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!host_impl->settings().impl_side_painting) { 4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FakeContentLayerImpl* content_impl = static_cast<FakeContentLayerImpl*>( 4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_impl->active_tree()->root_layer()->children()[0]); 4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Even though the context was lost, we should have a resource. The 4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TestWebGraphicsContext3D ensures that this resource is created with 4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the active context. 4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(content_impl->HaveResourceForTileAt(0, 0)); 4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FakePictureLayerImpl* picture_impl = static_cast<FakePictureLayerImpl*>( 4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_impl->active_tree()->root_layer()->children()[0]); 4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(picture_impl->HighResTiling()->TileAt(0, 0)->IsReadyToDraw()); 4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root_; 4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<Layer> layer_; 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This test uses TiledLayer and PictureLayer to check for a working context. 4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciSINGLE_AND_MULTI_THREAD_TEST_F( 4355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu LayerTreeHostContextTestLostContextSucceedsWithContent); 436a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostContextTestCreateOutputSurfaceFails 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostContextTest { 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Run a test that initially fails OutputSurface creation |times_to_fail| 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // times. If |expect_fallback_attempt| is |true|, an attempt to create a 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // fallback/software OutputSurface is expected to occur. 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostContextTestCreateOutputSurfaceFails(int times_to_fail, 4445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool expect_fallback_attempt) 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : times_to_fail_(times_to_fail), 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expect_fallback_attempt_(expect_fallback_attempt), 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_attempt_fallback_(false), 44803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) times_initialized_(0) { 44903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) times_to_fail_create_ = times_to_fail_; 45003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) 4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OVERRIDE { 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<FakeOutputSurface> surface = 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostContextTest::CreateFakeOutputSurface(fallback); 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (surface) 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(times_to_fail_, times_create_failed_); 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) did_attempt_fallback_ = fallback; 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return surface.Pass(); 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidInitializeOutputSurface() OVERRIDE { times_initialized_++; } 4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EndTest(); 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE { 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(times_to_fail_, times_create_failed_); 4765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_NE(0, times_initialized_); 4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expect_fallback_attempt_, did_attempt_fallback_); 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int times_to_fail_; 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool expect_fallback_attempt_; 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool did_attempt_fallback_; 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int times_initialized_; 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostContextTestCreateOutputSurfaceFailsOnce 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostContextTestCreateOutputSurfaceFails { 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostContextTestCreateOutputSurfaceFailsOnce() 4915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : LayerTreeHostContextTestCreateOutputSurfaceFails(1, false) {} 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostContextTestCreateOutputSurfaceFailsOnce); 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// After 4 failures we expect an attempt to create a fallback/software 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// OutputSurface. 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostContextTestCreateOutputSurfaceFailsWithFallback 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public LayerTreeHostContextTestCreateOutputSurfaceFails { 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostContextTestCreateOutputSurfaceFailsWithFallback() 5035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : LayerTreeHostContextTestCreateOutputSurfaceFails(4, true) {} 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostContextTestCreateOutputSurfaceFailsWithFallback); 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextAndEvictTextures 510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextAndEvictTextures() 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostContextTest(), 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl_host_(0), 5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci num_commits_(0), 5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci lost_context_(false) {} 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Paint non-solid color. 5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SkPaint paint; 5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci paint.setColor(SkColorSetARGB(100, 80, 200, 200)); 5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci client_.add_draw_rect(gfx::Rect(0, 0, 5, 5), paint); 5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) { 5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci picture_layer_ = FakePictureLayer::Create(&client_); 5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci picture_layer_->SetBounds(gfx::Size(10, 20)); 5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_tree_host()->SetRootLayer(picture_layer_); 5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content_layer_ = FakeContentLayer::Create(&client_); 5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content_layer_->SetBounds(gfx::Size(10, 20)); 5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_tree_host()->SetRootLayer(content_layer_); 5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void PostEvictTextures() { 540eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (HasImplThread()) { 541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImplThreadTaskRunner()->PostTask( 542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&LayerTreeHostContextTestLostContextAndEvictTextures:: 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EvictTexturesOnImplThread, 5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this))); 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugScopedSetImplThread impl(proxy()); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EvictTexturesOnImplThread(); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void EvictTexturesOnImplThread() { 553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch impl_host_->EvictTexturesForTesting(); 5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (lose_after_evict_) { 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 5571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci lost_context_ = true; 5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (num_commits_ > 1) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!layer_tree_host()->settings().impl_side_painting) { 5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(content_layer_->HaveBackingAt(0, 0)); 5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostEvictTextures(); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (num_commits_ > 1) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++num_commits_; 5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!lose_after_evict_) { 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci lost_context_ = true; 5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (impl->settings().impl_side_painting) { 5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FakePictureLayerImpl* picture_impl = 5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<FakePictureLayerImpl*>(impl->active_tree()->root_layer()); 5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(picture_impl->HighResTiling()->TileAt(0, 0)->IsReadyToDraw()); 5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FakeContentLayerImpl* content_impl = 5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<FakeContentLayerImpl*>(impl->active_tree()->root_layer()); 5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(content_impl->HaveResourceForTileAt(0, 0)); 5901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl_host_ = impl; 5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (lost_context_) 5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EndTest(); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void DidInitializeOutputSurface() OVERRIDE {} 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool lose_after_evict_; 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FakeContentLayer> content_layer_; 6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FakePictureLayer> picture_layer_; 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* impl_host_; 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_commits_; 6081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool lost_context_; 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 612a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_SingleThread_DirectRenderer) { 613a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = true; 614a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 615a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 616a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 617a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 618a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_SingleThread_DelegatingRenderer) { 619a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = true; 620a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 621a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 622a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 623a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 624a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_MultiThread_DirectRenderer_MainThreadPaint) { 625a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = true; 626a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 627a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 628a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 629a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 630a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_MultiThread_DelegatingRenderer_MainThreadPaint) { 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = true; 632a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Flaky on all platforms, http://crbug.com/310979 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 6371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DISABLED_LoseAfterEvict_MultiThread_DelegatingRenderer_ImplSidePaint) { 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = true; 639a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 640a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 641a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 642a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 643a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_SingleThread_DirectRenderer) { 644a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 645a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 646a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 647a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 648a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 649a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_SingleThread_DelegatingRenderer) { 650a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 651a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 655a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DirectRenderer_MainThreadPaint) { 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = false; 657a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 661a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DirectRenderer_ImplSidePaint) { 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = false; 663a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 664a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 665a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 666a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 667a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DelegatingRenderer_MainThreadPaint) { 668a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 669a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 670a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 671a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 672a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 673a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DelegatingRenderer_ImplSidePaint) { 674a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 675a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class LayerTreeHostContextTestLostContextWhileUpdatingResources 679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LayerTreeHostContextTestLostContextWhileUpdatingResources() 6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : num_children_(50), times_to_lose_on_end_query_(3) {} 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() OVERRIDE { 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> context = 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CreateContext3d(); 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_lose_on_end_query_) { 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_lose_on_end_query_; 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->set_times_end_query_succeeds(5); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return context.Pass(); 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 6951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) 6961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parent_ = FakePictureLayer::Create(&client_); 6971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci parent_ = FakeContentLayer::Create(&client_); 6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->SetBounds(gfx::Size(num_children_, 1)); 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < num_children_; i++) { 7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<Layer> child; 7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) 7051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci child = FakePictureLayer::Create(&client_); 7061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 7071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci child = FakeContentLayer::Create(&client_); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->SetPosition(gfx::PointF(i, 0.f)); 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->SetBounds(gfx::Size(1, 1)); 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->AddChild(child); 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(parent_); 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 719a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 720a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(0, times_to_lose_on_end_query_); 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, times_to_lose_on_end_query_); 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<Layer> parent_; 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_children_; 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_on_end_query_; 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F( 736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LayerTreeHostContextTestLostContextWhileUpdatingResources); 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LayerTreeHostContextTestLayersNotified : public LayerTreeHostContextTest { 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLayersNotified() 7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : LayerTreeHostContextTest(), num_commits_(0) {} 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 7441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) { 7451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_ = FakePictureLayer::Create(&client_); 7461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci child_ = FakePictureLayer::Create(&client_); 7471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci grandchild_ = FakePictureLayer::Create(&client_); 7481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 7491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_ = FakeContentLayer::Create(&client_); 7501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci child_ = FakeContentLayer::Create(&client_); 7511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci grandchild_ = FakeContentLayer::Create(&client_); 7521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(child_); 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_->AddChild(grandchild_); 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 7647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LayerTreeHostContextTest::DidActivateTreeOnThread(host_impl); 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FakePictureLayerImpl* root_picture = NULL; 7671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FakePictureLayerImpl* child_picture = NULL; 7681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FakePictureLayerImpl* grandchild_picture = NULL; 7691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FakeContentLayerImpl* root_content = NULL; 7701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FakeContentLayerImpl* child_content = NULL; 7711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FakeContentLayerImpl* grandchild_content = NULL; 7721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) { 7741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_picture = static_cast<FakePictureLayerImpl*>( 7751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_impl->active_tree()->root_layer()); 7761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci child_picture = 7771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<FakePictureLayerImpl*>(root_picture->children()[0]); 7781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci grandchild_picture = 7791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<FakePictureLayerImpl*>(child_picture->children()[0]); 7801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 7821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_content = static_cast<FakeContentLayerImpl*>( 7831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_impl->active_tree()->root_layer()); 7841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci child_content = 7851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<FakeContentLayerImpl*>(root_content->children()[0]); 7861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci grandchild_content = 7871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<FakeContentLayerImpl*>(child_content->children()[0]); 7881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++num_commits_; 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (num_commits_) { 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 7931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) { 7941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0u, root_picture->release_resources_count()); 7951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0u, child_picture->release_resources_count()); 7961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0u, grandchild_picture->release_resources_count()); 7971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 7981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0u, root_content->lost_output_surface_count()); 7991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0u, child_content->lost_output_surface_count()); 8001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0u, grandchild_content->lost_output_surface_count()); 8011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lose the context and struggle to recreate it. 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_ = 1; 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 8081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) { 8091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(root_picture->release_resources_count()); 8101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(child_picture->release_resources_count()); 8111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(grandchild_picture->release_resources_count()); 8121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 8131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(root_content->lost_output_surface_count()); 8141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(child_content->lost_output_surface_count()); 8151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(grandchild_content->lost_output_surface_count()); 8161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_commits_; 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 8311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<Layer> root_; 8321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<Layer> child_; 8331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<Layer> grandchild_; 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLayersNotified); 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestDontUseLostResources 839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostContextTestDontUseLostResources() : lost_context_(false) { 8424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) context_should_support_io_surface_ = true; 8438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) child_output_surface_ = FakeOutputSurface::Create3d(); 8458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) child_output_surface_->BindToClient(&output_surface_client_); 84623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) shared_bitmap_manager_.reset(new TestSharedBitmapManager()); 8471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci child_resource_provider_ = 8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourceProvider::Create(child_output_surface_.get(), 8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci shared_bitmap_manager_.get(), 8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NULL, 8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, 8521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 8531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1, 8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false); 8554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static void EmptyReleaseCallback(unsigned sync_point, bool lost) {} 8588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gpu::gles2::GLES2Interface* gl = 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) child_output_surface_->context_provider()->ContextGL(); 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); 8648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<TestRenderPass> pass_for_quad = TestRenderPass::Create(); 8668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pass_for_quad->SetNew( 8678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // AppendOneOfEveryQuadType() makes a RenderPass quad with this id. 86803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId(2, 1), 8698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 8708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 8718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Transform()); 8728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<TestRenderPass> pass = TestRenderPass::Create(); 87403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pass->SetNew(RenderPassId(1, 1), 8758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 8768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 8778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Transform()); 8788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pass->AppendOneOfEveryQuadType(child_resource_provider_.get(), 87903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId(2, 1)); 8808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame_data->render_pass_list.push_back(pass_for_quad.PassAs<RenderPass>()); 8828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame_data->render_pass_list.push_back(pass.PassAs<RenderPass>()); 8834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_resource_collection_ = new DelegatedFrameResourceCollection; 8854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_frame_provider_ = new DelegatedFrameProvider( 8864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_resource_collection_.get(), frame_data.Pass()); 8874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ResourceProvider::ResourceId resource = 8898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) child_resource_provider_->CreateResource( 8908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Size(4, 4), 8918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GL_CLAMP_TO_EDGE, 89203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ResourceProvider::TextureHintImmutable, 8938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RGBA_8888); 8948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ResourceProvider::ScopedWriteLockGL lock(child_resource_provider_.get(), 8958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) resource); 8968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 8978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gpu::Mailbox mailbox; 8985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gl->GenMailboxCHROMIUM(mailbox.name); 8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLuint sync_point = gl->InsertSyncPointCHROMIUM(); 9008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 9018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_refptr<Layer> root = Layer::Create(); 9028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) root->SetBounds(gfx::Size(10, 10)); 9038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) root->SetIsDrawable(true); 9048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 9054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<FakeDelegatedRendererLayer> delegated = 906a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FakeDelegatedRendererLayer::Create(delegated_frame_provider_.get()); 9074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated->SetBounds(gfx::Size(10, 10)); 9084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated->SetIsDrawable(true); 9094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(delegated); 9104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<Layer> layer; 9121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) 9131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer = PictureLayer::Create(&client_); 9141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 9151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer = ContentLayer::Create(&client_); 9161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer->SetBounds(gfx::Size(10, 10)); 9171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer->SetIsDrawable(true); 9181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root->AddChild(layer); 9194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_refptr<TextureLayer> texture = TextureLayer::CreateForMailbox(NULL); 9214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) texture->SetBounds(gfx::Size(10, 10)); 9224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) texture->SetIsDrawable(true); 9238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) texture->SetTextureMailbox( 9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TextureMailbox(mailbox, GL_TEXTURE_2D, sync_point), 9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SingleReleaseCallback::Create( 9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&LayerTreeHostContextTestDontUseLostResources:: 9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EmptyReleaseCallback))); 9284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(texture); 9294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<Layer> mask; 9311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) 9321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mask = PictureLayer::Create(&client_); 9331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 9341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mask = ContentLayer::Create(&client_); 9354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mask->SetBounds(gfx::Size(10, 10)); 9364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<Layer> layer_with_mask; 9381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) 9391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_with_mask = PictureLayer::Create(&client_); 9401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 9411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_with_mask = ContentLayer::Create(&client_); 9421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_with_mask->SetBounds(gfx::Size(10, 10)); 9431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_with_mask->SetIsDrawable(true); 9441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_with_mask->SetMaskLayer(mask.get()); 9451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root->AddChild(layer_with_mask); 9464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<VideoLayer> video_color = 9486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) VideoLayer::Create(&color_frame_provider_, media::VIDEO_ROTATION_0); 9494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_color->SetBounds(gfx::Size(10, 10)); 9504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_color->SetIsDrawable(true); 9514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(video_color); 9524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<VideoLayer> video_hw = 9546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) VideoLayer::Create(&hw_frame_provider_, media::VIDEO_ROTATION_0); 9554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_hw->SetBounds(gfx::Size(10, 10)); 9564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_hw->SetIsDrawable(true); 9574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(video_hw); 9584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<VideoLayer> video_scaled_hw = 9606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) VideoLayer::Create(&scaled_hw_frame_provider_, media::VIDEO_ROTATION_0); 9614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_scaled_hw->SetBounds(gfx::Size(10, 10)); 9624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_scaled_hw->SetIsDrawable(true); 9634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(video_scaled_hw); 964a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 9658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) color_video_frame_ = VideoFrame::CreateColorFrame( 9668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Size(4, 4), 0x80, 0x80, 0x80, base::TimeDelta()); 9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) hw_video_frame_ = 9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoFrame::WrapNativeTexture(make_scoped_ptr(new gpu::MailboxHolder( 9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mailbox, GL_TEXTURE_2D, sync_point)), 9705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::VideoFrame::ReleaseMailboxCB(), 9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(4, 4), 9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect(0, 0, 4, 4), 9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(4, 4), 9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta(), 9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoFrame::ReadPixelsCB()); 9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scaled_hw_video_frame_ = 9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoFrame::WrapNativeTexture(make_scoped_ptr(new gpu::MailboxHolder( 9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mailbox, GL_TEXTURE_2D, sync_point)), 9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::VideoFrame::ReleaseMailboxCB(), 9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(4, 4), 9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect(0, 0, 3, 2), 9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(4, 4), 9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta(), 9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoFrame::ReadPixelsCB()); 9858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 9868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) color_frame_provider_.set_frame(color_video_frame_); 9878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) hw_frame_provider_.set_frame(hw_video_frame_); 9888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scaled_hw_frame_provider_.set_frame(scaled_hw_video_frame_); 9898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 990a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!delegating_renderer()) { 991a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // TODO(danakj): IOSurface layer can not be transported. crbug.com/239335 9924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<IOSurfaceLayer> io_surface = IOSurfaceLayer::Create(); 9934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) io_surface->SetBounds(gfx::Size(10, 10)); 9944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) io_surface->SetIsDrawable(true); 9954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) io_surface->SetIOSurfaceProperties(1, gfx::Size(10, 10)); 9964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(io_surface); 997a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Enable the hud. 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeDebugState debug_state; 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_state.show_property_changed_rects = true; 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetDebugState(debug_state); 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<PaintedScrollbarLayer> scrollbar = 10053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PaintedScrollbarLayer::Create( 10061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<Scrollbar>(new FakeScrollbar).Pass(), layer->id()); 10074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scrollbar->SetBounds(gfx::Size(10, 10)); 10084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scrollbar->SetIsDrawable(true); 10094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(scrollbar); 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetRootLayer(root); 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(host_impl); 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 3) { 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On the third commit we're recovering from context loss. Hardware 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // video frames should not be reused by the VideoFrameProvider, but 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // software frames can be. 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hw_frame_provider_.set_frame(NULL); 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scaled_hw_frame_provider_.set_frame(NULL); 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1029cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 10305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 10315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 1032cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 2) { 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lose the context during draw on the second commit. This will cause 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a third commit to recover. 10364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) context3d_->set_times_bind_texture_succeeds(0); 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) 10425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OVERRIDE { 10435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This will get called twice: 10445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First when we create the initial output surface... 10455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (layer_tree_host()->source_frame_number() > 0) { 1046a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // ... and then again after we forced the context to be lost. 10474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) lost_context_ = true; 10484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 10495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return LayerTreeHostContextTest::CreateFakeOutputSurface(fallback); 10504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 10514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(layer_tree_host()->hud_layer()); 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // End the test once we know the 3nd frame drew. 1055a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (layer_tree_host()->source_frame_number() < 5) { 10564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->root_layer()->SetNeedsDisplay(); 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 10584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 10594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 10604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void AfterTest() OVERRIDE { EXPECT_TRUE(lost_context_); } 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 10674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool lost_context_; 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FakeOutputSurfaceClient output_surface_client_; 10708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<FakeOutputSurface> child_output_surface_; 107123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 10728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<ResourceProvider> child_resource_provider_; 10738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<DelegatedFrameResourceCollection> 10754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_resource_collection_; 10764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<DelegatedFrameProvider> delegated_frame_provider_; 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoFrame> color_video_frame_; 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoFrame> hw_video_frame_; 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoFrame> scaled_hw_video_frame_; 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeVideoFrameProvider color_frame_provider_; 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeVideoFrameProvider hw_frame_provider_; 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeVideoFrameProvider scaled_hw_frame_provider_; 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestDontUseLostResources); 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ImplSidePaintingLayerTreeHostContextTest 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostContextTest { 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->impl_side_painting = true; 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestImplSidePainting 1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public ImplSidePaintingLayerTreeHostContextTest { 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root = Layer::Create(); 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->SetBounds(gfx::Size(10, 10)); 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->SetIsDrawable(true); 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PictureLayer> picture = PictureLayer::Create(&client_); 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) picture->SetBounds(gfx::Size(10, 10)); 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) picture->SetIsDrawable(true); 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->AddChild(picture); 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root); 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_ = 1; 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidInitializeOutputSurface() OVERRIDE { EndTest(); } 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostContextTestImplSidePainting); 11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScrollbarLayerLostContext : public LayerTreeHostContextTest { 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollbarLayerLostContext() : commits_(0) {} 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> scroll_layer = Layer::Create(); 11355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scrollbar_layer_ = 11365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FakePaintedScrollbarLayer::Create(false, true, scroll_layer->id()); 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar_layer_->SetBounds(gfx::Size(10, 100)); 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(scrollbar_layer_); 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(scroll_layer); 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++commits_; 1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (commits_) { 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First (regular) update, we should upload 2 resources (thumb, and 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // backtrack). 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, scrollbar_layer_->update_count()); 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Second update, after the lost context, we should still upload 2 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resources even if the contents haven't changed. 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, scrollbar_layer_->update_count()); 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int commits_; 11693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<FakePaintedScrollbarLayer> scrollbar_layer_; 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(ScrollbarLayerLostContext); 1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class UIResourceLostTest : public LayerTreeHostContextTest { 1175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 1176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceLostTest() : time_step_(0) {} 11770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 11780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) settings->texture_id_allocation_chunk_size = 1; 11790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 1180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 1181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 118358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This is called on the main thread after each commit and 118458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // DidActivateTreeOnThread, with the value of time_step_ at the time 118558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // of the call to DidActivateTreeOnThread. Similar tests will do 118658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // work on the main thread in DidCommit but that is unsuitable because 118758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the main thread work for these tests must happen after 118858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // DidActivateTreeOnThread, which happens after DidCommit with impl-side 118958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // painting. 119058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int time_step) = 0; 119158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 119258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Called after DidActivateTreeOnThread. If this is done during the commit, 119358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the call to StepCompleteOnMainThread will not occur until after 119458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the commit completes, because the main thread is blocked. 119558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void PostStepCompleteToMainThread() { 119658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) proxy()->MainThreadTaskRunner()->PostTask( 119758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 11985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&UIResourceLostTest::StepCompleteOnMainThreadInternal, 11995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(this), 12005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) time_step_)); 120158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 120258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 120358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void PostLoseContextToImplThread() { 120458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 120503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ImplThreadTaskRunner()->PostTask( 120603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FROM_HERE, 120703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::Bind(&LayerTreeHostContextTest::LoseContext, 120803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::Unretained(this))); 120958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 121058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected: 1212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int time_step_; 1213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<FakeScopedUIResource> ui_resource_; 121458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 121558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 121658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void StepCompleteOnMainThreadInternal(int step) { 121758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 121858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StepCompleteOnMainThread(step); 121958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 1220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 1221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 122258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostTestSimple : public UIResourceLostTest { 1223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 122458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This is called when the commit is complete and the new layer tree has been 122558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // activated. 122658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) = 0; 122758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 122958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!layer_tree_host()->settings().impl_side_painting) { 123058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StepCompleteOnImplThread(impl); 123158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostStepCompleteToMainThread(); 123258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ++time_step_; 123358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 123458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 123558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 123658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 123758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (layer_tree_host()->settings().impl_side_painting) { 123858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StepCompleteOnImplThread(impl); 123958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostStepCompleteToMainThread(); 124058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ++time_step_; 124158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 124258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 124358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 124458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 124558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Losing context after an UI resource has been created. 124658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostAfterCommit : public UIResourceLostTestSimple { 124758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 124858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int step) OVERRIDE { 124958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 125058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (step) { 1251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 0: 1252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 1253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Expects a valid UIResourceId. 1254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(0, ui_resource_->id()); 1255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 125758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 4: 125858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Release resource before ending the test. 125958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_resource_.reset(); 126058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 126158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 126258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 5: 126358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 126403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) break; 126558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 126658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 126758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 126858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { 126958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 127058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (time_step_) { 1271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 1272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource should have been created on LTHI after the commit. 127358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 1274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 2: 1277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LoseContext(); 1278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 1280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resources should have been recreated. The bitmap callback should 1281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // have been called once with the resource_lost flag set to true. 1282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 1283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Resource Id on the impl-side have been recreated as well. Note 1284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // that the same UIResourceId persists after the context lost. 128558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 1286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 1291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostAfterCommit); 1293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Losing context before UI resource requests can be commited. Three sequences 1295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// of creation/deletion are considered: 1296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 1. Create one resource -> Context Lost => Expect the resource to have been 1297a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// created. 1298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 2. Delete an exisiting resource (test_id0_) -> create a second resource 1299a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// (test_id1_) -> Context Lost => Expect the test_id0_ to be removed and 1300a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// test_id1_ to have been created. 1301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 3. Create one resource -> Delete that same resource -> Context Lost => Expect 1302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// the resource to not exist in the manager. 130358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostBeforeCommit : public UIResourceLostTestSimple { 1304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 13055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UIResourceLostBeforeCommit() : test_id0_(0), test_id1_(0) {} 1306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 130758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int step) OVERRIDE { 130858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (step) { 1309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 0: 1310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 131158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Lose the context on the impl thread before the commit. 131258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostLoseContextToImplThread(); 1313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 2: 1315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sequence 2: 1316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Currently one resource has been created. 1317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_id0_ = ui_resource_->id(); 1318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Delete this resource. 1319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_.reset(); 1320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Create another resource. 1321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 1322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_id1_ = ui_resource_->id(); 1323a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sanity check that two resource creations return different ids. 1324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(test_id0_, test_id1_); 132558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Lose the context on the impl thread before the commit. 132658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostLoseContextToImplThread(); 1327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1328a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 1329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Clear the manager of resources. 1330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_.reset(); 1331a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1332a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 4: 1334a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sequence 3: 1335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 1336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_id0_ = ui_resource_->id(); 1337a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sanity check the UIResourceId should not be 0. 1338a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(0, test_id0_); 1339a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Usually ScopedUIResource are deleted from the manager in their 1340a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // destructor (so usually ui_resource_.reset()). But here we need 1341a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // ui_resource_ for the next step, so call DeleteUIResource directly. 1342a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host()->DeleteUIResource(test_id0_); 134358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Delete the resouce and then lose the context. 134458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostLoseContextToImplThread(); 1345a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1346a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 5: 134758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Release resource before ending the test. 1348a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_.reset(); 1349a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EndTest(); 1350a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 135158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 6: 135258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 135303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) break; 1354a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1355a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 135758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { 135858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 1359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (time_step_) { 1360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 136158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Sequence 1 (continued): 136258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The first context lost happens before the resources were created, 136358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // and because it resulted in no resources being destroyed, it does not 136458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // trigger resource re-creation. 136558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 136658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 136758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Resource Id on the impl-side has been created. 136858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1369a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1370a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 137158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Sequence 2 (continued): 137258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The previous resource should have been deleted. 137358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); 137403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // The second resource should have been created. 137503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_)); 137658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The second resource called the resource callback once and since the 137758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // context is lost, a "resource lost" callback was also issued. 137858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(2, ui_resource_->resource_create_count); 137958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 1380a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1381a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 5: 138258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Sequence 3 (continued): 138358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Expect the resource callback to have been called once. 138458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 138558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // No "resource lost" callbacks. 138658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 138758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The UI resource id should not be valid 138858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); 1389a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1390a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1391a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1392a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1393a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 1394a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceId test_id0_; 1395a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceId test_id1_; 1396a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 1397a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1398a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostBeforeCommit); 1399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1400a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Losing UI resource before the pending trees is activated but after the 1401a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// commit. Impl-side-painting only. 1402a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class UIResourceLostBeforeActivateTree : public UIResourceLostTest { 140358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int step) OVERRIDE { 140458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 140558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (step) { 1406a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 0: 1407a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 1408a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1409a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1410a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 1411a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_id_ = ui_resource_->id(); 1412a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_.reset(); 1413a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1414a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1415a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 5: 141658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Release resource before ending the test. 141758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_resource_.reset(); 1418a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EndTest(); 1419a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 142058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 6: 142158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make sure no extra commits happened. 142258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 1423a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1424a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1425a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 142658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 142758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 1428a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (time_step_) { 142958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 2: 143058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1431a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 143258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 4: 143358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 143458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 143558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 143658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 143758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 143858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 143958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (time_step_) { 1440a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 1441a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource creation callback has been called. 1442a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 1443a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource is not yet lost (sanity check). 1444a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 1445a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource should not have been created yet on the impl-side. 1446a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 1447a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LoseContext(); 1448a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1449a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 1450a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LoseContext(); 1451a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1452a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1453a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1454a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1455a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1456a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerTreeHostContextTest::DidActivateTreeOnThread(impl); 1457a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (time_step_) { 1458a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 1459a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The pending requests on the impl-side should have been processed. 1460a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 1461a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1462a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 2: 1463a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The "lost resource" callback should have been called once. 1464a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 1465a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1466a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 4: 1467a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource is deleted and should not be in the manager. Use 1468a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // test_id_ since ui_resource_ has been deleted. 1469a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id_)); 1470a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1471a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 147258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 147358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostStepCompleteToMainThread(); 1474a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ++time_step_; 1475a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1476a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1477a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 1478a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceId test_id_; 1479a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 1480a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1481a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(UIResourceLostBeforeActivateTree, 1482a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RunMultiThread_DirectRenderer_ImplSidePaint) { 1483a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RunTest(true, false, true); 1484a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 1485a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1486a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(UIResourceLostBeforeActivateTree, 1487a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RunMultiThread_DelegatingRenderer_ImplSidePaint) { 1488a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RunTest(true, true, true); 1489a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 1490a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 149158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Resources evicted explicitly and by visibility changes. 149258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostEviction : public UIResourceLostTestSimple { 149358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 149458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int step) OVERRIDE { 149558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 149658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (step) { 149758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 0: 149858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 149958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0, ui_resource_->id()); 150058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 150158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 150258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 2: 150358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make the tree not visible. 150458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetVisibleToMainThread(false); 150558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 150658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 3: 150758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Release resource before ending the test. 150858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_resource_.reset(); 150958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 151058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 151158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 4: 151258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 151358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 151458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 151558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 151658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* impl, 151758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool visible) OVERRIDE { 15185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 151958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!visible) { 152058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // All resources should have been evicted. 152158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(0u, context->NumTextures()); 152258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 152358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(2, ui_resource_->resource_create_count); 152458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 152558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Drawing is disabled both because of the evicted resources and 152658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // because the renderer is not visible. 152758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(impl->CanDraw()); 152858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make the renderer visible again. 152958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetVisibleToMainThread(true); 153058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 153158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 153258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 153358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { 15345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestWebGraphicsContext3D* context = TestContext(); 153558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 153658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (time_step_) { 153758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 1: 153858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The resource should have been created on LTHI after the commit. 153958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, context->NumTextures()); 154058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 154158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 154258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 154358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(impl->CanDraw()); 154458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Evict all UI resources. This will trigger a commit. 154558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) impl->EvictAllUIResources(); 154658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(0u, context->NumTextures()); 154758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 154858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 154958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 155058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(impl->CanDraw()); 155158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 155258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 2: 155358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The resource should have been recreated. 155458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, context->NumTextures()); 155558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 155658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(2, ui_resource_->resource_create_count); 155758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 155858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(impl->CanDraw()); 155958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 156058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 3: 156158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The resource should have been recreated after visibility was 156258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // restored. 156358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, context->NumTextures()); 156458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 156558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(3, ui_resource_->resource_create_count); 156658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(2, ui_resource_->lost_resource_count); 156758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(impl->CanDraw()); 156858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 156958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 157058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 157158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 157258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 157358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostEviction); 157458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostContextTestSurfaceCreateCallback 15764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostContextTest { 15774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 15784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostContextTestSurfaceCreateCallback() 15791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : LayerTreeHostContextTest() {} 15804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 15814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 15821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) { 15831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci picture_layer_ = FakePictureLayer::Create(&client_); 15841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci picture_layer_->SetBounds(gfx::Size(10, 20)); 15851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_tree_host()->SetRootLayer(picture_layer_); 15861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 15871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content_layer_ = FakeContentLayer::Create(&client_); 15881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content_layer_->SetBounds(gfx::Size(10, 20)); 15891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci layer_tree_host()->SetRootLayer(content_layer_); 15901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 15911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 15924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 15934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 15944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 15955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 15964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 15974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 15985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (layer_tree_host()->source_frame_number()) { 15994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 16001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) 16011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1u, picture_layer_->output_surface_created_count()); 16021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 16031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1u, content_layer_->output_surface_created_count()); 16044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 16054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 16064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 16071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) 16081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1u, picture_layer_->output_surface_created_count()); 16091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 16101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1u, content_layer_->output_surface_created_count()); 16115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 16124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 16134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 16141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) 16151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1u, picture_layer_->output_surface_created_count()); 16161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 16171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1u, content_layer_->output_surface_created_count()); 16185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 16195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 4: 16201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (layer_tree_host()->settings().impl_side_painting) 16211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2u, picture_layer_->output_surface_created_count()); 16221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 16231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2u, content_layer_->output_surface_created_count()); 16244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 16254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 16264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 16274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 16284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 16294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 16304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 16315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (LastCommittedSourceFrameNumber(impl)) { 16324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 0: 16334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 16344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 16354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 16364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 16374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LoseContext(); 16384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 16394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 16404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 16414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 16424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 16434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 16444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 16454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 16464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 16474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected: 16484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeContentLayerClient client_; 16491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FakePictureLayer> picture_layer_; 16501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<FakeContentLayer> content_layer_; 16514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 16524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 16534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestSurfaceCreateCallback); 16544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1655f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class LayerTreeHostContextTestLoseAfterSendingBeginMainFrame 1656f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : public LayerTreeHostContextTest { 1657f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected: 1658f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void BeginTest() OVERRIDE { 1659f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) deferred_ = false; 1660f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1661f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1662f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1663f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void ScheduledActionWillSendBeginMainFrame() OVERRIDE { 1664f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (deferred_) 1665f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 1666f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) deferred_ = true; 1667f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1668f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Defer commits before the BeginFrame arrives, causing it to be delayed. 1669f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MainThreadTaskRunner()->PostTask( 1670f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FROM_HERE, 1671f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&LayerTreeHostContextTestLoseAfterSendingBeginMainFrame:: 1672f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DeferCommitsOnMainThread, 1673f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Unretained(this), 1674f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) true)); 1675f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Meanwhile, lose the context while we are in defer commits. 1676f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ImplThreadTaskRunner()->PostTask( 1677f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FROM_HERE, 1678f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&LayerTreeHostContextTestLoseAfterSendingBeginMainFrame:: 1679f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LoseContextOnImplThread, 1680f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Unretained(this))); 1681f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1682f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1683f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void LoseContextOnImplThread() { 1684f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LoseContext(); 1685f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1686f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // After losing the context, stop deferring commits. 1687f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MainThreadTaskRunner()->PostTask( 1688f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FROM_HERE, 1689f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&LayerTreeHostContextTestLoseAfterSendingBeginMainFrame:: 1690f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DeferCommitsOnMainThread, 1691f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Unretained(this), 1692f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) false)); 1693f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1694f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1695f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void DeferCommitsOnMainThread(bool defer_commits) { 1696f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) layer_tree_host()->SetDeferCommits(defer_commits); 1697f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1698f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1699f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void WillBeginMainFrame() OVERRIDE { 1700f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Don't begin a frame with a lost surface. 1701f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(layer_tree_host()->output_surface_lost()); 1702f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1703f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1704f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { EndTest(); } 1705f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1706f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1707f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1708f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool deferred_; 1709f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 1710f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 171103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 171203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) LayerTreeHostContextTestLoseAfterSendingBeginMainFrame); 1713f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 1716