Hash :
bd5dce9a
Author :
Date :
2023-11-21T15:39:04
Metal: Use MTLEvent instead of MTLSharedEvent when possible Refactor mtl::Sync to be abstract and have multiple implementations using either MTLEvent or MTLSharedEvent. Use MTLEvent in all cases except for EGL Syncs when the user sets the sync type to EGL_SYNC_METAL_SHARED_EVENT_ANGLE. Determine completion of the sync object by watching for completion of the command buffer where the event's signaling was enqueued. Avoid any sleep loops by waiting on a condition_variable which is notified when the completed queue serial is updated. Forked from CLs by sky@ and kbr@ Bug: angleproject:8153 Change-Id: I4547444b596366496c811cb9954872b85ab14ad8 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5133706 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@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
//
// Copyright (c) 2020 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.
//
// SyncMtl:
// Defines the class interface for SyncMtl, implementing SyncImpl.
//
#ifndef LIBANGLE_RENDERER_METAL_SYNCMTL_H_
#define LIBANGLE_RENDERER_METAL_SYNCMTL_H_
#include <optional>
#include "libANGLE/renderer/EGLSyncImpl.h"
#include "libANGLE/renderer/FenceNVImpl.h"
#include "libANGLE/renderer/SyncImpl.h"
#include "libANGLE/renderer/metal/mtl_common.h"
namespace egl
{
class AttributeMap;
}
namespace rx
{
class ContextMtl;
namespace mtl
{
class SyncImpl;
} // namespace mtl
class FenceNVMtl : public FenceNVImpl
{
public:
FenceNVMtl();
~FenceNVMtl() override;
void onDestroy(const gl::Context *context) override;
angle::Result set(const gl::Context *context, GLenum condition) override;
angle::Result test(const gl::Context *context, GLboolean *outFinished) override;
angle::Result finish(const gl::Context *context) override;
private:
std::unique_ptr<mtl::SyncImpl> mSync;
};
class SyncMtl : public SyncImpl
{
public:
SyncMtl();
~SyncMtl() override;
void onDestroy(const gl::Context *context) override;
angle::Result set(const gl::Context *context, GLenum condition, GLbitfield flags) override;
angle::Result clientWait(const gl::Context *context,
GLbitfield flags,
GLuint64 timeout,
GLenum *outResult) override;
angle::Result serverWait(const gl::Context *context,
GLbitfield flags,
GLuint64 timeout) override;
angle::Result getStatus(const gl::Context *context, GLint *outResult) override;
private:
std::unique_ptr<mtl::SyncImpl> mSync;
};
class EGLSyncMtl final : public EGLSyncImpl
{
public:
EGLSyncMtl();
~EGLSyncMtl() override;
void onDestroy(const egl::Display *display) override;
egl::Error initialize(const egl::Display *display,
const gl::Context *context,
EGLenum type,
const egl::AttributeMap &attribs) override;
egl::Error clientWait(const egl::Display *display,
const gl::Context *context,
EGLint flags,
EGLTime timeout,
EGLint *outResult) override;
egl::Error serverWait(const egl::Display *display,
const gl::Context *context,
EGLint flags) override;
egl::Error getStatus(const egl::Display *display, EGLint *outStatus) override;
egl::Error copyMetalSharedEventANGLE(const egl::Display *display, void **result) const override;
egl::Error dupNativeFenceFD(const egl::Display *display, EGLint *result) const override;
private:
mtl::AutoObjCPtr<id<MTLSharedEvent>> mSharedEvent;
std::unique_ptr<mtl::SyncImpl> mSync;
};
} // namespace rx
#endif