| // | |
| // Copyright 2014 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| #include "gmock/gmock.h" | |
| #include "gtest/gtest.h" | |
| #include "libANGLE/Fence.h" | |
| #include "libANGLE/renderer/FenceNVImpl.h" | |
| #include "libANGLE/renderer/SyncImpl.h" | |
| #include "tests/angle_unittests_utils.h" | |
| using namespace testing; | |
| namespace | |
| { | |
| // | |
| // FenceNV tests | |
| // | |
| class MockFenceNVImpl : public rx::FenceNVImpl | |
| { | |
| public: | |
| virtual ~MockFenceNVImpl() { destroy(); } | |
| MOCK_METHOD1(onDestroy, void(const gl::Context *context)); | |
| MOCK_METHOD2(set, angle::Result(const gl::Context *, GLenum)); | |
| MOCK_METHOD2(test, angle::Result(const gl::Context *, GLboolean *)); | |
| MOCK_METHOD1(finish, angle::Result(const gl::Context *)); | |
| MOCK_METHOD0(destroy, void()); | |
| }; | |
| class FenceNVTest : public Test | |
| { | |
| protected: | |
| void SetUp() override | |
| { | |
| mImpl = new MockFenceNVImpl; | |
| EXPECT_CALL(factory, createFenceNV()).WillOnce(Return(mImpl)); | |
| EXPECT_CALL(*mImpl, destroy()); | |
| mFence = new gl::FenceNV(&factory); | |
| } | |
| void TearDown() override { delete mFence; } | |
| NiceMock<rx::MockGLFactory> factory; | |
| MockFenceNVImpl *mImpl; | |
| gl::FenceNV *mFence; | |
| }; | |
| TEST_F(FenceNVTest, SetAndTestBehavior) | |
| { | |
| EXPECT_CALL(*mImpl, set(_, _)).WillOnce(Return(angle::Result::Continue)).RetiresOnSaturation(); | |
| EXPECT_FALSE(mFence->isSet()); | |
| EXPECT_EQ(angle::Result::Continue, mFence->set(nullptr, GL_ALL_COMPLETED_NV)); | |
| EXPECT_TRUE(mFence->isSet()); | |
| // Fake the behavior of testing the fence before and after it's passed. | |
| EXPECT_CALL(*mImpl, test(_, _)) | |
| .WillOnce(DoAll(SetArgumentPointee<1>(static_cast<GLboolean>(GL_FALSE)), | |
| Return(angle::Result::Continue))) | |
| .WillOnce(DoAll(SetArgumentPointee<1>(static_cast<GLboolean>(GL_TRUE)), | |
| Return(angle::Result::Continue))) | |
| .RetiresOnSaturation(); | |
| GLboolean out; | |
| EXPECT_EQ(angle::Result::Continue, mFence->test(nullptr, &out)); | |
| EXPECT_EQ(GL_FALSE, out); | |
| EXPECT_EQ(angle::Result::Continue, mFence->test(nullptr, &out)); | |
| EXPECT_EQ(GL_TRUE, out); | |
| } | |
| // | |
| // Sync tests | |
| // | |
| class MockSyncImpl : public rx::SyncImpl | |
| { | |
| public: | |
| virtual ~MockSyncImpl() { destroy(); } | |
| MOCK_METHOD3(set, angle::Result(const gl::Context *, GLenum, GLbitfield)); | |
| MOCK_METHOD4(clientWait, angle::Result(const gl::Context *, GLbitfield, GLuint64, GLenum *)); | |
| MOCK_METHOD3(serverWait, angle::Result(const gl::Context *, GLbitfield, GLuint64)); | |
| MOCK_METHOD2(getStatus, angle::Result(const gl::Context *, GLint *)); | |
| MOCK_METHOD0(destroy, void()); | |
| }; | |
| class FenceSyncTest : public Test | |
| { | |
| protected: | |
| void SetUp() override | |
| { | |
| mImpl = new MockSyncImpl; | |
| EXPECT_CALL(factory, createSync()).WillOnce(Return(mImpl)); | |
| mFence = new gl::Sync(&factory, {1}); | |
| EXPECT_CALL(*mImpl, destroy()); | |
| mFence->addRef(); | |
| } | |
| void TearDown() override { mFence->release(nullptr); } | |
| NiceMock<rx::MockGLFactory> factory; | |
| MockSyncImpl *mImpl; | |
| gl::Sync *mFence; | |
| }; | |
| TEST_F(FenceSyncTest, SetAndGetStatusBehavior) | |
| { | |
| EXPECT_CALL(*mImpl, set(_, _, _)) | |
| .WillOnce(Return(angle::Result::Continue)) | |
| .RetiresOnSaturation(); | |
| EXPECT_EQ(angle::Result::Continue, mFence->set(nullptr, GL_SYNC_GPU_COMMANDS_COMPLETE, 0)); | |
| EXPECT_EQ(static_cast<GLenum>(GL_SYNC_GPU_COMMANDS_COMPLETE), mFence->getCondition()); | |
| // Fake the behavior of testing the fence before and after it's passed. | |
| EXPECT_CALL(*mImpl, getStatus(_, _)) | |
| .WillOnce(DoAll(SetArgumentPointee<1>(GL_UNSIGNALED), Return(angle::Result::Continue))) | |
| .WillOnce(DoAll(SetArgumentPointee<1>(GL_SIGNALED), Return(angle::Result::Continue))) | |
| .RetiresOnSaturation(); | |
| GLint out; | |
| EXPECT_EQ(angle::Result::Continue, mFence->getStatus(nullptr, &out)); | |
| EXPECT_EQ(GL_UNSIGNALED, out); | |
| EXPECT_EQ(angle::Result::Continue, mFence->getStatus(nullptr, &out)); | |
| EXPECT_EQ(GL_SIGNALED, out); | |
| } | |
| } // namespace |