1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <stddef.h>
6 
7 #include "cc/layers/append_quads_data.h"
8 #include "cc/layers/heads_up_display_layer_impl.h"
9 #include "cc/test/fake_impl_task_runner_provider.h"
10 #include "cc/test/fake_layer_tree_frame_sink.h"
11 #include "cc/test/fake_layer_tree_host_impl.h"
12 #include "cc/test/layer_tree_impl_test_base.h"
13 #include "cc/test/test_task_graph_runner.h"
14 #include "cc/trees/layer_tree_impl.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 
17 namespace cc {
18 namespace {
19 
CheckDrawLayer(HeadsUpDisplayLayerImpl * layer,LayerTreeFrameSink * frame_sink,viz::ClientResourceProvider * resource_provider,viz::ContextProvider * context_provider,DrawMode draw_mode)20 void CheckDrawLayer(HeadsUpDisplayLayerImpl* layer,
21                     LayerTreeFrameSink* frame_sink,
22                     viz::ClientResourceProvider* resource_provider,
23                     viz::ContextProvider* context_provider,
24                     DrawMode draw_mode) {
25   auto render_pass = viz::CompositorRenderPass::Create();
26   AppendQuadsData data;
27   bool will_draw = layer->WillDraw(draw_mode, resource_provider);
28   if (will_draw)
29     layer->AppendQuads(render_pass.get(), &data);
30   viz::CompositorRenderPassList pass_list;
31   pass_list.push_back(std::move(render_pass));
32   layer->UpdateHudTexture(draw_mode, frame_sink, resource_provider,
33                           context_provider, pass_list);
34   if (will_draw)
35     layer->DidDraw(resource_provider);
36 
37   size_t expected_quad_list_size = will_draw ? 1 : 0;
38   EXPECT_EQ(expected_quad_list_size, pass_list.back()->quad_list.size());
39   EXPECT_EQ(0u, data.num_missing_tiles);
40   EXPECT_EQ(0u, data.num_incomplete_tiles);
41 }
42 
43 class HeadsUpDisplayLayerImplTest : public LayerTreeImplTestBase,
44                                     public ::testing::Test {};
45 
TEST_F(HeadsUpDisplayLayerImplTest,ResourcelessSoftwareDrawAfterResourceLoss)46 TEST_F(HeadsUpDisplayLayerImplTest, ResourcelessSoftwareDrawAfterResourceLoss) {
47   host_impl()->CreatePendingTree();
48   auto* root = EnsureRootLayerInPendingTree();
49   auto* layer = AddLayerInPendingTree<HeadsUpDisplayLayerImpl>();
50   layer->SetBounds(gfx::Size(100, 100));
51   layer->set_visible_layer_rect(gfx::Rect(100, 100));
52   CopyProperties(root, layer);
53 
54   UpdatePendingTreeDrawProperties();
55 
56   // Check regular hardware draw is ok.
57   CheckDrawLayer(layer, layer_tree_frame_sink(), resource_provider(),
58                  layer_tree_frame_sink()->context_provider(),
59                  DRAW_MODE_HARDWARE);
60 
61   // Simulate a resource loss on transitioning to resourceless software mode.
62   layer->ReleaseResources();
63 
64   // Should skip resourceless software draw and not crash in UpdateHudTexture.
65   CheckDrawLayer(layer, layer_tree_frame_sink(), resource_provider(),
66                  layer_tree_frame_sink()->context_provider(),
67                  DRAW_MODE_RESOURCELESS_SOFTWARE);
68 }
69 
TEST_F(HeadsUpDisplayLayerImplTest,CPUAndGPURasterCanvas)70 TEST_F(HeadsUpDisplayLayerImplTest, CPUAndGPURasterCanvas) {
71   host_impl()->CreatePendingTree();
72   auto* root = EnsureRootLayerInPendingTree();
73   auto* layer = AddLayerInPendingTree<HeadsUpDisplayLayerImpl>();
74   layer->SetBounds(gfx::Size(100, 100));
75   CopyProperties(root, layer);
76 
77   UpdatePendingTreeDrawProperties();
78 
79   // Check Ganesh canvas drawing is ok.
80   CheckDrawLayer(layer, layer_tree_frame_sink(), resource_provider(),
81                  layer_tree_frame_sink()->context_provider(),
82                  DRAW_MODE_HARDWARE);
83 
84   host_impl()->ReleaseLayerTreeFrameSink();
85   auto layer_tree_frame_sink = FakeLayerTreeFrameSink::CreateSoftware();
86   host_impl()->InitializeFrameSink(layer_tree_frame_sink.get());
87 
88   // Check SW canvas drawing is ok.
89   CheckDrawLayer(layer, layer_tree_frame_sink.get(), resource_provider(),
90                  nullptr, DRAW_MODE_SOFTWARE);
91   host_impl()->ReleaseLayerTreeFrameSink();
92 }
93 
94 }  // namespace
95 }  // namespace cc
96