blob: d173686ea208c175f31bc3c105fffbc6d18e168b [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
23class TransformFeedbackTest : public testing::Test
24{
25 protected:
Jamie Madill3f01e6c2016-03-08 13:53:02 -050026 TransformFeedbackTest() : mImpl(nullptr), mFeedback(nullptr) {}
27
28 void SetUp() override
Kenneth Russelldb8ae162014-08-25 19:02:35 -070029 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -050030 mImpl = new rx::MockTransformFeedbackImpl;
31 EXPECT_CALL(mMockFactory, createTransformFeedback())
32 .WillOnce(Return(mImpl))
33 .RetiresOnSaturation();
34
Geoff Lang045536b2015-03-27 15:17:18 -040035 // Set a reasonable number of tf attributes
36 mCaps.maxTransformFeedbackSeparateAttributes = 8;
37
Geoff Lang045536b2015-03-27 15:17:18 -040038 EXPECT_CALL(*mImpl, destructor());
Jamie Madill3f01e6c2016-03-08 13:53:02 -050039 mFeedback = new gl::TransformFeedback(&mMockFactory, 1, mCaps);
Kenneth Russelldb8ae162014-08-25 19:02:35 -070040 mFeedback->addRef();
41 }
42
Jamie Madill3f01e6c2016-03-08 13:53:02 -050043 void TearDown() override
Kenneth Russelldb8ae162014-08-25 19:02:35 -070044 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -050045 if (mFeedback)
46 {
47 mFeedback->release();
48 }
49
50 // Only needed because the mock is leaked if bugs are present,
51 // which logs an error, but does not cause the test to fail.
52 // Ordinarily mocks are verified when destroyed.
53 testing::Mock::VerifyAndClear(mImpl);
Kenneth Russelldb8ae162014-08-25 19:02:35 -070054 }
55
Jamie Madill7aea7e02016-05-10 10:39:45 -040056 rx::MockGLFactory mMockFactory;
Geoff Lang045536b2015-03-27 15:17:18 -040057 rx::MockTransformFeedbackImpl* mImpl;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070058 gl::TransformFeedback* mFeedback;
Geoff Lang045536b2015-03-27 15:17:18 -040059 gl::Caps mCaps;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070060};
61
Kenneth Russelldb8ae162014-08-25 19:02:35 -070062TEST_F(TransformFeedbackTest, SideEffectsOfStartAndStop)
63{
64 testing::InSequence seq;
65
Geoff Langbb0a0bb2015-03-27 12:16:57 -040066 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070067 EXPECT_CALL(*mImpl, begin(GL_TRIANGLES));
Olli Etuahoc3e55a42016-03-09 16:29:18 +020068 mFeedback->begin(GL_TRIANGLES, nullptr);
Geoff Langbb0a0bb2015-03-27 12:16:57 -040069 EXPECT_TRUE(mFeedback->isActive());
70 EXPECT_EQ(static_cast<GLenum>(GL_TRIANGLES), mFeedback->getPrimitiveMode());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070071 EXPECT_CALL(*mImpl, end());
Geoff Langbb0a0bb2015-03-27 12:16:57 -040072 mFeedback->end();
73 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070074}
75
76TEST_F(TransformFeedbackTest, SideEffectsOfPauseAndResume)
77{
78 testing::InSequence seq;
79
Geoff Langbb0a0bb2015-03-27 12:16:57 -040080 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070081 EXPECT_CALL(*mImpl, begin(GL_TRIANGLES));
Olli Etuahoc3e55a42016-03-09 16:29:18 +020082 mFeedback->begin(GL_TRIANGLES, nullptr);
Geoff Langbb0a0bb2015-03-27 12:16:57 -040083 EXPECT_FALSE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070084 EXPECT_CALL(*mImpl, pause());
85 mFeedback->pause();
Geoff Langbb0a0bb2015-03-27 12:16:57 -040086 EXPECT_TRUE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070087 EXPECT_CALL(*mImpl, resume());
88 mFeedback->resume();
Geoff Langbb0a0bb2015-03-27 12:16:57 -040089 EXPECT_FALSE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070090 EXPECT_CALL(*mImpl, end());
Geoff Langbb0a0bb2015-03-27 12:16:57 -040091 mFeedback->end();
Kenneth Russelldb8ae162014-08-25 19:02:35 -070092}
93
Geoff Lang045536b2015-03-27 15:17:18 -040094TEST_F(TransformFeedbackTest, BufferBinding)
95{
96 rx::MockBufferImpl *bufferImpl = new rx::MockBufferImpl;
97 gl::Buffer *buffer = new gl::Buffer(bufferImpl, 1);
98 EXPECT_CALL(*bufferImpl, destructor()).Times(1).RetiresOnSaturation();
99
100 static const size_t bindIndex = 0;
101
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500102 EXPECT_EQ(mFeedback->getIndexedBufferCount(), mCaps.maxTransformFeedbackSeparateAttributes);
Geoff Lang48d33ae2015-04-27 11:01:44 -0400103
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500104 EXPECT_CALL(*mImpl, bindGenericBuffer(_));
105 mFeedback->bindGenericBuffer(buffer);
106 EXPECT_EQ(mFeedback->getGenericBuffer().get(), buffer);
Geoff Lang045536b2015-03-27 15:17:18 -0400107
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500108 EXPECT_CALL(*mImpl, bindIndexedBuffer(_, _));
109 mFeedback->bindIndexedBuffer(bindIndex, buffer, 0, 1);
110 for (size_t i = 0; i < mFeedback->getIndexedBufferCount(); i++)
Geoff Lang045536b2015-03-27 15:17:18 -0400111 {
112 if (i == bindIndex)
113 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500114 EXPECT_EQ(mFeedback->getIndexedBuffer(i).get(), buffer);
Geoff Lang045536b2015-03-27 15:17:18 -0400115 }
116 else
117 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500118 EXPECT_EQ(mFeedback->getIndexedBuffer(i).get(), nullptr);
Geoff Lang045536b2015-03-27 15:17:18 -0400119 }
120 }
121
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500122 // force-release the feedback object to ensure the buffer is released.
123 const size_t releaseCount = mFeedback->getRefCount();
124 for (size_t count = 0; count < releaseCount; ++count)
125 {
126 mFeedback->release();
127 }
128
129 mFeedback = nullptr;
Geoff Lang045536b2015-03-27 15:17:18 -0400130
131 testing::Mock::VerifyAndClear(bufferImpl);
132}
133
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500134} // anonymous namespace