// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_GFX_GPU_FENCE_H_
#define UI_GFX_GPU_FENCE_H_

#include "base/macros.h"
#include "build/build_config.h"
#include "ui/gfx/gfx_export.h"
#include "ui/gfx/gpu_fence_handle.h"

extern "C" typedef struct _ClientGpuFence* ClientGpuFence;

namespace base {
class TimeTicks;
}  // namespace base

namespace gfx {

// GpuFence objects own a GpuFenceHandle and release the resources in it when
// going out of scope as appropriate.
class GFX_EXPORT GpuFence {
 public:
  // Constructor takes ownership of the source handle's resources.
  explicit GpuFence(GpuFenceHandle handle);
  GpuFence() = delete;
  GpuFence(GpuFence&& other);
  GpuFence& operator=(GpuFence&& other);

  GpuFence(const GpuFence&) = delete;
  GpuFence& operator=(const GpuFence&) = delete;

  ~GpuFence();

  // Returns a const reference to the underlying GpuFenceHandle
  // owned by GpuFence. If you'd like a duplicated handle for use
  // with IPC, call the Clone method on the returned handle.
  const GpuFenceHandle& GetGpuFenceHandle() const;

  // Casts for use with the GLES interface.
  ClientGpuFence AsClientGpuFence();
  static GpuFence* FromClientGpuFence(ClientGpuFence gpu_fence);

  // Wait for the GpuFence to become ready.
  void Wait();

  enum FenceStatus { kSignaled, kNotSignaled, kInvalid };
  static FenceStatus GetStatusChangeTime(int fd, base::TimeTicks* time);

  base::TimeTicks GetMaxTimestamp() const;

 private:
  gfx::GpuFenceHandle fence_handle_;
};

}  // namespace gfx

#endif  // UI_GFX_GPU_FENCE_H_
