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