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