blob: baddfb7cb865f3507d3f24d22e229b9589e1ef97 [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 Lang045536b2015-03-27 15:17:18 -04009#include "libANGLE/Caps.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/TransformFeedback.h"
Geoff Lang045536b2015-03-27 15:17:18 -040011#include "libANGLE/renderer/BufferImpl_mock.h"
12#include "libANGLE/renderer/TransformFeedbackImpl_mock.h"
Kenneth Russelldb8ae162014-08-25 19:02:35 -070013
Geoff Lang045536b2015-03-27 15:17:18 -040014using ::testing::_;
15using ::testing::Return;
16using ::testing::SetArgumentPointee;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070017
Geoff Lang045536b2015-03-27 15:17:18 -040018namespace
Kenneth Russelldb8ae162014-08-25 19:02:35 -070019{
Kenneth Russelldb8ae162014-08-25 19:02:35 -070020
21class TransformFeedbackTest : public testing::Test
22{
23 protected:
24 virtual void SetUp()
25 {
Geoff Lang045536b2015-03-27 15:17:18 -040026 // Set a reasonable number of tf attributes
27 mCaps.maxTransformFeedbackSeparateAttributes = 8;
28
29 mImpl = new rx::MockTransformFeedbackImpl;
30 EXPECT_CALL(*mImpl, destructor());
31 mFeedback = new gl::TransformFeedback(mImpl, 1, mCaps);
Kenneth Russelldb8ae162014-08-25 19:02:35 -070032 mFeedback->addRef();
33 }
34
35 virtual void TearDown()
36 {
37 mFeedback->release();
38 }
39
Geoff Lang045536b2015-03-27 15:17:18 -040040 rx::MockTransformFeedbackImpl* mImpl;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070041 gl::TransformFeedback* mFeedback;
Geoff Lang045536b2015-03-27 15:17:18 -040042 gl::Caps mCaps;
Kenneth Russelldb8ae162014-08-25 19:02:35 -070043};
44
45TEST_F(TransformFeedbackTest, DestructionDeletesImpl)
46{
Geoff Lang045536b2015-03-27 15:17:18 -040047 rx::MockTransformFeedbackImpl* impl = new rx::MockTransformFeedbackImpl;
48 EXPECT_CALL(*impl, destructor()).Times(1).RetiresOnSaturation();
Kenneth Russelldb8ae162014-08-25 19:02:35 -070049
Geoff Lang045536b2015-03-27 15:17:18 -040050 gl::TransformFeedback* feedback = new gl::TransformFeedback(impl, 1, mCaps);
Kenneth Russelldb8ae162014-08-25 19:02:35 -070051 feedback->addRef();
52 feedback->release();
53
54 // Only needed because the mock is leaked if bugs are present,
55 // which logs an error, but does not cause the test to fail.
56 // Ordinarily mocks are verified when destroyed.
57 testing::Mock::VerifyAndClear(impl);
58}
59
60TEST_F(TransformFeedbackTest, SideEffectsOfStartAndStop)
61{
62 testing::InSequence seq;
63
Geoff Langbb0a0bb2015-03-27 12:16:57 -040064 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070065 EXPECT_CALL(*mImpl, begin(GL_TRIANGLES));
Geoff Langbb0a0bb2015-03-27 12:16:57 -040066 mFeedback->begin(GL_TRIANGLES);
67 EXPECT_TRUE(mFeedback->isActive());
68 EXPECT_EQ(static_cast<GLenum>(GL_TRIANGLES), mFeedback->getPrimitiveMode());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070069 EXPECT_CALL(*mImpl, end());
Geoff Langbb0a0bb2015-03-27 12:16:57 -040070 mFeedback->end();
71 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070072}
73
74TEST_F(TransformFeedbackTest, SideEffectsOfPauseAndResume)
75{
76 testing::InSequence seq;
77
Geoff Langbb0a0bb2015-03-27 12:16:57 -040078 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070079 EXPECT_CALL(*mImpl, begin(GL_TRIANGLES));
Geoff Langbb0a0bb2015-03-27 12:16:57 -040080 mFeedback->begin(GL_TRIANGLES);
81 EXPECT_FALSE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070082 EXPECT_CALL(*mImpl, pause());
83 mFeedback->pause();
Geoff Langbb0a0bb2015-03-27 12:16:57 -040084 EXPECT_TRUE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070085 EXPECT_CALL(*mImpl, resume());
86 mFeedback->resume();
Geoff Langbb0a0bb2015-03-27 12:16:57 -040087 EXPECT_FALSE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070088 EXPECT_CALL(*mImpl, end());
Geoff Langbb0a0bb2015-03-27 12:16:57 -040089 mFeedback->end();
Kenneth Russelldb8ae162014-08-25 19:02:35 -070090}
91
Geoff Lang045536b2015-03-27 15:17:18 -040092TEST_F(TransformFeedbackTest, BufferBinding)
93{
94 rx::MockBufferImpl *bufferImpl = new rx::MockBufferImpl;
95 gl::Buffer *buffer = new gl::Buffer(bufferImpl, 1);
96 EXPECT_CALL(*bufferImpl, destructor()).Times(1).RetiresOnSaturation();
97
98 static const size_t bindIndex = 0;
99
100 rx::MockTransformFeedbackImpl *feedbackImpl = new rx::MockTransformFeedbackImpl;
Geoff Lang48d33ae2015-04-27 11:01:44 -0400101 EXPECT_CALL(*feedbackImpl, destructor()).Times(1).RetiresOnSaturation();
102
Geoff Lang045536b2015-03-27 15:17:18 -0400103 gl::TransformFeedback *feedback = new gl::TransformFeedback(feedbackImpl, 1, mCaps);
104
105 EXPECT_EQ(feedback->getIndexedBufferCount(), mCaps.maxTransformFeedbackSeparateAttributes);
106
107 EXPECT_CALL(*feedbackImpl, bindGenericBuffer(_));
108 feedback->bindGenericBuffer(buffer);
109 EXPECT_EQ(feedback->getGenericBuffer().get(), buffer);
110
111 EXPECT_CALL(*feedbackImpl, bindIndexedBuffer(_, _));
112 feedback->bindIndexedBuffer(bindIndex, buffer, 0, 1);
113 for (size_t i = 0; i < feedback->getIndexedBufferCount(); i++)
114 {
115 if (i == bindIndex)
116 {
117 EXPECT_EQ(feedback->getIndexedBuffer(i).get(), buffer);
118 }
119 else
120 {
121 EXPECT_EQ(feedback->getIndexedBuffer(i).get(), nullptr);
122 }
123 }
124
125 feedback->addRef();
126 feedback->release();
127
128 testing::Mock::VerifyAndClear(bufferImpl);
129}
130
Kenneth Russelldb8ae162014-08-25 19:02:35 -0700131} // namespace