//
// 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.
//

// EGLSyncImpl.h: Defines the rx::EGLSyncImpl class.

#ifndef LIBANGLE_RENDERER_EGLSYNCIMPL_H_
#define LIBANGLE_RENDERER_EGLSYNCIMPL_H_

#include "libANGLE/Error.h"

#include "common/angleutils.h"

#include "angle_gl.h"

namespace egl
{
class AttributeMap;
class ThreadSafeDisplay;
}  // namespace egl

namespace gl
{
class Context;
}  // namespace gl

namespace rx
{
class EGLSyncImpl : angle::NonCopyable
{
  public:
    EGLSyncImpl() {}
    virtual ~EGLSyncImpl() {}

    virtual void onDestroy(const egl::ThreadSafeDisplay *display) {}

    virtual egl::Error initialize(const egl::ThreadSafeDisplay *display,
                                  const gl::Context *context,
                                  EGLenum type,
                                  const egl::AttributeMap &attribs) = 0;
    virtual egl::Error clientWait(const egl::ThreadSafeDisplay *display,
                                  const gl::Context *context,
                                  EGLint flags,
                                  EGLTime timeout,
                                  EGLint *outResult)                = 0;
    virtual egl::Error serverWait(const egl::ThreadSafeDisplay *display,
                                  const gl::Context *context,
                                  EGLint flags)                     = 0;
    virtual egl::Error signal(const egl::ThreadSafeDisplay *display,
                              const gl::Context *context,
                              EGLint mode);
    virtual egl::Error getStatus(const egl::ThreadSafeDisplay *display, EGLint *outStatus) = 0;
    virtual egl::Error copyMetalSharedEventANGLE(const egl::ThreadSafeDisplay *display,
                                                 void **outEvent) const;
    virtual egl::Error dupNativeFenceFD(const egl::ThreadSafeDisplay *display, EGLint *fdOut) const;
};
}  // namespace rx

#endif  // LIBANGLE_RENDERER_EGLSYNCIMPL_H_
