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