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

#include "ui/gl/gl_fence_egl.h"

#include "ui/gl/egl_util.h"
#include "ui/gl/gl_bindings.h"

namespace gl {

namespace {

bool g_ignore_egl_sync_failures = false;

}  // namespace

// static
void GLFenceEGL::SetIgnoreFailures() {
  g_ignore_egl_sync_failures = true;
}

GLFenceEGL::GLFenceEGL() = default;

// static
std::unique_ptr<GLFenceEGL> GLFenceEGL::Create() {
  auto fence = Create(EGL_SYNC_FENCE_KHR, nullptr);
  // Default creation isn't supposed to fail.
  DCHECK(fence);
  return fence;
}

// static
std::unique_ptr<GLFenceEGL> GLFenceEGL::Create(EGLenum type, EGLint* attribs) {
  // Can't use MakeUnique, the no-args constructor is private.
  auto fence = base::WrapUnique(new GLFenceEGL());

  if (!fence->InitializeInternal(type, attribs))
    return nullptr;
  return fence;
}

bool GLFenceEGL::InitializeInternal(EGLenum type, EGLint* attribs) {
  display_ = eglGetCurrentDisplay();
  sync_ = eglCreateSyncKHR(display_, type, attribs);
  glFlush();
  return sync_ != EGL_NO_SYNC_KHR;
}

bool GLFenceEGL::HasCompleted() {
  EGLint value = 0;
  if (eglGetSyncAttribKHR(display_, sync_, EGL_SYNC_STATUS_KHR, &value) !=
      EGL_TRUE) {
    LOG(ERROR) << "Failed to get EGLSync attribute. error code:"
               << eglGetError();
    return true;
  }

  DCHECK(value == EGL_SIGNALED_KHR || value == EGL_UNSIGNALED_KHR);
  return !value || value == EGL_SIGNALED_KHR;
}

void GLFenceEGL::ClientWait() {
  EGLint result = ClientWaitWithTimeoutNanos(EGL_FOREVER_KHR);
  DCHECK(g_ignore_egl_sync_failures || EGL_TIMEOUT_EXPIRED_KHR != result);
}

EGLint GLFenceEGL::ClientWaitWithTimeoutNanos(EGLTimeKHR timeout) {
  EGLint flags = 0;
  EGLint result = eglClientWaitSyncKHR(display_, sync_, flags, timeout);
  if (result == EGL_FALSE) {
    LOG(ERROR) << "Failed to wait for EGLSync. error:"
               << ui::GetLastEGLErrorString();
    CHECK(g_ignore_egl_sync_failures);
  }
  return result;
}

void GLFenceEGL::ServerWait() {
  if (!g_driver_egl.ext.b_EGL_KHR_wait_sync) {
    ClientWait();
    return;
  }
  EGLint flags = 0;
  if (eglWaitSyncKHR(display_, sync_, flags) == EGL_FALSE) {
    LOG(ERROR) << "Failed to wait for EGLSync. error:"
               << ui::GetLastEGLErrorString();
    CHECK(g_ignore_egl_sync_failures);
  }
}

void GLFenceEGL::Invalidate() {
  // Do nothing. We want the destructor to destroy the EGL fence even if the GL
  // context was lost. The EGLDisplay may still be valid, and this helps avoid
  // leaks.
}

GLFenceEGL::~GLFenceEGL() {
  eglDestroySyncKHR(display_, sync_);
}

}  // namespace gl
