Index: components/mus/ws/server_window_surface_manager.cc |
diff --git a/components/mus/ws/server_window_surface_manager.cc b/components/mus/ws/server_window_surface_manager.cc |
index 1699de41bc8006f97d94066f349ca176f0927731..83323d2508cf3fd39fbea050896bbe9a41564be3 100644 |
--- a/components/mus/ws/server_window_surface_manager.cc |
+++ b/components/mus/ws/server_window_surface_manager.cc |
@@ -4,6 +4,7 @@ |
#include "components/mus/ws/server_window_surface_manager.h" |
+#include "components/mus/surfaces/surfaces_state.h" |
#include "components/mus/ws/server_window.h" |
#include "components/mus/ws/server_window_delegate.h" |
#include "components/mus/ws/server_window_surface.h" |
@@ -16,9 +17,15 @@ ServerWindowSurfaceManager::ServerWindowSurfaceManager(ServerWindow* window) |
surface_id_allocator_(WindowIdToTransportId(window->id())), |
waiting_for_initial_frames_( |
window_->properties().count(mus::mojom::kWaitForUnderlay_Property) > |
- 0) {} |
+ 0) { |
+ surface_id_allocator_.RegisterSurfaceIdNamespace(GetSurfaceManager()); |
+} |
-ServerWindowSurfaceManager::~ServerWindowSurfaceManager() {} |
+ServerWindowSurfaceManager::~ServerWindowSurfaceManager() { |
+ // Explicitly clear the type to surface manager so that this manager |
+ // is still valid prior during ~ServerWindowSurface. |
+ type_to_surface_map_.clear(); |
+} |
bool ServerWindowSurfaceManager::ShouldDraw() { |
if (!waiting_for_initial_frames_) |
@@ -34,8 +41,16 @@ void ServerWindowSurfaceManager::CreateSurface( |
mojom::SurfaceType surface_type, |
mojo::InterfaceRequest<mojom::Surface> request, |
mojom::SurfaceClientPtr client) { |
- type_to_surface_map_[surface_type] = make_scoped_ptr(new ServerWindowSurface( |
+ scoped_ptr<ServerWindowSurface> surface(new ServerWindowSurface( |
this, surface_type, std::move(request), std::move(client))); |
+ if (!HasAnySurface()) { |
+ // Only one SurfaceFactoryClient can be registered per surface id namespace, |
+ // so register the first one. Since all surfaces created by this manager |
+ // represent the same window, the begin frame source can be shared by |
+ // all surfaces created here. |
+ surface->RegisterForBeginFrames(); |
+ } |
+ type_to_surface_map_[surface_type] = std::move(surface); |
} |
ServerWindowSurface* ServerWindowSurfaceManager::GetDefaultSurface() { |
@@ -52,10 +67,19 @@ ServerWindowSurface* ServerWindowSurfaceManager::GetSurfaceByType( |
return iter == type_to_surface_map_.end() ? nullptr : iter->second.get(); |
} |
-bool ServerWindowSurfaceManager::HasSurfaceOfType(mojom::SurfaceType type) { |
+bool ServerWindowSurfaceManager::HasSurfaceOfType( |
+ mojom::SurfaceType type) const { |
return type_to_surface_map_.count(type) > 0; |
} |
+bool ServerWindowSurfaceManager::HasAnySurface() { |
+ return GetDefaultSurface() || GetUnderlaySurface(); |
+} |
+ |
+cc::SurfaceManager* ServerWindowSurfaceManager::GetSurfaceManager() { |
+ return window()->delegate()->GetSurfacesState()->manager(); |
+} |
+ |
bool ServerWindowSurfaceManager::IsSurfaceReadyAndNonEmpty( |
mojom::SurfaceType type) const { |
auto iter = type_to_surface_map_.find(type); |