1 // Copyright 2013 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 "gpu/command_buffer/service/mailbox_manager.h" 6 7 #include "gpu/command_buffer/service/texture_manager.h" 8 #include "testing/gtest/include/gtest/gtest.h" 9 10 namespace gpu { 11 namespace gles2 { 12 13 class MailboxManagerTest : public testing::Test { 14 public: 15 MailboxManagerTest() : manager_(new MailboxManager()) {} 16 virtual ~MailboxManagerTest() {} 17 18 protected: 19 Texture* CreateTexture() { 20 return new Texture(0); 21 } 22 23 void DestroyTexture(Texture* texture) { 24 delete texture; 25 } 26 27 scoped_refptr<MailboxManager> manager_; 28 29 private: 30 DISALLOW_COPY_AND_ASSIGN(MailboxManagerTest); 31 }; 32 33 // Tests basic produce/consume behavior. 34 TEST_F(MailboxManagerTest, Basic) { 35 Texture* texture = CreateTexture(); 36 37 MailboxName name; 38 manager_->GenerateMailboxName(&name); 39 EXPECT_TRUE(manager_->ProduceTexture(0, name, texture)); 40 EXPECT_EQ(texture, manager_->ConsumeTexture(0, name)); 41 42 // We can consume multiple times. 43 EXPECT_EQ(texture, manager_->ConsumeTexture(0, name)); 44 45 // Wrong target should fail the consume. 46 EXPECT_EQ(NULL, manager_->ConsumeTexture(1, name)); 47 48 // Destroy should cleanup the mailbox. 49 DestroyTexture(texture); 50 EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name)); 51 } 52 53 // Should fail to produce or consume with an invalid mailbox. 54 TEST_F(MailboxManagerTest, InvalidName) { 55 Texture* texture = CreateTexture(); 56 MailboxName name; 57 memset(&name, 0, sizeof(name)); 58 EXPECT_FALSE(manager_->ProduceTexture(0, name, texture)); 59 EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name)); 60 DestroyTexture(texture); 61 } 62 63 // Tests behavior with multiple produce on the same texture. 64 TEST_F(MailboxManagerTest, ProduceMultipleMailbox) { 65 Texture* texture = CreateTexture(); 66 67 MailboxName name1; 68 manager_->GenerateMailboxName(&name1); 69 70 EXPECT_TRUE(manager_->ProduceTexture(0, name1, texture)); 71 EXPECT_EQ(texture, manager_->ConsumeTexture(0, name1)); 72 73 // Can produce a second time with the same mailbox. 74 EXPECT_TRUE(manager_->ProduceTexture(0, name1, texture)); 75 EXPECT_EQ(texture, manager_->ConsumeTexture(0, name1)); 76 77 // Can produce again, with a different mailbox. 78 MailboxName name2; 79 manager_->GenerateMailboxName(&name2); 80 EXPECT_TRUE(manager_->ProduceTexture(0, name2, texture)); 81 82 // Still available under all mailboxes. 83 EXPECT_EQ(texture, manager_->ConsumeTexture(0, name1)); 84 EXPECT_EQ(texture, manager_->ConsumeTexture(0, name2)); 85 86 // Destroy should cleanup all mailboxes. 87 DestroyTexture(texture); 88 EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name1)); 89 EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name2)); 90 } 91 92 // Tests behavior with multiple produce on the same mailbox with different 93 // textures. 94 TEST_F(MailboxManagerTest, ProduceMultipleTexture) { 95 Texture* texture1 = CreateTexture(); 96 Texture* texture2 = CreateTexture(); 97 98 MailboxName name; 99 manager_->GenerateMailboxName(&name); 100 101 EXPECT_TRUE(manager_->ProduceTexture(0, name, texture1)); 102 EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name)); 103 104 // Can produce a second time with the same mailbox, but different texture. 105 EXPECT_TRUE(manager_->ProduceTexture(0, name, texture2)); 106 EXPECT_EQ(texture2, manager_->ConsumeTexture(0, name)); 107 108 // Destroying the texture that's under no mailbox shouldn't have an effect. 109 DestroyTexture(texture1); 110 EXPECT_EQ(texture2, manager_->ConsumeTexture(0, name)); 111 112 // Destroying the texture that's bound should clean up. 113 DestroyTexture(texture2); 114 EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name)); 115 } 116 117 TEST_F(MailboxManagerTest, ProduceMultipleTextureMailbox) { 118 Texture* texture1 = CreateTexture(); 119 Texture* texture2 = CreateTexture(); 120 MailboxName name1; 121 manager_->GenerateMailboxName(&name1); 122 MailboxName name2; 123 manager_->GenerateMailboxName(&name2); 124 125 // Put texture1 on name1 and name2. 126 EXPECT_TRUE(manager_->ProduceTexture(0, name1, texture1)); 127 EXPECT_TRUE(manager_->ProduceTexture(0, name2, texture1)); 128 EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name1)); 129 EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name2)); 130 131 // Put texture2 on name2. 132 EXPECT_TRUE(manager_->ProduceTexture(0, name2, texture2)); 133 EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name1)); 134 EXPECT_EQ(texture2, manager_->ConsumeTexture(0, name2)); 135 136 // Destroy texture1, shouldn't affect name2. 137 DestroyTexture(texture1); 138 EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name1)); 139 EXPECT_EQ(texture2, manager_->ConsumeTexture(0, name2)); 140 141 DestroyTexture(texture2); 142 EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name2)); 143 } 144 145 } // namespace gles2 146 } // namespace gpu 147