Home | History | Annotate | Download | only in service
      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