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