// Copyright (c) 2012 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_context_stub.h"

#include "ui/gl/gl_gl_api_implementation.h"
#include "ui/gl/gl_stub_api.h"

namespace gl {

GLContextStub::GLContextStub() : GLContextStub(nullptr) {}
GLContextStub::GLContextStub(GLShareGroup* share_group)
    : GLContextReal(share_group),
      use_stub_api_(false),
      version_str_("OpenGL ES 3.0") {
  SetExtensionsString("GL_EXT_framebuffer_object");
}

bool GLContextStub::Initialize(GLSurface* compatible_surface,
                               const GLContextAttribs& attribs) {
  return true;
}

bool GLContextStub::MakeCurrent(GLSurface* surface) {
  BindGLApi();
  SetCurrent(surface);
  InitializeDynamicBindings();
  return true;
}

void GLContextStub::ReleaseCurrent(GLSurface* surface) {
  SetCurrent(nullptr);
}

bool GLContextStub::IsCurrent(GLSurface* surface) {
  return GetRealCurrent() == this;
}

void* GLContextStub::GetHandle() {
  return nullptr;
}

std::string GLContextStub::GetGLVersion() {
  return version_str_;
}

std::string GLContextStub::GetGLRenderer() {
  return std::string("CHROMIUM");
}

bool GLContextStub::WasAllocatedUsingRobustnessExtension() {
  return HasExtension("GL_ARB_robustness") ||
         HasExtension("GL_KHR_robustness") || HasExtension("GL_EXT_robustness");
}

void GLContextStub::SetUseStubApi(bool stub_api) {
  use_stub_api_ = stub_api;
}

void GLContextStub::SetExtensionsString(const char* extensions) {
  SetExtensionsFromString(extensions);
}

void GLContextStub::SetGLVersionString(const char* version_str) {
  version_str_ = std::string(version_str ? version_str : "");
}

GLContextStub::~GLContextStub() {}

GLApi* GLContextStub::CreateGLApi(DriverGL* driver) {
  if (use_stub_api_) {
    GLStubApi* stub_api = new GLStubApi();
    if (!version_str_.empty()) {
      stub_api->set_version(version_str_);
    }
    if (!extension_string().empty()) {
      stub_api->set_extensions(extension_string());
    }
    return stub_api;
  }

  return GLContext::CreateGLApi(driver);
}

}  // namespace gl
