// 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 "mojo/gpu/gl_context.h"

#include "mojo/public/cpp/application/connect.h"
#include "mojo/public/interfaces/application/application_connector.mojom.h"
#include "mojo/services/gpu/interfaces/gpu.mojom.h"

namespace mojo {

GLContext::GLContext(InterfaceHandle<CommandBuffer> command_buffer)
    : mgl_context_(
          MGLCreateContext(MGL_API_VERSION_GLES2,
                           command_buffer.PassHandle().release().value(),
                           MGL_NO_CONTEXT,
                           &ContextLostThunk,
                           this,
                           Environment::GetDefaultAsyncWaiter())) {
  DCHECK(mgl_context_ != MGL_NO_CONTEXT);
}

GLContext::~GLContext() {
  MGLDestroyContext(mgl_context_);
}

scoped_refptr<GLContext> GLContext::CreateOffscreen(
    ApplicationConnector* connector) {
  ServiceProviderPtr native_viewport;
  connector->ConnectToApplication("mojo:native_viewport_service",
                                  GetProxy(&native_viewport), nullptr);
  GpuPtr gpu_service;
  ConnectToService(native_viewport.get(), &gpu_service);
  InterfaceHandle<CommandBuffer> command_buffer;
  gpu_service->CreateOffscreenGLES2Context(GetProxy(&command_buffer));
  return new GLContext(command_buffer.Pass());
}

scoped_refptr<GLContext> GLContext::CreateFromCommandBuffer(
    InterfaceHandle<CommandBuffer> command_buffer) {
  return new GLContext(command_buffer.Pass());
}

bool GLContext::IsCurrent() const {
  return mgl_context_ == MGLGetCurrentContext();
}

void GLContext::AddObserver(Observer* observer) {
  DCHECK(observer);
  observers_.AddObserver(observer);
}

void GLContext::RemoveObserver(Observer* observer) {
  DCHECK(observer);
  observers_.RemoveObserver(observer);
}

void GLContext::ContextLostThunk(void* self) {
  static_cast<GLContext*>(self)->OnContextLost();
}

void GLContext::OnContextLost() {
  DCHECK(!lost_);

  lost_ = true;
  FOR_EACH_OBSERVER(Observer, observers_, OnContextLost());
}

GLContext::Scope::Scope(const scoped_refptr<GLContext>& gl_context)
    : gl_context_(gl_context), prior_mgl_context_(MGLGetCurrentContext()) {
  DCHECK(gl_context_);
  CHECK(!gl_context_->is_lost());  // common bug, check it in release builds

  MGLMakeCurrent(gl_context_->mgl_context_);
}

GLContext::Scope::~Scope() {
  DCHECK(gl_context_->IsCurrent());

  MGLMakeCurrent(prior_mgl_context_);
}

GLContext::Observer::~Observer() {}

}  // namespace mojo
