Commit cc5c369b authored by kylechar's avatar kylechar Committed by Commit Bot

viz: Assign temporary refernces with --enable-viz.

Fix the logic that decides whether or not to assign temporary references
in HostFrameSinkManager. This fixes temporary references not being
assigned owners when running with --enable-viz in desktop Chrome. Add a
test to verify temporary references are assigned with a remote
FrameSinkmanager.

Also fix some places in HostFrameSinkManager where |frame_sink_manager_|
and |frame_sink_manager_impl_| were mixed up.

Bug: 787589
Cq-Include-Trybots: master.tryserver.chromium.android:android_optional_gpu_tests_rel
Change-Id: I2b40fa332f8afc8ff7fa7b62482ef174bcbd239a
Reviewed-on: https://chromium-review.googlesource.com/793976Reviewed-by: default avatarScott Violet <sky@chromium.org>
Reviewed-by: default avatarFady Samuel <fsamuel@chromium.org>
Commit-Queue: kylechar <kylechar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#519861}
parent 93e1b8dd
...@@ -26,6 +26,10 @@ void HostFrameSinkManager::SetLocalManager( ...@@ -26,6 +26,10 @@ void HostFrameSinkManager::SetLocalManager(
frame_sink_manager_impl_ = frame_sink_manager_impl; frame_sink_manager_impl_ = frame_sink_manager_impl;
frame_sink_manager_ = frame_sink_manager_impl; frame_sink_manager_ = frame_sink_manager_impl;
// Assign temporary references if FrameSinkManagerImpl is using them.
assign_temporary_references_ =
frame_sink_manager_impl_->surface_manager()->using_surface_references();
} }
void HostFrameSinkManager::BindAndSetManager( void HostFrameSinkManager::BindAndSetManager(
...@@ -176,13 +180,19 @@ void HostFrameSinkManager::UnregisterFrameSinkHierarchy( ...@@ -176,13 +180,19 @@ void HostFrameSinkManager::UnregisterFrameSinkHierarchy(
frame_sink_data_map_.erase(parent_frame_sink_id); frame_sink_data_map_.erase(parent_frame_sink_id);
} }
void HostFrameSinkManager::WillAssignTemporaryReferencesExternally() {
assign_temporary_references_ = false;
}
void HostFrameSinkManager::AssignTemporaryReference( void HostFrameSinkManager::AssignTemporaryReference(
const SurfaceId& surface_id, const SurfaceId& surface_id,
const FrameSinkId& frame_sink_id) { const FrameSinkId& frame_sink_id) {
DCHECK(!assign_temporary_references_);
frame_sink_manager_->AssignTemporaryReference(surface_id, frame_sink_id); frame_sink_manager_->AssignTemporaryReference(surface_id, frame_sink_id);
} }
void HostFrameSinkManager::DropTemporaryReference(const SurfaceId& surface_id) { void HostFrameSinkManager::DropTemporaryReference(const SurfaceId& surface_id) {
DCHECK(!assign_temporary_references_);
frame_sink_manager_->DropTemporaryReference(surface_id); frame_sink_manager_->DropTemporaryReference(surface_id);
} }
...@@ -223,10 +233,14 @@ void HostFrameSinkManager::CompositorFrameSinkSupportDestroyed( ...@@ -223,10 +233,14 @@ void HostFrameSinkManager::CompositorFrameSinkSupportDestroyed(
void HostFrameSinkManager::PerformAssignTemporaryReference( void HostFrameSinkManager::PerformAssignTemporaryReference(
const SurfaceId& surface_id) { const SurfaceId& surface_id) {
// Find the expected embedder for the new surface and assign the temporary
// reference to it.
auto iter = frame_sink_data_map_.find(surface_id.frame_sink_id()); auto iter = frame_sink_data_map_.find(surface_id.frame_sink_id());
DCHECK(iter != frame_sink_data_map_.end()); if (iter == frame_sink_data_map_.end()) {
// We don't have any hierarchy information for what will embed the new
// surface, drop the temporary reference.
frame_sink_manager_->DropTemporaryReference(surface_id);
return;
}
const FrameSinkData& data = iter->second; const FrameSinkData& data = iter->second;
// Display roots don't have temporary references to assign. // Display roots don't have temporary references to assign.
...@@ -244,7 +258,7 @@ void HostFrameSinkManager::PerformAssignTemporaryReference( ...@@ -244,7 +258,7 @@ void HostFrameSinkManager::PerformAssignTemporaryReference(
for (const FrameSinkId& parent_id : data.parents) { for (const FrameSinkId& parent_id : data.parents) {
const FrameSinkData& parent_data = frame_sink_data_map_[parent_id]; const FrameSinkData& parent_data = frame_sink_data_map_[parent_id];
if (parent_data.IsFrameSinkRegistered()) { if (parent_data.IsFrameSinkRegistered()) {
frame_sink_manager_impl_->AssignTemporaryReference(surface_id, parent_id); frame_sink_manager_->AssignTemporaryReference(surface_id, parent_id);
return; return;
} }
} }
...@@ -264,7 +278,7 @@ void HostFrameSinkManager::OnConnectionLost() { ...@@ -264,7 +278,7 @@ void HostFrameSinkManager::OnConnectionLost() {
binding_.Close(); binding_.Close();
frame_sink_manager_ptr_.reset(); frame_sink_manager_ptr_.reset();
frame_sink_manager_impl_ = nullptr; frame_sink_manager_ = nullptr;
// CompositorFrameSinks are lost along with the connection to // CompositorFrameSinks are lost along with the connection to
// mojom::FrameSinkManager. // mojom::FrameSinkManager.
...@@ -297,23 +311,20 @@ void HostFrameSinkManager::RegisterAfterConnectionLoss() { ...@@ -297,23 +311,20 @@ void HostFrameSinkManager::RegisterAfterConnectionLoss() {
void HostFrameSinkManager::OnFirstSurfaceActivation( void HostFrameSinkManager::OnFirstSurfaceActivation(
const SurfaceInfo& surface_info) { const SurfaceInfo& surface_info) {
// TODO(kylechar): This needs to happen when the surface is created, not when
// it first activates.
if (assign_temporary_references_)
PerformAssignTemporaryReference(surface_info.id());
auto it = frame_sink_data_map_.find(surface_info.id().frame_sink_id()); auto it = frame_sink_data_map_.find(surface_info.id().frame_sink_id());
// If we've received a bogus or stale SurfaceId from Viz then just ignore it. // If we've received a bogus or stale SurfaceId from Viz then just ignore it.
if (it == frame_sink_data_map_.end()) { if (it == frame_sink_data_map_.end())
// We don't have any hierarchy information for what will embed the new
// surface, drop the temporary reference.
frame_sink_manager_->DropTemporaryReference(surface_info.id());
return; return;
}
FrameSinkData& frame_sink_data = it->second; FrameSinkData& frame_sink_data = it->second;
if (frame_sink_data.client) if (frame_sink_data.client)
frame_sink_data.client->OnFirstSurfaceActivation(surface_info); frame_sink_data.client->OnFirstSurfaceActivation(surface_info);
if (frame_sink_manager_impl_ &&
frame_sink_manager_impl_->surface_manager()->using_surface_references()) {
PerformAssignTemporaryReference(surface_info.id());
}
} }
void HostFrameSinkManager::OnClientConnectionClosed( void HostFrameSinkManager::OnClientConnectionClosed(
......
...@@ -44,11 +44,12 @@ class VIZ_HOST_EXPORT HostFrameSinkManager ...@@ -44,11 +44,12 @@ class VIZ_HOST_EXPORT HostFrameSinkManager
: public mojom::FrameSinkManagerClient, : public mojom::FrameSinkManagerClient,
public CompositorFrameSinkSupportManager { public CompositorFrameSinkSupportManager {
public: public:
using DisplayHitTestQueryMap =
base::flat_map<FrameSinkId, std::unique_ptr<HitTestQuery>>;
HostFrameSinkManager(); HostFrameSinkManager();
~HostFrameSinkManager() override; ~HostFrameSinkManager() override;
using DisplayHitTestQueryMap =
base::flat_map<FrameSinkId, std::unique_ptr<HitTestQuery>>;
const DisplayHitTestQueryMap& display_hit_test_query() const { const DisplayHitTestQueryMap& display_hit_test_query() const {
return display_hit_test_query_; return display_hit_test_query_;
} }
...@@ -114,9 +115,10 @@ class VIZ_HOST_EXPORT HostFrameSinkManager ...@@ -114,9 +115,10 @@ class VIZ_HOST_EXPORT HostFrameSinkManager
void UnregisterFrameSinkHierarchy(const FrameSinkId& parent_frame_sink_id, void UnregisterFrameSinkHierarchy(const FrameSinkId& parent_frame_sink_id,
const FrameSinkId& child_frame_sink_id); const FrameSinkId& child_frame_sink_id);
// These two functions should only be used by WindowServer. // These three functions should only be used by WindowServer.
// TODO(riajiang): Find a better way for HostFrameSinkManager to do the assign // TODO(riajiang): Find a better way for HostFrameSinkManager to do the assign
// and drop instead. // and drop instead.
void WillAssignTemporaryReferencesExternally();
void AssignTemporaryReference(const SurfaceId& surface_id, void AssignTemporaryReference(const SurfaceId& surface_id,
const FrameSinkId& owner); const FrameSinkId& owner);
void DropTemporaryReference(const SurfaceId& surface_id); void DropTemporaryReference(const SurfaceId& surface_id);
...@@ -227,6 +229,11 @@ class VIZ_HOST_EXPORT HostFrameSinkManager ...@@ -227,6 +229,11 @@ class VIZ_HOST_EXPORT HostFrameSinkManager
// If |frame_sink_manager_ptr_| connection was lost. // If |frame_sink_manager_ptr_| connection was lost.
bool connection_was_lost_ = false; bool connection_was_lost_ = false;
// If a FrameSinkId owner should be assigned when a new surface is created.
// This will be set false if using surface sequences or if temporary
// references are being assigned externally.
bool assign_temporary_references_ = true;
base::RepeatingClosure connection_lost_callback_; base::RepeatingClosure connection_lost_callback_;
DisplayHitTestQueryMap display_hit_test_query_; DisplayHitTestQueryMap display_hit_test_query_;
......
...@@ -624,5 +624,33 @@ TEST_F(HostFrameSinkManagerRemoteTest, DeletedHitTestQuery) { ...@@ -624,5 +624,33 @@ TEST_F(HostFrameSinkManagerRemoteTest, DeletedHitTestQuery) {
kFrameSinkChild1, 1); kFrameSinkChild1, 1);
} }
// Verify that HostFrameSinkManager assigns temporary references when connected
// to a remote mojom::FrameSinkManager.
TEST_F(HostFrameSinkManagerRemoteTest, AssignTemporaryReference) {
FakeHostFrameSinkClient host_client;
host().RegisterFrameSinkId(kFrameSinkParent1, &host_client);
const SurfaceId surface_id = MakeSurfaceId(kFrameSinkChild1, 1);
host().RegisterFrameSinkId(surface_id.frame_sink_id(), &host_client);
MockCompositorFrameSinkClient compositor_frame_sink_client;
mojom::CompositorFrameSinkPtr compositor_frame_sink;
host().CreateCompositorFrameSink(
kFrameSinkChild1, MakeRequest(&compositor_frame_sink),
compositor_frame_sink_client.BindInterfacePtr());
host().RegisterFrameSinkHierarchy(kFrameSinkParent1,
surface_id.frame_sink_id());
// When HostFrameSinkManager gets OnFirstSurfaceActivation() it should assign
// the temporary reference to the registered parent |kFrameSinkParent1|.
GetFrameSinkManagerClient()->OnFirstSurfaceActivation(
MakeSurfaceInfo(surface_id));
base::RunLoop run_loop;
EXPECT_CALL(impl(), AssignTemporaryReference(surface_id, kFrameSinkParent1))
.WillOnce(InvokeClosure(run_loop.QuitClosure()));
run_loop.Run();
}
} // namespace test } // namespace test
} // namespace viz } // namespace viz
...@@ -152,6 +152,8 @@ WindowServer::WindowServer(WindowServerDelegate* delegate, bool should_host_viz) ...@@ -152,6 +152,8 @@ WindowServer::WindowServer(WindowServerDelegate* delegate, bool should_host_viz)
std::make_unique<VizHostProxyImpl>(host_frame_sink_manager_.get())), std::make_unique<VizHostProxyImpl>(host_frame_sink_manager_.get())),
video_detector_(host_frame_sink_manager_.get()), video_detector_(host_frame_sink_manager_.get()),
display_creation_config_(DisplayCreationConfig::UNKNOWN) { display_creation_config_(DisplayCreationConfig::UNKNOWN) {
if (host_frame_sink_manager_)
host_frame_sink_manager_->WillAssignTemporaryReferencesExternally();
user_id_tracker_.AddObserver(this); user_id_tracker_.AddObserver(this);
OnUserIdAdded(user_id_tracker_.active_id()); OnUserIdAdded(user_id_tracker_.active_id());
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment