Hash :
69e46a18
Author :
Date :
2019-07-03T14:43:32
GL: Implement EGL_ANDROID_native_fence_sync This extension allows Chrome to use ANGLE on newer Android devices. BUG=angleproject:3643 Change-Id: I5456d61749399ca2bbc11cc5e98b9120f8702406 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1687121 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> Commit-Queue: Geoff Lang <geofflang@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
//
// Copyright 2019 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.
//
// SyncEGL.cpp: Implements the rx::SyncEGL class.
#include "libANGLE/renderer/gl/egl/SyncEGL.h"
#include "libANGLE/AttributeMap.h"
#include "libANGLE/Display.h"
#include "libANGLE/renderer/gl/egl/FunctionsEGL.h"
namespace rx
{
SyncEGL::SyncEGL(const egl::AttributeMap &attribs, const FunctionsEGL *egl)
: mEGL(egl),
mNativeFenceFD(
attribs.getAsInt(EGL_SYNC_NATIVE_FENCE_FD_ANDROID, EGL_NO_NATIVE_FENCE_FD_ANDROID)),
mSync(EGL_NO_SYNC_KHR)
{}
SyncEGL::~SyncEGL()
{
ASSERT(mSync == EGL_NO_SYNC_KHR);
}
void SyncEGL::onDestroy(const egl::Display *display)
{
ASSERT(mSync != EGL_NO_SYNC_KHR);
mEGL->destroySyncKHR(mSync);
mSync = EGL_NO_SYNC_KHR;
}
egl::Error SyncEGL::initialize(const egl::Display *display,
const gl::Context *context,
EGLenum type)
{
ASSERT(type == EGL_SYNC_FENCE_KHR || type == EGL_SYNC_NATIVE_FENCE_ANDROID);
std::vector<EGLint> attribs;
if (type == EGL_SYNC_NATIVE_FENCE_ANDROID)
{
attribs.push_back(EGL_SYNC_NATIVE_FENCE_FD_ANDROID);
attribs.push_back(mNativeFenceFD);
}
attribs.push_back(EGL_NONE);
mSync = mEGL->createSyncKHR(type, attribs.data());
if (mSync == EGL_NO_SYNC_KHR)
{
return egl::Error(mEGL->getError(), "eglCreateSync failed to create sync object");
}
return egl::NoError();
}
egl::Error SyncEGL::clientWait(const egl::Display *display,
const gl::Context *context,
EGLint flags,
EGLTime timeout,
EGLint *outResult)
{
ASSERT(mSync != EGL_NO_SYNC_KHR);
EGLint result = mEGL->clientWaitSyncKHR(mSync, flags, timeout);
if (result == EGL_FALSE)
{
return egl::Error(mEGL->getError(), "eglClientWaitSync failed");
}
*outResult = result;
return egl::NoError();
}
egl::Error SyncEGL::serverWait(const egl::Display *display,
const gl::Context *context,
EGLint flags)
{
ASSERT(mSync != EGL_NO_SYNC_KHR);
EGLint result = mEGL->waitSyncKHR(mSync, flags);
if (result == EGL_FALSE)
{
return egl::Error(mEGL->getError(), "eglWaitSync failed");
}
return egl::NoError();
}
egl::Error SyncEGL::getStatus(const egl::Display *display, EGLint *outStatus)
{
ASSERT(mSync != EGL_NO_SYNC_KHR);
EGLBoolean result = mEGL->getSyncAttribKHR(mSync, EGL_SYNC_STATUS_KHR, outStatus);
if (result == EGL_FALSE)
{
return egl::Error(mEGL->getError(), "eglGetSyncAttribKHR with EGL_SYNC_STATUS_KHR failed");
}
return egl::NoError();
}
egl::Error SyncEGL::dupNativeFenceFD(const egl::Display *display, EGLint *result) const
{
ASSERT(mSync != EGL_NO_SYNC_KHR);
*result = mEGL->dupNativeFenceFDANDROID(mSync);
if (*result == EGL_NO_NATIVE_FENCE_FD_ANDROID)
{
return egl::Error(mEGL->getError(), "eglDupNativeFenceFDANDROID failed");
}
return egl::NoError();
}
} // namespace rx