blob: 7fd86081dc29ae8d84725a2f9bcfc1c9f71c79a5 [file] [log] [blame]
// 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/gles2/gles2_support_impl.h"
#include "base/lazy_instance.h"
#include "gpu/command_buffer/client/gles2_interface.h"
#include "mojo/gles2/gles2_context.h"
#include "mojo/public/gles2/gles2_interface.h"
#include "mojo/public/gles2/gles2_private.h"
namespace mojo {
namespace gles2 {
namespace {
class GLES2ImplForCommandBuffer : public GLES2Interface {
public:
GLES2ImplForCommandBuffer() : gpu_interface_(NULL) {}
void set_gpu_interface(gpu::gles2::GLES2Interface* gpu_interface) {
gpu_interface_ = gpu_interface;
}
gpu::gles2::GLES2Interface* gpu_interface() const { return gpu_interface_; }
#define VISIT_GL_CALL(Function, ReturnType, PARAMETERS, ARGUMENTS) \
virtual ReturnType Function PARAMETERS OVERRIDE { \
return gpu_interface_->Function ARGUMENTS; \
}
#include "mojo/public/c/gles2/gles2_call_visitor_autogen.h"
#undef VISIT_GL_CALL
private:
gpu::gles2::GLES2Interface* gpu_interface_;
DISALLOW_COPY_AND_ASSIGN(GLES2ImplForCommandBuffer);
};
base::LazyInstance<GLES2ImplForCommandBuffer> g_gles2_interface =
LAZY_INSTANCE_INITIALIZER;
} // anonymous namespace
GLES2SupportImpl::GLES2SupportImpl() : async_waiter_(NULL) {}
GLES2SupportImpl::~GLES2SupportImpl() {}
// static
void GLES2SupportImpl::Init() { GLES2Support::Init(new GLES2SupportImpl()); }
void GLES2SupportImpl::Initialize(const MojoAsyncWaiter* async_waiter) {
DCHECK(!async_waiter_);
DCHECK(async_waiter);
async_waiter_ = async_waiter;
}
void GLES2SupportImpl::Terminate() {
DCHECK(async_waiter_);
async_waiter_ = NULL;
}
MojoGLES2Context GLES2SupportImpl::CreateContext(
MessagePipeHandle handle,
MojoGLES2ContextLost lost_callback,
MojoGLES2DrawAnimationFrame animation_callback,
void* closure) {
ScopedMessagePipeHandle scoped_handle(handle);
scoped_ptr<GLES2Context> client(new GLES2Context(async_waiter_,
scoped_handle.Pass(),
lost_callback,
animation_callback,
closure));
if (!client->Initialize())
client.reset();
return client.release();
}
void GLES2SupportImpl::DestroyContext(MojoGLES2Context context) {
delete static_cast<GLES2Context*>(context);
}
void GLES2SupportImpl::MakeCurrent(MojoGLES2Context context) {
gpu::gles2::GLES2Interface* interface = NULL;
if (context) {
GLES2Context* client = static_cast<GLES2Context*>(context);
interface = client->interface();
DCHECK(interface);
}
g_gles2_interface.Get().set_gpu_interface(interface);
}
void GLES2SupportImpl::SwapBuffers() {
g_gles2_interface.Get().gpu_interface()->SwapBuffers();
}
void GLES2SupportImpl::RequestAnimationFrames(MojoGLES2Context context) {
static_cast<GLES2Context*>(context)->RequestAnimationFrames();
}
void GLES2SupportImpl::CancelAnimationFrames(MojoGLES2Context context) {
static_cast<GLES2Context*>(context)->CancelAnimationFrames();
}
void* GLES2SupportImpl::GetGLES2Interface(MojoGLES2Context context) {
return static_cast<GLES2Context*>(context)->interface();
}
void* GLES2SupportImpl::GetContextSupport(MojoGLES2Context context) {
return static_cast<GLES2Context*>(context)->context_support();
}
GLES2Interface* GLES2SupportImpl::GetGLES2InterfaceForCurrentContext() {
return &g_gles2_interface.Get();
}
} // namespace gles2
} // namespace mojo