layer_tree_host_unittest_context.cc revision 558790d6acca3451cf3a6b497803a5f07d0bec58
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" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/io_surface_layer.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/scrollbar_layer.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/texture_layer.h" 15a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "cc/layers/texture_layer_impl.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer_impl.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/output/filter_operations.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_impl.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_context_provider.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer_impl.h" 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/test/fake_scrollbar.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_scrollbar_layer.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_video_frame_provider.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_common.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/media.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using media::VideoFrame; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebGraphicsContext3D; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These tests deal with losing the 3d graphics context. 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostContextTest : public LayerTreeTest { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest() 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeTest(), 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_(NULL), 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_(0), 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_initialize_(0), 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_create_(0), 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_(0), 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_draw_(0), 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_(0), 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_(0), 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_(0), 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_offscreen_(0), 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_offscreen_(0), 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_expect_create_failed_(0), 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_create_failed_(0), 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_offscreen_created_(0), 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) committed_at_least_once_(false), 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context_should_support_io_surface_(false) { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::InitializeMediaLibraryForTesting(); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void LoseContext() { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_->loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_INNOCENT_CONTEXT_RESET_ARB); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_ = NULL; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return TestWebGraphicsContext3D::Create(); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_fail_create_) { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_fail_create_; 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectCreateToFail(); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<OutputSurface>(); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> context3d = CreateContext3d(); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_ = context3d.get(); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (context_should_support_io_surface_) { 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context3d_->set_have_extension_io_surface(true); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context3d_->set_have_extension_egl_image(true); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_fail_initialize_) { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_fail_initialize_; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make the context get lost during reinitialization. 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The number of times MakeCurrent succeeds is not important, and 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // can be changed if needed to make this pass with future changes. 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_->set_times_make_current_succeeds(2); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectCreateToFail(); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (times_to_lose_on_create_) { 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_lose_on_create_; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectCreateToFail(); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 107a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (delegating_renderer()) { 108a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return FakeOutputSurface::CreateDelegating3d( 109a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) context3d.PassAs<WebGraphicsContext3D>()).PassAs<OutputSurface>(); 110a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return FakeOutputSurface::Create3d( 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d.PassAs<WebGraphicsContext3D>()).PassAs<OutputSurface>(); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> CreateOffscreenContext3d() { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!context3d_) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<TestWebGraphicsContext3D>(); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++times_offscreen_created_; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_fail_create_offscreen_) { 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_fail_create_offscreen_; 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectCreateToFail(); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<TestWebGraphicsContext3D>(); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> offscreen_context3d = 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestWebGraphicsContext3D::Create().Pass(); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(offscreen_context3d); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_->add_share_group_context(offscreen_context3d.get()); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return offscreen_context3d.Pass(); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OffscreenContextProviderForMainThread() OVERRIDE { 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!HasImplThread()); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!offscreen_contexts_main_thread_.get() || 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) offscreen_contexts_main_thread_->DestroyedOnMainThread()) { 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) offscreen_contexts_main_thread_ = FakeContextProvider::Create( 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeHostContextTest::CreateOffscreenContext3d, 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (offscreen_contexts_main_thread_.get() && 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !offscreen_contexts_main_thread_->BindToCurrentThread()) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) offscreen_contexts_main_thread_ = NULL; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return offscreen_contexts_main_thread_; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OffscreenContextProviderForCompositorThread() OVERRIDE { 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(HasImplThread()); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!offscreen_contexts_compositor_thread_.get() || 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) offscreen_contexts_compositor_thread_->DestroyedOnMainThread()) { 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) offscreen_contexts_compositor_thread_ = FakeContextProvider::Create( 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&LayerTreeHostContextTest::CreateOffscreenContext3d, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return offscreen_contexts_compositor_thread_; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool result) OVERRIDE { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!times_to_lose_during_draw_) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_lose_during_draw_; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_->set_times_make_current_succeeds(0); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_ = times_to_fail_recreate_; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_initialize_ = times_to_fail_reinitialize_; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_create_ = times_to_lose_on_recreate_; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_offscreen_ = times_to_fail_recreate_offscreen_; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_offscreen_ = 0; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) committed_at_least_once_ = true; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!times_to_lose_during_commit_) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_lose_during_commit_; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_ = times_to_fail_recreate_; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_initialize_ = times_to_fail_reinitialize_; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_create_ = times_to_lose_on_recreate_; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_offscreen_ = times_to_fail_recreate_offscreen_; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_offscreen_ = 0; 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidFailToInitializeOutputSurface() OVERRIDE { 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++times_create_failed_; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown() OVERRIDE { 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeTest::TearDown(); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(times_to_expect_create_failed_, times_create_failed_); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ExpectCreateToFail() { 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++times_to_expect_create_failed_; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestWebGraphicsContext3D* context3d_; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_create_; 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_initialize_; 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_on_create_; 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_commit_; 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_draw_; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_recreate_; 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int times_to_fail_reinitialize_; 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_on_recreate_; 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_create_offscreen_; 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_recreate_offscreen_; 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int times_to_expect_create_failed_; 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int times_create_failed_; 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_offscreen_created_; 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool committed_at_least_once_; 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool context_should_support_io_surface_; 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContextProvider> offscreen_contexts_main_thread_; 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContextProvider> offscreen_contexts_compositor_thread_; 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextSucceeds 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextSucceeds() 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostContextTest(), 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_case_(0), 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) num_losses_(0), 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) recovered_context_(true), 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_(false) {} 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 253b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(succeeded); 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (first_initialized_) 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_losses_; 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_ = true; 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recovered_context_ = true; 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(10u, test_case_); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(8 + 10 + 10, num_losses_); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the last frame had a context loss, then we'll commit again to 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // recover. 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!recovered_context_) 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_lose_during_commit_) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_lose_during_draw_) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recovered_context_ = false; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (NextTestCase()) 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvalidateAndSetNeedsCommit(); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InvalidateAndSetNeedsCommit() { 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Cause damage so we try to draw. 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetNeedsDisplay(); 289558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch layer_tree_host()->SetNeedsCommit(); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool NextTestCase() { 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const TestCase kTests[] = { 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Losing the context and failing to recreate it (or losing it again 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // immediately) a small number of times should succeed. 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 1, // times_to_lose_during_commit 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_lose_during_draw 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3, // times_to_fail_reinitialize 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_lose_on_recreate 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate_offscreen 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 0, // times_to_lose_during_commit 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1, // times_to_lose_during_draw 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3, // times_to_fail_reinitialize 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_lose_on_recreate 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate_offscreen 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 1, // times_to_lose_during_commit 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_lose_during_draw 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_reinitialize 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3, // times_to_fail_recreate 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_lose_on_recreate 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate_offscreen 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 0, // times_to_lose_during_commit 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1, // times_to_lose_during_draw 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_reinitialize 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3, // times_to_fail_recreate 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_lose_on_recreate 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate_offscreen 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 1, // times_to_lose_during_commit 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_lose_during_draw 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_reinitialize 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3, // times_to_lose_on_recreate 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate_offscreen 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 0, // times_to_lose_during_commit 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1, // times_to_lose_during_draw 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_reinitialize 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3, // times_to_lose_on_recreate 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate_offscreen 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 1, // times_to_lose_during_commit 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_lose_during_draw 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_reinitialize 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_lose_on_recreate 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3, // times_to_fail_recreate_offscreen 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 0, // times_to_lose_during_commit 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1, // times_to_lose_during_draw 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_reinitialize 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_lose_on_recreate 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3, // times_to_fail_recreate_offscreen 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Losing the context and recreating it any number of times should 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // succeed. 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 10, // times_to_lose_during_commit 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_lose_during_draw 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_reinitialize 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_lose_on_recreate 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate_offscreen 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 0, // times_to_lose_during_commit 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10, // times_to_lose_during_draw 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_reinitialize 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_lose_on_recreate 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // times_to_fail_recreate_offscreen 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (test_case_ >= arraysize(kTests)) 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_ = 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTests[test_case_].times_to_lose_during_commit; 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_draw_ = 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTests[test_case_].times_to_lose_during_draw; 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = kTests[test_case_].times_to_fail_reinitialize; 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = kTests[test_case_].times_to_fail_recreate; 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = kTests[test_case_].times_to_lose_on_recreate; 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_offscreen_ = 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTests[test_case_].times_to_fail_recreate_offscreen; 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++test_case_; 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct TestCase { 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_commit; 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_draw; 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_reinitialize; 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_recreate; 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_on_recreate; 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_recreate_offscreen; 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t test_case_; 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_losses_; 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool recovered_context_; 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool first_initialized_; 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLostContextSucceeds); 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextSucceedsWithContent 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTestLostContextSucceeds { 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextSucceedsWithContent() 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : LayerTreeHostContextTestLostContextSucceeds() {} 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_ = Layer::Create(); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetBounds(gfx::Size(10, 10)); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetAnchorPoint(gfx::PointF()); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetIsDrawable(true); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_ = FakeContentLayer::Create(&client_); 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetBounds(gfx::Size(10, 10)); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetAnchorPoint(gfx::PointF()); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetIsDrawable(true); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (use_surface_) { 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetForceRenderSurface(true); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Filters require us to create an offscreen context. 423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FilterOperations filters; 424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f)); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetFilters(filters); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetBackgroundFilters(filters); 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(content_); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InvalidateAndSetNeedsCommit() OVERRIDE { 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Invalidate the render surface so we don't try to use a cached copy of the 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // surface. We want to make sure to test the drawing paths for drawing to 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a child surface. 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetNeedsDisplay(); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextSucceeds::InvalidateAndSetNeedsCommit(); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerImpl* content_impl = static_cast<FakeContentLayerImpl*>( 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->active_tree()->root_layer()->children()[0]); 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Even though the context was lost, we should have a resource. The 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TestWebGraphicsContext3D ensures that this resource is created with 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the active context. 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(content_impl->HaveResourceForTileAt(0, 0)); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::ContextProvider* contexts = 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->offscreen_context_provider(); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (use_surface_) { 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(contexts->Context3d()); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(danakj): Make a fake GrContext. 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // EXPECT_TRUE(contexts->GrContext()); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(contexts); 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextSucceeds::AfterTest(); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (use_surface_) { 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1 create to start with + 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 6 from test cases that fail on initializing the renderer (after the 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // offscreen context is created) + 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 6 from test cases that lose the offscreen context directly + 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All the test cases that recreate both contexts only once 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // per time it is lost. 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(6 + 6 + 1 + num_losses_, times_offscreen_created_); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, times_offscreen_created_); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool use_surface_; 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root_; 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> content_; 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 485a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NoSurface_SingleThread_DirectRenderer) { 486a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) use_surface_ = false; 487a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 488a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 489a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 490a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 491a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NoSurface_SingleThread_DelegatingRenderer) { 492a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) use_surface_ = false; 493a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 494a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 495a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 496a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 497a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NoSurface_MultiThread_DirectRenderer_MainThreadPaint) { 498a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) use_surface_ = false; 499a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 500a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 501a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 502a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 503a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NoSurface_MultiThread_DirectRenderer_ImplSidePaint) { 504a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) use_surface_ = false; 505a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 506a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 507a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 508a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 509a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NoSurface_MultiThread_DelegatingRenderer_MainThreadPaint) { 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) use_surface_ = false; 511a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 515a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NoSurface_MultiThread_DelegatingRenderer_ImplSidePaint) { 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) use_surface_ = false; 517a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 520a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Surfaces don't exist with a delegating renderer. 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 522a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WithSurface_SingleThread_DirectRenderer) { 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) use_surface_ = true; 524a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 528a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WithSurface_MultiThread_DirectRenderer_MainThreadPaint) { 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) use_surface_ = true; 530a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 531a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 532a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 533a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 534a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WithSurface_MultiThread_DirectRenderer_ImplSidePaint) { 535a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) use_surface_ = true; 536a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostContextTestOffscreenContextFails 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostContextTest { 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_ = Layer::Create(); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetBounds(gfx::Size(10, 10)); 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetAnchorPoint(gfx::PointF()); 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetIsDrawable(true); 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_ = FakeContentLayer::Create(&client_); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetBounds(gfx::Size(10, 10)); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetAnchorPoint(gfx::PointF()); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetIsDrawable(true); 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetForceRenderSurface(true); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Filters require us to create an offscreen context. 554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FilterOperations filters; 555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f)); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetFilters(filters); 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetBackgroundFilters(filters); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(content_); 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_offscreen_ = 1; 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::ContextProvider* contexts = 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider()->offscreen_context_provider(); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(contexts); 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This did not lead to create failure. 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_expect_create_failed_ = 0; 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root_; 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> content_; 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestOffscreenContextFails); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextFails 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextFails() 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostContextTest(), 595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0), 596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_(false) { 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_ = 1; 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 604b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (first_initialized_) { 606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(succeeded); 607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_ = true; 610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(host_impl); 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++num_commits_; 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (num_commits_ == 1) { 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When the context is ok, we should have these things. 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(host_impl->output_surface()); 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(host_impl->renderer()); 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(host_impl->resource_provider()); 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When context recreation fails we shouldn't be left with any of them. 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(host_impl->output_surface()); 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(host_impl->renderer()); 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(host_impl->resource_provider()); 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_commits_; 635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool first_initialized_; 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 639a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailReinitialize100_SingleThread_DirectRenderer) { 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 100; 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 643a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 647a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailReinitialize100_SingleThread_DelegatingRenderer) { 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 100; 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 651a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 655a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailReinitialize100_MultiThread_DirectRenderer_MainThreadPaint) { 656a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 100; 657a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 658a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 659a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 660a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 661a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 662a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 663a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailReinitialize100_MultiThread_DirectRenderer_ImplSidePaint) { 664a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 100; 665a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 666a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 667a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 668a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 669a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 670a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 671a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailReinitialize100_MultiThread_DelegatingRenderer_MainThreadPaint) { 672a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 100; 673a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 674a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 675a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 676a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 677a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 678a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 679a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailReinitialize100_MultiThread_DelegatingRenderer_ImplSidePaint) { 680a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 100; 681a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 682a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 683a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 684a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 685a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 686a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 687a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailRecreate100_SingleThread_DirectRenderer) { 688a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 689a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 100; 690a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 691a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 692a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 693a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 694a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 695a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailRecreate100_SingleThread_DelegatingRenderer) { 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 100; 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 699a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 703a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailRecreate100_MultiThread_DirectRenderer_MainThreadPaint) { 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 100; 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 707a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 711a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailRecreate100_MultiThread_DirectRenderer_ImplSidePaint) { 712a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 713a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 100; 714a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 715a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 716a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 717a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 718a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 719a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailRecreate100_MultiThread_DelegatingRenderer_MainThreadPaint) { 720a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 721a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 100; 722a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 723a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 724a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 725a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 726a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 727a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailRecreate100_MultiThread_DelegatingRenderer_ImplSidePaint) { 728a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 729a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 100; 730a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 731a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 732a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 733a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 734a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 735a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseOnRecreate100_SingleThread_DirectRenderer) { 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 100; 739a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 743a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseOnRecreate100_SingleThread_DelegatingRenderer) { 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 100; 747a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 748a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 749a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 750a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 751a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseOnRecreate100_MultiThread_DirectRenderer_MainThreadPaint) { 752a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 753a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 754a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 100; 755a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 756a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 757a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 758a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 759a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseOnRecreate100_MultiThread_DirectRenderer_ImplSidePaint) { 760a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 761a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 762a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 100; 763a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 764a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 765a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 766a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 767a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseOnRecreate100_MultiThread_DelegatingRenderer_MainThreadPaint) { 768a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 769a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 770a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 100; 771a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 772a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 773a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 774a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 775a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseOnRecreate100_MultiThread_DelegatingRenderer_ImplSidePaint) { 776a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 777a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 778a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 100; 779a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestFinishAllRenderingAfterLoss 783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lose the context until the compositor gives up on it. 787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_ = false; 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_ = 1; 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 10; 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 793b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (first_initialized_) { 795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(succeeded); 796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->FinishAllRendering(); 797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_ = true; 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool first_initialized_; 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestFinishAllRenderingAfterLoss); 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextAndEvictTextures 813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextAndEvictTextures() 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostContextTest(), 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_(FakeContentLayer::Create(&client_)), 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl_host_(0), 819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0) {} 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_->SetBounds(gfx::Size(10, 20)); 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void PostEvictTextures() { 832eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (HasImplThread()) { 833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImplThreadTaskRunner()->PostTask( 834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &LayerTreeHostContextTestLostContextAndEvictTextures:: 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EvictTexturesOnImplThread, 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugScopedSetImplThread impl(proxy()); 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EvictTexturesOnImplThread(); 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void EvictTexturesOnImplThread() { 846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch impl_host_->EvictTexturesForTesting(); 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (lose_after_evict_) 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (num_commits_ > 1) 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingAt(0, 0)); 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostEvictTextures(); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (num_commits_ > 1) 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++num_commits_; 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!lose_after_evict_) 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl_host_ = impl; 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 868b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(succeeded); 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool lose_after_evict_; 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> layer_; 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* impl_host_; 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_commits_; 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 884a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_SingleThread_DirectRenderer) { 885a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = true; 886a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 887a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 888a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 889a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 890a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_SingleThread_DelegatingRenderer) { 891a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = true; 892a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 893a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 894a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 895a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 896a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_MultiThread_DirectRenderer_MainThreadPaint) { 897a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = true; 898a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 899a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 900a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 901a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 902a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_MultiThread_DirectRenderer_ImplSidePaint) { 903a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = true; 904a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 905a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 906a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 907a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 908a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_MultiThread_DelegatingRenderer_MainThreadPaint) { 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = true; 910a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 914a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_MultiThread_DelegatingRenderer_ImplSidePaint) { 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = true; 916a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 917a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 918a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 919a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 920a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_SingleThread_DirectRenderer) { 921a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 922a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 923a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 924a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 925a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 926a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_SingleThread_DelegatingRenderer) { 927a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 928a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 932a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DirectRenderer_MainThreadPaint) { 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = false; 934a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 938a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DirectRenderer_ImplSidePaint) { 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = false; 940a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 941a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 942a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 943a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 944a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DelegatingRenderer_MainThreadPaint) { 945a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 946a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 947a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 948a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 949a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 950a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DelegatingRenderer_ImplSidePaint) { 951a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 952a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextWhileUpdatingResources 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextWhileUpdatingResources() 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : parent_(FakeContentLayer::Create(&client_)), 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) num_children_(50), 961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_lose_on_end_query_(3) {} 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() OVERRIDE { 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> context = 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CreateContext3d(); 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_lose_on_end_query_) { 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_lose_on_end_query_; 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->set_times_end_query_succeeds(5); 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return context.Pass(); 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->SetBounds(gfx::Size(num_children_, 1)); 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < num_children_; i++) { 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> child = 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayer::Create(&client_); 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->SetPosition(gfx::PointF(i, 0.f)); 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->SetBounds(gfx::Size(1, 1)); 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->AddChild(child); 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(parent_); 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 997b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(succeeded); 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, times_to_lose_on_end_query_); 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> parent_; 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_children_; 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_on_end_query_; 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestLostContextWhileUpdatingResources); 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLayersNotified 1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLayersNotified() 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostContextTest(), 1020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0) {} 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_ = FakeContentLayer::Create(&client_); 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_ = FakeContentLayer::Create(&client_); 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) grandchild_ = FakeContentLayer::Create(&client_); 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(child_); 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_->AddChild(grandchild_); 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 10397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LayerTreeHostContextTest::DidActivateTreeOnThread(host_impl); 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerImpl* root = static_cast<FakeContentLayerImpl*>( 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->active_tree()->root_layer()); 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerImpl* child = static_cast<FakeContentLayerImpl*>( 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->children()[0]); 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerImpl* grandchild = static_cast<FakeContentLayerImpl*>( 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->children()[0]); 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++num_commits_; 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (num_commits_) { 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, root->lost_output_surface_count()); 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, child->lost_output_surface_count()); 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, grandchild->lost_output_surface_count()); 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lose the context and struggle to recreate it. 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_ = 1; 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, root->lost_output_surface_count()); 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, child->lost_output_surface_count()); 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, grandchild->lost_output_surface_count()); 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lose the context and again during recreate. 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_create_ = 1; 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, root->lost_output_surface_count()); 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, child->lost_output_surface_count()); 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, grandchild->lost_output_surface_count()); 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lose the context and again during reinitialization. 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_initialize_ = 1; 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(5u, root->lost_output_surface_count()); 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(5u, child->lost_output_surface_count()); 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(5u, grandchild->lost_output_surface_count()); 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_commits_; 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_; 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_; 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> grandchild_; 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLayersNotified); 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestDontUseLostResources 1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root_ = Layer::Create(); 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetBounds(gfx::Size(10, 10)); 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetAnchorPoint(gfx::PointF()); 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetIsDrawable(true); 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeDelegatedRendererLayer> delegated_ = 1108b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FakeDelegatedRendererLayer::Create(NULL); 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetBounds(gfx::Size(10, 10)); 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetAnchorPoint(gfx::PointF()); 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_->SetIsDrawable(true); 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(delegated_); 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> content_ = ContentLayer::Create(&client_); 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetBounds(gfx::Size(10, 10)); 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetAnchorPoint(gfx::PointF()); 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetIsDrawable(true); 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(content_); 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TextureLayer> texture_ = TextureLayer::Create(NULL); 11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) texture_->SetBounds(gfx::Size(10, 10)); 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) texture_->SetAnchorPoint(gfx::PointF()); 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) texture_->SetIsDrawable(true); 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(texture_); 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> mask_ = ContentLayer::Create(&client_); 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_->SetBounds(gfx::Size(10, 10)); 11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_->SetAnchorPoint(gfx::PointF()); 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> content_with_mask_ = 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentLayer::Create(&client_); 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_with_mask_->SetBounds(gfx::Size(10, 10)); 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_with_mask_->SetAnchorPoint(gfx::PointF()); 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_with_mask_->SetIsDrawable(true); 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_with_mask_->SetMaskLayer(mask_.get()); 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(content_with_mask_); 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoLayer> video_color_ = VideoLayer::Create( 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &color_frame_provider_); 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_color_->SetBounds(gfx::Size(10, 10)); 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_color_->SetAnchorPoint(gfx::PointF()); 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) video_color_->SetIsDrawable(true); 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(video_color_); 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<VideoLayer> video_hw_ = VideoLayer::Create( 1146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &hw_frame_provider_); 1147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch video_hw_->SetBounds(gfx::Size(10, 10)); 1148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch video_hw_->SetAnchorPoint(gfx::PointF()); 1149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch video_hw_->SetIsDrawable(true); 1150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch root_->AddChild(video_hw_); 1151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<VideoLayer> video_scaled_hw_ = VideoLayer::Create( 1153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &scaled_hw_frame_provider_); 1154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch video_scaled_hw_->SetBounds(gfx::Size(10, 10)); 1155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch video_scaled_hw_->SetAnchorPoint(gfx::PointF()); 1156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch video_scaled_hw_->SetIsDrawable(true); 1157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch root_->AddChild(video_scaled_hw_); 1158a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1159a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!delegating_renderer()) { 1160a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // TODO(danakj): IOSurface layer can not be transported. crbug.com/239335 1161a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_refptr<IOSurfaceLayer> io_surface_ = IOSurfaceLayer::Create(); 1162a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) io_surface_->SetBounds(gfx::Size(10, 10)); 1163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) io_surface_->SetAnchorPoint(gfx::PointF()); 1164a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) io_surface_->SetIsDrawable(true); 1165a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) io_surface_->SetIOSurfaceProperties(1, gfx::Size(10, 10)); 1166a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) root_->AddChild(io_surface_); 1167a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Enable the hud. 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeDebugState debug_state; 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_state.show_property_changed_rects = true; 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetDebugState(debug_state); 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ScrollbarLayer> scrollbar_ = ScrollbarLayer::Create( 117590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<Scrollbar>(new FakeScrollbar).Pass(), 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->id()); 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar_->SetBounds(gfx::Size(10, 10)); 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar_->SetAnchorPoint(gfx::PointF()); 11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar_->SetIsDrawable(true); 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(scrollbar_); 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context_should_support_io_surface_ = true; 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(host_impl); 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider* resource_provider = host_impl->resource_provider(); 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 0) { 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set up impl resources on the first commit. 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRenderPass> pass_for_quad = TestRenderPass::Create(); 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass_for_quad->SetNew( 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // AppendOneOfEveryQuadType() makes a RenderPass quad with this id. 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id(1, 1), 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform()); 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestRenderPass> pass = TestRenderPass::Create(); 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass->SetNew( 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id(2, 1), 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform()); 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass->AppendOneOfEveryQuadType(resource_provider, RenderPass::Id(2, 1)); 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPtrVector<RenderPass> pass_list; 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass_list.push_back(pass_for_quad.PassAs<RenderPass>()); 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass_list.push_back(pass.PassAs<RenderPass>()); 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First child is the delegated layer. 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeDelegatedRendererLayerImpl* delegated_impl = 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<FakeDelegatedRendererLayerImpl*>( 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->active_tree()->root_layer()->children()[0]); 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegated_impl->SetFrameDataForRenderPasses(&pass_list); 12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(pass_list.empty()); 12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1226a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Third child is the texture layer. 1227a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) TextureLayerImpl* texture_impl = 1228a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) static_cast<TextureLayerImpl*>( 1229a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) host_impl->active_tree()->root_layer()->children()[2]); 1230a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) texture_impl->set_texture_id( 1231a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) resource_provider->GraphicsContext3D()->createTexture()); 1232a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1233a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DCHECK(resource_provider->GraphicsContext3D()); 1234a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ResourceProvider::ResourceId texture = resource_provider->CreateResource( 1235a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) gfx::Size(4, 4), 1236a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) resource_provider->default_resource_type(), 1237a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ResourceProvider::TextureUsageAny); 1238a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ResourceProvider::ScopedWriteLockGL lock(resource_provider, texture); 1239a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gpu::Mailbox mailbox; 1241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch resource_provider->GraphicsContext3D()->genMailboxCHROMIUM(mailbox.name); 1242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unsigned sync_point = 1243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch resource_provider->GraphicsContext3D()->insertSyncPoint(); 1244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) color_video_frame_ = VideoFrame::CreateColorFrame( 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size(4, 4), 0x80, 0x80, 0x80, base::TimeDelta()); 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hw_video_frame_ = VideoFrame::WrapNativeTexture( 1248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new VideoFrame::MailboxHolder( 1249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch mailbox, 1250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch sync_point, 1251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VideoFrame::MailboxHolder::TextureNoLongerNeededCallback()), 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_TEXTURE_2D, 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size(4, 4), gfx::Rect(0, 0, 4, 4), gfx::Size(4, 4), 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta(), 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VideoFrame::ReadPixelsCB(), 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Closure()); 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scaled_hw_video_frame_ = VideoFrame::WrapNativeTexture( 1258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new VideoFrame::MailboxHolder( 1259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch mailbox, 1260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch sync_point, 1261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VideoFrame::MailboxHolder::TextureNoLongerNeededCallback()), 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_TEXTURE_2D, 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size(4, 4), gfx::Rect(0, 0, 3, 2), gfx::Size(4, 4), 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta(), 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VideoFrame::ReadPixelsCB(), 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Closure()); 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) color_frame_provider_.set_frame(color_video_frame_); 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hw_frame_provider_.set_frame(hw_video_frame_); 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scaled_hw_frame_provider_.set_frame(scaled_hw_video_frame_); 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 3) { 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On the third commit we're recovering from context loss. Hardware 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // video frames should not be reused by the VideoFrameProvider, but 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // software frames can be. 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hw_frame_provider_.set_frame(NULL); 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scaled_hw_frame_provider_.set_frame(NULL); 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 1284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 1285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool result) OVERRIDE { 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 2) { 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lose the context during draw on the second commit. This will cause 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a third commit to recover. 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (context3d_) 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_->set_times_bind_texture_succeeds(4); 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(layer_tree_host()->hud_layer()); 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // End the test once we know the 3nd frame drew. 1298bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (layer_tree_host()->source_frame_number() == 4) 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root_; 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DelegatedRendererLayer> delegated_; 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> content_; 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TextureLayer> texture_; 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> mask_; 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> content_with_mask_; 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoLayer> video_color_; 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoLayer> video_hw_; 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoLayer> video_scaled_hw_; 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<IOSurfaceLayer> io_surface_; 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ScrollbarLayer> scrollbar_; 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoFrame> color_video_frame_; 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoFrame> hw_video_frame_; 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoFrame> scaled_hw_video_frame_; 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeVideoFrameProvider color_frame_provider_; 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeVideoFrameProvider hw_frame_provider_; 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeVideoFrameProvider scaled_hw_frame_provider_; 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestDontUseLostResources); 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLosesFirstOutputSurface 1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestLosesFirstOutputSurface() { 1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Always fail. This needs to be set before LayerTreeHost is created. 1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_lose_on_create_ = 1000; 1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1346b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(succeeded); 1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If we make it this far without crashing, we pass! 1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(false); 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestLosesFirstOutputSurface); 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds 1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_fail_initialize_ = 2; 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds); 1378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestRetryWorksWithForcedInit 1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds { 1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidFailToInitializeOutputSurface() OVERRIDE { 1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds 1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ::DidFailToInitializeOutputSurface(); 1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (times_create_failed_ == 1) { 1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // CompositeAndReadback force recreates the output surface, which should 1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // fail. 1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->CompositeAndReadback( 1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &pixels, gfx::Rect(1, 1))); 1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 1397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestRetryWorksWithForcedInit); 1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestCompositeAndReadbackBeforeOutputSurfaceInit 1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This must be called immediately after creating LTH, before the first 1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // OutputSurface is initialized. 1405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(layer_tree_host()->output_surface_lost()); 1406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_output_surface_created_ = 0; 1408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 1410a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool result = layer_tree_host()->CompositeAndReadback( 1411a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) &pixels, gfx::Rect(1, 1)); 1412a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(!delegating_renderer(), result); 1413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, times_output_surface_created_); 1414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1418b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(succeeded); 1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++times_output_surface_created_; 1421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 1428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Should not try to create output surface again after successfully 1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // created by CompositeAndReadback. 1430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, times_output_surface_created_); 1431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int times_output_surface_created_; 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestCompositeAndReadbackBeforeOutputSurfaceInit); 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ImplSidePaintingLayerTreeHostContextTest 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostContextTest { 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->impl_side_painting = true; 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestImplSidePainting 1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public ImplSidePaintingLayerTreeHostContextTest { 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root = Layer::Create(); 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->SetBounds(gfx::Size(10, 10)); 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->SetAnchorPoint(gfx::PointF()); 14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->SetIsDrawable(true); 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PictureLayer> picture = PictureLayer::Create(&client_); 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) picture->SetBounds(gfx::Size(10, 10)); 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) picture->SetAnchorPoint(gfx::PointF()); 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) picture->SetIsDrawable(true); 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->AddChild(picture); 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root); 14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_ = 1; 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1474b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(succeeded); 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostContextTestImplSidePainting); 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScrollbarLayerLostContext : public LayerTreeHostContextTest { 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollbarLayerLostContext() : commits_(0) {} 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> scroll_layer = Layer::Create(); 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar_layer_ = FakeScrollbarLayer::Create( 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, true, scroll_layer->id()); 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar_layer_->SetBounds(gfx::Size(10, 100)); 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(scrollbar_layer_); 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(scroll_layer); 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++commits_; 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t upload_count = scrollbar_layer_->last_update_full_upload_size() + 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar_layer_->last_update_partial_upload_size(); 1507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (commits_) { 15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First (regular) update, we should upload 2 resources (thumb, and 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // backtrack). 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, scrollbar_layer_->update_count()); 1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, upload_count); 15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Second update, after the lost context, we should still upload 2 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resources even if the contents haven't changed. 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, scrollbar_layer_->update_count()); 1519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, upload_count); 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int commits_; 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeScrollbarLayer> scrollbar_layer_; 15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(ScrollbarLayerLostContext); 1533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestFailsToCreateSurface 1535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 1536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestFailsToCreateSurface() 1538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : LayerTreeHostContextTest(), 1539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) failure_count_(0) { 1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_lose_on_create_ = 10; 1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1549b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool success) OVERRIDE { 1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(success); 1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, failure_count_); 1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_lose_on_create_ = 0; 1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) failure_count_++; 1554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Normally, the embedder should stop trying to use the compositor at 1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // this point, but let's force it back into action when we shouldn't. 1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE( 1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(pixels, gfx::Rect(1, 1))); 1559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If we've made it this far without crashing, we've succeeded. 1560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int failure_count_; 1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1567a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 1568a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostContextTestFailsToCreateSurface); 1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Not reusing LayerTreeTest because it expects creating LTH to always succeed. 1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface 1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public testing::Test, 1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public FakeLayerTreeHostClient { 1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface() 1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : FakeLayerTreeHostClient(FakeLayerTreeHostClient::DIRECT_3D) {} 1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1578a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // FakeLayerTreeHostClient implementation. 1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE { 1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return scoped_ptr<OutputSurface>(); 1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1583a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void RunTest(bool threaded, 1584a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool delegating_renderer, 1585a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool impl_side_painting) { 1586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Thread> impl_thread; 1587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (threaded) { 1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_thread.reset(new base::Thread("LayerTreeTest")); 1589eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(impl_thread->Start()); 1590eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(impl_thread->message_loop_proxy().get()); 1591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1594a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) settings.impl_side_painting = impl_side_painting; 1595eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<LayerTreeHost> layer_tree_host = LayerTreeHost::Create( 1596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this, 1597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch settings, 1598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch impl_thread ? impl_thread->message_loop_proxy() : NULL); 1599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_tree_host); 1600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 1604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface); 16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 1608