Store current transform feedback buffer bindings in the object itself.

BUG=angleproject:763

Change-Id: I76565f68fa8145da29713de2a517a39a8d50a24b
Reviewed-on: https://chromium-review.googlesource.com/263061
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/TransformFeedback_unittest.cpp b/src/libANGLE/TransformFeedback_unittest.cpp
index 185c01b..f65527e 100644
--- a/src/libANGLE/TransformFeedback_unittest.cpp
+++ b/src/libANGLE/TransformFeedback_unittest.cpp
@@ -6,32 +6,29 @@
 
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
+#include "libANGLE/Caps.h"
 #include "libANGLE/TransformFeedback.h"
-#include "libANGLE/renderer/TransformFeedbackImpl.h"
+#include "libANGLE/renderer/BufferImpl_mock.h"
+#include "libANGLE/renderer/TransformFeedbackImpl_mock.h"
 
-namespace {
+using ::testing::_;
+using ::testing::Return;
+using ::testing::SetArgumentPointee;
 
-class MockTransformFeedbackImpl : public rx::TransformFeedbackImpl
+namespace
 {
-  public:
-    virtual ~MockTransformFeedbackImpl() { destroy(); }
-
-    MOCK_METHOD1(begin, void(GLenum primitiveMode));
-    MOCK_METHOD0(end, void());
-    MOCK_METHOD0(pause, void());
-    MOCK_METHOD0(resume, void());
-
-    MOCK_METHOD0(destroy, void());
-};
 
 class TransformFeedbackTest : public testing::Test
 {
   protected:
     virtual void SetUp()
     {
-        mImpl = new MockTransformFeedbackImpl;
-        EXPECT_CALL(*mImpl, destroy());
-        mFeedback = new gl::TransformFeedback(mImpl, 1);
+        // Set a reasonable number of tf attributes
+        mCaps.maxTransformFeedbackSeparateAttributes = 8;
+
+        mImpl = new rx::MockTransformFeedbackImpl;
+        EXPECT_CALL(*mImpl, destructor());
+        mFeedback = new gl::TransformFeedback(mImpl, 1, mCaps);
         mFeedback->addRef();
     }
 
@@ -40,16 +37,17 @@
         mFeedback->release();
     }
 
-    MockTransformFeedbackImpl* mImpl;
+    rx::MockTransformFeedbackImpl* mImpl;
     gl::TransformFeedback* mFeedback;
+    gl::Caps mCaps;
 };
 
 TEST_F(TransformFeedbackTest, DestructionDeletesImpl)
 {
-    MockTransformFeedbackImpl* impl = new MockTransformFeedbackImpl;
-    EXPECT_CALL(*impl, destroy()).Times(1).RetiresOnSaturation();
+    rx::MockTransformFeedbackImpl* impl = new rx::MockTransformFeedbackImpl;
+    EXPECT_CALL(*impl, destructor()).Times(1).RetiresOnSaturation();
 
-    gl::TransformFeedback* feedback = new gl::TransformFeedback(impl, 1);
+    gl::TransformFeedback* feedback = new gl::TransformFeedback(impl, 1, mCaps);
     feedback->addRef();
     feedback->release();
 
@@ -91,4 +89,41 @@
     mFeedback->end();
 }
 
+TEST_F(TransformFeedbackTest, BufferBinding)
+{
+    rx::MockBufferImpl *bufferImpl = new rx::MockBufferImpl;
+    gl::Buffer *buffer = new gl::Buffer(bufferImpl, 1);
+    EXPECT_CALL(*bufferImpl, destructor()).Times(1).RetiresOnSaturation();
+
+    static const size_t bindIndex = 0;
+
+    rx::MockTransformFeedbackImpl *feedbackImpl = new rx::MockTransformFeedbackImpl;
+    gl::TransformFeedback *feedback = new gl::TransformFeedback(feedbackImpl, 1, mCaps);
+
+    EXPECT_EQ(feedback->getIndexedBufferCount(), mCaps.maxTransformFeedbackSeparateAttributes);
+
+    EXPECT_CALL(*feedbackImpl, bindGenericBuffer(_));
+    feedback->bindGenericBuffer(buffer);
+    EXPECT_EQ(feedback->getGenericBuffer().get(), buffer);
+
+    EXPECT_CALL(*feedbackImpl, bindIndexedBuffer(_, _));
+    feedback->bindIndexedBuffer(bindIndex, buffer, 0, 1);
+    for (size_t i = 0; i < feedback->getIndexedBufferCount(); i++)
+    {
+        if (i == bindIndex)
+        {
+            EXPECT_EQ(feedback->getIndexedBuffer(i).get(), buffer);
+        }
+        else
+        {
+            EXPECT_EQ(feedback->getIndexedBuffer(i).get(), nullptr);
+        }
+    }
+
+    feedback->addRef();
+    feedback->release();
+
+    testing::Mock::VerifyAndClear(bufferImpl);
+}
+
 } // namespace