Index: cc/layers/texture_layer_unittest.cc |
diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc |
index cfbe8133fbf51cd445a1397fd2dde1b0a19434a8..14eb58b6919ba560b93c4515b128b3f7e8db8b60 100644 |
--- a/cc/layers/texture_layer_unittest.cc |
+++ b/cc/layers/texture_layer_unittest.cc |
@@ -17,11 +17,14 @@ |
#include "cc/layers/texture_layer_impl.h" |
#include "cc/output/compositor_frame_ack.h" |
#include "cc/output/context_provider.h" |
+#include "cc/resources/resource_update_queue.h" |
#include "cc/resources/returned_resource.h" |
#include "cc/test/fake_impl_proxy.h" |
+#include "cc/test/fake_layer_tree_host.h" |
#include "cc/test/fake_layer_tree_host_client.h" |
#include "cc/test/fake_layer_tree_host_impl.h" |
#include "cc/test/fake_output_surface.h" |
+#include "cc/test/fake_proxy.h" |
#include "cc/test/layer_test_common.h" |
#include "cc/test/layer_tree_test.h" |
#include "cc/test/test_web_graphics_context_3d.h" |
@@ -2178,5 +2181,68 @@ class TextureLayerWithMailboxImplThreadDeleted : public LayerTreeTest { |
SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
TextureLayerWithMailboxImplThreadDeleted); |
+class FakeMailboxTextureLayerClient : public TextureLayerClient { |
+ public: |
+ FakeMailboxTextureLayerClient() |
+ : prepare_texture_mailbox_(0), mailbox_released_(0) {} |
+ |
+ // TextureLayerClient implementation. |
+ virtual unsigned PrepareTexture() OVERRIDE { |
+ NOTREACHED(); |
+ return 0; |
+ } |
+ virtual bool PrepareTextureMailbox( |
+ TextureMailbox* texture_mailbox, |
+ scoped_ptr<SingleReleaseCallback>* release_callback, |
+ bool use_shared_memory) OVERRIDE { |
+ prepare_texture_mailbox_++; |
+ *texture_mailbox = TextureMailbox( |
+ MailboxFromString(std::string(64, '1')), GL_TEXTURE_2D, 0); |
+ *release_callback = SingleReleaseCallback::Create( |
+ base::Bind(&FakeMailboxTextureLayerClient::MailboxReleased, |
+ base::Unretained(this))); |
+ return true; |
+ } |
+ |
+ void MailboxReleased(uint32 sync_point, bool lost_resource) { |
+ mailbox_released_++; |
+ } |
+ |
+ int prepare_texture_mailbox() { return prepare_texture_mailbox_; } |
+ int mailbox_released() { return mailbox_released_; } |
+ |
+ private: |
+ int prepare_texture_mailbox_; |
+ int mailbox_released_; |
+}; |
+ |
+TEST(TextureLayerUnittest, ReleaseMailboxOnRendererCapabilityChange) { |
+ FakeMailboxTextureLayerClient client; |
+ scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(); |
+ host->InitializeForTesting(scoped_ptr<Proxy>(new FakeProxy)); |
+ FakeProxy* fake_proxy = static_cast<FakeProxy*>(host->proxy()); |
+ |
+ scoped_refptr<TextureLayer> test_layer = |
+ TextureLayer::CreateForMailbox(&client); |
+ test_layer->SetLayerTreeHost(host.get()); |
+ |
+ fake_proxy->GetRendererCapabilities().using_shared_memory_resources = false; |
+ scoped_ptr<ResourceUpdateQueue> queue = |
+ make_scoped_ptr(new ResourceUpdateQueue); |
+ test_layer->SavePaintProperties(); |
+ EXPECT_TRUE(test_layer->Update(queue.get(), NULL)); |
+ EXPECT_EQ(1, client.prepare_texture_mailbox()); |
+ EXPECT_EQ(0, client.mailbox_released()); |
+ |
+ // Update when using_shared_memory_resources changed. Should release old |
+ // mailbox back to client, and acquire a new one. |
+ fake_proxy->GetRendererCapabilities().using_shared_memory_resources = true; |
+ EXPECT_TRUE(test_layer->Update(queue.get(), NULL)); |
+ EXPECT_EQ(2, client.prepare_texture_mailbox()); |
+ EXPECT_EQ(1, client.mailbox_released()); |
+ |
+ test_layer->SetLayerTreeHost(NULL); |
+} |
+ |
} // namespace |
} // namespace cc |