// Copyright 2016 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 "modules/webgl/EXTDisjointTimerQueryWebGL2.h"

#include "bindings/modules/v8/WebGLAny.h"
#include "gpu/command_buffer/client/gles2_interface.h"
#include "modules/webgl/WebGLRenderingContextBase.h"

namespace blink {

WebGLExtensionName EXTDisjointTimerQueryWebGL2::name() const {
  return EXTDisjointTimerQueryWebGL2Name;
}

EXTDisjointTimerQueryWebGL2* EXTDisjointTimerQueryWebGL2::create(
    WebGLRenderingContextBase* context) {
  EXTDisjointTimerQueryWebGL2* o = new EXTDisjointTimerQueryWebGL2(context);
  return o;
}

bool EXTDisjointTimerQueryWebGL2::supported(
    WebGLRenderingContextBase* context) {
  return context->extensionsUtil()->supportsExtension(
      "GL_EXT_disjoint_timer_query");
}

const char* EXTDisjointTimerQueryWebGL2::extensionName() {
  return "EXT_disjoint_timer_query_webgl2";
}

void EXTDisjointTimerQueryWebGL2::queryCounterEXT(WebGLQuery* query,
                                                  GLenum target) {
  WebGLExtensionScopedContext scoped(this);
  if (scoped.isLost())
    return;

  DCHECK(query);
  if (query->isDeleted() ||
      !query->validate(scoped.context()->contextGroup(), scoped.context())) {
    scoped.context()->synthesizeGLError(GL_INVALID_OPERATION, "queryCounterEXT",
                                        "invalid query");
    return;
  }

  if (target != GL_TIMESTAMP_EXT) {
    scoped.context()->synthesizeGLError(GL_INVALID_ENUM, "queryCounterEXT",
                                        "invalid target");
    return;
  }

  if (query->hasTarget() && query->getTarget() != target) {
    scoped.context()->synthesizeGLError(GL_INVALID_OPERATION, "queryCounterEXT",
                                        "target does not match query");
    return;
  }

  // Timestamps are disabled in WebGL due to lack of driver support on multiple
  // platforms, so we don't actually perform a GL call.
  query->setTarget(target);
  query->resetCachedResult();
}

DEFINE_TRACE(EXTDisjointTimerQueryWebGL2) {
  WebGLExtension::trace(visitor);
}

EXTDisjointTimerQueryWebGL2::EXTDisjointTimerQueryWebGL2(
    WebGLRenderingContextBase* context)
    : WebGLExtension(context) {
  context->extensionsUtil()->ensureExtensionEnabled(
      "GL_EXT_disjoint_timer_query_webgl2");
}

}  // namespace blink
