Index: cc/surfaces/surface_display_output_surface.cc |
diff --git a/cc/surfaces/surface_display_output_surface.cc b/cc/surfaces/surface_display_output_surface.cc |
index 53d781fb102335e0feecf05c93b5bc935e291473..642ec9f94b6faeb0021fdc8625f84e2a0f1f637f 100644 |
--- a/cc/surfaces/surface_display_output_surface.cc |
+++ b/cc/surfaces/surface_display_output_surface.cc |
@@ -33,7 +33,8 @@ SurfaceDisplayOutputSurface::SurfaceDisplayOutputSurface( |
} |
SurfaceDisplayOutputSurface::~SurfaceDisplayOutputSurface() { |
- client_ = NULL; |
+ if (HasClient()) |
+ DetachFromClient(); |
if (!surface_id_.is_null()) { |
factory_.Destroy(surface_id_); |
} |
@@ -72,6 +73,9 @@ void SurfaceDisplayOutputSurface::SwapBuffers(CompositorFrame* frame) { |
bool SurfaceDisplayOutputSurface::BindToClient(OutputSurfaceClient* client) { |
DCHECK(client); |
DCHECK(display_client_); |
+ factory_.manager()->RegisterSurfaceFactoryClient(allocator_->id_namespace(), |
+ this); |
+ |
client_ = client; |
// Avoid initializing GL context here, as this should be sharing the |
// Display's context. |
@@ -84,6 +88,16 @@ void SurfaceDisplayOutputSurface::ForceReclaimResources() { |
SurfaceFactory::DrawCallback()); |
} |
+void SurfaceDisplayOutputSurface::DetachFromClient() { |
+ DCHECK(HasClient()); |
+ // Unregister the SurfaceFactoryClient here instead of the dtor so that only |
+ // one client is alive for this namespace at any given time. |
+ factory_.manager()->UnregisterSurfaceFactoryClient( |
+ allocator_->id_namespace()); |
+ OutputSurface::DetachFromClient(); |
+ DCHECK(!HasClient()); |
+} |
+ |
void SurfaceDisplayOutputSurface::ReturnResources( |
const ReturnedResourceArray& resources) { |
CompositorFrameAck ack; |
@@ -93,7 +107,6 @@ void SurfaceDisplayOutputSurface::ReturnResources( |
} |
void SurfaceDisplayOutputSurface::SetBeginFrameSource( |
- SurfaceId surface_id, |
BeginFrameSource* begin_frame_source) { |
// TODO(tansell): Hook this up. |
} |