16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file. 46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/public/c/gles2/gles2.h" 66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/lazy_instance.h" 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/threading/thread_local.h" 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h" 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_interface.h" 116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/gles2/gles2_context.h" 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "mojo/gles2/gles2_impl_export.h" 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using mojo::gles2::GLES2Context; 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace { 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)base::LazyInstance<base::ThreadLocalPointer<gpu::gles2::GLES2Interface> >::Leaky 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) g_gpu_interface; 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)extern "C" { 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)MojoGLES2Context MojoGLES2CreateContext(MojoHandle handle, 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MojoGLES2ContextLost lost_callback, 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void* closure, 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const MojoAsyncWaiter* async_waiter) { 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mojo::MessagePipeHandle mph(handle); 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mojo::ScopedMessagePipeHandle scoped_handle(mph); 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<GLES2Context> client(new GLES2Context( 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) async_waiter, scoped_handle.Pass(), lost_callback, closure)); 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!client->Initialize()) 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) client.reset(); 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return client.release(); 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void MojoGLES2DestroyContext(MojoGLES2Context context) { 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) delete static_cast<GLES2Context*>(context); 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void MojoGLES2MakeCurrent(MojoGLES2Context context) { 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gpu::gles2::GLES2Interface* interface = NULL; 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (context) { 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GLES2Context* client = static_cast<GLES2Context*>(context); 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) interface = client->interface(); 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(interface); 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) g_gpu_interface.Get().Set(interface); 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void MojoGLES2SwapBuffers() { 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(g_gpu_interface.Get().Get()); 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) g_gpu_interface.Get().Get()->SwapBuffers(); 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void* MojoGLES2GetGLES2Interface(MojoGLES2Context context) { 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return static_cast<GLES2Context*>(context)->interface(); 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void* MojoGLES2GetContextSupport(MojoGLES2Context context) { 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return static_cast<GLES2Context*>(context)->context_support(); 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define VISIT_GL_CALL(Function, ReturnType, PARAMETERS, ARGUMENTS) \ 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ReturnType gl##Function PARAMETERS { \ 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(g_gpu_interface.Get().Get()); \ 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return g_gpu_interface.Get().Get()->Function ARGUMENTS; \ 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/public/c/gles2/gles2_call_visitor_autogen.h" 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/public/c/gles2/gles2_call_visitor_chromium_sync_point_autogen.h" 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/public/c/gles2/gles2_call_visitor_chromium_texture_mailbox_autogen.h" 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#undef VISIT_GL_CALL 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // extern "C" 75