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

// Fence11.h: Defines the rx::FenceNV11 and rx::Sync11 classes which implement rx::FenceNVImpl
// and rx::SyncImpl.

#ifndef LIBANGLE_RENDERER_D3D_D3D11_FENCE11_H_
#define LIBANGLE_RENDERER_D3D_D3D11_FENCE11_H_

#include "libANGLE/renderer/FenceNVImpl.h"
#include "libANGLE/renderer/SyncImpl.h"

namespace rx
{
class Renderer11;

class FenceNV11 : public FenceNVImpl
{
  public:
    explicit FenceNV11(Renderer11 *renderer);
    ~FenceNV11() 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:
    template <class T>
    friend angle::Result FenceSetHelper(const gl::Context *context, T *fence);
    template <class T>
    friend angle::Result FenceTestHelper(const gl::Context *context,
                                         T *fence,
                                         bool flushCommandBuffer,
                                         GLboolean *outFinished);

    Renderer11 *mRenderer;
    ID3D11Query *mQuery;
};

class Sync11 : public SyncImpl
{
  public:
    explicit Sync11(Renderer11 *renderer);
    ~Sync11() 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:
    template <class T>
    friend angle::Result FenceSetHelper(const gl::Context *context, T *fence);
    template <class T>
    friend angle::Result FenceTestHelper(const gl::Context *context,
                                         T *fence,
                                         bool flushCommandBuffer,
                                         GLboolean *outFinished);

    Renderer11 *mRenderer;
    ID3D11Query *mQuery;
    LONGLONG mCounterFrequency;
};

}  // namespace rx

#endif  // LIBANGLE_RENDERER_D3D_D3D11_FENCE11_H_
