14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/append_quads_data.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/heads_up_display_layer_impl.h" 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_impl_proxy.h" 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_impl.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/mock_quad_culler.h" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace cc { 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace { 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void CheckDrawLayer(HeadsUpDisplayLayerImpl* layer, 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ResourceProvider* resource_provider, 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DrawMode draw_mode) { 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MockQuadCuller quad_culler; 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AppendQuadsData data; 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool will_draw = layer->WillDraw(draw_mode, resource_provider); 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (will_draw) 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->AppendQuads(&quad_culler, &data); 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->UpdateHudTexture(draw_mode, resource_provider); 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (will_draw) 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->DidDraw(resource_provider); 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t expected_quad_list_size = will_draw ? 1 : 0; 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(expected_quad_list_size, quad_culler.quad_list().size()); 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(HeadsUpDisplayLayerImplTest, ResourcelessSoftwareDrawAfterResourceLoss) { 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeImplProxy proxy; 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FakeLayerTreeHostImpl host_impl(&proxy); 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_impl.CreatePendingTree(); 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_impl.InitializeRenderer(CreateFakeOutputSurface()); 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<HeadsUpDisplayLayerImpl> layer = 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) HeadsUpDisplayLayerImpl::Create(host_impl.pending_tree(), 1); 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->SetContentBounds(gfx::Size(100, 100)); 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Check regular hardware draw is ok. 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CheckDrawLayer( 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer.get(), host_impl.resource_provider(), DRAW_MODE_HARDWARE); 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Simulate a resource loss on transitioning to resourceless software mode. 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->DidLoseOutputSurface(); 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Should skip resourceless software draw and not crash in UpdateHudTexture. 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CheckDrawLayer(layer.get(), 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_impl.resource_provider(), 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DRAW_MODE_RESOURCELESS_SOFTWARE); 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace cc 56