// Copyright 2018 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 "third_party/blink/renderer/modules/webgl/ovr_multiview_2.h"

#include "third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.h"
#include "third_party/blink/renderer/modules/webgl/webgl_framebuffer.h"
#include "third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h"

namespace blink {

OVRMultiview2::OVRMultiview2(WebGLRenderingContextBase* context)
    : WebGLExtension(context) {
  context->ExtensionsUtil()->EnsureExtensionEnabled("GL_OVR_multiview2");
  context->ContextGL()->GetIntegerv(GL_MAX_VIEWS_OVR, &max_views_ovr_);
}

WebGLExtensionName OVRMultiview2::GetName() const {
  return kOVRMultiview2Name;
}

OVRMultiview2* OVRMultiview2::Create(WebGLRenderingContextBase* context) {
  return MakeGarbageCollected<OVRMultiview2>(context);
}

void OVRMultiview2::framebufferTextureMultiviewOVR(GLenum target,
                                                   GLenum attachment,
                                                   WebGLTexture* texture,
                                                   GLint level,
                                                   GLint base_view_index,
                                                   GLsizei num_views) {
  WebGLExtensionScopedContext scoped(this);
  if (scoped.IsLost())
    return;
  if (!scoped.Context()->ValidateNullableWebGLObject(
          "framebufferTextureMultiviewOVR", texture))
    return;
  GLenum textarget = texture ? texture->GetTarget() : 0;
  if (texture) {
    if (textarget != GL_TEXTURE_2D_ARRAY) {
      scoped.Context()->SynthesizeGLError(GL_INVALID_OPERATION,
                                          "framebufferTextureMultiviewOVR",
                                          "invalid texture type");
      return;
    }
    if (num_views < 1) {
      scoped.Context()->SynthesizeGLError(GL_INVALID_VALUE,
                                          "framebufferTextureMultiviewOVR",
                                          "numViews is less than one");
      return;
    }
    if (num_views > max_views_ovr_) {
      scoped.Context()->SynthesizeGLError(
          GL_INVALID_VALUE, "framebufferTextureMultiviewOVR",
          "numViews is more than the value of MAX_VIEWS_OVR");
      return;
    }
    if (!static_cast<WebGL2RenderingContextBase*>(scoped.Context())
             ->ValidateTexFuncLayer("framebufferTextureMultiviewOVR", textarget,
                                    base_view_index))
      return;
    if (!static_cast<WebGL2RenderingContextBase*>(scoped.Context())
             ->ValidateTexFuncLayer("framebufferTextureMultiviewOVR", textarget,
                                    base_view_index + num_views - 1))
      return;
    if (!scoped.Context()->ValidateTexFuncLevel(
            "framebufferTextureMultiviewOVR", textarget, level))
      return;
  }

  WebGLFramebuffer* framebuffer_binding =
      scoped.Context()->GetFramebufferBinding(target);
  if (!framebuffer_binding || !framebuffer_binding->Object()) {
    scoped.Context()->SynthesizeGLError(GL_INVALID_OPERATION,
                                        "framebufferTextureMultiviewOVR",
                                        "no framebuffer bound");
    return;
  }

  framebuffer_binding->SetAttachmentForBoundFramebuffer(
      target, attachment, textarget, texture, level, base_view_index,
      num_views);
  scoped.Context()->ApplyStencilTest();
}

bool OVRMultiview2::Supported(WebGLRenderingContextBase* context) {
  return context->ExtensionsUtil()->SupportsExtension("GL_OVR_multiview2");
}

const char* OVRMultiview2::ExtensionName() {
  return "OVR_multiview2";
}

}  // namespace blink
