HAL/SurfaceFlinger专题之HWC和GPU合成部分更新通知

背景

hi,粉丝朋友们:
hal/surfaceflinger/perfetto专题,马哥经过若干天的努力,终于把sf最重要合成部分搞定,上传平台审核完成。
在这里插入图片描述

课程部分的截图花絮:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

目前完整课表list

1-start-intruduct.mkv  课程介绍
hal/hal-1-s.mp4 -hal发展总体介绍1
hal/hal-2.mkv  -hal发展总体介绍2
hal/hal-3.mkv  --经典hal深入讲解1
hal/hal-4-1-cut.mkv --经典hal深入实战讲解2
hal/hal-5.mp4 --经典hal深入实战讲解3
hal/hal-6.mkv --经典hal深入讲解4
hal/hidl-1.mkv --hidl深入背景讲解1
hal/hidl-2.mp4 --hidl深入讲解2
hal/hidl-3-cut.mp4 --hidl深入讲解3
hal/hidl-4-genarates.mkv  --hidl深入讲解-genarates原理
hal/hidl-5.mkv  --hidl实战部分1
hal/hidl-6.mp4  --hidl实战部分2
hal/hidl-passthrough-mapper-1.mkv  --hidl的passthrough案例分析1
hal/hidl-passthrough-mapper-2.mkv  --hidl的passthrough案例分析2
hal/vndk-1.mp4 --vndk介绍部分
hal/vndk-2.mkv --vndk讲解1
hal/vndk-3.mp4 --vndk讲解2
hal/aidl-1.mp4 --aidl深入讲解1
hal/aidl-2.mkv --aidl深入讲解2
hal/aidl-3.mp4 --aidl深入实战讲解2
hal/aidl-4.mp4 --aidl深入实战讲解2
hal/aidl-5-call-java.mp4 --aidl实战之java端调用
hal/aidl-6-update.mp4 -aidl的更新部分
hal/aidl-7-update-vinf.mp4 ----vinf相关介绍
perfetto/systrace-perfetto-1.mkv --perfetto的背景及抓取方式
perfetto/systrace-perfetto-2-base-knowlege-cut.mp4 --perfetto的查看基础知识讲解
perfetto/systrace-perfetto-3.mp4 --perfetto使用技巧及自定义tag加入方式
perfetto/systrace-perfetto-4-two-tips-small.mp4 ---perfetto使用小技巧分享
 2-surfacecontrol-Layer-1.mp4 --sf之surfacecontrol讲解1
 2-surfacecontrol-Layer-2.mkv --sf之surfacecontrol讲解2
 3-transaction-2.mkv --sf之transaction讲解1
 3-transaction.mkv --sf之transaction讲解2
vsync/1-vsync-1.mp4 --sf之vsync基础知识讲解1
vsync/2-vsync-2-workduration.mp4 --sf之vsync基础知识讲解2
vsync/3-vsync-source-1.mp4 --sf之vsync源码分析1
vsync/4-vsync-source-2-cut.mp4 --sf之vsync源码分析2
vsync/5-vsync-source-3.mp4 --sf之vsync源码分析3
vsync/6-vsync-source-4.mp4 --sf之vsync源码分析4
vsync/7-hw_adapter_sw_vsync.mp4 --sf之vsync硬件校准部分深入讲解
vsync/8-vsync-end-1-cut.mp4 --sf之vsync总结部分1
vsync/9-vsync-end-2.mp4 --sf之vsync总结部分2
vsync/10-perfetto-look-vsync-1-cut.mp4 --sf之vsync与perfetto结合分析巩固1
vsync/11-perfetto--look-vsync-2.mp4  --sf之vsync与perfetto结合分析巩固2
vsync/12-vsync-3-perfeto-apptimecallback.mp4  --sf之vsync与perfetto结合分析巩固3
vsync/13-vsync-4-perfetto-app-sf-start-end.mp4  --sf之vsync与perfetto结合分析巩固4
 commit-1-setTransaction.mp4 --sf之transaction讲解1 --sf之setTransaction部分深入讲解
 commit-2-flushTransation.mp4 --sf之flushTransation部分深入讲解
 commit-3.mkv --sf之commit部分
 cmomit-4-end-systrace.mp4  --sf之commit部分与systrace分析巩固
 
 -----------------------blastbufferqueue部分-----------------------------

blastbufferqueue-1.mkv  ---经典bufferqueue模型简单demo讲解1
blastbufferqueue-2.mp4  ---经典bufferqueue模型简单demo深入讲解2
balstbufferqueue-3.mkv  ---经典bufferqueue模型部分3
blastbufferqueue-4.mp4 ---经典bufferqueue模型部分4
blastbufferqueue-5.mp4 ---经典bufferqueue模型部分5
blastbufferqueue-6.mkv ---经典bufferqueue模型releaseBuffer
only-blast-1.mkv ---BLASTBufferQueue新特性发起和服务端分析1
only-blast-2.mp4 ---BLASTBufferQueue新特性发起和服务端分析2
only-blast-app-3.mp4 ---BLASTBufferQueue新特性app端分析1
only-blast-app-4.mp4 ---BLASTBufferQueue新特性app端分析2
o-blast-all-end-5.mp4 ---BLASTBufferQueue新特性总结部分
output-blast-func.mp4 ---BLASTBufferQueue新特性主要方法补充

 -----------------------composer部分-----------------------------
