зеркало из https://github.com/AvaloniaUI/angle.git
Update EGL_ANGLE_metal_shared_event_sync implementation.
Rename the extension's .txt file to match the current name of the extension. Update function signatures to take EGLSync rather than EGLSyncKHR. The two types are conceptually incompatible. This extension requires the use of eglCreateSync rather than eglCreateSyncKHR because the latter takes an array of EGLInt, but EGLAttrib is needed to express pointers (to MTLSharedEvents) in the attribute list. Revise ContextMtl::flush to use WaitUntilScheduled on older operating systems not supporting MTLSharedEvent. Bug: angleproject:7809 Change-Id: I39197616dc3e1e7ec6dc68dd83b4fde05184debf Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4000941 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org>
This commit is contained in:
Родитель
e449439e00
Коммит
3226cce3a6
|
@ -407,9 +407,9 @@ EGLAPI EGLBoolean EGLAPIENTRY eglExportVkImageANGLE(EGLDisplay dpy, EGLImage ima
|
|||
#define EGL_SYNC_METAL_SHARED_EVENT_OBJECT_ANGLE 0x34D9
|
||||
#define EGL_SYNC_METAL_SHARED_EVENT_SIGNAL_VALUE_LO_ANGLE 0x34DA
|
||||
#define EGL_SYNC_METAL_SHARED_EVENT_SIGNAL_VALUE_HI_ANGLE 0x34DB
|
||||
typedef void* (EGLAPIENTRYP PFNEGLCOPYMETALSHAREDEVENTANGLEPROC)(EGLDisplay dpy, EGLSyncKHR sync);
|
||||
typedef void* (EGLAPIENTRYP PFNEGLCOPYMETALSHAREDEVENTANGLEPROC)(EGLDisplay dpy, EGLSync sync);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI void *EGLAPIENTRY eglCopyMetalSharedEventANGLE(EGLDisplay dpy, EGLSyncKHR sync);
|
||||
EGLAPI void *EGLAPIENTRY eglCopyMetalSharedEventANGLE(EGLDisplay dpy, EGLSync sync);
|
||||
#endif
|
||||
#endif /* EGL_ANGLE_metal_shared_event_sync */
|
||||
|
||||
|
|
|
@ -576,6 +576,7 @@ class ContextMtl : public ContextImpl, public mtl::Context
|
|||
mtl::RenderCommandEncoder mRenderEncoder;
|
||||
mtl::BlitCommandEncoder mBlitEncoder;
|
||||
mtl::ComputeCommandEncoder mComputeEncoder;
|
||||
bool mHasMetalSharedEvents = false;
|
||||
|
||||
// Cached back-end objects
|
||||
FramebufferMtl *mDrawFramebuffer = nullptr;
|
||||
|
|
|
@ -216,7 +216,12 @@ ContextMtl::ContextMtl(const gl::State &state,
|
|||
mDriverUniforms{},
|
||||
mProvokingVertexHelper(this),
|
||||
mContextDevice(GetOwnershipIdentity(attribs))
|
||||
{}
|
||||
{
|
||||
if (@available(iOS 12.0, macOS 10.14, *))
|
||||
{
|
||||
mHasMetalSharedEvents = true;
|
||||
}
|
||||
}
|
||||
|
||||
ContextMtl::~ContextMtl() {}
|
||||
|
||||
|
@ -285,7 +290,22 @@ angle::Result ContextMtl::ensureIncompleteTexturesCreated(const gl::Context *con
|
|||
// Flush and finish.
|
||||
angle::Result ContextMtl::flush(const gl::Context *context)
|
||||
{
|
||||
flushCommandBuffer(mtl::NoWait);
|
||||
if (mHasMetalSharedEvents)
|
||||
{
|
||||
// MTLSharedEvent is available on these platforms, and callers
|
||||
// are expected to use the EGL_ANGLE_metal_shared_event_sync
|
||||
// extension to synchronize with ANGLE's Metal backend, if
|
||||
// needed. This is typically required if two MTLDevices are
|
||||
// operating on the same IOSurface.
|
||||
flushCommandBuffer(mtl::NoWait);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Older operating systems do not have this primitive available.
|
||||
// Make every flush operation wait until it's scheduled in order to
|
||||
// achieve callers' expected synchronization behavior.
|
||||
flushCommandBuffer(mtl::WaitUntilScheduled);
|
||||
}
|
||||
return angle::Result::Continue;
|
||||
}
|
||||
angle::Result ContextMtl::finish(const gl::Context *context)
|
||||
|
|
Загрузка…
Ссылка в новой задаче