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