nine_patch_layer_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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/base/thread.h"
8#include "cc/debug/overdraw_metrics.h"
9#include "cc/resources/prioritized_resource_manager.h"
10#include "cc/resources/resource_provider.h"
11#include "cc/resources/resource_update_queue.h"
12#include "cc/scheduler/texture_uploader.h"
13#include "cc/test/fake_layer_tree_host_client.h"
14#include "cc/test/fake_output_surface.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  MockLayerTreeHost(LayerTreeHostClient* client)
34      : LayerTreeHost(client, LayerTreeSettings()) {
35    Initialize(scoped_ptr<Thread>(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);
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_->InitializeRendererIfNeeded();
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->SetTexturePriorities(calculator);
76  test_layer->Update(&queue, &occlusion_tracker, NULL);
77  EXPECT_EQ(queue.FullUploadSize(), 0);
78  EXPECT_EQ(queue.PartialUploadSize(), 0);
79
80  // Setting a bitmap set should trigger a single full upload.
81  SkBitmap bitmap;
82  bitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
83  bitmap.allocPixels();
84  test_layer->SetBitmap(bitmap, gfx::Rect(5, 5, 1, 1));
85  test_layer->SetTexturePriorities(calculator);
86  test_layer->Update(&queue, &occlusion_tracker, NULL);
87  EXPECT_EQ(queue.FullUploadSize(), 1);
88  EXPECT_EQ(queue.PartialUploadSize(), 0);
89  ResourceUpdate params = queue.TakeFirstFullUpload();
90  EXPECT_TRUE(params.texture != NULL);
91
92  // Upload the texture.
93  layer_tree_host_->contents_texture_manager()->SetMaxMemoryLimitBytes(
94      1024 * 1024);
95  layer_tree_host_->contents_texture_manager()->PrioritizeTextures();
96
97  scoped_ptr<OutputSurface> output_surface;
98  scoped_ptr<ResourceProvider> resource_provider;
99  {
100    DebugScopedSetImplThread impl_thread(Proxy());
101    DebugScopedSetMainThreadBlocked main_thread_blocked(Proxy());
102    output_surface = CreateFakeOutputSurface();
103    resource_provider = ResourceProvider::Create(output_surface.get());
104    params.texture->AcquireBackingTexture(resource_provider.get());
105    ASSERT_TRUE(params.texture->have_backing_texture());
106  }
107
108  // Nothing changed, so no repeated upload.
109  test_layer->SetTexturePriorities(calculator);
110  test_layer->Update(&queue, &occlusion_tracker, NULL);
111  EXPECT_EQ(queue.FullUploadSize(), 0);
112  EXPECT_EQ(queue.PartialUploadSize(), 0);
113  {
114    DebugScopedSetImplThread impl_thread(Proxy());
115    DebugScopedSetMainThreadBlocked main_thread_blocked(Proxy());
116    layer_tree_host_->contents_texture_manager()->ClearAllMemory(
117        resource_provider.get());
118  }
119
120  // Reupload after eviction
121  test_layer->SetTexturePriorities(calculator);
122  test_layer->Update(&queue, &occlusion_tracker, NULL);
123  EXPECT_EQ(queue.FullUploadSize(), 1);
124  EXPECT_EQ(queue.PartialUploadSize(), 0);
125
126  // PrioritizedResourceManager clearing
127  layer_tree_host_->contents_texture_manager()->UnregisterTexture(
128      params.texture);
129  EXPECT_EQ(NULL, params.texture->resource_manager());
130  test_layer->SetTexturePriorities(calculator);
131  ResourceUpdateQueue queue2;
132  test_layer->Update(&queue2, &occlusion_tracker, NULL);
133  EXPECT_EQ(queue2.FullUploadSize(), 1);
134  EXPECT_EQ(queue2.PartialUploadSize(), 0);
135  params = queue2.TakeFirstFullUpload();
136  EXPECT_TRUE(params.texture != NULL);
137  EXPECT_EQ(params.texture->resource_manager(),
138            layer_tree_host_->contents_texture_manager());
139}
140
141}  // namespace
142}  // namespace cc
143