heads_up_display_layer_impl_unittest.cc 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. #include <stddef.h>
  5. #include <utility>
  6. #include "cc/layers/append_quads_data.h"
  7. #include "cc/layers/heads_up_display_layer_impl.h"
  8. #include "cc/test/fake_impl_task_runner_provider.h"
  9. #include "cc/test/fake_layer_tree_frame_sink.h"
  10. #include "cc/test/fake_layer_tree_host_impl.h"
  11. #include "cc/test/layer_tree_impl_test_base.h"
  12. #include "cc/test/test_task_graph_runner.h"
  13. #include "cc/trees/layer_tree_impl.h"
  14. #include "testing/gtest/include/gtest/gtest.h"
  15. namespace cc {
  16. namespace {
  17. void CheckDrawLayer(HeadsUpDisplayLayerImpl* layer,
  18. LayerTreeFrameSink* frame_sink,
  19. viz::ClientResourceProvider* resource_provider,
  20. viz::ContextProvider* context_provider,
  21. DrawMode draw_mode) {
  22. auto render_pass = viz::CompositorRenderPass::Create();
  23. AppendQuadsData data;
  24. bool will_draw = layer->WillDraw(draw_mode, resource_provider);
  25. if (will_draw)
  26. layer->AppendQuads(render_pass.get(), &data);
  27. viz::CompositorRenderPassList pass_list;
  28. pass_list.push_back(std::move(render_pass));
  29. bool gpu_raster = context_provider != nullptr;
  30. layer->UpdateHudTexture(draw_mode, frame_sink, resource_provider, gpu_raster,
  31. pass_list);
  32. if (will_draw)
  33. layer->DidDraw(resource_provider);
  34. size_t expected_quad_list_size = will_draw ? 1 : 0;
  35. EXPECT_EQ(expected_quad_list_size, pass_list.back()->quad_list.size());
  36. EXPECT_EQ(0u, data.num_missing_tiles);
  37. EXPECT_EQ(0u, data.num_incomplete_tiles);
  38. }
  39. class HeadsUpDisplayLayerImplTest : public LayerTreeImplTestBase,
  40. public ::testing::Test {
  41. public:
  42. HeadsUpDisplayLayerImplTest()
  43. : LayerTreeImplTestBase(
  44. FakeLayerTreeFrameSink::Create3dForGpuRasterization()) {}
  45. };
  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. UpdatePendingTreeDrawProperties();
  54. // Check regular hardware draw is ok.
  55. CheckDrawLayer(layer, layer_tree_frame_sink(), resource_provider(),
  56. layer_tree_frame_sink()->context_provider(),
  57. DRAW_MODE_HARDWARE);
  58. // Simulate a resource loss on transitioning to resourceless software mode.
  59. layer->ReleaseResources();
  60. // Should skip resourceless software draw and not crash in UpdateHudTexture.
  61. CheckDrawLayer(layer, layer_tree_frame_sink(), resource_provider(),
  62. layer_tree_frame_sink()->context_provider(),
  63. DRAW_MODE_RESOURCELESS_SOFTWARE);
  64. }
  65. TEST_F(HeadsUpDisplayLayerImplTest, CPUAndGPURasterCanvas) {
  66. host_impl()->CreatePendingTree();
  67. auto* root = EnsureRootLayerInPendingTree();
  68. auto* layer = AddLayerInPendingTree<HeadsUpDisplayLayerImpl>();
  69. layer->SetBounds(gfx::Size(100, 100));
  70. CopyProperties(root, layer);
  71. UpdatePendingTreeDrawProperties();
  72. // Check Ganesh canvas drawing is ok.
  73. CheckDrawLayer(layer, layer_tree_frame_sink(), resource_provider(),
  74. layer_tree_frame_sink()->context_provider(),
  75. DRAW_MODE_HARDWARE);
  76. host_impl()->ReleaseLayerTreeFrameSink();
  77. auto layer_tree_frame_sink = FakeLayerTreeFrameSink::CreateSoftware();
  78. host_impl()->InitializeFrameSink(layer_tree_frame_sink.get());
  79. // Check SW canvas drawing is ok.
  80. CheckDrawLayer(layer, layer_tree_frame_sink.get(), resource_provider(),
  81. nullptr, DRAW_MODE_SOFTWARE);
  82. host_impl()->ReleaseLayerTreeFrameSink();
  83. }
  84. } // namespace
  85. } // namespace cc