1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker #include "gmock/gmock.h"
8*8975f5c5SAndroid Build Coastguard Worker #include "gtest/gtest.h"
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Fence.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/FenceNVImpl.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/SyncImpl.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "tests/angle_unittests_utils.h"
14*8975f5c5SAndroid Build Coastguard Worker
15*8975f5c5SAndroid Build Coastguard Worker using namespace testing;
16*8975f5c5SAndroid Build Coastguard Worker
17*8975f5c5SAndroid Build Coastguard Worker namespace
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker
20*8975f5c5SAndroid Build Coastguard Worker //
21*8975f5c5SAndroid Build Coastguard Worker // FenceNV tests
22*8975f5c5SAndroid Build Coastguard Worker //
23*8975f5c5SAndroid Build Coastguard Worker
24*8975f5c5SAndroid Build Coastguard Worker class MockFenceNVImpl : public rx::FenceNVImpl
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker public:
~MockFenceNVImpl()27*8975f5c5SAndroid Build Coastguard Worker virtual ~MockFenceNVImpl() { destroy(); }
28*8975f5c5SAndroid Build Coastguard Worker
29*8975f5c5SAndroid Build Coastguard Worker MOCK_METHOD1(onDestroy, void(const gl::Context *context));
30*8975f5c5SAndroid Build Coastguard Worker MOCK_METHOD2(set, angle::Result(const gl::Context *, GLenum));
31*8975f5c5SAndroid Build Coastguard Worker MOCK_METHOD2(test, angle::Result(const gl::Context *, GLboolean *));
32*8975f5c5SAndroid Build Coastguard Worker MOCK_METHOD1(finish, angle::Result(const gl::Context *));
33*8975f5c5SAndroid Build Coastguard Worker
34*8975f5c5SAndroid Build Coastguard Worker MOCK_METHOD0(destroy, void());
35*8975f5c5SAndroid Build Coastguard Worker };
36*8975f5c5SAndroid Build Coastguard Worker
37*8975f5c5SAndroid Build Coastguard Worker class FenceNVTest : public Test
38*8975f5c5SAndroid Build Coastguard Worker {
39*8975f5c5SAndroid Build Coastguard Worker protected:
SetUp()40*8975f5c5SAndroid Build Coastguard Worker void SetUp() override
41*8975f5c5SAndroid Build Coastguard Worker {
42*8975f5c5SAndroid Build Coastguard Worker mImpl = new MockFenceNVImpl;
43*8975f5c5SAndroid Build Coastguard Worker EXPECT_CALL(factory, createFenceNV()).WillOnce(Return(mImpl));
44*8975f5c5SAndroid Build Coastguard Worker
45*8975f5c5SAndroid Build Coastguard Worker EXPECT_CALL(*mImpl, destroy());
46*8975f5c5SAndroid Build Coastguard Worker mFence = new gl::FenceNV(&factory);
47*8975f5c5SAndroid Build Coastguard Worker }
48*8975f5c5SAndroid Build Coastguard Worker
TearDown()49*8975f5c5SAndroid Build Coastguard Worker void TearDown() override { delete mFence; }
50*8975f5c5SAndroid Build Coastguard Worker
51*8975f5c5SAndroid Build Coastguard Worker NiceMock<rx::MockGLFactory> factory;
52*8975f5c5SAndroid Build Coastguard Worker MockFenceNVImpl *mImpl;
53*8975f5c5SAndroid Build Coastguard Worker gl::FenceNV *mFence;
54*8975f5c5SAndroid Build Coastguard Worker };
55*8975f5c5SAndroid Build Coastguard Worker
TEST_F(FenceNVTest,SetAndTestBehavior)56*8975f5c5SAndroid Build Coastguard Worker TEST_F(FenceNVTest, SetAndTestBehavior)
57*8975f5c5SAndroid Build Coastguard Worker {
58*8975f5c5SAndroid Build Coastguard Worker EXPECT_CALL(*mImpl, set(_, _)).WillOnce(Return(angle::Result::Continue)).RetiresOnSaturation();
59*8975f5c5SAndroid Build Coastguard Worker EXPECT_FALSE(mFence->isSet());
60*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(angle::Result::Continue, mFence->set(nullptr, GL_ALL_COMPLETED_NV));
61*8975f5c5SAndroid Build Coastguard Worker EXPECT_TRUE(mFence->isSet());
62*8975f5c5SAndroid Build Coastguard Worker // Fake the behavior of testing the fence before and after it's passed.
63*8975f5c5SAndroid Build Coastguard Worker EXPECT_CALL(*mImpl, test(_, _))
64*8975f5c5SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgumentPointee<1>(static_cast<GLboolean>(GL_FALSE)),
65*8975f5c5SAndroid Build Coastguard Worker Return(angle::Result::Continue)))
66*8975f5c5SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgumentPointee<1>(static_cast<GLboolean>(GL_TRUE)),
67*8975f5c5SAndroid Build Coastguard Worker Return(angle::Result::Continue)))
68*8975f5c5SAndroid Build Coastguard Worker .RetiresOnSaturation();
69*8975f5c5SAndroid Build Coastguard Worker GLboolean out;
70*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(angle::Result::Continue, mFence->test(nullptr, &out));
71*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GL_FALSE, out);
72*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(angle::Result::Continue, mFence->test(nullptr, &out));
73*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GL_TRUE, out);
74*8975f5c5SAndroid Build Coastguard Worker }
75*8975f5c5SAndroid Build Coastguard Worker
76*8975f5c5SAndroid Build Coastguard Worker //
77*8975f5c5SAndroid Build Coastguard Worker // Sync tests
78*8975f5c5SAndroid Build Coastguard Worker //
79*8975f5c5SAndroid Build Coastguard Worker
80*8975f5c5SAndroid Build Coastguard Worker class MockSyncImpl : public rx::SyncImpl
81*8975f5c5SAndroid Build Coastguard Worker {
82*8975f5c5SAndroid Build Coastguard Worker public:
~MockSyncImpl()83*8975f5c5SAndroid Build Coastguard Worker virtual ~MockSyncImpl() { destroy(); }
84*8975f5c5SAndroid Build Coastguard Worker
85*8975f5c5SAndroid Build Coastguard Worker MOCK_METHOD3(set, angle::Result(const gl::Context *, GLenum, GLbitfield));
86*8975f5c5SAndroid Build Coastguard Worker MOCK_METHOD4(clientWait, angle::Result(const gl::Context *, GLbitfield, GLuint64, GLenum *));
87*8975f5c5SAndroid Build Coastguard Worker MOCK_METHOD3(serverWait, angle::Result(const gl::Context *, GLbitfield, GLuint64));
88*8975f5c5SAndroid Build Coastguard Worker MOCK_METHOD2(getStatus, angle::Result(const gl::Context *, GLint *));
89*8975f5c5SAndroid Build Coastguard Worker
90*8975f5c5SAndroid Build Coastguard Worker MOCK_METHOD0(destroy, void());
91*8975f5c5SAndroid Build Coastguard Worker };
92*8975f5c5SAndroid Build Coastguard Worker
93*8975f5c5SAndroid Build Coastguard Worker class FenceSyncTest : public Test
94*8975f5c5SAndroid Build Coastguard Worker {
95*8975f5c5SAndroid Build Coastguard Worker protected:
SetUp()96*8975f5c5SAndroid Build Coastguard Worker void SetUp() override
97*8975f5c5SAndroid Build Coastguard Worker {
98*8975f5c5SAndroid Build Coastguard Worker mImpl = new MockSyncImpl;
99*8975f5c5SAndroid Build Coastguard Worker EXPECT_CALL(factory, createSync()).WillOnce(Return(mImpl));
100*8975f5c5SAndroid Build Coastguard Worker
101*8975f5c5SAndroid Build Coastguard Worker mFence = new gl::Sync(&factory, {1});
102*8975f5c5SAndroid Build Coastguard Worker EXPECT_CALL(*mImpl, destroy());
103*8975f5c5SAndroid Build Coastguard Worker mFence->addRef();
104*8975f5c5SAndroid Build Coastguard Worker }
105*8975f5c5SAndroid Build Coastguard Worker
TearDown()106*8975f5c5SAndroid Build Coastguard Worker void TearDown() override { mFence->release(nullptr); }
107*8975f5c5SAndroid Build Coastguard Worker
108*8975f5c5SAndroid Build Coastguard Worker NiceMock<rx::MockGLFactory> factory;
109*8975f5c5SAndroid Build Coastguard Worker MockSyncImpl *mImpl;
110*8975f5c5SAndroid Build Coastguard Worker gl::Sync *mFence;
111*8975f5c5SAndroid Build Coastguard Worker };
112*8975f5c5SAndroid Build Coastguard Worker
TEST_F(FenceSyncTest,SetAndGetStatusBehavior)113*8975f5c5SAndroid Build Coastguard Worker TEST_F(FenceSyncTest, SetAndGetStatusBehavior)
114*8975f5c5SAndroid Build Coastguard Worker {
115*8975f5c5SAndroid Build Coastguard Worker EXPECT_CALL(*mImpl, set(_, _, _))
116*8975f5c5SAndroid Build Coastguard Worker .WillOnce(Return(angle::Result::Continue))
117*8975f5c5SAndroid Build Coastguard Worker .RetiresOnSaturation();
118*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(angle::Result::Continue, mFence->set(nullptr, GL_SYNC_GPU_COMMANDS_COMPLETE, 0));
119*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<GLenum>(GL_SYNC_GPU_COMMANDS_COMPLETE), mFence->getCondition());
120*8975f5c5SAndroid Build Coastguard Worker // Fake the behavior of testing the fence before and after it's passed.
121*8975f5c5SAndroid Build Coastguard Worker EXPECT_CALL(*mImpl, getStatus(_, _))
122*8975f5c5SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgumentPointee<1>(GL_UNSIGNALED), Return(angle::Result::Continue)))
123*8975f5c5SAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgumentPointee<1>(GL_SIGNALED), Return(angle::Result::Continue)))
124*8975f5c5SAndroid Build Coastguard Worker .RetiresOnSaturation();
125*8975f5c5SAndroid Build Coastguard Worker GLint out;
126*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(angle::Result::Continue, mFence->getStatus(nullptr, &out));
127*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GL_UNSIGNALED, out);
128*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(angle::Result::Continue, mFence->getStatus(nullptr, &out));
129*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(GL_SIGNALED, out);
130*8975f5c5SAndroid Build Coastguard Worker }
131*8975f5c5SAndroid Build Coastguard Worker
132*8975f5c5SAndroid Build Coastguard Worker } // namespace
133