blob: 5cb432bf11fd73efcfe984b5649669ad58577975 [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"
Jamie Madill493f9572018-05-24 19:52:15 -04009
Geoff Lang520c4ae2015-05-05 13:12:36 -040010#include "libANGLE/Buffer.h"
Geoff Lang045536b2015-03-27 15:17:18 -040011#include "libANGLE/Caps.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050012#include "libANGLE/TransformFeedback.h"
Geoff Lang045536b2015-03-27 15:17:18 -040013#include "libANGLE/renderer/BufferImpl_mock.h"
14#include "libANGLE/renderer/TransformFeedbackImpl_mock.h"
Jamie Madill3f01e6c2016-03-08 13:53:02 -050015#include "tests/angle_unittests_utils.h"
Kenneth Russelldb8ae162014-08-25 19:02:35 -070016
Geoff Lang045536b2015-03-27 15:17:18 -040017using ::testing::_;
Geoff Lang73bd2182016-07-15 13:01:24 -040018using ::testing::get;
Geoff Lang045536b2015-03-27 15:17:18 -040019using ::testing::Return;
20using ::testing::SetArgumentPointee;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070021
Geoff Lang045536b2015-03-27 15:17:18 -040022namespace
Kenneth Russelldb8ae162014-08-25 19:02:35 -070023{
Kenneth Russelldb8ae162014-08-25 19:02:35 -070024
Geoff Lang73bd2182016-07-15 13:01:24 -040025ACTION(CreateMockTransformFeedbackImpl)
26{
27 return new rx::MockTransformFeedbackImpl(arg0);
28}
29
Kenneth Russelldb8ae162014-08-25 19:02:35 -070030class TransformFeedbackTest : public testing::Test
31{
32 protected:
Jamie Madill3f01e6c2016-03-08 13:53:02 -050033 TransformFeedbackTest() : mImpl(nullptr), mFeedback(nullptr) {}
34
35 void SetUp() override
Kenneth Russelldb8ae162014-08-25 19:02:35 -070036 {
Geoff Lang73bd2182016-07-15 13:01:24 -040037 EXPECT_CALL(mMockFactory, createTransformFeedback(_))
38 .WillOnce(CreateMockTransformFeedbackImpl())
Jamie Madill3f01e6c2016-03-08 13:53:02 -050039 .RetiresOnSaturation();
40
Geoff Lang045536b2015-03-27 15:17:18 -040041 // Set a reasonable number of tf attributes
42 mCaps.maxTransformFeedbackSeparateAttributes = 8;
43
Jamie Madill3f01e6c2016-03-08 13:53:02 -050044 mFeedback = new gl::TransformFeedback(&mMockFactory, 1, mCaps);
Kenneth Russelldb8ae162014-08-25 19:02:35 -070045 mFeedback->addRef();
Geoff Lang73bd2182016-07-15 13:01:24 -040046
47 mImpl = rx::GetImplAs<rx::MockTransformFeedbackImpl>(mFeedback);
48 EXPECT_CALL(*mImpl, destructor());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070049 }
50
Jamie Madill3f01e6c2016-03-08 13:53:02 -050051 void TearDown() override
Kenneth Russelldb8ae162014-08-25 19:02:35 -070052 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -050053 if (mFeedback)
54 {
Jamie Madill4928b7c2017-06-20 12:57:39 -040055 mFeedback->release(nullptr);
Jamie Madill3f01e6c2016-03-08 13:53:02 -050056 }
57
58 // Only needed because the mock is leaked if bugs are present,
59 // which logs an error, but does not cause the test to fail.
60 // Ordinarily mocks are verified when destroyed.
61 testing::Mock::VerifyAndClear(mImpl);
Kenneth Russelldb8ae162014-08-25 19:02:35 -070062 }
63
Jamie Madill7aea7e02016-05-10 10:39:45 -040064 rx::MockGLFactory mMockFactory;
Jamie Madill493f9572018-05-24 19:52:15 -040065 rx::MockTransformFeedbackImpl *mImpl;
66 gl::TransformFeedback *mFeedback;
Geoff Lang045536b2015-03-27 15:17:18 -040067 gl::Caps mCaps;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070068};
69
Kenneth Russelldb8ae162014-08-25 19:02:35 -070070TEST_F(TransformFeedbackTest, SideEffectsOfStartAndStop)
71{
72 testing::InSequence seq;
73
Geoff Langbb0a0bb2015-03-27 12:16:57 -040074 EXPECT_FALSE(mFeedback->isActive());
Jamie Madill493f9572018-05-24 19:52:15 -040075 EXPECT_CALL(*mImpl, begin(gl::PrimitiveMode::Triangles));
76 mFeedback->begin(nullptr, gl::PrimitiveMode::Triangles, nullptr);
Geoff Langbb0a0bb2015-03-27 12:16:57 -040077 EXPECT_TRUE(mFeedback->isActive());
Jamie Madill493f9572018-05-24 19:52:15 -040078 EXPECT_EQ(gl::PrimitiveMode::Triangles, mFeedback->getPrimitiveMode());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070079 EXPECT_CALL(*mImpl, end());
Jamie Madill6c1f6712017-02-14 19:08:04 -050080 mFeedback->end(nullptr);
Geoff Langbb0a0bb2015-03-27 12:16:57 -040081 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070082}
83
84TEST_F(TransformFeedbackTest, SideEffectsOfPauseAndResume)
85{
86 testing::InSequence seq;
87
Geoff Langbb0a0bb2015-03-27 12:16:57 -040088 EXPECT_FALSE(mFeedback->isActive());
Jamie Madill493f9572018-05-24 19:52:15 -040089 EXPECT_CALL(*mImpl, begin(gl::PrimitiveMode::Triangles));
90 mFeedback->begin(nullptr, gl::PrimitiveMode::Triangles, nullptr);
Geoff Langbb0a0bb2015-03-27 12:16:57 -040091 EXPECT_FALSE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070092 EXPECT_CALL(*mImpl, pause());
93 mFeedback->pause();
Geoff Langbb0a0bb2015-03-27 12:16:57 -040094 EXPECT_TRUE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070095 EXPECT_CALL(*mImpl, resume());
96 mFeedback->resume();
Geoff Langbb0a0bb2015-03-27 12:16:57 -040097 EXPECT_FALSE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070098 EXPECT_CALL(*mImpl, end());
Jamie Madill6c1f6712017-02-14 19:08:04 -050099 mFeedback->end(nullptr);
Kenneth Russelldb8ae162014-08-25 19:02:35 -0700100}
101
Geoff Lang045536b2015-03-27 15:17:18 -0400102TEST_F(TransformFeedbackTest, BufferBinding)
103{
104 rx::MockBufferImpl *bufferImpl = new rx::MockBufferImpl;
Geoff Lang045536b2015-03-27 15:17:18 -0400105 EXPECT_CALL(*bufferImpl, destructor()).Times(1).RetiresOnSaturation();
106
Jamie Madill8f775602016-11-03 16:45:34 -0400107 rx::MockGLFactory mockGLFactory;
108 EXPECT_CALL(mockGLFactory, createBuffer(_))
109 .Times(1)
110 .WillOnce(Return(bufferImpl))
111 .RetiresOnSaturation();
112
113 gl::Buffer *buffer = new gl::Buffer(&mockGLFactory, 1);
114
Geoff Lang045536b2015-03-27 15:17:18 -0400115 static const size_t bindIndex = 0;
116
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500117 EXPECT_EQ(mFeedback->getIndexedBufferCount(), mCaps.maxTransformFeedbackSeparateAttributes);
Geoff Lang48d33ae2015-04-27 11:01:44 -0400118
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500119 EXPECT_CALL(*mImpl, bindIndexedBuffer(_, _));
Jamie Madill4928b7c2017-06-20 12:57:39 -0400120 mFeedback->bindIndexedBuffer(nullptr, bindIndex, buffer, 0, 1);
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500121 for (size_t i = 0; i < mFeedback->getIndexedBufferCount(); i++)
Geoff Lang045536b2015-03-27 15:17:18 -0400122 {
123 if (i == bindIndex)
124 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500125 EXPECT_EQ(mFeedback->getIndexedBuffer(i).get(), buffer);
Geoff Lang045536b2015-03-27 15:17:18 -0400126 }
127 else
128 {
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500129 EXPECT_EQ(mFeedback->getIndexedBuffer(i).get(), nullptr);
Geoff Lang045536b2015-03-27 15:17:18 -0400130 }
131 }
132
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500133 // force-release the feedback object to ensure the buffer is released.
134 const size_t releaseCount = mFeedback->getRefCount();
135 for (size_t count = 0; count < releaseCount; ++count)
136 {
Jamie Madill4928b7c2017-06-20 12:57:39 -0400137 mFeedback->release(nullptr);
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500138 }
139
140 mFeedback = nullptr;
Geoff Lang045536b2015-03-27 15:17:18 -0400141
142 testing::Mock::VerifyAndClear(bufferImpl);
143}
144
Jamie Madill3f01e6c2016-03-08 13:53:02 -0500145} // anonymous namespace