Android P图形架构之SurfaceFlinger加载显示屏流程

本文解析了Android系统中显示屏初始化的全过程,从LocalDisplayAdapter到SurfaceFlinger,再到HAL层的Hotplug事件处理,深入探讨了显示屏信息如何在系统中传递与初始化。

相关源码:
\frameworks\base\services\core\java\com\android\server\display\LocalDisplayAdapter.java
\frameworks\base\core\java\android\view\SurfaceControl.java
\frameworks\base\core/jni\android_view_SurfaceControl.cpp
frameworks\native\libs\gui\include\private\gui\ComposerService.h
\frameworks\base\services\core\java\com\android\server\display\DisplayManagerService.java
\frameworks/native/services/surfaceflinger/DisplayDevice.h
frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.h
\frameworks\native\libs\gui\ISurfaceComposerClient.cpp
\frameworks\native\libs\gui\ISurfaceComposer.cpp
hardware\libhardware\include\hardware\hwcomposer_defs.h
\frameworks\native\services\surfaceflinger\SurfaceFlinger.cpp
\frameworks\native\services\surfaceflinger\DisplayHardware\HWC2.cpp
\vendor\nxp-opensource\imx\display\hwcomposer_v20\hwcomposer.cpp
\hardware\interfaces\graphics\composer\2.1\utils\passthrough\include\composer-passthrough\2.1\HwcHal.h

官方资料:
https://source.android.com/devices/graphics
https://source.android.google.cn/devices/graphics?hl=zh_cn
https://source.android.google.cn/devices/graphics

谷歌官网图形架构:
Surface 如何被渲染

1、LocalDisplayAdapter.java

LocalDisplayAdapter的主要作用是初始化显示屏,从SurfaceFlinger中获取到屏的显示,并发送给DisplayManagerService进行显示屏的初始化。
其中,getBuiltInDisplay最终是调用SurfaceFlinger中的getBuiltInDisplay,由SurfaceFlinger管理的显示适配器。

源码路径:\frameworks\base\services\core\java\com\android\server\display\LocalDisplayAdapter.java

private static final int[] BUILT_IN_DISPLAY_IDS_TO_SCAN = new int[] {
   
   
        SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN,
        SurfaceControl.BUILT_IN_DISPLAY_ID_HDMI,
        SurfaceControl.BUILT_IN_DISPLAY_ID_THIRD,	//add by sunxiaolin 20190906
};

@Override
public void registerLocked() {
   
   
    super.registerLocked();
    mHotplugReceiver = new HotplugDisplayEventReceiver(getHandler().getLooper());
    for (int builtInDisplayId : BUILT_IN_DISPLAY_IDS_TO_SCAN) {
   
   
        tryConnectDisplayLocked(builtInDisplayId);
    }
}
从SurfaceFlinger中获取显示屏信息,并通过DisplayManagerService,add displays
private void tryConnectDisplayLocked(int builtInDisplayId) {
   
   
	//最终调用到SurfaceFlinger中getBuiltInDisplay,获取到可以使用的显示屏display
    IBinder displayToken = SurfaceControl.getBuiltInDisplay(builtInDisplayId);
    if (displayToken != null) {
   
   
		//省略一部分代码
		//...
		//
		sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_ADDED);
	}
}

2、ISurfaceComposer.cpp

LocalDisplayAdapter中的getBuiltInDisplay,最终是调用SurfaceFlinger中的getBuiltInDisplay(),但是我们还是详细跟一下JNI调用的流程:
SurfaceControl中的getBuiltInDisplay()调用了JNI的nativeGetBuiltInDisplay,定义如下:
\frameworks\base\core\java\android\view\SurfaceControl.java

private static native IBinder nativeGetBuiltInDisplay(int physicalDisplayId);
public static IBinder getBuiltInDisplay(int builtInDisplayId) {
   
   
    return nativeGetBuiltInDisplay(builtInDisplayId);
}

android_view_SurfaceControl中调用的是SurfaceComposerClient中的getBuiltInDisplay,
\frameworks\base\core/jni\android_view_SurfaceControl.cpp

static jobject nativeGetBuiltInDisplay(JNIEnv* env, jclass clazz, jint id) {
   
   
    sp<IBinder> token(SurfaceComposerClient::getBuiltInDisplay(id));
    return javaObjectForIBinder(env, token);
}

SurfaceComposerClient调用是ISurfaceComposer中的getBuiltInDisplay,实现如下:
\frameworks\native\libs\gui\SurfaceComposerClient.cpp

sp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) {
   
   
    return ComposerService::getComposerService()->getBuiltInDisplay(id);
}

ComposerService中关于getComposerService()的定义,得知调用的是ISurfaceComposer中的接口:
frameworks\native\libs\gui\include\private\gui\ComposerService.h

// Get a connection to the Composer Service.  This will block until
// a connection is established.
static sp<ISurfaceComposer> getComposerService();

\frameworks\native\libs\gui\ISurfaceComposer.cpp

virtual sp<IBinder> getBuiltInDisplay(int32_t id)
{
   
   
    Parcel data, reply;
    data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
    data.writeInt32(id);
    remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaolin2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值