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