Commit 55cd40ff authored by Sadrul Habib Chowdhury's avatar Sadrul Habib Chowdhury Committed by Commit Bot

aura: Allow injecting the AcceleratedWidget into aura.

mus can delegate managing the gfx::AcceleratedWidget it creates to the
window manager. The window manager (i.e. ash/aura) in this case needs to
support injecting this AcceleratedWidget into its compositor.

BUG=786453

Change-Id: If9de911ab70e84e750728b0b46a8d4470c1e7da8
Reviewed-on: https://chromium-review.googlesource.com/792272Reviewed-by: default avatarScott Violet <sky@chromium.org>
Commit-Queue: Sadrul Chowdhury <sadrul@chromium.org>
Cr-Commit-Position: refs/heads/master@{#519717}
parent 26b03d9e
......@@ -334,6 +334,16 @@ void WindowManager::OnWmConnected() {
wayland_server_controller_ = WaylandServerController::CreateIfNecessary();
}
void WindowManager::OnWmAcceleratedWidgetAvailableForDisplay(
int64_t display_id,
gfx::AcceleratedWidget widget) {
auto* window = Shell::GetRootWindowForDisplayId(display_id);
if (window) {
auto* host = static_cast<aura::WindowTreeHostMus*>(window->GetHost());
host->OverrideAcceleratedWidget(widget);
}
}
void WindowManager::OnWmSetBounds(aura::Window* window,
const gfx::Rect& bounds) {
// TODO(sky): this indirectly sets bounds, which is against what
......
......@@ -128,6 +128,9 @@ class ASH_EXPORT WindowManager : public aura::WindowManagerDelegate,
// WindowManagerDelegate:
void SetWindowManagerClient(aura::WindowManagerClient* client) override;
void OnWmConnected() override;
void OnWmAcceleratedWidgetAvailableForDisplay(
int64_t display_id,
gfx::AcceleratedWidget widget) override;
void OnWmSetBounds(aura::Window* window, const gfx::Rect& bounds) override;
bool OnWmSetProperty(
aura::Window* window,
......
......@@ -72,6 +72,9 @@ class SimpleWM : public service_manager::Service,
// aura::WindowManagerDelegate:
void SetWindowManagerClient(aura::WindowManagerClient* client) override;
void OnWmConnected() override;
void OnWmAcceleratedWidgetAvailableForDisplay(
int64_t display_id,
gfx::AcceleratedWidget widget) override {}
void OnWmSetBounds(aura::Window* window, const gfx::Rect& bounds) override;
bool OnWmSetProperty(
aura::Window* window,
......
......@@ -32,6 +32,9 @@ class MusDemoInternal : public MusDemo, public aura::WindowManagerDelegate {
// aura::WindowManagerDelegate:
void SetWindowManagerClient(aura::WindowManagerClient* client) final;
void OnWmAcceleratedWidgetAvailableForDisplay(
int64_t display_id,
gfx::AcceleratedWidget widget) final {}
void OnWmSetBounds(aura::Window* window, const gfx::Rect& bounds) final;
bool OnWmSetProperty(aura::Window* window,
const std::string& name,
......
......@@ -98,6 +98,9 @@ class TestWM : public service_manager::Service,
window_manager_client_ = client;
}
void OnWmConnected() override {}
void OnWmAcceleratedWidgetAvailableForDisplay(
int64_t display_id,
gfx::AcceleratedWidget widget) override {}
void OnWmSetBounds(aura::Window* window, const gfx::Rect& bounds) override {
window->SetBounds(bounds);
}
......
......@@ -47,6 +47,9 @@ class TestWindowManagerDelegate : public aura::WindowManagerDelegate {
// WindowManagerDelegate:
void SetWindowManagerClient(aura::WindowManagerClient* client) override {}
void OnWmAcceleratedWidgetAvailableForDisplay(
int64_t display_id,
gfx::AcceleratedWidget widget) override {}
void OnWmConnected() override {}
void OnWmSetBounds(aura::Window* window, const gfx::Rect& bounds) override {}
bool OnWmSetProperty(
......
......@@ -88,6 +88,9 @@ class WindowServerTestBase : public WindowServerServiceTestBase,
// WindowManagerDelegate:
void SetWindowManagerClient(aura::WindowManagerClient* client) override;
void OnWmConnected() override;
void OnWmAcceleratedWidgetAvailableForDisplay(
int64_t display_id,
gfx::AcceleratedWidget widget) override {}
void OnWmSetBounds(aura::Window* window, const gfx::Rect& bounds) override;
bool OnWmSetProperty(
aura::Window* window,
......
......@@ -20,6 +20,7 @@
#include "services/ui/public/interfaces/window_tree_constants.mojom.h"
#include "ui/aura/aura_export.h"
#include "ui/events/mojo/event.mojom.h"
#include "ui/gfx/native_widget_types.h"
namespace display {
class Display;
......@@ -152,6 +153,13 @@ class AURA_EXPORT WindowManagerDelegate {
// the WindowManager.
virtual void SetWindowManagerClient(WindowManagerClient* client) = 0;
// Called if the window server requires the window manager to manage the real
// accelerated widget. This is the case when mus expects the window manager to
// set up viz (instead of mus itself hosting viz).
virtual void OnWmAcceleratedWidgetAvailableForDisplay(
int64_t display_id,
gfx::AcceleratedWidget widget) = 0;
// Called when the connection to mus has been fully established.
virtual void OnWmConnected();
......
......@@ -1717,7 +1717,10 @@ void WindowTreeClient::OnConnect() {
void WindowTreeClient::WmOnAcceleratedWidgetForDisplay(
int64_t display,
gpu::SurfaceHandle surface_handle) {
// TODO(crbug.com/786453): Implement this.
if (window_manager_delegate_) {
window_manager_delegate_->OnWmAcceleratedWidgetAvailableForDisplay(
display, surface_handle);
}
}
void WindowTreeClient::WmNewDisplayAdded(
......
......@@ -176,6 +176,17 @@ display::Display WindowTreeHostMus::GetDisplay() const {
return display;
}
void WindowTreeHostMus::OverrideAcceleratedWidget(
gfx::AcceleratedWidget widget) {
bool was_visible = compositor()->IsVisible();
if (was_visible)
compositor()->SetVisible(false);
compositor()->ReleaseAcceleratedWidget();
OnAcceleratedWidgetAvailable(widget, GetDisplay().device_scale_factor());
if (was_visible)
compositor()->SetVisible(true);
}
std::unique_ptr<DisplayInitParams>
WindowTreeHostMus::ReleaseDisplayInitParams() {
return std::move(display_init_params_);
......
......@@ -29,7 +29,7 @@ class WindowTreeHostMusDelegate;
struct DisplayInitParams;
struct WindowTreeHostMusInitParams;
class AURA_EXPORT WindowTreeHostMus : public aura::WindowTreeHostPlatform {
class AURA_EXPORT WindowTreeHostMus : public WindowTreeHostPlatform {
public:
explicit WindowTreeHostMus(WindowTreeHostMusInitParams init_params);
......@@ -95,6 +95,10 @@ class AURA_EXPORT WindowTreeHostMus : public aura::WindowTreeHostPlatform {
int64_t display_id() const { return display_id_; }
display::Display GetDisplay() const;
// Forces WindowTreeHost to re-setup the compositor to use the provided
// |widget|.
void OverrideAcceleratedWidget(gfx::AcceleratedWidget widget);
// aura::WindowTreeHostPlatform:
void HideImpl() override;
void SetBoundsInPixels(const gfx::Rect& bounds) override;
......
......@@ -112,6 +112,9 @@ class AuraTestBase : public testing::Test,
// WindowManagerDelegate:
void SetWindowManagerClient(WindowManagerClient* client) override;
void OnWmConnected() override;
void OnWmAcceleratedWidgetAvailableForDisplay(
int64_t display_id,
gfx::AcceleratedWidget widget) override {}
void OnWmSetBounds(Window* window, const gfx::Rect& bounds) override;
bool OnWmSetProperty(
Window* window,
......
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