blob: 07a0959e2c99dca6c6b0a3e1bee78429e6ccd40d [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::_;
Geoff Lang73bd2182016-07-15 13:01:24 -040017using ::testing::get;
Geoff Lang045536b2015-03-27 15:17:18 -040018using ::testing::Return;
19using ::testing::SetArgumentPointee;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070020
Geoff Lang045536b2015-03-27 15:17:18 -040021namespace
Kenneth Russelldb8ae162014-08-25 19:02:35 -070022{
Kenneth Russelldb8ae162014-08-25 19:02:35 -070023
Geoff Lang73bd2182016-07-15 13:01:24 -040024ACTION(CreateMockTransformFeedbackImpl)
25{
26 return new rx::MockTransformFeedbackImpl(arg0);
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 {
Geoff Lang73bd2182016-07-15 13:01:24 -040036 EXPECT_CALL(mMockFactory, createTransformFeedback(_))
37 .WillOnce(CreateMockTransformFeedbackImpl())
Jamie Madill3f01e6c2016-03-08 13:53:02 -050038 .RetiresOnSaturation();
39
Geoff Lang045536b2015-03-27 15:17:18 -040040 // Set a reasonable number of tf attributes
41 mCaps.maxTransformFeedbackSeparateAttributes = 8;
42
Jamie Madill3f01e6c2016-03-08 13:53:02 -050043 mFeedback = new gl::TransformFeedback(&mMockFactory, 1, mCaps);
Kenneth Russelldb8ae162014-08-25 19:02:35 -070044 mFeedback->addRef();
Geoff Lang73bd2182016-07-15 13:01:24 -040045
46 mImpl = rx::GetImplAs<rx::MockTransformFeedbackImpl>(mFeedback);
47 EXPECT_CALL(*mImpl, destructor());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070048 }
49
Jamie Madill3f01e6c2016-03-08 13:53:02 -050050 void TearDown() override
Kenneth Russelldb8ae162014-08-25 19:02:35 -070051 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -050052 if (mFeedback)
53 {
54 mFeedback->release();
55 }
56
57 // Only needed because the mock is leaked if bugs are present,
58 // which logs an error, but does not cause the test to fail.
59 // Ordinarily mocks are verified when destroyed.
60 testing::Mock::VerifyAndClear(mImpl);
Kenneth Russelldb8ae162014-08-25 19:02:35 -070061 }
62
Jamie Madill7aea7e02016-05-10 10:39:45 -040063 rx::MockGLFactory mMockFactory;
Geoff Lang045536b2015-03-27 15:17:18 -040064 rx::MockTransformFeedbackImpl* mImpl;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070065 gl::TransformFeedback* mFeedback;
Geoff Lang045536b2015-03-27 15:17:18 -040066 gl::Caps mCaps;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070067};
68
Kenneth Russelldb8ae162014-08-25 19:02:35 -070069TEST_F(TransformFeedbackTest, SideEffectsOfStartAndStop)
70{
71 testing::InSequence seq;
72
Geoff Langbb0a0bb2015-03-27 12:16:57 -040073 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070074 EXPECT_CALL(*mImpl, begin(GL_TRIANGLES));
Olli Etuahoc3e55a42016-03-09 16:29:18 +020075 mFeedback->begin(GL_TRIANGLES, nullptr);
Geoff Langbb0a0bb2015-03-27 12:16:57 -040076 EXPECT_TRUE(mFeedback->isActive());
77 EXPECT_EQ(static_cast<GLenum>(GL_TRIANGLES), mFeedback->getPrimitiveMode());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070078 EXPECT_CALL(*mImpl, end());
Geoff Langbb0a0bb2015-03-27 12:16:57 -040079 mFeedback->end();
80 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070081}
82
83TEST_F(TransformFeedbackTest, SideEffectsOfPauseAndResume)
84{
85 testing::InSequence seq;
86
Geoff Langbb0a0bb2015-03-27 12:16:57 -040087 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070088 EXPECT_CALL(*mImpl, begin(GL_TRIANGLES));
Olli Etuahoc3e55a42016-03-09 16:29:18 +020089 mFeedback->begin(GL_TRIANGLES, nullptr);
Geoff Langbb0a0bb2015-03-27 12:16:57 -040090 EXPECT_FALSE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070091 EXPECT_CALL(*mImpl, pause());
92 mFeedback->pause();
Geoff Langbb0a0bb2015-03-27 12:16:57 -040093 EXPECT_TRUE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070094 EXPECT_CALL(*mImpl, resume());
95 mFeedback->resume();
Geoff Langbb0a0bb2015-03-27 12:16:57 -040096 EXPECT_FALSE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070097 EXPECT_CALL(*mImpl, end());
Geoff Langbb0a0bb2015-03-27 12:16:57 -040098 mFeedback->end();
Kenneth Russelldb8ae162014-08-25 19:02:35 -070099}
100
Geoff Lang045536b2015-03-27 15:17:18 -0400101TEST_F(TransformFeedbackTest, BufferBinding)
102{
103 rx::MockBufferImpl *bufferImpl = new rx::MockBufferImpl;
104 gl::Buffer *buffer = new gl::Buffer(bufferImpl, 1);
105 EXPECT_CALL(*bufferImpl, destructor()).Times(1).RetiresOnSaturation();
106
107 static const size_t bindIndex = 0;
108
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500109 EXPECT_EQ(mFeedback->getIndexedBufferCount(), mCaps.maxTransformFeedbackSeparateAttributes);
Geoff Lang48d33ae2015-04-27 11:01:44 -0400110
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500111 EXPECT_CALL(*mImpl, bindGenericBuffer(_));
112 mFeedback->bindGenericBuffer(buffer);
113 EXPECT_EQ(mFeedback->getGenericBuffer().get(), buffer);
Geoff Lang045536b2015-03-27 15:17:18 -0400114
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500115 EXPECT_CALL(*mImpl, bindIndexedBuffer(_, _));
116 mFeedback->bindIndexedBuffer(bindIndex, buffer, 0, 1);
117 for (size_t i = 0; i < mFeedback->getIndexedBufferCount(); i++)
Geoff Lang045536b2015-03-27 15:17:18 -0400118 {
119 if (i == bindIndex)
120 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500121 EXPECT_EQ(mFeedback->getIndexedBuffer(i).get(), buffer);
Geoff Lang045536b2015-03-27 15:17:18 -0400122 }
123 else
124 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500125 EXPECT_EQ(mFeedback->getIndexedBuffer(i).get(), nullptr);
Geoff Lang045536b2015-03-27 15:17:18 -0400126 }
127 }
128
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500129 // force-release the feedback object to ensure the buffer is released.
130 const size_t releaseCount = mFeedback->getRefCount();
131 for (size_t count = 0; count < releaseCount; ++count)
132 {
133 mFeedback->release();
134 }
135
136 mFeedback = nullptr;
Geoff Lang045536b2015-03-27 15:17:18 -0400137
138 testing::Mock::VerifyAndClear(bufferImpl);
139}
140
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500141} // anonymous namespace