blob: 8864843571dcf87f43e87d8e479827c0472d6612 [file] [log] [blame]
// 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<MailboxManager> 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