| Index: ppapi/proxy/ppb_graphics_3d_proxy.cc
|
| diff --git a/ppapi/proxy/ppb_graphics_3d_proxy.cc b/ppapi/proxy/ppb_graphics_3d_proxy.cc
|
| index 2a708a36dbd49d4bdf0a694722c8d040c09e99a5..25bcd44f956e5b725ab13a5f25dbf4000cd2db70 100644
|
| --- a/ppapi/proxy/ppb_graphics_3d_proxy.cc
|
| +++ b/ppapi/proxy/ppb_graphics_3d_proxy.cc
|
| @@ -69,7 +69,7 @@ Graphics3D::~Graphics3D() {
|
| DestroyGLES2Impl();
|
| }
|
|
|
| -bool Graphics3D::Init() {
|
| +bool Graphics3D::Init(gpu::gles2::GLES2Implementation* share_gles2) {
|
| PluginDispatcher* dispatcher = PluginDispatcher::GetForResource(this);
|
| if (!dispatcher)
|
| return false;
|
| @@ -79,7 +79,8 @@ bool Graphics3D::Init() {
|
| if (!command_buffer_->Initialize())
|
| return false;
|
|
|
| - return CreateGLES2Impl(kCommandBufferSize, kTransferBufferSize);
|
| + return CreateGLES2Impl(kCommandBufferSize, kTransferBufferSize,
|
| + share_gles2);
|
| }
|
|
|
| PP_Bool Graphics3D::InitCommandBuffer() {
|
| @@ -152,10 +153,18 @@ PP_Resource PPB_Graphics3D_Proxy::CreateProxyResource(
|
| if (!dispatcher)
|
| return PP_ERROR_BADARGUMENT;
|
|
|
| - // TODO(alokp): Support shared context.
|
| - DCHECK_EQ(0, share_context);
|
| - if (share_context != 0)
|
| - return 0;
|
| + HostResource share_host;
|
| + gpu::gles2::GLES2Implementation* share_gles2 = NULL;
|
| + if (share_context != 0) {
|
| + EnterResourceNoLock<PPB_Graphics3D_API> enter(share_context, true);
|
| + if (enter.failed())
|
| + return PP_ERROR_BADARGUMENT;
|
| +
|
| + PPB_Graphics3D_Shared* share_graphics =
|
| + static_cast<PPB_Graphics3D_Shared*>(enter.object());
|
| + share_host = share_graphics->host_resource();
|
| + share_gles2 = share_graphics->gles2_impl();
|
| + }
|
|
|
| std::vector<int32_t> attribs;
|
| if (attrib_list) {
|
| @@ -170,12 +179,12 @@ PP_Resource PPB_Graphics3D_Proxy::CreateProxyResource(
|
|
|
| HostResource result;
|
| dispatcher->Send(new PpapiHostMsg_PPBGraphics3D_Create(
|
| - API_ID_PPB_GRAPHICS_3D, instance, attribs, &result));
|
| + API_ID_PPB_GRAPHICS_3D, instance, share_host, attribs, &result));
|
| if (result.is_null())
|
| return 0;
|
|
|
| scoped_refptr<Graphics3D> graphics_3d(new Graphics3D(result));
|
| - if (!graphics_3d->Init())
|
| + if (!graphics_3d->Init(share_gles2))
|
| return 0;
|
| return graphics_3d->GetReference();
|
| }
|
| @@ -214,16 +223,20 @@ bool PPB_Graphics3D_Proxy::OnMessageReceived(const IPC::Message& msg) {
|
| }
|
|
|
| void PPB_Graphics3D_Proxy::OnMsgCreate(PP_Instance instance,
|
| + HostResource share_context,
|
| const std::vector<int32_t>& attribs,
|
| HostResource* result) {
|
| if (attribs.empty() || attribs.back() != PP_GRAPHICS3DATTRIB_NONE)
|
| return; // Bad message.
|
|
|
| thunk::EnterResourceCreation enter(instance);
|
| +
|
| if (enter.succeeded()) {
|
| result->SetHostResource(
|
| - instance,
|
| - enter.functions()->CreateGraphics3DRaw(instance, 0, &attribs.front()));
|
| + instance,
|
| + enter.functions()->CreateGraphics3DRaw(instance,
|
| + share_context.host_resource(),
|
| + &attribs.front()));
|
| }
|
| }
|
|
|
|
|