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