// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "gpu/command_buffer/service/mailbox_manager.h" #include "gpu/command_buffer/service/texture_manager.h" #include "testing/gtest/include/gtest/gtest.h" namespace gpu { namespace gles2 { class MailboxManagerTest : public testing::Test { public: MailboxManagerTest() : manager_(new MailboxManager()) {} virtual ~MailboxManagerTest() {} protected: Texture* CreateTexture() { return new Texture(0); } void DestroyTexture(Texture* texture) { delete texture; } scoped_refptr manager_; private: DISALLOW_COPY_AND_ASSIGN(MailboxManagerTest); }; // Tests basic produce/consume behavior. TEST_F(MailboxManagerTest, Basic) { Texture* texture = CreateTexture(); MailboxName name; manager_->GenerateMailboxName(&name); EXPECT_TRUE(manager_->ProduceTexture(0, name, texture)); EXPECT_EQ(texture, manager_->ConsumeTexture(0, name)); // We can consume multiple times. EXPECT_EQ(texture, manager_->ConsumeTexture(0, name)); // Wrong target should fail the consume. EXPECT_EQ(NULL, manager_->ConsumeTexture(1, name)); // Destroy should cleanup the mailbox. DestroyTexture(texture); EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name)); } // Should fail to produce or consume with an invalid mailbox. TEST_F(MailboxManagerTest, InvalidName) { Texture* texture = CreateTexture(); MailboxName name; memset(&name, 0, sizeof(name)); EXPECT_FALSE(manager_->ProduceTexture(0, name, texture)); EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name)); DestroyTexture(texture); } // Tests behavior with multiple produce on the same texture. TEST_F(MailboxManagerTest, ProduceMultipleMailbox) { Texture* texture = CreateTexture(); MailboxName name1; manager_->GenerateMailboxName(&name1); EXPECT_TRUE(manager_->ProduceTexture(0, name1, texture)); EXPECT_EQ(texture, manager_->ConsumeTexture(0, name1)); // Can produce a second time with the same mailbox. EXPECT_TRUE(manager_->ProduceTexture(0, name1, texture)); EXPECT_EQ(texture, manager_->ConsumeTexture(0, name1)); // Can produce again, with a different mailbox. MailboxName name2; manager_->GenerateMailboxName(&name2); EXPECT_TRUE(manager_->ProduceTexture(0, name2, texture)); // Still available under all mailboxes. EXPECT_EQ(texture, manager_->ConsumeTexture(0, name1)); EXPECT_EQ(texture, manager_->ConsumeTexture(0, name2)); // Destroy should cleanup all mailboxes. DestroyTexture(texture); EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name1)); EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name2)); } // Tests behavior with multiple produce on the same mailbox with different // textures. TEST_F(MailboxManagerTest, ProduceMultipleTexture) { Texture* texture1 = CreateTexture(); Texture* texture2 = CreateTexture(); MailboxName name; manager_->GenerateMailboxName(&name); EXPECT_TRUE(manager_->ProduceTexture(0, name, texture1)); EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name)); // Can produce a second time with the same mailbox, but different texture. EXPECT_TRUE(manager_->ProduceTexture(0, name, texture2)); EXPECT_EQ(texture2, manager_->ConsumeTexture(0, name)); // Destroying the texture that's under no mailbox shouldn't have an effect. DestroyTexture(texture1); EXPECT_EQ(texture2, manager_->ConsumeTexture(0, name)); // Destroying the texture that's bound should clean up. DestroyTexture(texture2); EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name)); } TEST_F(MailboxManagerTest, ProduceMultipleTextureMailbox) { Texture* texture1 = CreateTexture(); Texture* texture2 = CreateTexture(); MailboxName name1; manager_->GenerateMailboxName(&name1); MailboxName name2; manager_->GenerateMailboxName(&name2); // Put texture1 on name1 and name2. EXPECT_TRUE(manager_->ProduceTexture(0, name1, texture1)); EXPECT_TRUE(manager_->ProduceTexture(0, name2, texture1)); EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name1)); EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name2)); // Put texture2 on name2. EXPECT_TRUE(manager_->ProduceTexture(0, name2, texture2)); EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name1)); EXPECT_EQ(texture2, manager_->ConsumeTexture(0, name2)); // Destroy texture1, shouldn't affect name2. DestroyTexture(texture1); EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name1)); EXPECT_EQ(texture2, manager_->ConsumeTexture(0, name2)); DestroyTexture(texture2); EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name2)); } } // namespace gles2 } // namespace gpu