hwc-1.mp4  ----hwc合成部分深入源码分析1
hwc-2.mp4 ----hwc合成部分深入源码分析2
hwc-3-cut.mp4 ----hwc合成部分深入源码分析3
hwc-4.mp4 ----hwc合成部分深入源码分析4
hwc-5-cut.mp4 ----hwc合成部分深入源码分析5
hwc-hal.mp4 ----hwc合成的hal部分分析1
hwc-hal-2.mp4 ----hwc合成的hal部分分析2
hwc-6-perfetto.mp4 ----hwc合成部分结合trace分析
gpu-demo.mp4 ----gpu合成demo实现
gpu-source-1.mp4 ----gpu合成源码分析1
gpu-source-2.mp4 ----gpu合成源码分析2
gpu-source-3-systrace.mp4 ----gpu合成trace分析



目前已经到课74节课时

后续更新部分

1、surfaceflinger相关的实战小项目
2、补充一些selinux部分的基础
大家尽请期待

更多framework干货请关注“千里马学框架”

<think>我们正在讨论Android图形合成HWCGPU的角色,以及它们与DRM的关系。用户现在想查找HWCDRM/GPU合成相关代码的位置。根据之前的讨论,HWC是硬件合成器,而GPU负责软件合成。同时,引用内容提到了DRM(DirectRenderingManager)在Linux内核中的作用,特别是CRTC(阴极射线管控制器,在DRM中代表显示控制器)overlay planes。用户问题:查找DRM GPU合成HWC合成的代码实现位置我们需要分两部分:1. HWC合成的代码位置:在Android系统中,HWC的实现通常位于硬件抽象层(HAL)中,具体路径在`hardware/interfaces/graphics/composer/`下,而具体厂商的实现则在设备相关的代码中。2. DRM(内核部分GPU合成(通常指软件合成,即GPU通过OpenGLES/Vulkan进行合成)的代码位置:DRM相关的代码位于Linux内核的`drivers/gpu/drm`目录下。而GPU合成(软件合成)的代码在Android的SurfaceFlinger中,使用OpenGL ES或Vulkan实现。根据引用内容,我们还知道受保护的DRM视频(DRM-Protected)必须通过HWC的overlay planes来显示,因为GPU无法访问这些受保护的缓冲区。具体代码位置:一、HWC合成的实现代码:1.Android框架中HWC的接口定义:`hardware/interfaces/graphics/composer/`(例如`IComposer.hal`等文件)2.具体HWC实现(以常见的DRM/KMS实现为例)通常位于设备厂商的HAL实现中,例如:-在AOSP中,有一个使用DRM/KMS的HWC实现示例,位于`hardware/google/graphics/composer`(具体路径可能变化,但通常设备厂商会提供自己的实现)-对于使用DRM/KMS的HWC实现,可以查找`hwcomposer.drm`之类的模块。例如,在`hardware/interfaces/graphics/composer/2.1/utils/passthrough`下可能有passthrough HAL实现,而具体的实现则在设备树中。二、DRM/KMS的代码(内核空间):1.DRM核心代码:Linux内核中的`drivers/gpu/drm`- CRTC、Plane、Encoder等对象的实现:`drivers/gpu/drm/drm_crtc.c`,`drm_plane.c`, `drm_encoder.c`等-具体显示驱动(如i915,amdgpu,exynos等)在各自的子目录中实现。三、GPU合成(软件合成)的代码:1.在SurfaceFlinger中,当HWC无法处理图层时,会使用GPU进行合成。这部分代码位于:-`frameworks/native/services/surfaceflinger/`,特别是`SurfaceFlinger.cpp``DisplayHardware/`目录下的`HWComposer.cpp`(处理与HWC的交互)`CompositionEngine/`目录下的相关文件。-GPU合成的具体实现:在`frameworks/native/services/surfaceflinger/CompositionEngine/`下的`Output.cpp`、`RenderSurface.cpp`等文件中,会调用OpenGL ES或Vulkan进行渲染。四、受保护内容(DRM-Protected)的合成路径:1.在HWC中,受保护的内容通过overlay plane直接显示,避免GPU访问。在代码中,这体现在:-在SurfaceFlinger中,当图层被标记为受保护时,会尝试通过HWC的overlay来处理(参见`HWComposer.cpp`中创建layer的过程)。-在DRM驱动中,受保护的缓冲区在传递给显示控制器之前不会被解密(通常由硬件处理)。五、如何通过dumpsys SurfaceFlinger查看合成类型:如之前引用[3]所示,可以通过`dumpsys SurfaceFlinger`查看图层的合成类型(composition type)。例如,SIDEBAND表示sideband流(用于受保护内容),HWC_OVERLAY表示硬件合成,GLES表示GPU合成。因此,用户可以根据上述路径查找相关代码。注意:由于Android系统内核版本的不同,具体路径可能有所变化,但大致的模块位置是相对固定的。生成相关问题:1.如何调试HWC合成失败的问题?2.在DRM驱动中,如何配置overlayplane?3.如何实现一个支持DRM受保护视频的HWC模块?4.SurfaceFlingerGPU合成的性能优化方法有哪些?</think>### HWC 与 DRM/GPU 合成代码实现位置分析 #### 一、HWC 硬件合成核心代码位置 1. **Android HWC HAL 接口层** - 路径:`hardware/interfaces/graphics/composer/` - 关键文件: - `IComposer.hal` (HIDL 接口定义) - `ComposerClient.cpp` (HWC 客户端实现)[^1] - 功能:定义硬件合成器与 SurfaceFlinger 的通信协议 2. **DRM/KMS 驱动层** - 路径:`drivers/gpu/drm/` (Linux 内核源码) - 关键模块: - `drm_crtc.c`:实现 CRTC(显示管道控制器) - `drm_plane.c`:管理 Overlay 图层硬件 - `drm_encoder.c`:处理显示输出编码[^1] - 示例代码片段: ```c // drivers/gpu/drm/drm_plane.c int drm_plane_init(struct drm_device *dev, struct drm_plane *plane, uint32_t possible_crtcs, const struct drm_plane_funcs *funcs, const uint32_t *formats, ...) { // 初始化硬件图层 plane->format_default = true; drm_mode_object_register(dev, &plane->base); } ``` 3. **厂商 HWC 实现示例** - 高通平台:`vendor/qcom/opensource/display-hal/` - 三星平台:`vendor/samsung_slsi/hardware/hwcomposer/` - 关键函数: ```cpp // 硬件合成提交函数 Return<Error> HwcImpl::setLayerInfo(uint64_t display, uint32_t layer, const LayerInfo& info) { // 配置 DRM 图层属性 drmModeAtomicAddProperty(atom, plane_id, DRM_MODE_ATOMIC_PLANE_FB, fb_id); } ``` #### 二、GPU 软件合成核心代码位置 1. **SurfaceFlinger 合成引擎** - 路径:`frameworks/native/services/surfaceflinger/CompositionEngine/` - 关键文件: - `Output.cpp`:`Output::composeSurfaces()` - `RenderSurface.cpp`:GLES/Vulkan 渲染实现[^2] 2. **OpenGL ES 合成路径** - 路径:`frameworks/native/services/surfaceflinger/` - 关键函数: ```cpp // RenderEngine/GLESRenderEngine.cpp void GLESRenderEngine::drawLayers(const DisplaySettings& display, ...) { glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); for (auto& layer : layers) { glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // GPU 合成 } } ``` 3. **DRM 保护内容处理** - 路径:`frameworks/native/services/surfaceflinger/DisplayHardware/` - 特殊路径: - `HWComposer.cpp` 中 `createLayer()` 检测 `DRM_PROTECTED` 标志 - 强制使用 `SIDEBAND` 合成类型绕过 GPU[^3] ```cpp // 检测受保护内容 if (layer->isProtected()) { compositionType = Composition::SIDEBAND; } ``` #### 三、关键调试与验证方法 1. **合成类型检测** 通过 `adb shell dumpsys SurfaceFlinger` 查看: ```plaintext + Layer 0xb40000776aa87410 (VideoPlayback) compositionType = SIDEBAND // DRM 保护路径 flags = DRM_PROTECTED + Layer 0x6c3 (StatusBar) compositionType = GLES // GPU 合成 ``` 2. **内核 DRM 调试** - 启用 DRM 调试日志:`echo 0xFF > /sys/module/drm/parameters/debug` - 查看 CRTC/Plane 状态:`cat /d/dri/0/state` --- ### 相关问题 1. 如何通过修改 `HWComposer.cpp` 强制特定图层走 GPU 合成路径? 2. DRM 受保护视频在 `drm_plane.c` 中如何实现硬件解密? 3. SurfaceFlinger 的 `CompositionEngine` 如何动态选择 HWCGPU 合成? 4. 在 Vulkan 渲染引擎中,如何实现与 HWC 的协同工作? 5. 如何通过内核 DRM 调试接口实时监控图层合成状态? [^1]: DRM 核心模块实现显示控制器的硬件抽象 [^2]: GPU 合成通过 OpenGL ES/Vulkan 实现复杂效果 [^3]: 受保护内容必须通过硬件合成路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

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

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

打赏作者

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

抵扣说明:

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

余额充值