1cb93a386Sopenharmony_ci// 2cb93a386Sopenharmony_ci// Copyright 2002 The ANGLE Project Authors. All rights reserved. 3cb93a386Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be 4cb93a386Sopenharmony_ci// found in the LICENSE file. 5cb93a386Sopenharmony_ci// 6cb93a386Sopenharmony_ci 7cb93a386Sopenharmony_ci// Fence.cpp: Implements the gl::FenceNV and gl::Sync classes. 8cb93a386Sopenharmony_ci 9cb93a386Sopenharmony_ci#include "libANGLE/Fence.h" 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "angle_gl.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci#include "common/utilities.h" 14cb93a386Sopenharmony_ci#include "libANGLE/renderer/FenceNVImpl.h" 15cb93a386Sopenharmony_ci#include "libANGLE/renderer/GLImplFactory.h" 16cb93a386Sopenharmony_ci#include "libANGLE/renderer/SyncImpl.h" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_cinamespace gl 19cb93a386Sopenharmony_ci{ 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ciFenceNV::FenceNV(rx::GLImplFactory *factory) 22cb93a386Sopenharmony_ci : mFence(factory->createFenceNV()), mIsSet(false), mStatus(GL_FALSE), mCondition(GL_NONE) 23cb93a386Sopenharmony_ci{} 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ciFenceNV::~FenceNV() 26cb93a386Sopenharmony_ci{ 27cb93a386Sopenharmony_ci SafeDelete(mFence); 28cb93a386Sopenharmony_ci} 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_civoid FenceNV::onDestroy(const gl::Context *context) 31cb93a386Sopenharmony_ci{ 32cb93a386Sopenharmony_ci mFence->onDestroy(context); 33cb93a386Sopenharmony_ci} 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ciangle::Result FenceNV::set(const Context *context, GLenum condition) 36cb93a386Sopenharmony_ci{ 37cb93a386Sopenharmony_ci ANGLE_TRY(mFence->set(context, condition)); 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci mCondition = condition; 40cb93a386Sopenharmony_ci mStatus = GL_FALSE; 41cb93a386Sopenharmony_ci mIsSet = true; 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci return angle::Result::Continue; 44cb93a386Sopenharmony_ci} 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ciangle::Result FenceNV::test(const Context *context, GLboolean *outResult) 47cb93a386Sopenharmony_ci{ 48cb93a386Sopenharmony_ci // Flush the command buffer by default 49cb93a386Sopenharmony_ci ANGLE_TRY(mFence->test(context, &mStatus)); 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci *outResult = mStatus; 52cb93a386Sopenharmony_ci return angle::Result::Continue; 53cb93a386Sopenharmony_ci} 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ciangle::Result FenceNV::finish(const Context *context) 56cb93a386Sopenharmony_ci{ 57cb93a386Sopenharmony_ci ASSERT(mIsSet); 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci ANGLE_TRY(mFence->finish(context)); 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci mStatus = GL_TRUE; 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci return angle::Result::Continue; 64cb93a386Sopenharmony_ci} 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ciSync::Sync(rx::GLImplFactory *factory, GLuint id) 67cb93a386Sopenharmony_ci : RefCountObject(factory->generateSerial(), id), 68cb93a386Sopenharmony_ci mFence(factory->createSync()), 69cb93a386Sopenharmony_ci mLabel(), 70cb93a386Sopenharmony_ci mCondition(GL_SYNC_GPU_COMMANDS_COMPLETE), 71cb93a386Sopenharmony_ci mFlags(0) 72cb93a386Sopenharmony_ci{} 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_civoid Sync::onDestroy(const Context *context) 75cb93a386Sopenharmony_ci{ 76cb93a386Sopenharmony_ci ASSERT(mFence); 77cb93a386Sopenharmony_ci mFence->onDestroy(context); 78cb93a386Sopenharmony_ci} 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ciSync::~Sync() 81cb93a386Sopenharmony_ci{ 82cb93a386Sopenharmony_ci SafeDelete(mFence); 83cb93a386Sopenharmony_ci} 84cb93a386Sopenharmony_ci 85cb93a386Sopenharmony_civoid Sync::setLabel(const Context *context, const std::string &label) 86cb93a386Sopenharmony_ci{ 87cb93a386Sopenharmony_ci mLabel = label; 88cb93a386Sopenharmony_ci} 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ciconst std::string &Sync::getLabel() const 91cb93a386Sopenharmony_ci{ 92cb93a386Sopenharmony_ci return mLabel; 93cb93a386Sopenharmony_ci} 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_ciangle::Result Sync::set(const Context *context, GLenum condition, GLbitfield flags) 96cb93a386Sopenharmony_ci{ 97cb93a386Sopenharmony_ci ANGLE_TRY(mFence->set(context, condition, flags)); 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_ci mCondition = condition; 100cb93a386Sopenharmony_ci mFlags = flags; 101cb93a386Sopenharmony_ci return angle::Result::Continue; 102cb93a386Sopenharmony_ci} 103cb93a386Sopenharmony_ci 104cb93a386Sopenharmony_ciangle::Result Sync::clientWait(const Context *context, 105cb93a386Sopenharmony_ci GLbitfield flags, 106cb93a386Sopenharmony_ci GLuint64 timeout, 107cb93a386Sopenharmony_ci GLenum *outResult) 108cb93a386Sopenharmony_ci{ 109cb93a386Sopenharmony_ci ASSERT(mCondition != GL_NONE); 110cb93a386Sopenharmony_ci return mFence->clientWait(context, flags, timeout, outResult); 111cb93a386Sopenharmony_ci} 112cb93a386Sopenharmony_ci 113cb93a386Sopenharmony_ciangle::Result Sync::serverWait(const Context *context, GLbitfield flags, GLuint64 timeout) 114cb93a386Sopenharmony_ci{ 115cb93a386Sopenharmony_ci return mFence->serverWait(context, flags, timeout); 116cb93a386Sopenharmony_ci} 117cb93a386Sopenharmony_ci 118cb93a386Sopenharmony_ciangle::Result Sync::getStatus(const Context *context, GLint *outResult) const 119cb93a386Sopenharmony_ci{ 120cb93a386Sopenharmony_ci return mFence->getStatus(context, outResult); 121cb93a386Sopenharmony_ci} 122cb93a386Sopenharmony_ci 123cb93a386Sopenharmony_ci} // namespace gl 124