blob: c3049700de2225e32eb7542749a245add6662600 [file] [log] [blame]
Kenneth Russelldb8ae162014-08-25 19:02:35 -07001//
2// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7#include "gmock/gmock.h"
8#include "gtest/gtest.h"
Geoff Lang520c4ae2015-05-05 13:12:36 -04009#include "libANGLE/Buffer.h"
Geoff Lang045536b2015-03-27 15:17:18 -040010#include "libANGLE/Caps.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050011#include "libANGLE/TransformFeedback.h"
Geoff Lang045536b2015-03-27 15:17:18 -040012#include "libANGLE/renderer/BufferImpl_mock.h"
13#include "libANGLE/renderer/TransformFeedbackImpl_mock.h"
Jamie Madill3f01e6c2016-03-08 13:53:02 -050014#include "tests/angle_unittests_utils.h"
Kenneth Russelldb8ae162014-08-25 19:02:35 -070015
Geoff Lang045536b2015-03-27 15:17:18 -040016using ::testing::_;
17using ::testing::Return;
18using ::testing::SetArgumentPointee;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070019
Geoff Lang045536b2015-03-27 15:17:18 -040020namespace
Kenneth Russelldb8ae162014-08-25 19:02:35 -070021{
Kenneth Russelldb8ae162014-08-25 19:02:35 -070022
Jamie Madill3f01e6c2016-03-08 13:53:02 -050023class MockFactory : public rx::NullFactory
24{
25 public:
26 MOCK_METHOD0(createTransformFeedback, rx::TransformFeedbackImpl *());
27};
28
Kenneth Russelldb8ae162014-08-25 19:02:35 -070029class TransformFeedbackTest : public testing::Test
30{
31 protected:
Jamie Madill3f01e6c2016-03-08 13:53:02 -050032 TransformFeedbackTest() : mImpl(nullptr), mFeedback(nullptr) {}
33
34 void SetUp() override
Kenneth Russelldb8ae162014-08-25 19:02:35 -070035 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -050036 mImpl = new rx::MockTransformFeedbackImpl;
37 EXPECT_CALL(mMockFactory, createTransformFeedback())
38 .WillOnce(Return(mImpl))
39 .RetiresOnSaturation();
40
Geoff Lang045536b2015-03-27 15:17:18 -040041 // Set a reasonable number of tf attributes
42 mCaps.maxTransformFeedbackSeparateAttributes = 8;
43
Geoff Lang045536b2015-03-27 15:17:18 -040044 EXPECT_CALL(*mImpl, destructor());
Jamie Madill3f01e6c2016-03-08 13:53:02 -050045 mFeedback = new gl::TransformFeedback(&mMockFactory, 1, mCaps);
Kenneth Russelldb8ae162014-08-25 19:02:35 -070046 mFeedback->addRef();
47 }
48
Jamie Madill3f01e6c2016-03-08 13:53:02 -050049 void TearDown() override
Kenneth Russelldb8ae162014-08-25 19:02:35 -070050 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -050051 if (mFeedback)
52 {
53 mFeedback->release();
54 }
55
56 // Only needed because the mock is leaked if bugs are present,
57 // which logs an error, but does not cause the test to fail.
58 // Ordinarily mocks are verified when destroyed.
59 testing::Mock::VerifyAndClear(mImpl);
Kenneth Russelldb8ae162014-08-25 19:02:35 -070060 }
61
Jamie Madill3f01e6c2016-03-08 13:53:02 -050062 MockFactory mMockFactory;
Geoff Lang045536b2015-03-27 15:17:18 -040063 rx::MockTransformFeedbackImpl* mImpl;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070064 gl::TransformFeedback* mFeedback;
Geoff Lang045536b2015-03-27 15:17:18 -040065 gl::Caps mCaps;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070066};
67
Kenneth Russelldb8ae162014-08-25 19:02:35 -070068TEST_F(TransformFeedbackTest, SideEffectsOfStartAndStop)
69{
70 testing::InSequence seq;
71
Geoff Langbb0a0bb2015-03-27 12:16:57 -040072 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070073 EXPECT_CALL(*mImpl, begin(GL_TRIANGLES));
Geoff Langbb0a0bb2015-03-27 12:16:57 -040074 mFeedback->begin(GL_TRIANGLES);
75 EXPECT_TRUE(mFeedback->isActive());
76 EXPECT_EQ(static_cast<GLenum>(GL_TRIANGLES), mFeedback->getPrimitiveMode());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070077 EXPECT_CALL(*mImpl, end());
Geoff Langbb0a0bb2015-03-27 12:16:57 -040078 mFeedback->end();
79 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070080}
81
82TEST_F(TransformFeedbackTest, SideEffectsOfPauseAndResume)
83{
84 testing::InSequence seq;
85
Geoff Langbb0a0bb2015-03-27 12:16:57 -040086 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070087 EXPECT_CALL(*mImpl, begin(GL_TRIANGLES));
Geoff Langbb0a0bb2015-03-27 12:16:57 -040088 mFeedback->begin(GL_TRIANGLES);
89 EXPECT_FALSE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070090 EXPECT_CALL(*mImpl, pause());
91 mFeedback->pause();
Geoff Langbb0a0bb2015-03-27 12:16:57 -040092 EXPECT_TRUE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070093 EXPECT_CALL(*mImpl, resume());
94 mFeedback->resume();
Geoff Langbb0a0bb2015-03-27 12:16:57 -040095 EXPECT_FALSE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070096 EXPECT_CALL(*mImpl, end());
Geoff Langbb0a0bb2015-03-27 12:16:57 -040097 mFeedback->end();
Kenneth Russelldb8ae162014-08-25 19:02:35 -070098}
99
Geoff Lang045536b2015-03-27 15:17:18 -0400100TEST_F(TransformFeedbackTest, BufferBinding)
101{
102 rx::MockBufferImpl *bufferImpl = new rx::MockBufferImpl;
103 gl::Buffer *buffer = new gl::Buffer(bufferImpl, 1);
104 EXPECT_CALL(*bufferImpl, destructor()).Times(1).RetiresOnSaturation();
105
106 static const size_t bindIndex = 0;
107
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500108 EXPECT_EQ(mFeedback->getIndexedBufferCount(), mCaps.maxTransformFeedbackSeparateAttributes);
Geoff Lang48d33ae2015-04-27 11:01:44 -0400109
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500110 EXPECT_CALL(*mImpl, bindGenericBuffer(_));
111 mFeedback->bindGenericBuffer(buffer);
112 EXPECT_EQ(mFeedback->getGenericBuffer().get(), buffer);
Geoff Lang045536b2015-03-27 15:17:18 -0400113
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500114 EXPECT_CALL(*mImpl, bindIndexedBuffer(_, _));
115 mFeedback->bindIndexedBuffer(bindIndex, buffer, 0, 1);
116 for (size_t i = 0; i < mFeedback->getIndexedBufferCount(); i++)
Geoff Lang045536b2015-03-27 15:17:18 -0400117 {
118 if (i == bindIndex)
119 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500120 EXPECT_EQ(mFeedback->getIndexedBuffer(i).get(), buffer);
Geoff Lang045536b2015-03-27 15:17:18 -0400121 }
122 else
123 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500124 EXPECT_EQ(mFeedback->getIndexedBuffer(i).get(), nullptr);
Geoff Lang045536b2015-03-27 15:17:18 -0400125 }
126 }
127
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500128 // force-release the feedback object to ensure the buffer is released.
129 const size_t releaseCount = mFeedback->getRefCount();
130 for (size_t count = 0; count < releaseCount; ++count)
131 {
132 mFeedback->release();
133 }
134
135 mFeedback = nullptr;
Geoff Lang045536b2015-03-27 15:17:18 -0400136
137 testing::Mock::VerifyAndClear(bufferImpl);
138}
139
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500140} // anonymous namespace