Commit 8cb05f56 authored by Scott Violet's avatar Scott Violet Committed by Commit Bot

content: gets RWHVA::GetRootFrameSinkId working with single-process mash

This adds HostFrameSinkManager::FindRootFrameSinkId() to find the root
frame sink id. This is necessary as
window->GetHost()->compositor()->frame_sink_id() is not the root frame sink in
mash.

BUG=879791
TEST=none

Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel
Change-Id: I5a1520b2ba144cb231d254059810ff153add3a49
Reviewed-on: https://chromium-review.googlesource.com/1249152
Commit-Queue: Scott Violet <sky@chromium.org>
Reviewed-by: default avatarkylechar <kylechar@chromium.org>
Reviewed-by: default avatarSadrul Chowdhury <sadrul@chromium.org>
Cr-Commit-Position: refs/heads/master@{#595512}
parent f3d287f6
...@@ -245,6 +245,23 @@ bool HostFrameSinkManager::IsFrameSinkHierarchyRegistered( ...@@ -245,6 +245,23 @@ bool HostFrameSinkManager::IsFrameSinkHierarchyRegistered(
base::ContainsValue(iter->second.children, child_frame_sink_id); base::ContainsValue(iter->second.children, child_frame_sink_id);
} }
base::Optional<FrameSinkId> HostFrameSinkManager::FindRootFrameSinkId(
const FrameSinkId& start) const {
auto iter = frame_sink_data_map_.find(start);
if (iter == frame_sink_data_map_.end())
return base::nullopt;
if (iter->second.is_root)
return start;
for (const FrameSinkId& parent_id : iter->second.parents) {
base::Optional<FrameSinkId> root = FindRootFrameSinkId(parent_id);
if (root)
return root;
}
return base::nullopt;
}
void HostFrameSinkManager::DropTemporaryReference(const SurfaceId& surface_id) { void HostFrameSinkManager::DropTemporaryReference(const SurfaceId& surface_id) {
frame_sink_manager_->DropTemporaryReference(surface_id); frame_sink_manager_->DropTemporaryReference(surface_id);
} }
......
...@@ -142,6 +142,10 @@ class VIZ_HOST_EXPORT HostFrameSinkManager ...@@ -142,6 +142,10 @@ class VIZ_HOST_EXPORT HostFrameSinkManager
const FrameSinkId& parent_frame_sink_id, const FrameSinkId& parent_frame_sink_id,
const FrameSinkId& child_frame_sink_id) const; const FrameSinkId& child_frame_sink_id) const;
// Returns the first ancestor of |start| (including |start|) that is a root.
base::Optional<FrameSinkId> FindRootFrameSinkId(
const FrameSinkId& start) const;
void DropTemporaryReference(const SurfaceId& surface_id); void DropTemporaryReference(const SurfaceId& surface_id);
// These two functions should only be used by WindowServer. // These two functions should only be used by WindowServer.
......
...@@ -547,6 +547,37 @@ TEST_F(HostFrameSinkManagerLocalTest, HitTestAggregatorQuery) { ...@@ -547,6 +547,37 @@ TEST_F(HostFrameSinkManagerLocalTest, HitTestAggregatorQuery) {
EXPECT_FALSE(DisplayHitTestQueryExists(kFrameSinkChild1)); EXPECT_FALSE(DisplayHitTestQueryExists(kFrameSinkChild1));
} }
TEST_F(HostFrameSinkManagerRemoteTest, FindRootFrameSinkId) {
FakeHostFrameSinkClient host_client;
EXPECT_FALSE(host().FindRootFrameSinkId(kFrameSinkParent1));
EXPECT_FALSE(host().FindRootFrameSinkId(kFrameSinkChild1));
// Register two FrameSinkIds, hierarchy between them and create a
// CompositorFrameSink for one.
host().RegisterFrameSinkId(kFrameSinkParent1, &host_client);
host().RegisterFrameSinkId(kFrameSinkChild1, &host_client);
host().RegisterFrameSinkHierarchy(kFrameSinkParent1, kFrameSinkChild1);
EXPECT_FALSE(host().FindRootFrameSinkId(kFrameSinkParent1));
EXPECT_FALSE(host().FindRootFrameSinkId(kFrameSinkChild1));
RootCompositorFrameSinkData root_data;
host().CreateRootCompositorFrameSink(
root_data.BuildParams(kFrameSinkParent1));
MockCompositorFrameSinkClient compositor_frame_sink_client;
mojom::CompositorFrameSinkPtr compositor_frame_sink;
host().CreateCompositorFrameSink(
kFrameSinkChild1, MakeRequest(&compositor_frame_sink),
compositor_frame_sink_client.BindInterfacePtr());
EXPECT_EQ(base::Optional<FrameSinkId>(kFrameSinkParent1),
host().FindRootFrameSinkId(kFrameSinkParent1));
EXPECT_EQ(base::Optional<FrameSinkId>(kFrameSinkParent1),
host().FindRootFrameSinkId(kFrameSinkChild1));
}
// Verify that HostFrameSinkManager can handle restarting after a GPU crash. // Verify that HostFrameSinkManager can handle restarting after a GPU crash.
TEST_F(HostFrameSinkManagerRemoteTest, RestartOnGpuCrash) { TEST_F(HostFrameSinkManagerRemoteTest, RestartOnGpuCrash) {
FakeHostFrameSinkClient host_client; FakeHostFrameSinkClient host_client;
......
...@@ -22,9 +22,11 @@ ...@@ -22,9 +22,11 @@
#include "components/viz/common/features.h" #include "components/viz/common/features.h"
#include "components/viz/common/frame_sinks/copy_output_request.h" #include "components/viz/common/frame_sinks/copy_output_request.h"
#include "components/viz/common/frame_sinks/copy_output_result.h" #include "components/viz/common/frame_sinks/copy_output_result.h"
#include "components/viz/host/host_frame_sink_manager.h"
#include "content/browser/accessibility/browser_accessibility_manager.h" #include "content/browser/accessibility/browser_accessibility_manager.h"
#include "content/browser/accessibility/browser_accessibility_state_impl.h" #include "content/browser/accessibility/browser_accessibility_state_impl.h"
#include "content/browser/bad_message.h" #include "content/browser/bad_message.h"
#include "content/browser/compositor/surface_utils.h"
#include "content/browser/frame_host/frame_tree.h" #include "content/browser/frame_host/frame_tree.h"
#include "content/browser/frame_host/frame_tree_node.h" #include "content/browser/frame_host/frame_tree_node.h"
#include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/frame_host/render_frame_host_impl.h"
...@@ -929,8 +931,23 @@ void RenderWidgetHostViewAura::DidStopFlinging() { ...@@ -929,8 +931,23 @@ void RenderWidgetHostViewAura::DidStopFlinging() {
} }
void RenderWidgetHostViewAura::TransformPointToRootSurface(gfx::PointF* point) { void RenderWidgetHostViewAura::TransformPointToRootSurface(gfx::PointF* point) {
aura::Window::ConvertPointToTarget(window_, window_->GetRootWindow(), point); aura::Window* root = window_->GetRootWindow();
window_->GetRootWindow()->transform().TransformPoint(point); aura::Window::ConvertPointToTarget(window_, root, point);
root->GetRootWindow()->transform().TransformPoint(point);
// On ChromeOS, the root surface is the whole desktop. When using the
// window-service converting to screen coordinates gives us that.
#if defined(OS_CHROMEOS)
if (features::IsUsingWindowService()) {
aura::client::ScreenPositionClient* screen_client =
aura::client::GetScreenPositionClient(root);
if (screen_client) {
gfx::Point rounded_point(point->x(), point->y());
screen_client->ConvertPointToScreen(root, &rounded_point);
*point = gfx::PointF(rounded_point);
}
}
#endif
} }
gfx::Rect RenderWidgetHostViewAura::GetBoundsInRootWindow() { gfx::Rect RenderWidgetHostViewAura::GetBoundsInRootWindow() {
...@@ -1705,9 +1722,18 @@ bool RenderWidgetHostViewAura::TransformPointToCoordSpaceForView( ...@@ -1705,9 +1722,18 @@ bool RenderWidgetHostViewAura::TransformPointToCoordSpaceForView(
} }
viz::FrameSinkId RenderWidgetHostViewAura::GetRootFrameSinkId() { viz::FrameSinkId RenderWidgetHostViewAura::GetRootFrameSinkId() {
if (window_ && window_->GetHost() && window_->GetHost()->compositor()) if (!window_ || !window_->GetHost() || !window_->GetHost()->compositor())
return window_->GetHost()->compositor()->frame_sink_id(); return viz::FrameSinkId();
return viz::FrameSinkId();
// In single-process mash the root is provided by Ash. Have
// HostFrameSinkManager walk the tree to find the right root.
if (features::IsSingleProcessMash()) {
base::Optional<viz::FrameSinkId> root =
GetHostFrameSinkManager()->FindRootFrameSinkId(frame_sink_id_);
return root ? *root : viz::FrameSinkId();
}
return window_->GetHost()->compositor()->frame_sink_id();
} }
viz::SurfaceId RenderWidgetHostViewAura::GetCurrentSurfaceId() const { viz::SurfaceId RenderWidgetHostViewAura::GetCurrentSurfaceId() const {
......
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