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// EGLSync.cpp: Implements the egl::Sync class.
8cb93a386Sopenharmony_ci
9cb93a386Sopenharmony_ci#include "libANGLE/EGLSync.h"
10cb93a386Sopenharmony_ci
11cb93a386Sopenharmony_ci#include "angle_gl.h"
12cb93a386Sopenharmony_ci
13cb93a386Sopenharmony_ci#include "common/utilities.h"
14cb93a386Sopenharmony_ci#include "libANGLE/renderer/EGLImplFactory.h"
15cb93a386Sopenharmony_ci#include "libANGLE/renderer/EGLReusableSync.h"
16cb93a386Sopenharmony_ci#include "libANGLE/renderer/EGLSyncImpl.h"
17cb93a386Sopenharmony_ci
18cb93a386Sopenharmony_cinamespace egl
19cb93a386Sopenharmony_ci{
20cb93a386Sopenharmony_ci
21cb93a386Sopenharmony_ciSync::Sync(rx::EGLImplFactory *factory, EGLenum type, const AttributeMap &attribs)
22cb93a386Sopenharmony_ci    : mLabel(nullptr),
23cb93a386Sopenharmony_ci      mType(type),
24cb93a386Sopenharmony_ci      mCondition(EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR),
25cb93a386Sopenharmony_ci      mNativeFenceFD(
26cb93a386Sopenharmony_ci          attribs.getAsInt(EGL_SYNC_NATIVE_FENCE_FD_ANDROID, EGL_NO_NATIVE_FENCE_FD_ANDROID))
27cb93a386Sopenharmony_ci{
28cb93a386Sopenharmony_ci    switch (type)
29cb93a386Sopenharmony_ci    {
30cb93a386Sopenharmony_ci        case EGL_SYNC_FENCE:
31cb93a386Sopenharmony_ci        case EGL_SYNC_NATIVE_FENCE_ANDROID:
32cb93a386Sopenharmony_ci            mFence = std::unique_ptr<rx::EGLSyncImpl>(factory->createSync(attribs));
33cb93a386Sopenharmony_ci            break;
34cb93a386Sopenharmony_ci
35cb93a386Sopenharmony_ci        case EGL_SYNC_REUSABLE_KHR:
36cb93a386Sopenharmony_ci            mFence = std::unique_ptr<rx::EGLSyncImpl>(new rx::ReusableSync(attribs));
37cb93a386Sopenharmony_ci            break;
38cb93a386Sopenharmony_ci
39cb93a386Sopenharmony_ci        default:
40cb93a386Sopenharmony_ci            UNREACHABLE();
41cb93a386Sopenharmony_ci    }
42cb93a386Sopenharmony_ci
43cb93a386Sopenharmony_ci    // Per extension spec: Signaling Condition.
44cb93a386Sopenharmony_ci    // "If the EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute is not
45cb93a386Sopenharmony_ci    // EGL_NO_NATIVE_FENCE_FD_ANDROID then the EGL_SYNC_CONDITION_KHR attribute
46cb93a386Sopenharmony_ci    // is set to EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID and the EGL_SYNC_STATUS_KHR
47cb93a386Sopenharmony_ci    // attribute is set to reflect the signal status of the native fence object.
48cb93a386Sopenharmony_ci    if ((mType == EGL_SYNC_NATIVE_FENCE_ANDROID) &&
49cb93a386Sopenharmony_ci        (mNativeFenceFD != EGL_NO_NATIVE_FENCE_FD_ANDROID))
50cb93a386Sopenharmony_ci    {
51cb93a386Sopenharmony_ci        mCondition = EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID;
52cb93a386Sopenharmony_ci    }
53cb93a386Sopenharmony_ci}
54cb93a386Sopenharmony_ci
55cb93a386Sopenharmony_civoid Sync::onDestroy(const Display *display)
56cb93a386Sopenharmony_ci{
57cb93a386Sopenharmony_ci    ASSERT(mFence);
58cb93a386Sopenharmony_ci    mFence->onDestroy(display);
59cb93a386Sopenharmony_ci    mFence.reset();
60cb93a386Sopenharmony_ci}
61cb93a386Sopenharmony_ci
62cb93a386Sopenharmony_ciSync::~Sync() {}
63cb93a386Sopenharmony_ci
64cb93a386Sopenharmony_ciError Sync::initialize(const Display *display, const gl::Context *context)
65cb93a386Sopenharmony_ci{
66cb93a386Sopenharmony_ci    return mFence->initialize(display, context, mType);
67cb93a386Sopenharmony_ci}
68cb93a386Sopenharmony_ci
69cb93a386Sopenharmony_civoid Sync::setLabel(EGLLabelKHR label)
70cb93a386Sopenharmony_ci{
71cb93a386Sopenharmony_ci    mLabel = label;
72cb93a386Sopenharmony_ci}
73cb93a386Sopenharmony_ci
74cb93a386Sopenharmony_ciEGLLabelKHR Sync::getLabel() const
75cb93a386Sopenharmony_ci{
76cb93a386Sopenharmony_ci    return mLabel;
77cb93a386Sopenharmony_ci}
78cb93a386Sopenharmony_ci
79cb93a386Sopenharmony_ciError Sync::clientWait(const Display *display,
80cb93a386Sopenharmony_ci                       const gl::Context *context,
81cb93a386Sopenharmony_ci                       EGLint flags,
82cb93a386Sopenharmony_ci                       EGLTime timeout,
83cb93a386Sopenharmony_ci                       EGLint *outResult)
84cb93a386Sopenharmony_ci{
85cb93a386Sopenharmony_ci    return mFence->clientWait(display, context, flags, timeout, outResult);
86cb93a386Sopenharmony_ci}
87cb93a386Sopenharmony_ci
88cb93a386Sopenharmony_ciError Sync::serverWait(const Display *display, const gl::Context *context, EGLint flags)
89cb93a386Sopenharmony_ci{
90cb93a386Sopenharmony_ci    return mFence->serverWait(display, context, flags);
91cb93a386Sopenharmony_ci}
92cb93a386Sopenharmony_ci
93cb93a386Sopenharmony_ciError Sync::signal(const Display *display, const gl::Context *context, EGLint mode)
94cb93a386Sopenharmony_ci{
95cb93a386Sopenharmony_ci    return mFence->signal(display, context, mode);
96cb93a386Sopenharmony_ci}
97cb93a386Sopenharmony_ci
98cb93a386Sopenharmony_ciError Sync::getStatus(const Display *display, EGLint *outStatus) const
99cb93a386Sopenharmony_ci{
100cb93a386Sopenharmony_ci    return mFence->getStatus(display, outStatus);
101cb93a386Sopenharmony_ci}
102cb93a386Sopenharmony_ci
103cb93a386Sopenharmony_ciError Sync::dupNativeFenceFD(const Display *display, EGLint *result) const
104cb93a386Sopenharmony_ci{
105cb93a386Sopenharmony_ci    return mFence->dupNativeFenceFD(display, result);
106cb93a386Sopenharmony_ci}
107cb93a386Sopenharmony_ci
108cb93a386Sopenharmony_ci}  // namespace egl
109