blob: 2883d7601ee935fb329ae33ddf469738d225cf14 [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"
Kenneth Russelldb8ae162014-08-25 19:02:35 -070014
Geoff Lang045536b2015-03-27 15:17:18 -040015using ::testing::_;
16using ::testing::Return;
17using ::testing::SetArgumentPointee;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070018
Geoff Lang045536b2015-03-27 15:17:18 -040019namespace
Kenneth Russelldb8ae162014-08-25 19:02:35 -070020{
Kenneth Russelldb8ae162014-08-25 19:02:35 -070021
22class TransformFeedbackTest : public testing::Test
23{
24 protected:
25 virtual void SetUp()
26 {
Geoff Lang045536b2015-03-27 15:17:18 -040027 // Set a reasonable number of tf attributes
28 mCaps.maxTransformFeedbackSeparateAttributes = 8;
29
30 mImpl = new rx::MockTransformFeedbackImpl;
31 EXPECT_CALL(*mImpl, destructor());
32 mFeedback = new gl::TransformFeedback(mImpl, 1, mCaps);
Kenneth Russelldb8ae162014-08-25 19:02:35 -070033 mFeedback->addRef();
34 }
35
36 virtual void TearDown()
37 {
38 mFeedback->release();
39 }
40
Geoff Lang045536b2015-03-27 15:17:18 -040041 rx::MockTransformFeedbackImpl* mImpl;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070042 gl::TransformFeedback* mFeedback;
Geoff Lang045536b2015-03-27 15:17:18 -040043 gl::Caps mCaps;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070044};
45
46TEST_F(TransformFeedbackTest, DestructionDeletesImpl)
47{
Geoff Lang045536b2015-03-27 15:17:18 -040048 rx::MockTransformFeedbackImpl* impl = new rx::MockTransformFeedbackImpl;
49 EXPECT_CALL(*impl, destructor()).Times(1).RetiresOnSaturation();
Kenneth Russelldb8ae162014-08-25 19:02:35 -070050
Geoff Lang045536b2015-03-27 15:17:18 -040051 gl::TransformFeedback* feedback = new gl::TransformFeedback(impl, 1, mCaps);
Kenneth Russelldb8ae162014-08-25 19:02:35 -070052 feedback->addRef();
53 feedback->release();
54
55 // Only needed because the mock is leaked if bugs are present,
56 // which logs an error, but does not cause the test to fail.
57 // Ordinarily mocks are verified when destroyed.
58 testing::Mock::VerifyAndClear(impl);
59}
60
61TEST_F(TransformFeedbackTest, SideEffectsOfStartAndStop)
62{
63 testing::InSequence seq;
64
Geoff Langbb0a0bb2015-03-27 12:16:57 -040065 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070066 EXPECT_CALL(*mImpl, begin(GL_TRIANGLES));
Geoff Langbb0a0bb2015-03-27 12:16:57 -040067 mFeedback->begin(GL_TRIANGLES);
68 EXPECT_TRUE(mFeedback->isActive());
69 EXPECT_EQ(static_cast<GLenum>(GL_TRIANGLES), mFeedback->getPrimitiveMode());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070070 EXPECT_CALL(*mImpl, end());
Geoff Langbb0a0bb2015-03-27 12:16:57 -040071 mFeedback->end();
72 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070073}
74
75TEST_F(TransformFeedbackTest, SideEffectsOfPauseAndResume)
76{
77 testing::InSequence seq;
78
Geoff Langbb0a0bb2015-03-27 12:16:57 -040079 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070080 EXPECT_CALL(*mImpl, begin(GL_TRIANGLES));
Geoff Langbb0a0bb2015-03-27 12:16:57 -040081 mFeedback->begin(GL_TRIANGLES);
82 EXPECT_FALSE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070083 EXPECT_CALL(*mImpl, pause());
84 mFeedback->pause();
Geoff Langbb0a0bb2015-03-27 12:16:57 -040085 EXPECT_TRUE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070086 EXPECT_CALL(*mImpl, resume());
87 mFeedback->resume();
Geoff Langbb0a0bb2015-03-27 12:16:57 -040088 EXPECT_FALSE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070089 EXPECT_CALL(*mImpl, end());
Geoff Langbb0a0bb2015-03-27 12:16:57 -040090 mFeedback->end();
Kenneth Russelldb8ae162014-08-25 19:02:35 -070091}
92
Geoff Lang045536b2015-03-27 15:17:18 -040093TEST_F(TransformFeedbackTest, BufferBinding)
94{
95 rx::MockBufferImpl *bufferImpl = new rx::MockBufferImpl;
96 gl::Buffer *buffer = new gl::Buffer(bufferImpl, 1);
97 EXPECT_CALL(*bufferImpl, destructor()).Times(1).RetiresOnSaturation();
98
99 static const size_t bindIndex = 0;
100
101 rx::MockTransformFeedbackImpl *feedbackImpl = new rx::MockTransformFeedbackImpl;
Geoff Lang48d33ae2015-04-27 11:01:44 -0400102 EXPECT_CALL(*feedbackImpl, destructor()).Times(1).RetiresOnSaturation();
103
Geoff Lang045536b2015-03-27 15:17:18 -0400104 gl::TransformFeedback *feedback = new gl::TransformFeedback(feedbackImpl, 1, mCaps);
105
106 EXPECT_EQ(feedback->getIndexedBufferCount(), mCaps.maxTransformFeedbackSeparateAttributes);
107
108 EXPECT_CALL(*feedbackImpl, bindGenericBuffer(_));
109 feedback->bindGenericBuffer(buffer);
110 EXPECT_EQ(feedback->getGenericBuffer().get(), buffer);
111
112 EXPECT_CALL(*feedbackImpl, bindIndexedBuffer(_, _));
113 feedback->bindIndexedBuffer(bindIndex, buffer, 0, 1);
114 for (size_t i = 0; i < feedback->getIndexedBufferCount(); i++)
115 {
116 if (i == bindIndex)
117 {
118 EXPECT_EQ(feedback->getIndexedBuffer(i).get(), buffer);
119 }
120 else
121 {
122 EXPECT_EQ(feedback->getIndexedBuffer(i).get(), nullptr);
123 }
124 }
125
126 feedback->addRef();
127 feedback->release();
128
129 testing::Mock::VerifyAndClear(bufferImpl);
130}
131
Kenneth Russelldb8ae162014-08-25 19:02:35 -0700132} // namespace