blob: d019cb76718ecc20c4463870fdf1e28d91c826c0 [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 {
Jamie Madill4928b7c2017-06-20 12:57:39 -040054 mFeedback->release(nullptr);
Jamie Madill3f01e6c2016-03-08 13:53:02 -050055 }
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));
Jamie Madill6c1f6712017-02-14 19:08:04 -050075 mFeedback->begin(nullptr, 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());
Jamie Madill6c1f6712017-02-14 19:08:04 -050079 mFeedback->end(nullptr);
Geoff Langbb0a0bb2015-03-27 12:16:57 -040080 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));
Jamie Madill6c1f6712017-02-14 19:08:04 -050089 mFeedback->begin(nullptr, 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());
Jamie Madill6c1f6712017-02-14 19:08:04 -050098 mFeedback->end(nullptr);
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;
Geoff Lang045536b2015-03-27 15:17:18 -0400104 EXPECT_CALL(*bufferImpl, destructor()).Times(1).RetiresOnSaturation();
105
Jamie Madill8f775602016-11-03 16:45:34 -0400106 rx::MockGLFactory mockGLFactory;
107 EXPECT_CALL(mockGLFactory, createBuffer(_))
108 .Times(1)
109 .WillOnce(Return(bufferImpl))
110 .RetiresOnSaturation();
111
112 gl::Buffer *buffer = new gl::Buffer(&mockGLFactory, 1);
113
Geoff Lang045536b2015-03-27 15:17:18 -0400114 static const size_t bindIndex = 0;
115
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500116 EXPECT_EQ(mFeedback->getIndexedBufferCount(), mCaps.maxTransformFeedbackSeparateAttributes);
Geoff Lang48d33ae2015-04-27 11:01:44 -0400117
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500118 EXPECT_CALL(*mImpl, bindGenericBuffer(_));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400119 mFeedback->bindGenericBuffer(nullptr, buffer);
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500120 EXPECT_EQ(mFeedback->getGenericBuffer().get(), buffer);
Geoff Lang045536b2015-03-27 15:17:18 -0400121
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500122 EXPECT_CALL(*mImpl, bindIndexedBuffer(_, _));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400123 mFeedback->bindIndexedBuffer(nullptr, bindIndex, buffer, 0, 1);
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500124 for (size_t i = 0; i < mFeedback->getIndexedBufferCount(); i++)
Geoff Lang045536b2015-03-27 15:17:18 -0400125 {
126 if (i == bindIndex)
127 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500128 EXPECT_EQ(mFeedback->getIndexedBuffer(i).get(), buffer);
Geoff Lang045536b2015-03-27 15:17:18 -0400129 }
130 else
131 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500132 EXPECT_EQ(mFeedback->getIndexedBuffer(i).get(), nullptr);
Geoff Lang045536b2015-03-27 15:17:18 -0400133 }
134 }
135
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500136 // force-release the feedback object to ensure the buffer is released.
137 const size_t releaseCount = mFeedback->getRefCount();
138 for (size_t count = 0; count < releaseCount; ++count)
139 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400140 mFeedback->release(nullptr);
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500141 }
142
143 mFeedback = nullptr;
Geoff Lang045536b2015-03-27 15:17:18 -0400144
145 testing::Mock::VerifyAndClear(bufferImpl);
146}
147
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500148} // anonymous namespace