layer_tree_host_unittest_context.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_provider.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_resource_collection.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/io_surface_layer.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h" 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/layers/painted_scrollbar_layer.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/texture_layer.h" 17a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "cc/layers/texture_layer_impl.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/video_layer_impl.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/output/filter_operations.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_impl.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_delegated_renderer_layer_impl.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "cc/test/fake_output_surface_client.h" 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_painted_scrollbar_layer.h" 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_scoped_ui_resource.h" 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/test/fake_scrollbar.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_video_frame_provider.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_common.h" 350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_context_provider.h" 360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/media.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using media::VideoFrame; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebGraphicsContext3D; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These tests deal with losing the 3d graphics context. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostContextTest : public LayerTreeTest { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest() 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeTest(), 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_(NULL), 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_(0), 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_initialize_(0), 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_create_(0), 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_(0), 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_draw_(0), 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_(0), 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_(0), 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_(0), 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_offscreen_(0), 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_offscreen_(0), 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_expect_create_failed_(0), 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_create_failed_(0), 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_offscreen_created_(0), 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) committed_at_least_once_(false), 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) context_should_support_io_surface_(false), 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fallback_context_works_(false) { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::InitializeMediaLibraryForTesting(); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void LoseContext() { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_->loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_INNOCENT_CONTEXT_RESET_ARB); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_ = NULL; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return TestWebGraphicsContext3D::Create(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface(bool fallback) 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OVERRIDE { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_fail_create_) { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_fail_create_; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectCreateToFail(); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<OutputSurface>(); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> context3d = CreateContext3d(); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_ = context3d.get(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (context_should_support_io_surface_) { 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context3d_->set_have_extension_io_surface(true); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context3d_->set_have_extension_egl_image(true); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (times_to_fail_initialize_ && !(fallback && fallback_context_works_)) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_fail_initialize_; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make the context get lost during reinitialization. 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The number of times MakeCurrent succeeds is not important, and 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // can be changed if needed to make this pass with future changes. 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_->set_times_make_current_succeeds(2); 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectCreateToFail(); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (times_to_lose_on_create_) { 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_lose_on_create_; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectCreateToFail(); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 113a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (delegating_renderer()) { 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return FakeOutputSurface::CreateDelegating3d(context3d.Pass()) 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) .PassAs<OutputSurface>(); 116a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return FakeOutputSurface::Create3d(context3d.Pass()) 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) .PassAs<OutputSurface>(); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> CreateOffscreenContext3d() { 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!context3d_) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<TestWebGraphicsContext3D>(); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++times_offscreen_created_; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_fail_create_offscreen_) { 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_fail_create_offscreen_; 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectCreateToFail(); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return scoped_ptr<TestWebGraphicsContext3D>(); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> offscreen_context3d = 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestWebGraphicsContext3D::Create().Pass(); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(offscreen_context3d); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_->add_share_group_context(offscreen_context3d.get()); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return offscreen_context3d.Pass(); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual scoped_refptr<ContextProvider> OffscreenContextProvider() OVERRIDE { 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!offscreen_contexts_.get() || 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) offscreen_contexts_->DestroyedOnMainThread()) { 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) offscreen_contexts_ = 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TestContextProvider::Create(CreateOffscreenContext3d()); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return offscreen_contexts_; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool result) OVERRIDE { 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(result); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!times_to_lose_during_draw_) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_lose_during_draw_; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context3d_->set_times_make_current_succeeds(0); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_ = times_to_fail_recreate_; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_initialize_ = times_to_fail_reinitialize_; 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_create_ = times_to_lose_on_recreate_; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_offscreen_ = times_to_fail_recreate_offscreen_; 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_offscreen_ = 0; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) committed_at_least_once_ = true; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!times_to_lose_during_commit_) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_lose_during_commit_; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_ = times_to_fail_recreate_; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_initialize_ = times_to_fail_reinitialize_; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_create_ = times_to_lose_on_recreate_; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_offscreen_ = times_to_fail_recreate_offscreen_; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_offscreen_ = 0; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidFailToInitializeOutputSurface() OVERRIDE { 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++times_create_failed_; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown() OVERRIDE { 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeTest::TearDown(); 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(times_to_expect_create_failed_, times_create_failed_); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ExpectCreateToFail() { 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++times_to_expect_create_failed_; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestWebGraphicsContext3D* context3d_; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_create_; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_initialize_; 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_on_create_; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_commit_; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_draw_; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_recreate_; 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int times_to_fail_reinitialize_; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_on_recreate_; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_create_offscreen_; 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_recreate_offscreen_; 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int times_to_expect_create_failed_; 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int times_create_failed_; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_offscreen_created_; 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool committed_at_least_once_; 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool context_should_support_io_surface_; 220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool fallback_context_works_; 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<TestContextProvider> offscreen_contexts_; 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextSucceeds 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextSucceeds() 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostContextTest(), 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_case_(0), 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) num_losses_(0), 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) recovered_context_(true), 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_(false) {} 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(succeeded); 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (first_initialized_) 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++num_losses_; 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_ = true; 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recovered_context_ = true; 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(11u, test_case_); 252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(8 + 10 + 10 + 1, num_losses_); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the last frame had a context loss, then we'll commit again to 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // recover. 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!recovered_context_) 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_lose_during_commit_) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_lose_during_draw_) 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recovered_context_ = false; 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (NextTestCase()) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InvalidateAndSetNeedsCommit(); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InvalidateAndSetNeedsCommit() { 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Cause damage so we try to draw. 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->root_layer()->SetNeedsDisplay(); 275558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch layer_tree_host()->SetNeedsCommit(); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool NextTestCase() { 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const TestCase kTests[] = { 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Losing the context and failing to recreate it (or losing it again 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // immediately) a small number of times should succeed. 282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 1, // times_to_lose_during_commit 283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_lose_during_draw 284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3, // times_to_fail_reinitialize 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate 286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_lose_on_recreate 287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate_offscreen 288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) false, // fallback_context_works 289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }, 290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 0, // times_to_lose_during_commit 291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1, // times_to_lose_during_draw 292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3, // times_to_fail_reinitialize 293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate 294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_lose_on_recreate 295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate_offscreen 296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) false, // fallback_context_works 297a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }, 298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 1, // times_to_lose_during_commit 299a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_lose_during_draw 300a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_reinitialize 301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3, // times_to_fail_recreate 302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_lose_on_recreate 303a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate_offscreen 304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) false, // fallback_context_works 305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }, 306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 0, // times_to_lose_during_commit 307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1, // times_to_lose_during_draw 308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_reinitialize 309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3, // times_to_fail_recreate 310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_lose_on_recreate 311a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate_offscreen 312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) false, // fallback_context_works 313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }, 314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 1, // times_to_lose_during_commit 315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_lose_during_draw 316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_reinitialize 317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate 318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3, // times_to_lose_on_recreate 319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate_offscreen 320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) false, // fallback_context_works 321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }, 322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 0, // times_to_lose_during_commit 323a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1, // times_to_lose_during_draw 324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_reinitialize 325a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate 326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3, // times_to_lose_on_recreate 327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate_offscreen 328a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) false, // fallback_context_works 329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }, 330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 1, // times_to_lose_during_commit 331a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_lose_during_draw 332a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_reinitialize 333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate 334a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_lose_on_recreate 335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3, // times_to_fail_recreate_offscreen 336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) false, // fallback_context_works 337a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }, 338a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 0, // times_to_lose_during_commit 339a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1, // times_to_lose_during_draw 340a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_reinitialize 341a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate 342a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_lose_on_recreate 343a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3, // times_to_fail_recreate_offscreen 344a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) false, // fallback_context_works 345a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }, 346a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Losing the context and recreating it any number of times should 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // succeed. 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 10, // times_to_lose_during_commit 349a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_lose_during_draw 350a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_reinitialize 351a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate 352a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_lose_on_recreate 353a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate_offscreen 354a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) false, // fallback_context_works 355a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }, 356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 0, // times_to_lose_during_commit 357a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 10, // times_to_lose_during_draw 358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_reinitialize 359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate 360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_lose_on_recreate 361a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate_offscreen 362a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) false, // fallback_context_works 363a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }, 364a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Losing the context, failing to reinitialize it, and making a fallback 365a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // context should work. 366a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) { 0, // times_to_lose_during_commit 367a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1, // times_to_lose_during_draw 368a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 10, // times_to_fail_reinitialize 369a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate 370a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_lose_on_recreate 371a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 0, // times_to_fail_recreate_offscreen 372a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) true, // fallback_context_works 373a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }, 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (test_case_ >= arraysize(kTests)) 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_ = 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTests[test_case_].times_to_lose_during_commit; 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_draw_ = 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTests[test_case_].times_to_lose_during_draw; 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = kTests[test_case_].times_to_fail_reinitialize; 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = kTests[test_case_].times_to_fail_recreate; 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = kTests[test_case_].times_to_lose_on_recreate; 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_offscreen_ = 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kTests[test_case_].times_to_fail_recreate_offscreen; 388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fallback_context_works_ = kTests[test_case_].fallback_context_works; 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++test_case_; 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct TestCase { 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_commit; 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_during_draw; 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_reinitialize; 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_recreate; 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_on_recreate; 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_fail_recreate_offscreen; 400a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool fallback_context_works; 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t test_case_; 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_losses_; 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool recovered_context_; 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool first_initialized_; 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLostContextSucceeds); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextSucceedsWithContent 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTestLostContextSucceeds { 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextSucceedsWithContent() 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : LayerTreeHostContextTestLostContextSucceeds() {} 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_ = Layer::Create(); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetBounds(gfx::Size(10, 10)); 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetAnchorPoint(gfx::PointF()); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetIsDrawable(true); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_ = FakeContentLayer::Create(&client_); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetBounds(gfx::Size(10, 10)); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetAnchorPoint(gfx::PointF()); 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetIsDrawable(true); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (use_surface_) { 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetForceRenderSurface(true); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Filters require us to create an offscreen context. 431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FilterOperations filters; 432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f)); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetFilters(filters); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetBackgroundFilters(filters); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(content_); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InvalidateAndSetNeedsCommit() OVERRIDE { 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Invalidate the render surface so we don't try to use a cached copy of the 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // surface. We want to make sure to test the drawing paths for drawing to 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a child surface. 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetNeedsDisplay(); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextSucceeds::InvalidateAndSetNeedsCommit(); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerImpl* content_impl = static_cast<FakeContentLayerImpl*>( 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->active_tree()->root_layer()->children()[0]); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Even though the context was lost, we should have a resource. The 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TestWebGraphicsContext3D ensures that this resource is created with 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the active context. 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(content_impl->HaveResourceForTileAt(0, 0)); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContextProvider* contexts = host_impl->offscreen_context_provider(); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (use_surface_) { 461424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ASSERT_TRUE(contexts); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(contexts->Context3d()); 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(danakj): Make a fake GrContext. 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // EXPECT_TRUE(contexts->GrContext()); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(contexts); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextSucceeds::AfterTest(); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (use_surface_) { 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1 create to start with + 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 6 from test cases that fail on initializing the renderer (after the 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // offscreen context is created) + 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 6 from test cases that lose the offscreen context directly + 477a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // 4 from test cases that create a fallback + 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All the test cases that recreate both contexts only once 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // per time it is lost. 480a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(6 + 6 + 1 + 4 + num_losses_, times_offscreen_created_); 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, times_offscreen_created_); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool use_surface_; 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root_; 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> content_; 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 494a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NoSurface_SingleThread_DirectRenderer) { 495a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) use_surface_ = false; 496a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 497a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 498a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 499a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 500a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NoSurface_SingleThread_DelegatingRenderer) { 501a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) use_surface_ = false; 502a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 503a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 504a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 505a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 506a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NoSurface_MultiThread_DirectRenderer_MainThreadPaint) { 507a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) use_surface_ = false; 508a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 509a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 510a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 511a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 512a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) NoSurface_MultiThread_DelegatingRenderer_MainThreadPaint) { 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) use_surface_ = false; 514a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 517a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Surfaces don't exist with a delegating renderer. 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 519a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WithSurface_SingleThread_DirectRenderer) { 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) use_surface_ = true; 521a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextSucceedsWithContent, 525a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) WithSurface_MultiThread_DirectRenderer_MainThreadPaint) { 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) use_surface_ = true; 527a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 528a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 529a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostContextTestOffscreenContextFails 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostContextTest { 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_ = Layer::Create(); 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetBounds(gfx::Size(10, 10)); 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetAnchorPoint(gfx::PointF()); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->SetIsDrawable(true); 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_ = FakeContentLayer::Create(&client_); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetBounds(gfx::Size(10, 10)); 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetAnchorPoint(gfx::PointF()); 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetIsDrawable(true); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetForceRenderSurface(true); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Filters require us to create an offscreen context. 545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FilterOperations filters; 546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch filters.Append(FilterOperation::CreateGrayscaleFilter(0.5f)); 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetFilters(filters); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_->SetBackgroundFilters(filters); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(content_); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_offscreen_ = 1; 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ContextProvider* contexts = host_impl->offscreen_context_provider(); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(contexts); 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This did not lead to create failure. 566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_expect_create_failed_ = 0; 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root_; 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> content_; 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestOffscreenContextFails); 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextFails 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextFails() 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostContextTest(), 585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0), 586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_(false) { 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_ = 1; 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 594b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (first_initialized_) { 596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(succeeded); 597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_ = true; 600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(host_impl); 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++num_commits_; 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (num_commits_ == 1) { 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When the context is ok, we should have these things. 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(host_impl->output_surface()); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(host_impl->renderer()); 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(host_impl->resource_provider()); 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When context recreation fails we shouldn't be left with any of them. 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(host_impl->output_surface()); 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(host_impl->renderer()); 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(host_impl->resource_provider()); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_commits_; 625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool first_initialized_; 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 629a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailReinitialize100_SingleThread_DirectRenderer) { 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 100; 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 633a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 637a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailReinitialize100_SingleThread_DelegatingRenderer) { 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 100; 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 641a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 645a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailReinitialize100_MultiThread_DirectRenderer_MainThreadPaint) { 646a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 100; 647a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 648a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 649a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 650a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 651a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 652a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 653a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailReinitialize100_MultiThread_DirectRenderer_ImplSidePaint) { 654a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 100; 655a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 656a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 657a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 658a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 659a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 660a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 661a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailReinitialize100_MultiThread_DelegatingRenderer_MainThreadPaint) { 662a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 100; 663a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 664a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 665a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 666a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 667a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 668a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 669a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailReinitialize100_MultiThread_DelegatingRenderer_ImplSidePaint) { 670a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 100; 671a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 672a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 673a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 674a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 675a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 676a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 677a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailRecreate100_SingleThread_DirectRenderer) { 678a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 679a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 100; 680a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 681a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 682a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 683a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 684a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 685a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailRecreate100_SingleThread_DelegatingRenderer) { 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 100; 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 689a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 693a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailRecreate100_MultiThread_DirectRenderer_MainThreadPaint) { 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 100; 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 697a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 701a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailRecreate100_MultiThread_DirectRenderer_ImplSidePaint) { 702a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 703a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 100; 704a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 705a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 706a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 707a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 708a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 709a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailRecreate100_MultiThread_DelegatingRenderer_MainThreadPaint) { 710a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 711a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 100; 712a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 713a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 714a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 715a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 716a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 717a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FailRecreate100_MultiThread_DelegatingRenderer_ImplSidePaint) { 718a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 719a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 100; 720a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 0; 721a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 722a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 723a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 724a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 725a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseOnRecreate100_SingleThread_DirectRenderer) { 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 100; 729a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 733a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseOnRecreate100_SingleThread_DelegatingRenderer) { 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_recreate_ = 0; 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_recreate_ = 100; 737a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 738a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 739a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 740a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 741a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseOnRecreate100_MultiThread_DirectRenderer_MainThreadPaint) { 742a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 743a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 744a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 100; 745a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 746a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 747a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 748a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 749a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseOnRecreate100_MultiThread_DirectRenderer_ImplSidePaint) { 750a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 751a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 752a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 100; 753a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 754a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 755a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 756a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 757a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseOnRecreate100_MultiThread_DelegatingRenderer_MainThreadPaint) { 758a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 759a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 760a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 100; 761a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 762a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 763a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 764a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextFails, 765a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseOnRecreate100_MultiThread_DelegatingRenderer_ImplSidePaint) { 766a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_reinitialize_ = 0; 767a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_fail_recreate_ = 0; 768a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) times_to_lose_on_recreate_ = 100; 769a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestFinishAllRenderingAfterLoss 773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lose the context until the compositor gives up on it. 777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_ = false; 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_ = 1; 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_reinitialize_ = 10; 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 783b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (first_initialized_) { 785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(succeeded); 786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->FinishAllRendering(); 787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_initialized_ = true; 790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool first_initialized_; 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestFinishAllRenderingAfterLoss); 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLostContextAndEvictTextures 803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLostContextAndEvictTextures() 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostContextTest(), 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_(FakeContentLayer::Create(&client_)), 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl_host_(0), 809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0) {} 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_->SetBounds(gfx::Size(10, 20)); 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void PostEvictTextures() { 822eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (HasImplThread()) { 823eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImplThreadTaskRunner()->PostTask( 824eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FROM_HERE, 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &LayerTreeHostContextTestLostContextAndEvictTextures:: 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EvictTexturesOnImplThread, 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DebugScopedSetImplThread impl(proxy()); 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EvictTexturesOnImplThread(); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void EvictTexturesOnImplThread() { 836eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch impl_host_->EvictTexturesForTesting(); 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (lose_after_evict_) 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (num_commits_ > 1) 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(layer_->HaveBackingAt(0, 0)); 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostEvictTextures(); 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (num_commits_ > 1) 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++num_commits_; 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!lose_after_evict_) 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl_host_ = impl; 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 858b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(succeeded); 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool lose_after_evict_; 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> layer_; 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* impl_host_; 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_commits_; 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 874a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_SingleThread_DirectRenderer) { 875a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = true; 876a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 877a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 878a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 879a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 880a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_SingleThread_DelegatingRenderer) { 881a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = true; 882a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 883a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 884a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 885a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 886a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_MultiThread_DirectRenderer_MainThreadPaint) { 887a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = true; 888a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 889a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 890a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 891a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 892a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseAfterEvict_MultiThread_DelegatingRenderer_MainThreadPaint) { 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = true; 894a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Flaky on all platforms, http://crbug.com/310979 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 8991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DISABLED_LoseAfterEvict_MultiThread_DelegatingRenderer_ImplSidePaint) { 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = true; 901a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 902a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 903a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 904a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 905a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_SingleThread_DirectRenderer) { 906a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 907a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, false, false); 908a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 909a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 910a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 911a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_SingleThread_DelegatingRenderer) { 912a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 913a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(false, true, false); 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 917a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DirectRenderer_MainThreadPaint) { 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = false; 919a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, false); 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 923a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DirectRenderer_ImplSidePaint) { 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lose_after_evict_ = false; 925a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, false, true); 926a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 927a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 928a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 929a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DelegatingRenderer_MainThreadPaint) { 930a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 931a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, false); 932a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 933a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 934a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(LayerTreeHostContextTestLostContextAndEvictTextures, 935a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LoseBeforeEvict_MultiThread_DelegatingRenderer_ImplSidePaint) { 936a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) lose_after_evict_ = false; 937a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) RunTest(true, true, true); 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)class DISABLED_LayerTreeHostContextTestLostContextWhileUpdatingResources 941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 9430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DISABLED_LayerTreeHostContextTestLostContextWhileUpdatingResources() 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : parent_(FakeContentLayer::Create(&client_)), 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) num_children_(50), 946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_lose_on_end_query_(3) {} 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() OVERRIDE { 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> context = 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CreateContext3d(); 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (times_to_lose_on_end_query_) { 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) --times_to_lose_on_end_query_; 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->set_times_end_query_succeeds(5); 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return context.Pass(); 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->SetBounds(gfx::Size(num_children_, 1)); 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < num_children_; i++) { 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> child = 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayer::Create(&client_); 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->SetPosition(gfx::PointF(i, 0.f)); 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->SetBounds(gfx::Size(1, 1)); 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->AddChild(child); 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(parent_); 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(succeeded); 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, times_to_lose_on_end_query_); 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> parent_; 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_children_; 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int times_to_lose_on_end_query_; 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Disabled (crbug.com/313790) 9988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F( 9990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DISABLED_LayerTreeHostContextTestLostContextWhileUpdatingResources); 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLayersNotified 1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTestLayersNotified() 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostContextTest(), 1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_commits_(0) {} 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_ = FakeContentLayer::Create(&client_); 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_ = FakeContentLayer::Create(&client_); 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) grandchild_ = FakeContentLayer::Create(&client_); 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_->AddChild(child_); 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_->AddChild(grandchild_); 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_); 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 10257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) LayerTreeHostContextTest::DidActivateTreeOnThread(host_impl); 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerImpl* root = static_cast<FakeContentLayerImpl*>( 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->active_tree()->root_layer()); 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerImpl* child = static_cast<FakeContentLayerImpl*>( 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->children()[0]); 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerImpl* grandchild = static_cast<FakeContentLayerImpl*>( 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->children()[0]); 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++num_commits_; 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (num_commits_) { 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, root->lost_output_surface_count()); 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, child->lost_output_surface_count()); 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, grandchild->lost_output_surface_count()); 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lose the context and struggle to recreate it. 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_create_ = 1; 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, root->lost_output_surface_count()); 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, child->lost_output_surface_count()); 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, grandchild->lost_output_surface_count()); 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lose the context and again during recreate. 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_on_create_ = 1; 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, root->lost_output_surface_count()); 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, child->lost_output_surface_count()); 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3u, grandchild->lost_output_surface_count()); 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lose the context and again during reinitialization. 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_fail_initialize_ = 1; 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(5u, root->lost_output_surface_count()); 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(5u, child->lost_output_surface_count()); 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(5u, grandchild->lost_output_surface_count()); 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_commits_; 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> root_; 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> child_; 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> grandchild_; 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestLayersNotified); 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestDontUseLostResources 1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 10878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) LayerTreeHostContextTestDontUseLostResources() 10888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) : lost_context_(false) { 10894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) context_should_support_io_surface_ = true; 10908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) child_output_surface_ = FakeOutputSurface::Create3d(); 10928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) child_output_surface_->BindToClient(&output_surface_client_); 10938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) child_resource_provider_ = 10940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ResourceProvider::Create(child_output_surface_.get(), 10950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) NULL, 10960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 0, 10970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) false, 10980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1); 10994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static void EmptyReleaseCallback(unsigned sync_point, bool lost) {} 11028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 11048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebKit::WebGraphicsContext3D* context3d = 11058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) child_output_surface_->context_provider()->Context3d(); 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); 11088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<TestRenderPass> pass_for_quad = TestRenderPass::Create(); 11108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pass_for_quad->SetNew( 11118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // AppendOneOfEveryQuadType() makes a RenderPass quad with this id. 11128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RenderPass::Id(2, 1), 11138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 11148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 11158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Transform()); 11168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<TestRenderPass> pass = TestRenderPass::Create(); 11188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pass->SetNew(RenderPass::Id(1, 1), 11198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 11208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Rect(0, 0, 10, 10), 11218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Transform()); 11228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pass->AppendOneOfEveryQuadType(child_resource_provider_.get(), 11238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RenderPass::Id(2, 1)); 11248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame_data->render_pass_list.push_back(pass_for_quad.PassAs<RenderPass>()); 11268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame_data->render_pass_list.push_back(pass.PassAs<RenderPass>()); 11274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_resource_collection_ = new DelegatedFrameResourceCollection; 11294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_frame_provider_ = new DelegatedFrameProvider( 11304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_resource_collection_.get(), frame_data.Pass()); 11314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ResourceProvider::ResourceId resource = 11338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) child_resource_provider_->CreateResource( 11348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Size(4, 4), 11358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GL_CLAMP_TO_EDGE, 11368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ResourceProvider::TextureUsageAny, 11378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RGBA_8888); 11388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ResourceProvider::ScopedWriteLockGL lock(child_resource_provider_.get(), 11398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) resource); 11408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gpu::Mailbox mailbox; 11428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) context3d->genMailboxCHROMIUM(mailbox.name); 11438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) unsigned sync_point = context3d->insertSyncPoint(); 11448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_refptr<Layer> root = Layer::Create(); 11468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) root->SetBounds(gfx::Size(10, 10)); 11478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) root->SetAnchorPoint(gfx::PointF()); 11488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) root->SetIsDrawable(true); 11498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<FakeDelegatedRendererLayer> delegated = 11514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeDelegatedRendererLayer::Create(NULL, 11524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_frame_provider_.get()); 11534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated->SetBounds(gfx::Size(10, 10)); 11544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated->SetAnchorPoint(gfx::PointF()); 11554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated->SetIsDrawable(true); 11564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(delegated); 11574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<ContentLayer> content = ContentLayer::Create(&client_); 11594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content->SetBounds(gfx::Size(10, 10)); 11604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content->SetAnchorPoint(gfx::PointF()); 11614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content->SetIsDrawable(true); 11624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(content); 11634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_refptr<TextureLayer> texture = TextureLayer::CreateForMailbox(NULL); 11654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) texture->SetBounds(gfx::Size(10, 10)); 11664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) texture->SetAnchorPoint(gfx::PointF()); 11674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) texture->SetIsDrawable(true); 11688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) texture->SetTextureMailbox( 11698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) TextureMailbox(mailbox, sync_point), 11708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) SingleReleaseCallback::Create(base::Bind( 11718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &LayerTreeHostContextTestDontUseLostResources:: 11728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EmptyReleaseCallback))); 11734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(texture); 11744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<ContentLayer> mask = ContentLayer::Create(&client_); 11764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mask->SetBounds(gfx::Size(10, 10)); 11774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mask->SetAnchorPoint(gfx::PointF()); 11784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<ContentLayer> content_with_mask = 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentLayer::Create(&client_); 11814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content_with_mask->SetBounds(gfx::Size(10, 10)); 11824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content_with_mask->SetAnchorPoint(gfx::PointF()); 11834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content_with_mask->SetIsDrawable(true); 11844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content_with_mask->SetMaskLayer(mask.get()); 11854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(content_with_mask); 11864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<VideoLayer> video_color = 11884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) VideoLayer::Create(&color_frame_provider_); 11894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_color->SetBounds(gfx::Size(10, 10)); 11904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_color->SetAnchorPoint(gfx::PointF()); 11914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_color->SetIsDrawable(true); 11924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(video_color); 11934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<VideoLayer> video_hw = 11954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) VideoLayer::Create(&hw_frame_provider_); 11964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_hw->SetBounds(gfx::Size(10, 10)); 11974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_hw->SetAnchorPoint(gfx::PointF()); 11984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_hw->SetIsDrawable(true); 11994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(video_hw); 12004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 12014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<VideoLayer> video_scaled_hw = 12024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) VideoLayer::Create(&scaled_hw_frame_provider_); 12034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_scaled_hw->SetBounds(gfx::Size(10, 10)); 12044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_scaled_hw->SetAnchorPoint(gfx::PointF()); 12054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_scaled_hw->SetIsDrawable(true); 12064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(video_scaled_hw); 1207a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 12088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) color_video_frame_ = VideoFrame::CreateColorFrame( 12098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Size(4, 4), 0x80, 0x80, 0x80, base::TimeDelta()); 12108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) hw_video_frame_ = VideoFrame::WrapNativeTexture( 12118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) new VideoFrame::MailboxHolder( 12128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mailbox, 12138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) sync_point, 12148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) VideoFrame::MailboxHolder::TextureNoLongerNeededCallback()), 12158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GL_TEXTURE_2D, 12168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Size(4, 4), gfx::Rect(0, 0, 4, 4), gfx::Size(4, 4), 12178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::TimeDelta(), 12188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) VideoFrame::ReadPixelsCB(), 12198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::Closure()); 12208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scaled_hw_video_frame_ = VideoFrame::WrapNativeTexture( 12218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) new VideoFrame::MailboxHolder( 12228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) mailbox, 12238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) sync_point, 12248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) VideoFrame::MailboxHolder::TextureNoLongerNeededCallback()), 12258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GL_TEXTURE_2D, 12268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) gfx::Size(4, 4), gfx::Rect(0, 0, 3, 2), gfx::Size(4, 4), 12278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::TimeDelta(), 12288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) VideoFrame::ReadPixelsCB(), 12298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::Closure()); 12308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 12318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) color_frame_provider_.set_frame(color_video_frame_); 12328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) hw_frame_provider_.set_frame(hw_video_frame_); 12338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scaled_hw_frame_provider_.set_frame(scaled_hw_video_frame_); 12348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1235a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!delegating_renderer()) { 1236a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // TODO(danakj): IOSurface layer can not be transported. crbug.com/239335 12374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<IOSurfaceLayer> io_surface = IOSurfaceLayer::Create(); 12384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) io_surface->SetBounds(gfx::Size(10, 10)); 12394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) io_surface->SetAnchorPoint(gfx::PointF()); 12404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) io_surface->SetIsDrawable(true); 12414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) io_surface->SetIOSurfaceProperties(1, gfx::Size(10, 10)); 12424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(io_surface); 1243a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Enable the hud. 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeDebugState debug_state; 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) debug_state.show_property_changed_rects = true; 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetDebugState(debug_state); 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<PaintedScrollbarLayer> scrollbar = 12513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PaintedScrollbarLayer::Create( 12524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<Scrollbar>(new FakeScrollbar).Pass(), content->id()); 12534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scrollbar->SetBounds(gfx::Size(10, 10)); 12544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scrollbar->SetAnchorPoint(gfx::PointF()); 12554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scrollbar->SetIsDrawable(true); 12564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root->AddChild(scrollbar); 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetRootLayer(root); 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(host_impl); 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 3) { 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On the third commit we're recovering from context loss. Hardware 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // video frames should not be reused by the VideoFrameProvider, but 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // software frames can be. 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hw_frame_provider_.set_frame(NULL); 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scaled_hw_frame_provider_.set_frame(NULL); 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 1277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 1278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool result) OVERRIDE { 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->active_tree()->source_frame_number() == 2) { 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lose the context during draw on the second commit. This will cause 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a third commit to recover. 12824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) context3d_->set_times_bind_texture_succeeds(0); 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface( 12884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool fallback) OVERRIDE { 12894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (layer_tree_host()) { 12904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) lost_context_ = true; 12914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(layer_tree_host()->source_frame_number(), 3); 12924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 12934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return LayerTreeHostContextTest::CreateOutputSurface(fallback); 12944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 12954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(layer_tree_host()->hud_layer()); 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // End the test once we know the 3nd frame drew. 12994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (layer_tree_host()->source_frame_number() < 4) { 13004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->root_layer()->SetNeedsDisplay(); 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 13024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 13034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 13044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 13084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(lost_context_); 13094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 13134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool lost_context_; 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FakeOutputSurfaceClient output_surface_client_; 13168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<FakeOutputSurface> child_output_surface_; 13178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<ResourceProvider> child_resource_provider_; 13188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 13194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<DelegatedFrameResourceCollection> 13204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegated_resource_collection_; 13214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<DelegatedFrameProvider> delegated_frame_provider_; 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoFrame> color_video_frame_; 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoFrame> hw_video_frame_; 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<VideoFrame> scaled_hw_video_frame_; 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeVideoFrameProvider color_frame_provider_; 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeVideoFrameProvider hw_frame_provider_; 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeVideoFrameProvider scaled_hw_frame_provider_; 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestDontUseLostResources); 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestLosesFirstOutputSurface 1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestLosesFirstOutputSurface() { 1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Always fail. This needs to be set before LayerTreeHost is created. 1339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_lose_on_create_ = 1000; 1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1348b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(succeeded); 1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If we make it this far without crashing, we pass! 1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(false); 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestLosesFirstOutputSurface); 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds 1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_fail_initialize_ = 2; 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 1379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds); 1380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestRetryWorksWithForcedInit 1382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds { 1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidFailToInitializeOutputSurface() OVERRIDE { 1385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestRetriesFirstInitializationAndSucceeds 1386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ::DidFailToInitializeOutputSurface(); 1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (times_create_failed_ == 1) { 1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // CompositeAndReadback force recreates the output surface, which should 1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // fail. 1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->CompositeAndReadback( 1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &pixels, gfx::Rect(1, 1))); 1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestRetryWorksWithForcedInit); 1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestCompositeAndReadbackBeforeOutputSurfaceInit 1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This must be called immediately after creating LTH, before the first 1406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // OutputSurface is initialized. 1407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(layer_tree_host()->output_surface_lost()); 1408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_output_surface_created_ = 0; 1410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Post the SetNeedsCommit before the readback to make sure it is run 14121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // on the main thread before the readback's replacement commit when 14131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // we have a threaded compositor. 14141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 14151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 1417a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool result = layer_tree_host()->CompositeAndReadback( 1418a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) &pixels, gfx::Rect(1, 1)); 1419a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(!delegating_renderer(), result); 1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, times_output_surface_created_); 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1423b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 1424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(succeeded); 1425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++times_output_surface_created_; 1426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE { 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE { 1433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Should not try to create output surface again after successfully 1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // created by CompositeAndReadback. 1435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, times_output_surface_created_); 1436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 143858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 143958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 144058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool result) OVERRIDE { 144158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_GE(host_impl->active_tree()->source_frame_number(), 0); 144258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_LE(host_impl->active_tree()->source_frame_number(), 1); 144358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 144458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 144558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 144658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 144758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // We should only draw for the readback and the replacement commit. 144858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The replacement commit will also be the first commit after output 144958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // surface initialization. 145058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_GE(host_impl->active_tree()->source_frame_number(), 0); 145158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_LE(host_impl->active_tree()->source_frame_number(), 1); 145258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 145358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 145458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 145558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool result) OVERRIDE { 145658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // We should only swap for the replacement commit. 145758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(host_impl->active_tree()->source_frame_number(), 1); 145858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 145958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 146058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int times_output_surface_created_; 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestCompositeAndReadbackBeforeOutputSurfaceInit); 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 146858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This test verifies that losing an output surface during a 146958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// simultaneous readback and forced redraw works and does not deadlock. 147058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostContextTestLoseOutputSurfaceDuringReadbackAndForcedDraw 147158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : public LayerTreeHostContextTest { 147258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 147358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kFirstOutputSurfaceInitSourceFrameNumber = 0; 147458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kReadbackSourceFrameNumber = 1; 147558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kReadbackReplacementSourceFrameNumber = 2; 147658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kSecondOutputSurfaceInitSourceFrameNumber = 3; 147758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 147858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTestLoseOutputSurfaceDuringReadbackAndForcedDraw() 147958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : did_react_to_first_commit_(false) {} 148058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 148158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 148258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This enables forced draws after a single prepare to draw failure. 148358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings->timeout_and_draw_when_animation_checkerboards = true; 148458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings->maximum_number_of_failed_draws_before_draw_is_forced_ = 1; 148558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 148658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 148758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 148858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 148958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 149058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 149158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool result) OVERRIDE { 149258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int sfn = host_impl->active_tree()->source_frame_number(); 149358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(sfn == kFirstOutputSurfaceInitSourceFrameNumber || 149458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kSecondOutputSurfaceInitSourceFrameNumber || 149558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kReadbackSourceFrameNumber) 149658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << sfn; 149758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 149858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Before we react to the failed draw by initiating the forced draw 149958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // sequence, start a readback on the main thread and then lose the context 150058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // to start output surface initialization all at the same time. 150158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (sfn == kFirstOutputSurfaceInitSourceFrameNumber && 150258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) !did_react_to_first_commit_) { 150358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) did_react_to_first_commit_ = true; 150458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostReadbackToMainThread(); 150558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LoseContext(); 150658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 150758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 150858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 150958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 151058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 151158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl, 151258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool success) OVERRIDE { 151358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // -1 is for the first output surface initialization. 151458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int sfn = host_impl->active_tree()->source_frame_number(); 151558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(sfn == -1 || sfn == kReadbackReplacementSourceFrameNumber) 151658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << sfn; 151758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 151858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 151958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 152058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // We should only draw the first commit after output surface initialization 152158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // and attempt to draw the readback commit (which will fail). 152258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // All others should abort because the output surface is lost. 152358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int sfn = host_impl->active_tree()->source_frame_number(); 152458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(sfn == kSecondOutputSurfaceInitSourceFrameNumber || 152558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kReadbackSourceFrameNumber) 152658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << sfn; 152758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 152858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 152958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 153058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool result) OVERRIDE { 153158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // We should only swap the first commit after the second output surface 153258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // initialization. 153358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int sfn = host_impl->active_tree()->source_frame_number(); 153458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(sfn == kSecondOutputSurfaceInitSourceFrameNumber) << sfn; 153558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 153658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 153758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 153858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 153958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 154058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int did_react_to_first_commit_; 154158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 154258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 154358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F( 154458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTestLoseOutputSurfaceDuringReadbackAndForcedDraw); 154558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 154658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This test verifies that losing an output surface right before a 154758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// simultaneous readback and forced redraw works and does not deadlock. 154858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class LayerTreeHostContextTestReadbackWithForcedDrawAndOutputSurfaceInit 154958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : public LayerTreeHostContextTest { 155058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 155158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kFirstOutputSurfaceInitSourceFrameNumber = 0; 155258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kReadbackSourceFrameNumber = 1; 155358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kForcedDrawCommitSourceFrameNumber = 2; 155458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const int kSecondOutputSurfaceInitSourceFrameNumber = 2; 155558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 155658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTestReadbackWithForcedDrawAndOutputSurfaceInit() 155758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : did_lose_context_(false) {} 155858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 155958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 156058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This enables forced draws after a single prepare to draw failure. 156158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings->timeout_and_draw_when_animation_checkerboards = true; 156258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings->maximum_number_of_failed_draws_before_draw_is_forced_ = 1; 156358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 156458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 156558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 156658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 156758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 156858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostImpl::FrameData* frame_data, 156958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool result) OVERRIDE { 157058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int sfn = host_impl->active_tree()->source_frame_number(); 157158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(sfn == kFirstOutputSurfaceInitSourceFrameNumber || 157258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kSecondOutputSurfaceInitSourceFrameNumber || 157358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kReadbackSourceFrameNumber) 157458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << sfn; 157558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 157658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Before we react to the failed draw by initiating the forced draw 157758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // sequence, start a readback on the main thread and then lose the context 157858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // to start output surface initialization all at the same time. 157958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (sfn == kFirstOutputSurfaceInitSourceFrameNumber && !did_lose_context_) { 158058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) did_lose_context_ = true; 158158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LoseContext(); 158258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 158358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 158458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returning false will result in a forced draw. 158558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 158658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 158758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 158858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 158958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(succeeded); 159058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (layer_tree_host()->source_frame_number() > 0) { 159158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Perform a readback right after the second output surface 159258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // initialization. 159358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) char pixels[4]; 159458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 159558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 159658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 159758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 159858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl, 159958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool success) OVERRIDE { 160058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // -1 is for the first output surface initialization. 160158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int sfn = host_impl->active_tree()->source_frame_number(); 160258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(sfn == -1 || sfn == kFirstOutputSurfaceInitSourceFrameNumber) 160358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << sfn; 160458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 160558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 160658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 160758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // We should only draw the first commit after output surface initialization 160858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // and attempt to draw the readback commit (which will fail). 160958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // All others should abort because the output surface is lost. 161058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int sfn = host_impl->active_tree()->source_frame_number(); 161158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(sfn == kForcedDrawCommitSourceFrameNumber || 161258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sfn == kReadbackSourceFrameNumber) 161358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << sfn; 161458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 161558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 161658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 161758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool result) OVERRIDE { 161858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // We should only swap the first commit after the second output surface 161958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // initialization. 162058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int sfn = host_impl->active_tree()->source_frame_number(); 162158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(sfn == kForcedDrawCommitSourceFrameNumber) << sfn; 162258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 162358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 162458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 162558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 162658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 162758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int did_lose_context_; 162858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 162958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 163058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MULTI_THREAD_TEST_F( 163158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTestReadbackWithForcedDrawAndOutputSurfaceInit); 163258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ImplSidePaintingLayerTreeHostContextTest 16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public LayerTreeHostContextTest { 16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->impl_side_painting = true; 16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestImplSidePainting 1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public ImplSidePaintingLayerTreeHostContextTest { 16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> root = Layer::Create(); 16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->SetBounds(gfx::Size(10, 10)); 16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->SetAnchorPoint(gfx::PointF()); 16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->SetIsDrawable(true); 16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PictureLayer> picture = PictureLayer::Create(&client_); 16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) picture->SetBounds(gfx::Size(10, 10)); 16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) picture->SetAnchorPoint(gfx::PointF()); 16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) picture->SetIsDrawable(true); 16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->AddChild(picture); 16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root); 16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times_to_lose_during_commit_ = 1; 16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1667b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(succeeded); 16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostContextTestImplSidePainting); 16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScrollbarLayerLostContext : public LayerTreeHostContextTest { 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollbarLayerLostContext() : commits_(0) {} 16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> scroll_layer = Layer::Create(); 16843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scrollbar_layer_ = FakePaintedScrollbarLayer::Create( 16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, true, scroll_layer->id()); 16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollbar_layer_->SetBounds(gfx::Size(10, 100)); 16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(scrollbar_layer_); 16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(scroll_layer); 16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++commits_; 1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (commits_) { 16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First (regular) update, we should upload 2 resources (thumb, and 17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // backtrack). 17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, scrollbar_layer_->update_count()); 17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoseContext(); 17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Second update, after the lost context, we should still upload 2 17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resources even if the contents haven't changed. 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, scrollbar_layer_->update_count()); 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 171158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 3: 171258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Single thread proxy issues extra commits after context lost. 171358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // http://crbug.com/287250 171458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasImplThread()) 171558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 171658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int commits_; 17243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<FakePaintedScrollbarLayer> scrollbar_layer_; 17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(ScrollbarLayerLostContext); 1728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostContextTestFailsToCreateSurface 1730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public LayerTreeHostContextTest { 1731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostContextTestFailsToCreateSurface() 1733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : LayerTreeHostContextTest(), 1734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) failure_count_(0) { 1735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_lose_on_create_ = 10; 1736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 1739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1744b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool success) OVERRIDE { 1745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(success); 1746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0, failure_count_); 1747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) times_to_lose_on_create_ = 0; 1748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) failure_count_++; 1749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Normally, the embedder should stop trying to use the compositor at 1750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // this point, but let's force it back into action when we shouldn't. 1751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char pixels[4]; 1752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE( 1753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(pixels, gfx::Rect(1, 1))); 1754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If we've made it this far without crashing, we've succeeded. 1755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EndTest(); 1756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int failure_count_; 1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1762a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 1763a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) LayerTreeHostContextTestFailsToCreateSurface); 1764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Not reusing LayerTreeTest because it expects creating LTH to always succeed. 1766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface 1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public testing::Test, 1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public FakeLayerTreeHostClient { 1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface() 1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : FakeLayerTreeHostClient(FakeLayerTreeHostClient::DIRECT_3D) {} 1772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1773a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // FakeLayerTreeHostClient implementation. 1774a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface(bool fallback) 1775a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OVERRIDE { 1776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return scoped_ptr<OutputSurface>(); 1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1779a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void RunTest(bool threaded, 1780a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool delegating_renderer, 1781a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) bool impl_side_painting) { 1782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Thread> impl_thread; 1783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (threaded) { 1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) impl_thread.reset(new base::Thread("LayerTreeTest")); 1785eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(impl_thread->Start()); 1786eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(impl_thread->message_loop_proxy().get()); 1787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeSettings settings; 1790a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) settings.impl_side_painting = impl_side_painting; 1791eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<LayerTreeHost> layer_tree_host = LayerTreeHost::Create( 1792eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch this, 17931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NULL, 1794eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch settings, 1795eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch impl_thread ? impl_thread->message_loop_proxy() : NULL); 1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(layer_tree_host); 1797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 1799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F( 1801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface); 18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1803a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class UIResourceLostTest : public LayerTreeHostContextTest { 1804a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 1805a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceLostTest() : time_step_(0) {} 18060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 18070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) settings->texture_id_allocation_chunk_size = 1; 18080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 1809a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 1810a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void AfterTest() OVERRIDE {} 1811a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 181258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This is called on the main thread after each commit and 181358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // DidActivateTreeOnThread, with the value of time_step_ at the time 181458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // of the call to DidActivateTreeOnThread. Similar tests will do 181558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // work on the main thread in DidCommit but that is unsuitable because 181658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the main thread work for these tests must happen after 181758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // DidActivateTreeOnThread, which happens after DidCommit with impl-side 181858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // painting. 181958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int time_step) = 0; 182058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 182158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Called after DidActivateTreeOnThread. If this is done during the commit, 182258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the call to StepCompleteOnMainThread will not occur until after 182358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the commit completes, because the main thread is blocked. 182458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void PostStepCompleteToMainThread() { 182558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) proxy()->MainThreadTaskRunner()->PostTask( 182658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 182758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind( 182858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &UIResourceLostTest::StepCompleteOnMainThreadInternal, 182958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Unretained(this), 183058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) time_step_)); 183158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 183258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 183358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void PostLoseContextToImplThread() { 183458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 183558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::SingleThreadTaskRunner* task_runner = 183658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) HasImplThread() ? ImplThreadTaskRunner() 183758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : base::MessageLoopProxy::current(); 183858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner->PostTask( 183958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 184058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind( 184158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &LayerTreeHostContextTest::LoseContext, 184258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Unretained(this))); 184358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 184458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1845a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected: 1846a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int time_step_; 1847a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<FakeScopedUIResource> ui_resource_; 184858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 184958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 185058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void StepCompleteOnMainThreadInternal(int step) { 185158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 185258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StepCompleteOnMainThread(step); 185358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 1854a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 1855a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 185658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostTestSimple : public UIResourceLostTest { 1857a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 185858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This is called when the commit is complete and the new layer tree has been 185958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // activated. 186058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) = 0; 186158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1862a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 186358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!layer_tree_host()->settings().impl_side_painting) { 186458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StepCompleteOnImplThread(impl); 186558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostStepCompleteToMainThread(); 186658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ++time_step_; 186758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 186858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 186958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 187058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 187158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (layer_tree_host()->settings().impl_side_painting) { 187258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StepCompleteOnImplThread(impl); 187358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostStepCompleteToMainThread(); 187458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ++time_step_; 187558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 187658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 187758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 187858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 187958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Losing context after an UI resource has been created. 188058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostAfterCommit : public UIResourceLostTestSimple { 188158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 188258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int step) OVERRIDE { 188358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 188458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (step) { 1885a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 0: 1886a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 1887a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Expects a valid UIResourceId. 1888a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(0, ui_resource_->id()); 1889a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1890a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 189158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 4: 189258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Release resource before ending the test. 189358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_resource_.reset(); 189458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 189558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 189658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 5: 189758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Single thread proxy issues extra commits after context lost. 189858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // http://crbug.com/287250 189958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasImplThread()) 190058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 190158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 190258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 6: 190358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 190458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 190558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 190658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 190758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { 190858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 190958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (time_step_) { 1910a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 1911a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource should have been created on LTHI after the commit. 191258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 1913a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1914a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1915a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 2: 1916a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LoseContext(); 1917a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1918a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 1919a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resources should have been recreated. The bitmap callback should 1920a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // have been called once with the resource_lost flag set to true. 1921a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 1922a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Resource Id on the impl-side have been recreated as well. Note 1923a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // that the same UIResourceId persists after the context lost. 192458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 1925a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1926a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1927a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1928a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1929a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 1930a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1931a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostAfterCommit); 1932a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1933a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Losing context before UI resource requests can be commited. Three sequences 1934a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// of creation/deletion are considered: 1935a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 1. Create one resource -> Context Lost => Expect the resource to have been 1936a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// created. 1937a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 2. Delete an exisiting resource (test_id0_) -> create a second resource 1938a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// (test_id1_) -> Context Lost => Expect the test_id0_ to be removed and 1939a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// test_id1_ to have been created. 1940a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// 3. Create one resource -> Delete that same resource -> Context Lost => Expect 1941a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// the resource to not exist in the manager. 194258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostBeforeCommit : public UIResourceLostTestSimple { 1943a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 1944a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceLostBeforeCommit() 1945a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) : test_id0_(0), 1946a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_id1_(0) {} 1947a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 194858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int step) OVERRIDE { 194958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (step) { 1950a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 0: 1951a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 195258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Lose the context on the impl thread before the commit. 195358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostLoseContextToImplThread(); 1954a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1955a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 2: 1956a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sequence 2: 1957a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Currently one resource has been created. 1958a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_id0_ = ui_resource_->id(); 1959a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Delete this resource. 1960a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_.reset(); 1961a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Create another resource. 1962a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 1963a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_id1_ = ui_resource_->id(); 1964a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sanity check that two resource creations return different ids. 1965a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(test_id0_, test_id1_); 196658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Lose the context on the impl thread before the commit. 196758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostLoseContextToImplThread(); 1968a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1969a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 1970a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Clear the manager of resources. 1971a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_.reset(); 1972a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 1973a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1974a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 4: 1975a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sequence 3: 1976a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 1977a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_id0_ = ui_resource_->id(); 1978a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sanity check the UIResourceId should not be 0. 1979a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(0, test_id0_); 1980a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Usually ScopedUIResource are deleted from the manager in their 1981a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // destructor (so usually ui_resource_.reset()). But here we need 1982a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // ui_resource_ for the next step, so call DeleteUIResource directly. 1983a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host()->DeleteUIResource(test_id0_); 198458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Delete the resouce and then lose the context. 198558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostLoseContextToImplThread(); 1986a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 1987a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 5: 198858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Release resource before ending the test. 1989a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_.reset(); 1990a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EndTest(); 1991a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 199258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 6: 199358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Single thread proxy issues extra commits after context lost. 199458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // http://crbug.com/287250 199558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasImplThread()) 199658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 199758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 199858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 8: 199958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 2000a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2001a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2002a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 200358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { 200458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 2005a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (time_step_) { 2006a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 200758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Sequence 1 (continued): 200858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The first context lost happens before the resources were created, 200958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // and because it resulted in no resources being destroyed, it does not 201058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // trigger resource re-creation. 201158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 201258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 201358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Resource Id on the impl-side has been created. 201458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2015a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2016a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 201758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Sequence 2 (continued): 201858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The previous resource should have been deleted. 201958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); 202058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (HasImplThread()) { 202158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The second resource should have been created. 2022a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_)); 202358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 202458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The extra commit that happens at context lost in the single thread 202558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // proxy changes the timing so that the resource has been destroyed. 202658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // http://crbug.com/287250 202758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id1_)); 2028a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 202958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The second resource called the resource callback once and since the 203058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // context is lost, a "resource lost" callback was also issued. 203158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(2, ui_resource_->resource_create_count); 203258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 2033a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2034a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 5: 203558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Sequence 3 (continued): 203658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Expect the resource callback to have been called once. 203758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 203858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // No "resource lost" callbacks. 203958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 204058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The UI resource id should not be valid 204158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); 2042a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2043a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2044a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2045a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2046a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 2047a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceId test_id0_; 2048a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceId test_id1_; 2049a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 2050a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2051a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostBeforeCommit); 2052a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2053a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Losing UI resource before the pending trees is activated but after the 2054a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// commit. Impl-side-painting only. 2055a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class UIResourceLostBeforeActivateTree : public UIResourceLostTest { 205658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int step) OVERRIDE { 205758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 205858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (step) { 2059a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 0: 2060a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 2061a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 2062a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2063a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 2064a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_id_ = ui_resource_->id(); 2065a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_resource_.reset(); 2066a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PostSetNeedsCommitToMainThread(); 2067a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2068a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 5: 206958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Release resource before ending the test. 207058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_resource_.reset(); 2071a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EndTest(); 2072a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 207358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 6: 207458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make sure no extra commits happened. 207558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 2076a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2077a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2078a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 207958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 208058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 2081a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (time_step_) { 208258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 2: 208358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2084a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 208558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 4: 208658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 208758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 208858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 208958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 209058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 209158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 209258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (time_step_) { 2093a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 2094a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource creation callback has been called. 2095a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 2096a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource is not yet lost (sanity check). 2097a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 2098a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource should not have been created yet on the impl-side. 2099a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 2100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LoseContext(); 2101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 3: 2103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LoseContext(); 2104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 2109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LayerTreeHostContextTest::DidActivateTreeOnThread(impl); 2110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) switch (time_step_) { 2111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 1: 2112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The pending requests on the impl-side should have been processed. 2113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 2114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 2: 2116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The "lost resource" callback should have been called once. 2117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 2118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) case 4: 2120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The resource is deleted and should not be in the manager. Use 2121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // test_id_ since ui_resource_ has been deleted. 2122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id_)); 2123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) break; 2124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 212558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 212658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostStepCompleteToMainThread(); 2127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ++time_step_; 2128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 2131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) UIResourceId test_id_; 2132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 2133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(UIResourceLostBeforeActivateTree, 2135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RunMultiThread_DirectRenderer_ImplSidePaint) { 2136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RunTest(true, false, true); 2137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 2138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(UIResourceLostBeforeActivateTree, 2140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RunMultiThread_DelegatingRenderer_ImplSidePaint) { 2141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RunTest(true, true, true); 2142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 2143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 214458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Resources evicted explicitly and by visibility changes. 214558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class UIResourceLostEviction : public UIResourceLostTestSimple { 214658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 214758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnMainThread(int step) OVERRIDE { 214858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); 214958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (step) { 215058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 0: 215158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); 215258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0, ui_resource_->id()); 215358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 215458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 215558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 2: 215658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make the tree not visible. 215758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetVisibleToMainThread(false); 215858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 215958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 3: 216058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Release resource before ending the test. 216158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_resource_.reset(); 216258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EndTest(); 216358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 216458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 4: 216558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NOTREACHED(); 216658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 216758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 216858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 216958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* impl, 217058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool visible) OVERRIDE { 217158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>( 217258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) impl->output_surface()->context_provider()->Context3d()); 217358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!visible) { 217458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // All resources should have been evicted. 217558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(0u, context->NumTextures()); 217658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 217758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(2, ui_resource_->resource_create_count); 217858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 217958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Drawing is disabled both because of the evicted resources and 218058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // because the renderer is not visible. 218158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(impl->CanDraw()); 218258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make the renderer visible again. 218358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PostSetVisibleToMainThread(true); 218458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 218558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 218658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 218758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { 218858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>( 218958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) impl->output_surface()->context_provider()->Context3d()); 219058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 219158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (time_step_) { 219258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 1: 219358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The resource should have been created on LTHI after the commit. 219458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, context->NumTextures()); 219558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 219658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 219758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 219858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(impl->CanDraw()); 219958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Evict all UI resources. This will trigger a commit. 220058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) impl->EvictAllUIResources(); 220158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(0u, context->NumTextures()); 220258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 220358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->resource_create_count); 220458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, ui_resource_->lost_resource_count); 220558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(impl->CanDraw()); 220658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 220758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 2: 220858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The resource should have been recreated. 220958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, context->NumTextures()); 221058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 221158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(2, ui_resource_->resource_create_count); 221258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, ui_resource_->lost_resource_count); 221358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(impl->CanDraw()); 221458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 221558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case 3: 221658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The resource should have been recreated after visibility was 221758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // restored. 221858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, context->NumTextures()); 221958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); 222058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(3, ui_resource_->resource_create_count); 222158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(2, ui_resource_->lost_resource_count); 222258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(impl->CanDraw()); 222358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 222458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 222558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 222658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 222758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 222858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostEviction); 222958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 22304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class LayerTreeHostContextTestSurfaceCreateCallback 22314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : public LayerTreeHostContextTest { 22324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 22334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostContextTestSurfaceCreateCallback() 22344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : LayerTreeHostContextTest(), 22354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_(FakeContentLayer::Create(&client_)), 22364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) num_commits_(0) {} 22374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 22384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetupTree() OVERRIDE { 22394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_->SetBounds(gfx::Size(10, 20)); 22404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetRootLayer(layer_); 22414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostContextTest::SetupTree(); 22424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 22434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 22444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 22454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 22464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 22474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 22484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DidCommit() OVERRIDE { 22494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (num_commits_) { 22504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 0: 22514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1u, layer_->output_surface_created_count()); 22524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 22534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 22544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 22554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1u, layer_->output_surface_created_count()); 22564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 22574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 22584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 22594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(1u, layer_->output_surface_created_count()); 22604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 22614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 22624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(2u, layer_->output_surface_created_count()); 22634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 22644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 22654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 22664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ++num_commits_; 22674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 22684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 22694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 22704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeHostContextTest::CommitCompleteOnThread(impl); 22714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (num_commits_) { 22724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 0: 22734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 22744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 1: 22754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 22764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 2: 22774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LoseContext(); 22784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 22794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case 3: 22804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EndTest(); 22814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 22824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 22834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 22844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 22854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 22864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(succeeded); 22874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 22884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 22894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 22904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 22914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected: 22924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeContentLayerClient client_; 22934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<FakeContentLayer> layer_; 22944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int num_commits_; 22954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 22964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 22974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestSurfaceCreateCallback); 22984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 2301