为臭氧gbm客户实现单个界面以配置显示

本文最初发布在Google文档中。

介绍

从理论上讲,在Chromium中使用Ozone的应用程序可以在运行时选择其后端,例如X11,DRM / GBM,Wayland或无头。 但是,如果我们用臭氧层gbm(DRM / GBM)后端构建content_shell,则它不能很好地工作,因为它没有实现显示配置器来配置显示,而是因为该代码在Ash中。 但是它还需要管理多个显示器。 因此,如果我们要呈现臭氧gbm客户端的用户界面,则每个臭氧gbm客户端都必须实现自己的显示配置器,就像臭氧臭氧演示程序一样。 但是,每个客户端将具有相同的显示配置处理程序,这效率很低。 此外,CrOS中已经实现了显示管理功能,例如多显示支持,HDCP和显示布局管理器,因此我们需要一种与非CrOS应用程序共享这些功能的方法,例如数字标牌,信息亭,IVI,机顶盒,数字电视,物联网系统等

本文档介绍了如何为ocb-gbm客户端实现单个接口以配置CrOS DisplayManager和DisplayConfigurator的显示,以及如何在臭氧-gbm客户端中使用它。

目标

  1. 提供一个单一的界面,用于管理和配置针对臭氧gbm客户的显示。
  2. 允许臭氧gbm客户(例如CrOS,臭氧_demo等)使用该接口。

当前用于显示管理的CrOS体系结构

ash :: Shell拥有DisplayManager和DisplayConfigurator。 它还取决于用于创建显示信息的ui :: DisplayChangeObserver,方法是通过观察显示配置回调将其从ui :: DisplayConfigurator传递给DisplayManager。

但是,我们需要有一个用于配置显示的界面,以便任何臭氧gbm客户端都可以更轻松地使用显示配置功能。

拟议建筑

让DisplayManager拥有自己的DisplayConfigurator(完成)

  bool DisplayManager :: SetDisplayMode(int64_t display_id, 
const ManagedDisplayMode&display_mode){
  ... 
  #如果已定义(OS_CHROMEOS) 
否则, 如果 (resolution_changed && configure_displays_)
委托_->显示配置器()-> OnConfigurationChanged();
  #万一 
  ... 
  } 

当前,ui :: DisplayManager通过ash :: WindowTreeHostManager与ui :: DisplayConfigurator交互,但是它可以通过允许DisplayManager拥有DisplayConfigurator来直接访问ui :: DisplayConfigurator。 因此,我们可以避免在上面的代码中链接函数调用。

单一界面用于显示配置和管理

ui :: DisplayManager可以通过移动DisplayManager下的DisplayConfigurator和DisplayChangeObserver来成为臭氧gbm客户端的单一接口,这可以简化CrOS Shell与ui / Display / Manager之间的关系。 仅通过访问DisplayManager,Ozone-gbm客户端即可轻松使用显示配置/管理功能。

设置回调而不是创建NativeDisplayObserver

在此体系结构中,臭氧gbm客户端将没有NativeDisplayObserver,因此无法观察显示配置的更改。 相反,我们可以在DisplayManager中设置一个回调函数,以便在配置显示器时可以触发该回调函数。

实作

第一阶段:将显示配置代码与CrOS分开(完成)

首先,我们需要通过引入build_display_configuration build标志将Display Configuration代码与CrOS分开,以便可以轻松地为已经提交到干线的任何臭氧gbm客户启用它:

https://chromium.googlesource.com/chromium/src/+/d3ae8737f7186154d2fdc3ccc5fe43bf290f91b5

此CL将ui / display / manager / chromeos中的所有文件移动到ui / display / manager中,并添加了build_display_configuration GN arg。

第二阶段:添加DISPLAY_CONFIGURATION宏

但是,如果我们尝试使用不带OS_CHROMEOS的build_display_configuration来构建content_shell,则仍然会有构建中断,因为某些Display Configuration代码属于CrOS构建,因此我们需要通过引入DISPLAY_CONFIGURATION宏将这些代码与CrOS构建分开。

 如果(build_display_configuration){ 
定义+ = [“ DISPLAY_CONFIGURATION”]
}

同样,应通过OS_CHROMEOS宏来保护“显示配置”代码中CrOS特定的代码,如下所示:

  #如果已定义(OS_CHROMEOS) 
如果(!chromeos :: IsRunningAsSystemCompositor())
返回cached_displays;
#万一

[WIP] https://chromium-review.googlesource.com/c/chromium/src/+/1399472

