Chromium Code Reviews| Index: ppapi/proxy/ppb_instance_proxy.cc |
| diff --git a/ppapi/proxy/ppb_instance_proxy.cc b/ppapi/proxy/ppb_instance_proxy.cc |
| index 2b1a9889026c0474cb3b966871f8d0907cfe91b5..cd111d2c953745fe25eeefefee4d63b0de795732 100644 |
| --- a/ppapi/proxy/ppb_instance_proxy.cc |
| +++ b/ppapi/proxy/ppb_instance_proxy.cc |
| @@ -215,37 +215,59 @@ PP_Bool PPB_Instance_Proxy::BindGraphics(PP_Instance instance, |
| PP_Resource device) { |
| // If device is 0, pass a null HostResource. This signals the host to unbind |
| // all devices. |
| - HostResource host_resource; |
| PP_Resource pp_resource = 0; |
| + InstanceData* data = static_cast<PluginDispatcher*>(dispatcher())-> |
| + GetInstanceData(instance); |
| + scoped_refptr<Resource> old_compositor = data->bound_compositor; |
| + |
| if (device) { |
| - Resource* resource = |
| - PpapiGlobals::Get()->GetResourceTracker()->GetResource(device); |
| - if (!resource || resource->pp_instance() != instance) |
| + do { |
| + // Try enter device as a Graphics3D deivce. |
| + EnterResourceNoLock<PPB_Graphics3D_API> enter_3d(device, false); |
| + if (enter_3d.succeeded()) { |
| + if (enter_3d.resource()->pp_instance() != instance) |
| + return PP_FALSE; |
| + data->bound_compositor = NULL; |
| + pp_resource = enter_3d.resource()->host_resource().host_resource(); |
| + break; |
| + } |
| + |
| + // Try enter device as a Graphics2D device. |
| + EnterResourceNoLock<PPB_Graphics2D_API> enter_2d(device, false); |
| + if (enter_2d.succeeded()) { |
| + if (enter_2d.resource()->pp_instance() != instance) |
| + return PP_FALSE; |
| + data->bound_compositor = NULL; |
| + pp_resource = enter_2d.resource()->pp_resource(); |
| + break; |
| + } |
| + |
| + // Try enter device as a Compositor device. |
| + EnterResourceNoLock<PPB_Compositor_API> enter_compositor(device, false); |
| + if (enter_compositor.succeeded()) { |
| + if (enter_compositor.resource()->pp_instance() != instance) |
| + return PP_FALSE; |
| + data->bound_compositor = enter_compositor.resource(); |
| + pp_resource = enter_compositor.resource()->pp_resource(); |
| + break; |
| + } |
| + |
| return PP_FALSE; |
| - host_resource = resource->host_resource(); |
| - pp_resource = resource->pp_resource(); |
| + } while (false); |
|
piman
2014/06/18 00:55:24
That's a crazy amount of logic to track something
Peng
2014/06/18 02:35:03
Same reason.
And EnterResourceNoLock() will look u
|
| } else { |
| - // Passing 0 means unbinding all devices. |
| - dispatcher()->Send(new PpapiHostMsg_PPBInstance_BindGraphics( |
| - API_ID_PPB_INSTANCE, instance, 0)); |
| - return PP_TRUE; |
| + data->bound_compositor = NULL; |
| } |
| - // We need to pass different resource to Graphics 2D and 3D right now. Once |
| - // 3D is migrated to the new design, we should be able to unify this. |
| - EnterResourceNoLock<PPB_Compositor_API> enter_compositor(device, false); |
| - EnterResourceNoLock<PPB_Graphics2D_API> enter_2d(device, false); |
| - EnterResourceNoLock<PPB_Graphics3D_API> enter_3d(device, false); |
| - if (enter_compositor.succeeded() || enter_2d.succeeded()) { |
| - dispatcher()->Send(new PpapiHostMsg_PPBInstance_BindGraphics( |
| + if (old_compositor) |
| + old_compositor->AsPPB_Compositor_API()->BindToInstance(0); |
| + |
| + if (data->bound_compositor) |
| + data->bound_compositor->AsPPB_Compositor_API()->BindToInstance(true); |
| + |
| + dispatcher()->Send(new PpapiHostMsg_PPBInstance_BindGraphics( |
| API_ID_PPB_INSTANCE, instance, pp_resource)); |
| - return PP_TRUE; |
| - } else if (enter_3d.succeeded()) { |
| - dispatcher()->Send(new PpapiHostMsg_PPBInstance_BindGraphics( |
| - API_ID_PPB_INSTANCE, instance, host_resource.host_resource())); |
| - return PP_TRUE; |
| - } |
| - return PP_FALSE; |
| + |
| + return PP_TRUE; |
| } |
| PP_Bool PPB_Instance_Proxy::IsFullFrame(PP_Instance instance) { |