admin管理员组文章数量:1130349
针对IVI多屏方案,部分场景可能会有支持不同屏播放不同的开机动画的需求,甚至是有动态支持替换动画的需求。原生的BootAnimation并不支持此功能,因此需要针对这种需求,从DisplayManagerService->BootAnimation->SurfaceFlinger的通路进行修改支持。
DisplayManagerService的修改,主要是为了避免系统启动初期DisplayManagerService的对各个屏的layerstack的设置。因为启动前期并没有任何的window,因此在DMS来看,所有的display是没有内容的,因此直接使用了主显的显示内容。
BootAnimation的修改,就是要支持多个动画的播放、动画资源文件的选择,以及各display的layerstack的设置。
SurfaceFlinger的修改,主要是支持了多个屏同时进入动画的显示,SurfaceFlinger原生的框架中,对所有启动时已接入的显示设备是同时加载的,但默认没有设置layerstack、powermode等信息,因此除主屏外,其他屏的初始化都是在DisplayManagerService启动后才进行的,因此可以看到多屏的动画在播放时,是主屏先显示,让等隔几秒后其他屏才显示动画。
SurfaceFlinger层的修改
SurfaceFlinger层主要解决的是所有副屏的初始化问题,主要是powermode的设置:
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 1cfc303..b4ade6b 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -4541,31 +4541,37 @@ void SurfaceFlinger::onInitializeDisplays() {
setTransactionState(state, displays, 0, nullptr, mPendingInputWindowCommands, -1, {}, {});
setPowerModeInternal(display, HWC_POWER_MODE_NORMAL);
+
#if ENABLE_POWER_EXTERNAL_DISPLAY
+ for (const auto& [id, token] : mPhysicalDisplayTokens) {
+ const auto displayExt = getDisplayDeviceLocked(token);
+ if (displayExt == display)
+ continue;
+ if(displayExt)
+ {
+ const sp<IBinder> tokenExt = displayExt->getDisplayToken().promote();
+ LOG_ALWAYS_FATAL_IF(tokenExt == nullptr);
+
+ // reset screen orientation and use primary layer stack
+ Vector<ComposerState> stateExt;
+ Vector<DisplayState> displayStateExts;
+ DisplayState ds;
+ ds.what = DisplayState::eDisplayProjectionChanged |
+ DisplayState::eLayerStackChanged;
+ ds.token = tokenExt;
+ ds.layerStack = 0;
+ ds.orientation = DisplayState::eOrientationDefault;
+ ds.frame.makeInvalid();
+ ds.viewport.makeInvalid();
+ ds.width = 0;
+ ds.height = 0;
+ displayStateExts.add(ds);
+ setTransactionState(stateExt, displayStateExts, 0, nullptr, mPendingInputWindowCommands, -1, {}, {});
+ setPowerModeInternal(di针对IVI多屏方案,部分场景可能会有支持不同屏播放不同的开机动画的需求,甚至是有动态支持替换动画的需求。原生的BootAnimation并不支持此功能,因此需要针对这种需求,从DisplayManagerService->BootAnimation->SurfaceFlinger的通路进行修改支持。
DisplayManagerService的修改,主要是为了避免系统启动初期DisplayManagerService的对各个屏的layerstack的设置。因为启动前期并没有任何的window,因此在DMS来看,所有的display是没有内容的,因此直接使用了主显的显示内容。
BootAnimation的修改,就是要支持多个动画的播放、动画资源文件的选择,以及各display的layerstack的设置。
SurfaceFlinger的修改,主要是支持了多个屏同时进入动画的显示,SurfaceFlinger原生的框架中,对所有启动时已接入的显示设备是同时加载的,但默认没有设置layerstack、powermode等信息,因此除主屏外,其他屏的初始化都是在DisplayManagerService启动后才进行的,因此可以看到多屏的动画在播放时,是主屏先显示,让等隔几秒后其他屏才显示动画。
SurfaceFlinger层的修改
SurfaceFlinger层主要解决的是所有副屏的初始化问题,主要是powermode的设置:
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 1cfc303..b4ade6b 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -4541,31 +4541,37 @@ void SurfaceFlinger::onInitializeDisplays() {
setTransactionState(state, displays, 0, nullptr, mPendingInputWindowCommands, -1, {}, {});
setPowerModeInternal(display, HWC_POWER_MODE_NORMAL);
+
#if ENABLE_POWER_EXTERNAL_DISPLAY
+ for (const auto& [id, token] : mPhysicalDisplayTokens) {
+ const auto displayExt = getDisplayDeviceLocked(token);
+ if (displayExt == display)
+ continue;
+ if(displayExt)
+ {
+ const sp<IBinder> tokenExt = displayExt->getDisplayToken().promote();
+ LOG_ALWAYS_FATAL_IF(tokenExt == nullptr);
+
+ // reset screen orientation and use primary layer stack
+ Vector<ComposerState> stateExt;
+ Vector<DisplayState> displayStateExts;
+ DisplayState ds;
+ ds.what = DisplayState::eDisplayProjectionChanged |
+ DisplayState::eLayerStackChanged;
+ ds.token = tokenExt;
+ ds.layerStack = 0;
+ ds.orientation = DisplayState::eOrientationDefault;
+ ds.frame.makeInvalid();
+ ds.viewport.makeInvalid();
+ ds.width = 0;
+ ds.height = 0;
+ displayStateExts.add(ds);
+ setTransactionState(stateExt, displayStateExts, 0, nullptr, mPendingInputWindowCommands, -1, {}, {});
+ setPowerModeInternal(di版权声明:本文标题:Android10多屏开机动画 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://it.en369.cn/jiaocheng/1763933422a2972715.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。


发表评论