第三阶段:在没有自己的显示配置器的情况下,使臭氧_演示与DisplayManager和DisplayConfigurator一起使用。

这是臭氧_demo的代码示例:

  WindowManager :: WindowManager(std :: unique_ptr  
renderer_factory,base :: OnceClosure quit_closure)
:quit_closure_(std :: move(quit_closure)),
renderer_factory_(std :: move(renderer_factory)){
如果(!renderer_factory _-> Initialize())
LOG(FATAL)<<“无法初始化渲染器工厂”;
  std :: unique_ptr 委托( 
ui :: OzonePlatform :: GetInstance()-> CreateNativeDisplayDelegate());
 如果(委托){ 
std :: unique_ptr
屏幕(光环::测试屏幕::创建(gfx :: ScaleToCeiledSize(
gfx :: Size(800,600),2.0))));
display :: Screen :: SetScreenInstance(screen.get());
     display_configurator_ = 
std :: make_unique ();
display_configurator _-> Init(std :: move(delegate),false);
display_manager_ =
std :: make_unique (std :: move(screen));

如果(!display_manager _-> InitFromCommandLine()){
display_change_observer_ =
std :: make_unique (
display_configurator_.get(),display_manager_.get());
display_configurator _-> AddObserver(
display_change_observer_.get());
display_configurator _-> set_state_controller(
display_change_observer_.get());
display_configurator _-> ForceInitialConfigure(
base :: BindRepeating(
&WindowManager :: OnConfigured,base :: Unretained(this)));
}其他
display_manager _-> InitDefaultDisplay();
}其他{
日志(警告)<<
“没有展示代表; 回到测试窗口”;
int width = kTestWindowWidth;
int height = kTestWindowHeight;
sscanf(base :: CommandLine :: ForCurrentProcess()
-> GetSwitchValueASCII(kWindowSize).c_str(),
“%dx%d”,&width和&height);
  DemoWindow * window = new DemoWindow(this, 
renderer_factory_.get(),
gfx :: Rect(gfx :: Size(width,height)));
window-> Start();
}
}

第四阶段:让DisplayManager拥有自己的DisplayConfigurator

ui :: DisplayManager将拥有DisplayConfigurator和DisplayChangeObserver,因此,臭氧gbm客户端将仅通过ui :: DisplayManager配置显示器来访问ui :: Display信息。

[完成] https://chromium-review.googlesource.com/c/chromium/src/+/1418315

第五阶段:为gbm客户端启用零拷贝纹理和视频加速

我们可以为CrOS等任何臭氧级gbm客户启用零拷贝纹理上传和视频加速。

第六阶段:将新的显示配置界面应用于content_shell并支持布局测试

我们可以在真实的浏览环境中测试硬件加速功能,这比单元测试好。

另一种方法是,除了将显示配置/管理功能应用于content_shell之外,我们还可以创建带有新臭氧后端(bodiless)的无外壳外壳。

未来计划:实施无害臭氧层

不含臭氧的臭氧层是一个新的臭氧平台,专门为希望启用硬件加速功能(例如视频加速,硬件覆盖和在Linux系统上上传零拷贝纹理)的应用程序而设计。 它使用chromeless提供了全屏浏览支持,从而允许使用网络技术创建新的UI。 这是臭氧生物将实现的一些功能:

  • 每个窗口的窗口大小始终等于一个WTH。
  • 多显示器支持
  • 输入(键盘,鼠标和触摸)和光标支持
  • 弹出窗口支持
  • 视频加速和硬件覆盖支持
  • HDCP支持

[错误] https://bugs.chromium.org/p/chromium/issues/detail?id=936704

虫子

  • Ozone-GBM未在content_shell上配置显示
  • 允许在Linux / Intel桌面上运行OGB-GBM
  • 在Linux桌面上运行带臭氧层gbm的content_shell
  • 为臭氧gbm客户实现单个界面以配置显示

更改列表

  • https://chromium.googlesource.com/chromium/src/+/d3ae8737f7186154d2fdc3ccc5fe43bf290f91b5(完成)
  • https://chromium-review.googlesource.com/c/chromium/src/+/1220719(WIP)
  • 让DisplayManager拥有自己的DisplayConfigurator(完成)

参考

  • https://chromium.googlesource.com/chromium/src/+/HEAD/docs/ozone_overview.md
  • BlinkOn9:在Linux台式机系统上使用OAO-GBM加速图形性能
  • 在Linux桌面上利用Chrome的Ozone-GBM Intel图形支持