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

// FenceNVGL.h: Defines the class interface for FenceNVGL.

#ifndef LIBANGLE_RENDERER_GL_FENCENVGL_H_
#define LIBANGLE_RENDERER_GL_FENCENVGL_H_

#include "libANGLE/renderer/FenceNVImpl.h"

namespace rx
{
class FunctionsGL;

// FenceNV implemented with the native GL_NV_fence extension
class FenceNVGL : public FenceNVImpl
{
  public:
    explicit FenceNVGL(const FunctionsGL *functions);
    ~FenceNVGL() 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;

    static bool Supported(const FunctionsGL *functions);

  private:
    GLuint mFence;

    const FunctionsGL *mFunctions;
};

// FenceNV implemented with the GLsync API
class FenceNVSyncGL : public FenceNVImpl
{
  public:
    explicit FenceNVSyncGL(const FunctionsGL *functions);
    ~FenceNVSyncGL() 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;

    static bool Supported(const FunctionsGL *functions);

  private:
    GLsync mSyncObject;

    const FunctionsGL *mFunctions;
};
}  // namespace rx

#endif  // LIBANGLE_RENDERER_GL_FENCENVGL_H_
