nine_patch_layer_unittest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/nine_patch_layer.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/debug/overdraw_metrics.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_provider.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_queue.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/texture_uploader.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/occlusion_tracker.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Mock;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::_;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::AtLeast;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::AnyNumber;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockLayerTreeHost : public LayerTreeHost {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit MockLayerTreeHost(LayerTreeHostClient* client)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : LayerTreeHost(client, LayerTreeSettings()) {
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Initialize(NULL);
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NinePatchLayerTest : public testing::Test {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NinePatchLayerTest() : fake_client_(FakeLayerTreeHostClient::DIRECT_3D) {}
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cc::Proxy* Proxy() const { return layer_tree_host_->proxy(); }
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_.reset(new MockLayerTreeHost(&fake_client_));
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Mock::VerifyAndClearExpectations(layer_tree_host_.get());
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<MockLayerTreeHost> layer_tree_host_;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeLayerTreeHostClient fake_client_;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(NinePatchLayerTest, TriggerFullUploadOnceWhenChangingBitmap) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<NinePatchLayer> test_layer = NinePatchLayer::Create();
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(test_layer.get());
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->SetIsDrawable(true);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->SetBounds(gfx::Size(100, 100));
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetRootLayer(test_layer);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(layer_tree_host_.get());
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(test_layer->layer_tree_host(), layer_tree_host_.get());
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_tree_host_->InitializeOutputSurfaceIfNeeded();
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PriorityCalculator calculator;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceUpdateQueue queue;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OcclusionTracker occlusion_tracker(gfx::Rect(), false);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No bitmap set should not trigger any uploads.
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->SetTexturePriorities(calculator);
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_layer->Update(&queue, &occlusion_tracker);
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, queue.FullUploadSize());
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, queue.PartialUploadSize());
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setting a bitmap set should trigger a single full upload.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap bitmap;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bitmap.allocPixels();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->SetBitmap(bitmap, gfx::Rect(5, 5, 1, 1));
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->SetTexturePriorities(calculator);
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_layer->Update(&queue, &occlusion_tracker);
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1u, queue.FullUploadSize());
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, queue.PartialUploadSize());
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceUpdate params = queue.TakeFirstFullUpload();
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(params.texture != NULL);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Upload the texture.
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->contents_texture_manager()->SetMaxMemoryLimitBytes(
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      1024 * 1024);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->contents_texture_manager()->PrioritizeTextures();
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<OutputSurface> output_surface;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ResourceProvider> resource_provider;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DebugScopedSetImplThread impl_thread(Proxy());
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DebugScopedSetMainThreadBlocked main_thread_blocked(Proxy());
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    output_surface = CreateFakeOutputSurface();
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    resource_provider = ResourceProvider::Create(output_surface.get(), 0);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    params.texture->AcquireBackingTexture(resource_provider.get());
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(params.texture->have_backing_texture());
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Nothing changed, so no repeated upload.
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->SetTexturePriorities(calculator);
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_layer->Update(&queue, &occlusion_tracker);
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, queue.FullUploadSize());
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, queue.PartialUploadSize());
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DebugScopedSetImplThread impl_thread(Proxy());
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DebugScopedSetMainThreadBlocked main_thread_blocked(Proxy());
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_->contents_texture_manager()->ClearAllMemory(
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        resource_provider.get());
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Reupload after eviction
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->SetTexturePriorities(calculator);
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_layer->Update(&queue, &occlusion_tracker);
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1u, queue.FullUploadSize());
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, queue.PartialUploadSize());
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PrioritizedResourceManager clearing
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->contents_texture_manager()->UnregisterTexture(
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      params.texture);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, params.texture->resource_manager());
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->SetTexturePriorities(calculator);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceUpdateQueue queue2;
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_layer->Update(&queue2, &occlusion_tracker);
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1u, queue2.FullUploadSize());
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, queue2.PartialUploadSize());
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params = queue2.TakeFirstFullUpload();
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(params.texture != NULL);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(params.texture->resource_manager(),
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host_->contents_texture_manager());
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
142