IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> HWComposer源代码分析 -> 正文阅读

[PHP知识库]HWComposer源代码分析

代码路径为:/frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cpp 代码版本为android P
此类跟硬件合成Vsync信号有关系。这篇文章主要跟踪下硬件合成Vsync的过程。废话不多说,先看下构造方法。
在这里插入图片描述
可以看到构造方法传入一个Composer,然后强转为 mHwcDevice变量。目前这个就是唯一的构造传入参数。
遇到了一个新的类,android::Hwc2::Composer,这个类实现在
/frameworks/native/services/surfaceflinger/DisplayHardware/ComposerHal.cpp 中。
在这里插入图片描述
我们的HWComposer的很多操作都委托给了Composer。先来看下HWComposer的几个比较重要的方法。
先来看下Composer怎么构造的。

165Composer::Composer(const std::string& serviceName)
166    : mWriter(kWriterInitialSize),
167      mIsUsingVrComposer(serviceName == std::string("vr"))
168{ 
//通过binder 调用HAL模块的mComposerService
169    mComposer = V2_1::IComposer::getService(serviceName);
170
171    if (mComposer == nullptr) {
172        LOG_ALWAYS_FATAL("failed to get hwcomposer service");
173    }
174
175    mComposer->createClient(
176            [&](const auto& tmpError, const auto& tmpClient)
177            {
178                if (tmpError == Error::NONE) {
179                    mClient = tmpClient;
180                }
181            });
182    if (mClient == nullptr) {
183        LOG_ALWAYS_FATAL("failed to create composer client");
184    }
185
186    // 2.2 support is optional
187    sp<IComposer> composer_2_2 = IComposer::castFrom(mComposer);
188    if (composer_2_2 != nullptr) {
189        mClient_2_2 = IComposerClient::castFrom(mClient);
190        LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr, "IComposer 2.2 did not return IComposerClient 2.2");
191    }
192
193    if (mIsUsingVrComposer) {
194        sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
195        if (vrClient == nullptr) {
196            LOG_ALWAYS_FATAL("failed to create vr composer client");
197        }
198    }
199}

mClient实现如下。
在这里插入图片描述
从上述总结可以知道,HWComposer很多业务逻辑都是直接跟硬件交互了。HAL位于操作系统和驱动程序之上,运行在用户空间中的服务程序。其目的是为上层的应用提供一个统一的查询硬件设备的接口。有了HAL接口,就可以将硬件开发和上层的应用开发分离开,上层的应用开发不必关系具体实现是什么硬件,同样地,如果硬件厂家需要改变硬件设备,只需要按照HAL接口的规范和标准提供对应的硬件驱动,而不必更改应用。(HAL层并不提供对硬件的实际操作,对硬件的实际操作仍然由具体的驱动程序来完成。)(此段文章摘自 https://blog.csdn.net/yyh448522331/article/details/77925907 )
当硬件层产生了Vsync信号,会回调mComposeClient的HalEventCallback
在这里插入图片描述
其中onVsync就是所谓的同步信号,进而会调用到HWCompose里面的onVsync方法。
不过由于在SurfaceFlinger的init方法中
getBE().mHwc->registerCallback(this, ++getBE().mComposerSequenceId);
HWCompose把callback注册到SurfaceFlinger,那么当硬件层的Vsync信号到来的时候,
直接回调到SF的onVsync方法,方法如下。

1325void SurfaceFlinger::onVsyncReceived(int32_t sequenceId,
1326        hwc2_display_t displayId, int64_t timestamp) {
1327    Mutex::Autolock lock(mStateLock);
1328    // Ignore any vsyncs from a previous hardware composer.
1329    if (sequenceId != getBE().mComposerSequenceId) {
1330        return;
1331    }
1332
1333    int32_t type;
1334    if (!getBE().mHwc->onVsync(displayId, timestamp, &type)) {
1335        return;
1336    }
1337
1338    bool needsHwVsync = false;
1339
1340    { // Scope for the lock
1341        Mutex::Autolock _l(mHWVsyncLock);
1342        if (type == DisplayDevice::DISPLAY_PRIMARY && mPrimaryHWVsyncEnabled) {
1343            needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1344        }
1345    }
1346
1347    if (needsHwVsync) {
1348        enableHardwareVsync();
1349    } else {
1350        disableHardwareVsync(false);
1351    }
1352}

最后有一句, enableHardwareVsync()。主要是对mPrimaryDispSync的操作。后续文章再来分析DispSync.cpp的作用。SurfaceFlinger作为一个核心的系统服务,毫无疑问他的功能一定是有很多功能强大的类来组成,这个时候不能需要抽丝剥茧,慢慢分析。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-27 11:38:35  更:2021-08-27 11:40:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:24:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码