| // |
| // 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 <condition_variable> |
| #include <mutex> |
| |
| #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 |
| { |
| |
| // Common class to be used by both SyncImpl and EGLSyncImpl. |
| // NOTE: SharedEvent is only declared on iOS 12.0+ or mac 10.14+ |
| #if defined(__IPHONE_12_0) || defined(__MAC_10_14) |
| class Sync |
| { |
| public: |
| Sync(); |
| ~Sync(); |
| |
| void onDestroy(); |
| |
| angle::Result initialize(ContextMtl *contextMtl); |
| |
| angle::Result set(ContextMtl *contextMtl, GLenum condition, GLbitfield flags); |
| angle::Result clientWait(ContextMtl *contextMtl, |
| bool flushCommands, |
| uint64_t timeout, |
| GLenum *outResult); |
| void serverWait(ContextMtl *contextMtl); |
| angle::Result getStatus(bool *signaled); |
| |
| private: |
| SharedEventRef mMetalSharedEvent; |
| uint64_t mSetCounter = 0; |
| |
| std::shared_ptr<std::condition_variable> mCv; |
| std::shared_ptr<std::mutex> mLock; |
| }; |
| #else // #if defined(__IPHONE_12_0) || defined(__MAC_10_14) |
| class Sync |
| { |
| public: |
| void onDestroy() { UNREACHABLE(); } |
| |
| angle::Result initialize(ContextMtl *context) |
| { |
| UNREACHABLE(); |
| return angle::Result::Stop; |
| } |
| angle::Result set(ContextMtl *contextMtl, GLenum condition, GLbitfield flags) |
| { |
| UNREACHABLE(); |
| return angle::Result::Stop; |
| } |
| angle::Result clientWait(ContextMtl *context, |
| bool flushCommands, |
| uint64_t timeout, |
| GLenum *outResult) |
| { |
| UNREACHABLE(); |
| return angle::Result::Stop; |
| } |
| void serverWait(ContextMtl *contextMtl) { UNREACHABLE(); } |
| angle::Result getStatus(bool *signaled) |
| { |
| UNREACHABLE(); |
| return angle::Result::Stop; |
| } |
| }; |
| #endif // #if defined(__IPHONE_12_0) || defined(__MAC_10_14) |
| } // 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: |
| mtl::Sync 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: |
| mtl::Sync mSync; |
| }; |
| |
| class EGLSyncMtl final : public EGLSyncImpl |
| { |
| public: |
| EGLSyncMtl(const egl::AttributeMap &attribs); |
| ~EGLSyncMtl() override; |
| |
| void onDestroy(const egl::Display *display) override; |
| |
| egl::Error initialize(const egl::Display *display, |
| const gl::Context *context, |
| EGLenum type) 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 dupNativeFenceFD(const egl::Display *display, EGLint *result) const override; |
| |
| private: |
| mtl::Sync mSync; |
| }; |
| |
| } // namespace rx |
| |
| #endif |