Chromium Code Reviews| 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..323dfdc274a455c97b7ff8d6270cd60253190b15 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) { |
|
brettw
2012/05/25 23:19:41
Nit: * next to type rather than arg name
|
| 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() { |
| @@ -146,16 +147,19 @@ PPB_Graphics3D_Proxy::~PPB_Graphics3D_Proxy() { |
| // static |
| PP_Resource PPB_Graphics3D_Proxy::CreateProxyResource( |
| PP_Instance instance, |
| - PP_Resource share_context, |
| + PPB_Graphics3D_API* share_context, |
| const int32_t* attrib_list) { |
| PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
| + Graphics3D* share_graphics = static_cast<Graphics3D*>(share_context); |
| 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) { |
| + share_host = share_graphics->host_resource(); |
| + share_gles2 = share_graphics->gles2_impl(); |
| + } |
| std::vector<int32_t> attribs; |
| if (attrib_list) { |
| @@ -170,12 +174,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 +218,28 @@ 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); |
| + PPB_Graphics3D_API *share_api = NULL; |
| + if (share_context.host_resource() != 0) { |
| + thunk::EnterResource<thunk::PPB_Graphics3D_API> |
| + enter_share(share_context.host_resource(), true); |
| + if (!enter_share.succeeded()) |
| + return; |
| + share_api = enter_share.object(); |
| + } |
| + |
| if (enter.succeeded()) { |
| result->SetHostResource( |
| - instance, |
| - enter.functions()->CreateGraphics3DRaw(instance, 0, &attribs.front())); |
| + instance, |
| + enter.functions()->CreateGraphics3DRaw(instance, |
| + share_api, |
| + &attribs.front())); |
| } |
| } |