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())); |
} |
} |