// 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 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(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) { ScopedCommandBufferHandle scoped_handle(CommandBufferHandle(handle.value())); scoped_ptr 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(context); } void GLES2SupportImpl::MakeCurrent(MojoGLES2Context context) { gpu::gles2::GLES2Interface* interface = NULL; if (context) { GLES2Context* client = static_cast(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(context)->RequestAnimationFrames(); } void GLES2SupportImpl::CancelAnimationFrames(MojoGLES2Context context) { static_cast(context)->CancelAnimationFrames(); } void* GLES2SupportImpl::GetGLES2Interface(MojoGLES2Context context) { return static_cast(context)->interface(); } void* GLES2SupportImpl::GetContextSupport(MojoGLES2Context context) { return static_cast(context)->context_support(); } GLES2Interface* GLES2SupportImpl::GetGLES2InterfaceForCurrentContext() { return &g_gles2_interface.Get(); } } // namespace gles2 } // namespace mojo