// Copyright 2015 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/gles2/control_thunks_impl.h"

#include "mojo/gles2/gles2_context.h"
#include "mojo/public/cpp/system/message_pipe.h"

extern "C" {

#define VISIT_GL_CALL(Function, ReturnType, PARAMETERS, ARGUMENTS) \
  ReturnType MojoGLES2gl##Function PARAMETERS;
#include "mojo/public/platform/native/gles2/call_visitor.h"
#undef VISIT_GL_CALL

}

namespace gles2 {

// static
ControlThunksImpl* ControlThunksImpl::Get() {
  static auto* thunks = new ControlThunksImpl;
  return thunks;
}

MGLContext ControlThunksImpl::CreateContext(
    MGLOpenGLAPIVersion version,
    MojoHandle command_buffer_handle,
    MGLContext share_group,
    MGLContextLostCallback lost_callback,
    void* lost_callback_closure,
    const struct MojoAsyncWaiter* async_waiter) {
  mojo::MessagePipeHandle mph(command_buffer_handle);
  mojo::ScopedMessagePipeHandle scoped_handle(mph);
  scoped_ptr<GLES2Context> client(
      new GLES2Context(async_waiter, scoped_handle.Pass(), lost_callback,
                       lost_callback_closure));
  if (!client->Initialize())
    client.reset();
  return client.release();
}

void ControlThunksImpl::DestroyContext(MGLContext context) {
  delete static_cast<GLES2Context*>(context);
}

void ControlThunksImpl::MakeCurrent(MGLContext context) {
  current_context_tls_.Set(static_cast<GLES2Context*>(context));
}

MGLContext ControlThunksImpl::GetCurrentContext() {
  return current_context_tls_.Get();
}

void ControlThunksImpl::ResizeSurface(uint32_t width, uint32_t height) {
  current_context_tls_.Get()->interface()->ResizeCHROMIUM(width, height, 1.f);
}

void ControlThunksImpl::SwapBuffers() {
  current_context_tls_.Get()->interface()->SwapBuffers();
}


MGLMustCastToProperFunctionPointerType ControlThunksImpl::GetProcAddress(
    const char* name) {
#define VISIT_GL_CALL(Function, ReturnType, PARAMETERS, ARGUMENTS) \
  if (!strcmp(name, "gl"#Function)) \
    return reinterpret_cast<MGLMustCastToProperFunctionPointerType>( \
        MojoGLES2gl##Function);
#include "mojo/public/platform/native/gles2/call_visitor.h"
#undef VISIT_GL_CALL
  return nullptr;
}

void* ControlThunksImpl::GetGLES2Interface(MGLContext context) {
  GLES2Context* client = reinterpret_cast<GLES2Context*>(context);
  DCHECK(client);
  return client->interface();
}

void ControlThunksImpl::Echo(MGLEchoCallback callback, void* closure) {
  current_context_tls_.Get()->Echo(callback, closure);
}

void ControlThunksImpl::SignalSyncPoint(
    uint32_t sync_point,
    MGLSignalSyncPointCallback callback,
    void* closure) {
  current_context_tls_.Get()->context_support()->SignalSyncPoint(
      sync_point, base::Bind(callback, closure));
}

gpu::gles2::GLES2Interface* ControlThunksImpl::CurrentGLES2Interface() {
  if (!current_context_tls_.Get())
    return nullptr;
  return current_context_tls_.Get()->interface();
}

ControlThunksImpl::ControlThunksImpl() {
}

ControlThunksImpl::~ControlThunksImpl() {
}

}  // namespace gles2
