nine_patch_layer_unittest.cc revision 3551c9c881056c480085172ff9840cab31610854
1// Copyright 2012 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 "cc/layers/nine_patch_layer.h"
6
7#include "cc/debug/overdraw_metrics.h"
8#include "cc/resources/prioritized_resource_manager.h"
9#include "cc/resources/resource_provider.h"
10#include "cc/resources/resource_update_queue.h"
11#include "cc/scheduler/texture_uploader.h"
12#include "cc/test/fake_layer_tree_host_client.h"
13#include "cc/test/fake_output_surface.h"
14#include "cc/test/fake_output_surface_client.h"
15#include "cc/test/geometry_test_utils.h"
16#include "cc/trees/layer_tree_host.h"
17#include "cc/trees/occlusion_tracker.h"
18#include "cc/trees/single_thread_proxy.h"
19#include "testing/gmock/include/gmock/gmock.h"
20#include "testing/gtest/include/gtest/gtest.h"
21#include "third_party/skia/include/core/SkBitmap.h"
22
23using ::testing::Mock;
24using ::testing::_;
25using ::testing::AtLeast;
26using ::testing::AnyNumber;
27
28namespace cc {
29namespace {
30
31class MockLayerTreeHost : public LayerTreeHost {
32 public:
33  explicit MockLayerTreeHost(LayerTreeHostClient* client)
34      : LayerTreeHost(client, LayerTreeSettings()) {
35    Initialize(NULL);
36  }
37};
38
39class NinePatchLayerTest : public testing::Test {
40 public:
41  NinePatchLayerTest() : fake_client_(FakeLayerTreeHostClient::DIRECT_3D) {}
42
43  cc::Proxy* Proxy() const { return layer_tree_host_->proxy(); }
44
45 protected:
46  virtual void SetUp() {
47    layer_tree_host_.reset(new MockLayerTreeHost(&fake_client_));
48  }
49
50  virtual void TearDown() {
51    Mock::VerifyAndClearExpectations(layer_tree_host_.get());
52  }
53
54  scoped_ptr<MockLayerTreeHost> layer_tree_host_;
55  FakeLayerTreeHostClient fake_client_;
56};
57
58TEST_F(NinePatchLayerTest, TriggerFullUploadOnceWhenChangingBitmap) {
59  scoped_refptr<NinePatchLayer> test_layer = NinePatchLayer::Create();
60  ASSERT_TRUE(test_layer.get());
61  test_layer->SetIsDrawable(true);
62  test_layer->SetBounds(gfx::Size(100, 100));
63
64  layer_tree_host_->SetRootLayer(test_layer);
65  Mock::VerifyAndClearExpectations(layer_tree_host_.get());
66  EXPECT_EQ(test_layer->layer_tree_host(), layer_tree_host_.get());
67
68  layer_tree_host_->InitializeOutputSurfaceIfNeeded();
69
70  PriorityCalculator calculator;
71  ResourceUpdateQueue queue;
72  OcclusionTracker occlusion_tracker(gfx::Rect(), false);
73
74  // No bitmap set should not trigger any uploads.
75  test_layer->SavePaintProperties();
76  test_layer->SetTexturePriorities(calculator);
77  test_layer->Update(&queue, &occlusion_tracker);
78  EXPECT_EQ(0u, queue.FullUploadSize());
79  EXPECT_EQ(0u, queue.PartialUploadSize());
80
81  // Setting a bitmap set should trigger a single full upload.
82  SkBitmap bitmap;
83  bitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
84  bitmap.allocPixels();
85  test_layer->SetBitmap(bitmap, gfx::Rect(5, 5, 1, 1));
86  test_layer->SavePaintProperties();
87  test_layer->SetTexturePriorities(calculator);
88  test_layer->Update(&queue, &occlusion_tracker);
89  EXPECT_EQ(1u, queue.FullUploadSize());
90  EXPECT_EQ(0u, queue.PartialUploadSize());
91  ResourceUpdate params = queue.TakeFirstFullUpload();
92  EXPECT_TRUE(params.texture != NULL);
93
94  // Upload the texture.
95  layer_tree_host_->contents_texture_manager()->SetMaxMemoryLimitBytes(
96      1024 * 1024);
97  layer_tree_host_->contents_texture_manager()->PrioritizeTextures();
98
99  FakeOutputSurfaceClient output_surface_client;
100  scoped_ptr<OutputSurface> output_surface;
101  scoped_ptr<ResourceProvider> resource_provider;
102  {
103    DebugScopedSetImplThread impl_thread(Proxy());
104    DebugScopedSetMainThreadBlocked main_thread_blocked(Proxy());
105    output_surface = FakeOutputSurface::Create3d();
106    CHECK(output_surface->BindToClient(&output_surface_client));
107    resource_provider = ResourceProvider::Create(output_surface.get(), 0);
108    params.texture->AcquireBackingTexture(resource_provider.get());
109    ASSERT_TRUE(params.texture->have_backing_texture());
110  }
111
112  // Nothing changed, so no repeated upload.
113  test_layer->SavePaintProperties();
114  test_layer->SetTexturePriorities(calculator);
115  test_layer->Update(&queue, &occlusion_tracker);
116  EXPECT_EQ(0u, queue.FullUploadSize());
117  EXPECT_EQ(0u, queue.PartialUploadSize());
118  {
119    DebugScopedSetImplThread impl_thread(Proxy());
120    DebugScopedSetMainThreadBlocked main_thread_blocked(Proxy());
121    layer_tree_host_->contents_texture_manager()->ClearAllMemory(
122        resource_provider.get());
123  }
124
125  // Reupload after eviction
126  test_layer->SavePaintProperties();
127  test_layer->SetTexturePriorities(calculator);
128  test_layer->Update(&queue, &occlusion_tracker);
129  EXPECT_EQ(1u, queue.FullUploadSize());
130  EXPECT_EQ(0u, queue.PartialUploadSize());
131
132  // PrioritizedResourceManager clearing
133  layer_tree_host_->contents_texture_manager()->UnregisterTexture(
134      params.texture);
135  EXPECT_EQ(NULL, params.texture->resource_manager());
136  test_layer->SavePaintProperties();
137  test_layer->SetTexturePriorities(calculator);
138  ResourceUpdateQueue queue2;
139  test_layer->Update(&queue2, &occlusion_tracker);
140  EXPECT_EQ(1u, queue2.FullUploadSize());
141  EXPECT_EQ(0u, queue2.PartialUploadSize());
142  params = queue2.TakeFirstFullUpload();
143  EXPECT_TRUE(params.texture != NULL);
144  EXPECT_EQ(params.texture->resource_manager(),
145            layer_tree_host_->contents_texture_manager());
146}
147
148}  // namespace
149}  // namespace cc
150