17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "gpu/command_buffer/service/mailbox_manager.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "gpu/command_buffer/service/feature_info.h"
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_service_test.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "gpu/command_buffer/service/mailbox_synchronizer.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "gpu/command_buffer/service/texture_manager.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/gl/gl_context_stub.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gl/gl_mock.h"
14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/gl/gl_surface_stub.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace gpu {
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace gles2 {
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using namespace ::testing;
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class MailboxManagerTest : public GpuServiceTest {
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  MailboxManagerTest() : initialized_synchronizer_(false) {}
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~MailboxManagerTest() {}
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected:
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetUp() {
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    GpuServiceTest::SetUp();
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    feature_info_ = new FeatureInfo;
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    manager_ = new MailboxManager;
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void SetUpWithSynchronizer() {
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    GpuServiceTest::SetUp();
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MailboxSynchronizer::Initialize();
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    initialized_synchronizer_ = true;
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    feature_info_ = new FeatureInfo;
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    manager_ = new MailboxManager;
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void TearDown() {
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (initialized_synchronizer_)
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      MailboxSynchronizer::Terminate();
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    GpuServiceTest::TearDown();
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Texture* CreateTexture() {
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return new Texture(1);
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SetTarget(Texture* texture, GLenum target, GLuint max_level) {
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    texture->SetTarget(NULL, target, max_level);
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SetLevelInfo(
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      Texture* texture,
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GLenum target,
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GLint level,
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GLenum internal_format,
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GLsizei width,
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GLsizei height,
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GLsizei depth,
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GLint border,
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GLenum format,
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GLenum type,
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      bool cleared) {
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    texture->SetLevelInfo(NULL,
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          target,
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          level,
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          internal_format,
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          width,
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          height,
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          depth,
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          border,
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          format,
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          type,
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          cleared);
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GLenum SetParameter(Texture* texture, GLenum pname, GLint param) {
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return texture->SetParameteri(feature_info_.get(), pname, param);
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void DestroyTexture(Texture* texture) {
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    delete texture;
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<MailboxManager> manager_;
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool initialized_synchronizer_;
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info_;
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MailboxManagerTest);
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Tests basic produce/consume behavior.
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(MailboxManagerTest, Basic) {
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Texture* texture = CreateTexture();
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mailbox name = Mailbox::Generate();
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager_->ProduceTexture(0, name, texture);
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(texture, manager_->ConsumeTexture(0, name));
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // We can consume multiple times.
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(texture, manager_->ConsumeTexture(0, name));
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Wrong target should fail the consume.
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(NULL, manager_->ConsumeTexture(1, name));
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Destroy should cleanup the mailbox.
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DestroyTexture(texture);
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name));
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Tests behavior with multiple produce on the same texture.
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(MailboxManagerTest, ProduceMultipleMailbox) {
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Texture* texture = CreateTexture();
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mailbox name1 = Mailbox::Generate();
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager_->ProduceTexture(0, name1, texture);
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(texture, manager_->ConsumeTexture(0, name1));
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Can produce a second time with the same mailbox.
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager_->ProduceTexture(0, name1, texture);
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(texture, manager_->ConsumeTexture(0, name1));
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Can produce again, with a different mailbox.
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mailbox name2 = Mailbox::Generate();
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager_->ProduceTexture(0, name2, texture);
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Still available under all mailboxes.
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(texture, manager_->ConsumeTexture(0, name1));
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(texture, manager_->ConsumeTexture(0, name2));
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Destroy should cleanup all mailboxes.
1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DestroyTexture(texture);
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name1));
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name2));
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Tests behavior with multiple produce on the same mailbox with different
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// textures.
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(MailboxManagerTest, ProduceMultipleTexture) {
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Texture* texture1 = CreateTexture();
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Texture* texture2 = CreateTexture();
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mailbox name = Mailbox::Generate();
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager_->ProduceTexture(0, name, texture1);
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name));
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Can produce a second time with the same mailbox, but different texture.
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager_->ProduceTexture(0, name, texture2);
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(texture2, manager_->ConsumeTexture(0, name));
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Destroying the texture that's under no mailbox shouldn't have an effect.
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DestroyTexture(texture1);
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(texture2, manager_->ConsumeTexture(0, name));
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Destroying the texture that's bound should clean up.
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DestroyTexture(texture2);
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name));
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(MailboxManagerTest, ProduceMultipleTextureMailbox) {
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Texture* texture1 = CreateTexture();
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Texture* texture2 = CreateTexture();
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mailbox name1 = Mailbox::Generate();
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Mailbox name2 = Mailbox::Generate();
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Put texture1 on name1 and name2.
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager_->ProduceTexture(0, name1, texture1);
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager_->ProduceTexture(0, name2, texture1);
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name1));
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name2));
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Put texture2 on name2.
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager_->ProduceTexture(0, name2, texture2);
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name1));
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(texture2, manager_->ConsumeTexture(0, name2));
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Destroy texture1, shouldn't affect name2.
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DestroyTexture(texture1);
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name1));
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(texture2, manager_->ConsumeTexture(0, name2));
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DestroyTexture(texture2);
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name2));
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const GLsizei kMaxTextureWidth = 64;
194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const GLsizei kMaxTextureHeight = 64;
195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const GLsizei kMaxTextureDepth = 1;
196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class MailboxManagerSyncTest : public MailboxManagerTest {
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MailboxManagerSyncTest() {}
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~MailboxManagerSyncTest() {}
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetUp() {
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MailboxManagerTest::SetUpWithSynchronizer();
205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    manager2_ = new MailboxManager;
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    context_ = new gfx::GLContextStub();
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    surface_ = new gfx::GLSurfaceStub();
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    context_->MakeCurrent(surface_.get());
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Texture* DefineTexture() {
212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Texture* texture = CreateTexture();
213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const GLsizei levels_needed = TextureManager::ComputeMipMapCount(
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        GL_TEXTURE_2D, kMaxTextureWidth, kMaxTextureHeight, kMaxTextureDepth);
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetTarget(texture, GL_TEXTURE_2D, levels_needed);
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetLevelInfo(texture,
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 GL_TEXTURE_2D,
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 0,
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 GL_RGBA,
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 1,
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 1,
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 1,
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 0,
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 GL_RGBA,
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 GL_UNSIGNED_BYTE,
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 true);
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetParameter(texture, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetParameter(texture, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return texture;
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SetupUpdateTexParamExpectations(GLuint texture_id,
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       GLenum min,
234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       GLenum mag,
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       GLenum wrap_s,
236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       GLenum wrap_t) {
237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DCHECK(texture_id);
238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const GLuint kCurrentTexture = 0;
239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(*gl_, GetIntegerv(GL_TEXTURE_BINDING_2D, _))
240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .WillOnce(SetArgPointee<1>(kCurrentTexture))
241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .RetiresOnSaturation();
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, texture_id))
243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .Times(1)
244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .RetiresOnSaturation();
245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(*gl_,
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min))
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .Times(1)
248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .RetiresOnSaturation();
249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(*gl_,
250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag))
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .Times(1)
252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .RetiresOnSaturation();
253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_s))
254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .Times(1)
255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .RetiresOnSaturation();
256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_t))
257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .Times(1)
258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .RetiresOnSaturation();
259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(*gl_, Flush())
260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .Times(1)
261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .RetiresOnSaturation();
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kCurrentTexture))
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .Times(1)
264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .RetiresOnSaturation();
265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void TearDown() {
268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    context_->ReleaseCurrent(NULL);
269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MailboxManagerTest::TearDown();
270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_refptr<MailboxManager> manager2_;
273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<gfx::GLContext> context_;
274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<gfx::GLSurface> surface_;
275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MailboxManagerSyncTest);
278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(MailboxManagerSyncTest, ProduceDestroy) {
281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Texture* texture = DefineTexture();
282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Mailbox name = Mailbox::Generate();
283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  InSequence sequence;
285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  manager_->ProduceTexture(GL_TEXTURE_2D, name, texture);
286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(texture, manager_->ConsumeTexture(GL_TEXTURE_2D, name));
287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DestroyTexture(texture);
289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(NULL, manager_->ConsumeTexture(GL_TEXTURE_2D, name));
290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(NULL, manager2_->ConsumeTexture(GL_TEXTURE_2D, name));
291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(MailboxManagerSyncTest, ProduceSyncDestroy) {
294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  InSequence sequence;
295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Texture* texture = DefineTexture();
297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Mailbox name = Mailbox::Generate();
298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  manager_->ProduceTexture(GL_TEXTURE_2D, name, texture);
300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(texture, manager_->ConsumeTexture(GL_TEXTURE_2D, name));
301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Synchronize
303ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  manager_->PushTextureUpdates(0);
304ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  manager2_->PullTextureUpdates(0);
305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DestroyTexture(texture);
307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(NULL, manager_->ConsumeTexture(GL_TEXTURE_2D, name));
308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(NULL, manager2_->ConsumeTexture(GL_TEXTURE_2D, name));
309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Duplicates a texture into a second manager instance, and then
312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// makes sure a redefinition becomes visible there too.
313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(MailboxManagerSyncTest, ProduceConsumeResize) {
314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLuint kNewTextureId = 1234;
315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  InSequence sequence;
316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Texture* texture = DefineTexture();
318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Mailbox name = Mailbox::Generate();
319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  manager_->ProduceTexture(GL_TEXTURE_2D, name, texture);
321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(texture, manager_->ConsumeTexture(GL_TEXTURE_2D, name));
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Synchronize
324ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  manager_->PushTextureUpdates(0);
325ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  manager2_->PullTextureUpdates(0);
326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(*gl_, GenTextures(1, _))
328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      .WillOnce(SetArgPointee<1>(kNewTextureId));
329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetupUpdateTexParamExpectations(
330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      kNewTextureId, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT);
331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Texture* new_texture = manager2_->ConsumeTexture(GL_TEXTURE_2D, name);
332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(new_texture == NULL);
333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_NE(texture, new_texture);
334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(kNewTextureId, new_texture->service_id());
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Resize original texture
337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetLevelInfo(texture,
338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               GL_TEXTURE_2D,
339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               0,
340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               GL_RGBA,
341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               16,
342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               32,
343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               1,
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               0,
345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               GL_RGBA,
346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               GL_UNSIGNED_BYTE,
347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               true);
348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Should have been orphaned
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL);
350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Synchronize again
352ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  manager_->PushTextureUpdates(0);
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetupUpdateTexParamExpectations(
354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      kNewTextureId, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT);
355ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  manager2_->PullTextureUpdates(0);
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GLsizei width, height;
357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  new_texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height);
358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(16, width);
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(32, height);
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Should have gotten a new attachment
362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) != NULL);
363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Resize original texture again....
364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetLevelInfo(texture,
365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               GL_TEXTURE_2D,
366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               0,
367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               GL_RGBA,
368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               64,
369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               64,
370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               1,
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               0,
372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               GL_RGBA,
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               GL_UNSIGNED_BYTE,
374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               true);
375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // ...and immediately delete the texture which should save the changes.
376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetupUpdateTexParamExpectations(
377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      kNewTextureId, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT);
378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DestroyTexture(texture);
379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Should be still around since there is a ref from manager2
381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(new_texture, manager2_->ConsumeTexture(GL_TEXTURE_2D, name));
382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The last change to the texture should be visible without a sync point (i.e.
384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // push).
385ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  manager2_->PullTextureUpdates(0);
386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  new_texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height);
387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(64, width);
388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(64, height);
389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DestroyTexture(new_texture);
391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(NULL, manager_->ConsumeTexture(GL_TEXTURE_2D, name));
392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(NULL, manager2_->ConsumeTexture(GL_TEXTURE_2D, name));
393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Makes sure changes are correctly published even when updates are
396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// pushed in both directions, i.e. makes sure we don't clobber a shared
397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// texture definition with an older version.
398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(MailboxManagerSyncTest, ProduceConsumeBidirectional) {
399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLuint kNewTextureId1 = 1234;
400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLuint kNewTextureId2 = 4321;
401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Texture* texture1 = DefineTexture();
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Mailbox name1 = Mailbox::Generate();
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Texture* texture2 = DefineTexture();
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Mailbox name2 = Mailbox::Generate();
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Texture* new_texture1 = NULL;
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Texture* new_texture2 = NULL;
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  manager_->ProduceTexture(GL_TEXTURE_2D, name1, texture1);
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  manager2_->ProduceTexture(GL_TEXTURE_2D, name2, texture2);
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Make visible.
413ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  manager_->PushTextureUpdates(0);
414ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  manager2_->PushTextureUpdates(0);
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Create textures in the other manager instances for texture1 and texture2,
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // respectively to create a real sharing scenario. Otherwise, there would
418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // never be conflicting updates/pushes.
419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    InSequence sequence;
421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(*gl_, GenTextures(1, _))
422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .WillOnce(SetArgPointee<1>(kNewTextureId1));
423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetupUpdateTexParamExpectations(
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        kNewTextureId1, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT);
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    new_texture1 = manager2_->ConsumeTexture(GL_TEXTURE_2D, name1);
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(*gl_, GenTextures(1, _))
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .WillOnce(SetArgPointee<1>(kNewTextureId2));
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SetupUpdateTexParamExpectations(
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        kNewTextureId2, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT);
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    new_texture2 = manager_->ConsumeTexture(GL_TEXTURE_2D, name2);
431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(kNewTextureId1, new_texture1->service_id());
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(kNewTextureId2, new_texture2->service_id());
434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Make a change to texture1
436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_EQ(static_cast<GLuint>(GL_LINEAR), texture1->min_filter());
437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR),
438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            SetParameter(texture1, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Make sure this does not clobber it with the previous version we pushed.
441ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  manager_->PullTextureUpdates(0);
442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Make a change to texture2
444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_EQ(static_cast<GLuint>(GL_LINEAR), texture2->mag_filter());
445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR),
446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            SetParameter(texture2, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Mock::VerifyAndClearExpectations(gl_.get());
449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Synchronize in both directions
451ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  manager_->PushTextureUpdates(0);
452ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  manager2_->PushTextureUpdates(0);
453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // manager1 should see the change to texture2 mag_filter being applied.
454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetupUpdateTexParamExpectations(
455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      new_texture2->service_id(), GL_LINEAR, GL_NEAREST, GL_REPEAT, GL_REPEAT);
456ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  manager_->PullTextureUpdates(0);
457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // manager2 should see the change to texture1 min_filter being applied.
458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetupUpdateTexParamExpectations(
459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      new_texture1->service_id(), GL_NEAREST, GL_LINEAR, GL_REPEAT, GL_REPEAT);
460ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch  manager2_->PullTextureUpdates(0);
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DestroyTexture(texture1);
463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DestroyTexture(texture2);
464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DestroyTexture(new_texture1);
465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DestroyTexture(new_texture2);
466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO: different texture into same mailbox
469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO: same texture, multiple mailboxes
471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO: Produce incomplete texture
473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO: Texture::level_infos_[][].size()
475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO: unsupported targets and formats
477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace gles2
4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace gpu
480