1. 整体架构图┌─────────────────────────────────────────────────────────────────┐ │ 应用层框架 │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ App应用 │ │ Activity │ │ View系统 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ └─────────────────────┬───────────────────────────────────────────┘ │ Binder IPC ▼ ┌─────────────────────────────────────────────────────────────────┐ │ SurfaceFlinger服务 │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ SurfaceFlinger.cpp │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ │ │ - mHwc (std::unique_ptrHWComposer) │ │ │ │ │ │ - mDisplays (显示设备集合) │ │ │ │ │ │ - commit() - 合成提交 │ │ │ │ │ │ - postComposition() - 后处理 │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────┘ │ └─────────────────────┬───────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ HWComposer硬件组合器 │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ DisplayHardware/HWComposer.h/.cpp │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ │ │ std::unique_ptrHwc2::Composer mComposer │ │ │ │ │ │ mDisplayData (显示数据结构) │ │ │ │ │ │ │ │ │ │ │ │ 关键方法 │ │ │ │ │ │ - setCallback() - 设置回调 │ │ │ │ │ │ - getDeviceCompositionChanges() - 获取合成变更 │ │ │ │ │ │ - setClientTarget() - 设置客户端目标 │ │ │ │ │ │ - presentAndGetReleaseFences() - 显示和获取栅栏 │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────┘ │ └─────────────────────┬───────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ Composer HAL抽象层 │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ DisplayHardware/ComposerHal.h │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ │ │ class Composer { │ │ │ │ │ │ public: │ │ │ │ │ │ virtual Error presentDisplay() 0; │ │ │ │ │ │ virtual Error setClientTarget() 0; │ │ │ │ │ │ virtual Error validateDisplay() 0; │ │ │ │ │ │ virtual Error createLayer() 0; │ │ │ │ │ │ // ... 更多接口 │ │ │ │ │ │ }; │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ 具体实现AidlComposerHal/HidlComposerHal │ │ │ └──────────────────────────────────────────────────────────┘ │ └─────────────────────┬───────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 硬件组合器HAL服务 (厂商实现) │ │ (位于vendor分区实现具体的显示输出逻辑) │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ 厂商实现的核心代码 │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ │ │ DrmDisplay.cpp (DRM显示管理) │ │ │ │ │ │ DrmConnector.cpp (连接器管理) │ │ │ │ │ │ DrmCrtc.cpp (CRTC管理) │ │ │ │ │ │ DrmPlane.cpp (平面管理) │ │ │ │ │ │ DrmDevice.cpp (DRM设备管理) │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────┘ │ └─────────────────────┬───────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ libdrm │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ libdrm核心接口 │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ │ │ 设备管理 (xf86drm.h) │ │ │ │ │ │ - drmOpen() - 打开DRM设备 │ │ │ │ │ │ - drmClose() - 关闭DRM设备 │ │ │ │ │ │ - drmGetVersion() - 获取驱动版本 │ │ │ │ │ │ - drmIoctl() - ioctl封装 │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ │ │ KMS模式设置 (xf86drmMode.h) │ │ │ │ │ │ - drmModeGetResources() - 获取资源 │ │ │ │ │ │ - drmModeGetConnector() - 获取连接器 │ │ │ │ │ │ - drmModeSetCrtc() - 设置CRTC │ │ │ │ │ │ - drmModeAddFB() - 添加帧缓冲区 │ │ │ │ │ │ - drmModePageFlip() - 页面翻转 │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────┘ │ └─────────────────────┬───────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ Linux Kernel DRM子系统 │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ DRM Core (drivers/gpu/drm/) │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ │ │ drm_dev.c - 设备管理 │ │ │ │ │ │ drm_mode_config.c - 模式配置 │ │ │ │ │ │ drm_connector.c - 连接器管理 │ │ │ │ │ │ drm_crtc.c - CRTC管理 │ │ │ │ │ │ drm_encoder.c - 编码器管理 │ │ │ │ │ │ drm_plane.c - 平面管理 │ │ │ │ │ │ drm_gem.c - GEM内存管理 │ │ │ │ │ │ drm_fb_helper.c - 帧缓冲区助手 │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ GPU驱动实现 │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ │ │ i915 │ │ amdgpu │ │ 其他驱动 │ │ │ │ │ │ Intel GPU │ │ AMD GPU │ │ │ │ │ │ │ │ 驱动实现 │ │ 驱动实现 │ │ │ │ │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ └──────────────────────────────────────────────────────────┘ │ └─────────────────────┬───────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ GPU硬件 / 显示控制器 │ │ ├─► GPU核心 (计算单元、着色器等) │ │ ├─► 显示控制器 (时序控制、信号输出) │ │ ├─► 显存 (VRAM/系统内存共享) │ │ ├─► 输出接口 (HDMI/DP/eDP/DSI/Mipi等) │ │ └─► 显示器 (实际显示设备) │ └─────────────────────────────────────────────────────────────────┘2. 初始化阶段详细代码流程SurfaceFlinger::init() │ │ 代码位置: native/services/surfaceflinger/SurfaceFlinger.cpp │ ├─► HWComposer构造函数 │ │ │ ├─► HWComposer::HWComposer(composerServiceName) │ │ │ │ │ └─► HWComposer::HWComposer(Hwc2::Composer::create(composerServiceName)) │ │ │ │ │ ├─► Hwc2::Composer::create() │ │ │ │ │ │ │ └─► 检查并连接到硬件服务 │ │ │ │ │ │ │ ├─► 检查AIDL服务 │ │ │ │ │ │ │ │ │ └─► AServiceManager_checkService( │ │ │ │ android.hardware.graphics.composer3) │ │ │ │ │ │ │ ├─► 检查HIDL服务 │ │ │ │ │ │ │ │ │ └─► IComposer::getService() │ │ │ │ │ │ │ └─► 创建Composer实例 │ │ │ │ │ │ │ └─► std::make_uniqueAidlComposerHal(halService) │ │ │ │ │ │ │ └─► 初始化AIDL连接 │ │ │ │ │ │ │ └─► 连接到硬件Composer服务 │ │ │ │ │ │ │ └─► 厂商HAL服务初始化 │ │ │ │ │ │ │ └─► libdrm初始化调用 │ │ │ │ │ │ │ ├─► drmOpen(/dev/dri/card0) │ │ │ │ │ │ │ │ │ └─► libdrm/xf86drm.c │ │ │ │ │ │ │ │ │ ├─► drmOpenDevice() │ │ │ │ │ ├─► 确定设备节点路径 │ │ │ │ │ ├─► open(/dev/dri/card0, O_RDWR) │ │ │ │ │ └─► 返回文件描述符 │ │ │ │ │ │ │ ├─► drmGetVersion(fd, version) │ │ │ │ │ │ │ │ │ └─► drmIoctl(fd, DRM_IOCTL_VERSION, version) │ │ │ │ │ │ │ │ │ └─► 内核处理并返回驱动版本 │ │ │ │ │ │ │ └─► drmModeGetResources(fd) │ │ │ │ │ │ │ └─► libdrm/xf86drmMode.c │ │ │ │ │ │ │ ├─► drmModeGetResources() │ │ │ │ │ │ │ │ │ ├─► 准备drm_mode_card_res结构 │ │ │ │ │ │ │ │ │ ├─► 第一次ioctl调用 │ │ │ │ │ └─► drmIoctl(fd, DRM_IOCTL_MODE_GETRESOURCES, res) │ │ │ │ │ ├─► 内核DRM处理 │ │ │ │ │ ├─► 返回资源数量 │ │ │ │ │ └─► res.count_crtcs, res.count_connectors等 │ │ │ │ │ │ │ │ │ ├─► 分配内存 │ │ │ │ │ ├─► res.fb_id_ptr malloc(count_fbs * sizeof(uint32_t)) │ │ │ │ │ ├─► res.crtc_id_ptr malloc(count_crtcs * sizeof(uint32_t)) │ │ │ │ │ └─► ... 分配其他资源数组 │ │ │ │ │ │ │ │ │ └─► 第二次ioctl调用 │ │ │ │ └─► drmIoctl(fd, DRM_IOCTL_MODE_GETRESOURCES, res) │ │ │ │ ├─► 内核填充资源ID数组 │ │ │ │ └─│ 返回完整的资源信息 │ │ │ │ │ │ │ └─► 构建drmModeRes结构返回 │ │ │ ├─► fbs: 帧缓冲区ID数组 │ │ │ ├─► crtcs: CRTC ID数组 │ │ │ ├─► connectors: 连接器ID数组 │ │ │ └─► encoders: 编码器ID数组 │ │ │ │ │ └─► 初始化HWComposer成员变量 │ │ ├─► mComposer std::move(composer) │ │ ├─► mRegisteredCallback false │ │ └─► mCapabilities 初始化能力集合 │ │ │ └─► 返回HWComposer实例 │ ├─► 设置回调函数 │ │ │ ├─► HWComposer::setCallback(callback) │ │ │ │ │ ├─► loadCapabilities() │ │ │ │ │ │ │ └─► mComposer-getCapabilities() │ │ │ │ │ │ │ └─► AidlComposerHal::getCapabilities() │ │ │ │ │ │ │ └─► mHal-getCapabilities(capabilities) │ │ │ │ │ │ │ └─► 硬件服务返回能力列表 │ │ │ ├─► SKIP_CLIENT_COLOR_TRANSFORM │ │ │ ├─► DOZE │ │ │ ├─► REFRESH_RATE_SWITCHING │ │ │ └─► 其他能力 │ │ │ │ │ ├─► loadLayerMetadataSupport() │ │ │ │ │ ├─► loadOverlayProperties() │ │ │ │ │ ├─► loadHdrConversionCapabilities() │ │ │ │ │ └─► 注册回调 │ │ │ │ │ └─► mComposer-registerCallback(callback) │ │ │ │ │ └─► AidlComposerHal::registerCallback() │ │ │ │ │ └─► mHal-registerCallback(callbackWrapper) │ │ │ │ │ └─► 硬件服务注册回调 │ │ │ │ │ └─► 启用热插拔、VSync等事件通知 │ │ ├─► onHotplug - 显示器热插拔 │ │ ├─► onVsync - 垂直同步信号 │ │ └─► onRefresh - 刷新请求 │ │ └─► 初始化显示设备 │ └─► SurfaceFlinger::initializeDisplays() │ ├─► 处理热插拔事件 │ │ │ └─► HWComposer::onHotplug(hwcDisplayId, connection) │ │ │ └─► onHotplugConnect(hwcDisplayId) │ │ │ ├─► 获取显示标识信息 │ │ │ │ │ └─► getDisplayIdentificationData(hwcDisplayId) │ │ │ │ │ └─► mComposer-getDisplayIdentificationData() │ │ │ │ │ └─► 硬件服务返回显示标识 │ │ ├─► EDID数据 │ │ ├─► 厂商信息 │ │ └─│ 设备ID │ │ │ ├─► 创建物理显示设备 │ │ │ │ │ └─► allocatePhysicalDisplay(hwcDisplayId, displayId) │ │ │ │ │ └─► 创建HWC2::Display实例 │ │ │ │ │ └─► std::make_uniqueHWC2::impl::Display( │ │ *mComposer.get(), │ │ mCapabilities, │ │ hwcDisplayId, │ │ hal::DisplayType::PHYSICAL) │ │ │ └─► 返回显示设备信息 │ ├─► 显示ID │ ├─► 分辨率 │ └─► 显示名称 │ └─► 创建DisplayDevice实例 │ └─► 创建DisplayDevice并添加到显示设备列表3. 帧显示和合成详细流程SurfaceFlinger::commit() │ │ 代码位置: native/services/surfaceflinger/SurfaceFlinger.cpp │ ├─► 准备合成 │ │ │ ├─► validateLayers() │ │ │ │ │ └─► 检查所有Layer的状态 │ │ ├─► 图层可见性 │ │ ├─│ 缓冲区状态 │ │ └─│ 合成类型 │ │ │ └─► buildLayerStacks() │ │ │ └─► 构建图层栈 │ ├─► 按Z顺序排序 │ ├─► 确定合成策略 │ └─► 准备合成参数 │ ├─► 获取硬件合成器建议 │ │ │ ├─► HWComposer::getDeviceCompositionChanges(displayId, frameUsesClientComposition, │ │ earliestPresentTime, expectedPresentTime, │ │ frameInterval, outChanges) │ │ │ │ │ └─► DeviceRequestedChanges获取流程 │ │ │ │ │ ├─► 检查显示有效性 │ │ │ │ │ │ │ └─► RETURN_IF_INVALID_DISPLAY(displayId, error) │ │ │ │ │ ├─► 获取显示数据 │ │ │ │ │ │ │ └─► auto displayData mDisplayData[displayId] │ │ │ │ │ │ │ └─► 获取HWC2::Display实例 │ │ │ │ │ │ │ └─► displayData.hwcDisplay │ │ │ │ │ ├─► 准备客户端目标 │ │ │ │ │ │ │ └─► prepareClientTarget(displayData, frameUsesClientComposition, │ │ │ earliestPresentTime, expectedPresentTime, │ │ │ frameInterval) │ │ │ │ │ ├─► 验证显示 │ │ │ │ │ │ │ └─► validateDisplay(displayData, earliestPresentTime, │ │ │ expectedPresentTime, frameInterval) │ │ │ │ │ │ │ ├─► HWC2::Display::validate() │ │ │ │ │ │ │ └─► ComposerHal::validateDisplay(display, expectedPresentTime, │ │ │ frameIntervalNs, outNumTypes, │ │ │ outNumRequests) │ │ │ │ │ │ │ └─► AidlComposerHal::validateDisplay() │ │ │ │ │ │ │ └─► mHal-validateDisplay(display, expectedPresentTime, │ │ │ frameIntervalNs, numTypes, │ │ │ numRequests) │ │ │ │ │ │ │ └─► 硬件服务验证 │ │ │ │ │ │ │ └─► 厂商实现调用libdrm │ │ │ │ │ │ │ ├─► drmModeGetConnector() │ │ │ │ │ │ │ │ │ └─► ioctl(DRM_IOCTL_MODE_GETCONNECTOR) │ │ │ │ ├─► 内核DRM处理 │ │ │ │ ├─► 检查连接状态 │ │ │ │ ├─► 获取支持的显示模式 │ │ │ │ └─│ 返回连接器信息 │ │ │ │ │ │ │ ├─► drmModeGetEncoder() │ │ │ │ │ │ │ │ │ └─► ioctl(DRM_IOCTL_MODE_GETENCODER) │ │ │ │ └─► 获取编码器信息 │ │ │ │ │ │ │ └─► drmModeGetCrtc() │ │ │ │ │ │ │ └─► ioctl(DRM_IOCTL_MODE_GETCRTC) │ │ │ ├─► 获取CRTC状态 │ │ │ └─│ 返回当前配置 │ │ │ │ │ ├─► 获取合成类型变更 │ │ │ │ │ │ │ └─► getChangedCompositionTypes() │ │ │ │ │ │ │ └─► ComposerHal::getChangedCompositionTypes(display, outLayers, │ │ │ outTypes) │ │ │ │ │ │ │ └─► 硬件服务返回合成类型建议 │ │ │ ├─► DEVICE - 硬件合成 │ │ │ ├─► CLIENT - 客户端合成 │ │ │ └─► CURSOR - 光标合成 │ │ │ │ │ ├─► 获取显示请求 │ │ │ │ │ │ │ └─► getDisplayRequests(display, outDisplayRequestMask, │ │ │ outLayers, outLayerRequestMasks) │ │ │ │ │ │ │ └─► 获取显示相关的合成请求 │ │ │ ├─► FLIP_CLIENT_TARGET - 翻转客户端目标 │ │ │ ├─► WRITE_CLIENT_TARGET_TO_OUTPUT - 写入客户端目标 │ │ │ └─► 其他显示请求 │ │ │ │ │ └─► 构建返回结果 │ │ │ │ │ └─► DeviceRequestedChanges │ │ ├─► changedTypes - 图层合成类型变更 │ │ ├─► displayRequests - 显示器请求 │ │ └─► layerRequests - 图层请求 │ │ └─► 执行合成操作 │ ├─► 根据合成类型选择合成方式 │ │ │ ├─► DEVICE合成 (硬件加速) │ │ │ │ │ └─► 直接由硬件合成器处理 │ │ │ │ │ └─► 设置图层层属性 │ │ │ │ │ ├─► setLayerBuffer() │ │ │ │ │ │ │ └─► ComposerHal::setLayerBuffer(display, layer, slot, │ │ │ buffer, acquireFence) │ │ │ │ │ │ │ └─► 硬件服务设置图层缓冲区 │ │ │ │ │ │ │ └─► 关联GEM句柄到图层 │ │ │ │ │ ├─► setLayerCompositionType() │ │ │ │ │ │ │ └─► 设置为DEVICE合成类型 │ │ │ │ │ └─► 其他图层属性设置 │ │ ├─► setLayerDisplayFrame() │ │ ├─► setLayerSourceCrop() │ │ ├─► setLayerBlendMode() │ │ └─► setLayerTransform() │ │ │ └─► CLIENT合成 (软件渲染) │ │ │ └─► GPU渲染流程 │ │ │ └─► RenderEngine::renderLayers() │ │ │ ├─► OpenGL ES渲染 │ │ │ │ │ └─► 使用GPU合成多个图层 │ │ ├─► 图层混合 │ │ ├─► 效果处理 │ │ └─► 生成最终图像 │ │ │ └─► 输出到GraphicBuffer │ │ │ └─► 作为客户端目标提交 │ ├─► 提交显示 │ │ │ └─► SurfaceFlinger::postComposition() │ │ │ └─► HWComposer::presentAndGetReleaseFences(displayId, earliestPresentTime) │ │ │ └─► 显示和获取释放栅栏的详细流程 │ │ │ ├─► 设置客户端目标 │ │ │ │ │ └─► setClientTarget(displayId, slot, acquireFence, target, │ │ dataspace, hdrSdrRatio) │ │ │ │ │ └─► ComposerHal::setClientTarget(display, slot, target, │ │ acquireFence, dataspace, damage, │ │ hdrSdrRatio) │ │ │ │ │ └─► 硬件服务处理客户端目标 │ │ │ │ │ └─► 调用libdrm分配GEM对象 │ │ │ │ │ ├─► 分配GEM缓冲对象 │ │ │ │ │ │ │ └─► drmIoctl(fd, DRM_IOCTL_GEM_CREATE, create) │ │ │ │ │ │ │ └─► 内核创建GEM对象 │ │ │ │ │ │ │ ├─► DRM Core: drm_gem_create() │ │ │ │ │ │ │ │ │ └─► GPU驱动: gem_create() │ │ │ │ ├─► 分配显存 │ │ │ │ ├─► 创建GEM对象 │ │ │ │ └─│ 返回GEM句柄 │ │ │ │ │ │ │ └─► 返回gem_handle │ │ │ │ │ ├─► 映射GEM对象到用户空间 │ │ │ │ │ │ │ └─► drmIoctl(fd, DRM_IOCTL_GEM_MMAP, map) │ │ │ │ │ │ │ └─► 内核处理映射请求 │ │ │ │ │ │ │ ├─► DRM Core: drm_gem_mmap() │ │ │ │ │ │ │ │ │ └─► GPU驱动: gem_mmap() │ │ │ │ ├─► 获取物理地址 │ │ │ │ ├─► 设置页表映射 │ │ │ │ └─│ 返回偏移量 │ │ │ │ │ │ │ └─► mmap()系统调用 │ │ │ │ │ │ │ └─► 映射到用户空间虚拟地址 │ │ │ │ │ │ │ └─► 返回用户空间地址 │ │ │ │ │ ├─► 复制像素数据 │ │ │ │ │ │ │ └─► memcpy(addr, buffer_data, size) │ │ │ │ │ │ │ └─► 将客户端合成的数据复制到GEM缓冲区 │ │ │ │ │ └─► 创建帧缓冲区 │ │ │ │ │ └─► drmModeAddFB(fd, width, height, depth, bpp, │ │ pitch, gem_handle, fb_id) │ │ │ │ │ └─► libdrm/xf86drmMode.c │ │ │ │ │ └─► drmModeAddFB() │ │ │ │ │ ├─► 准备drm_mode_fb_cmd结构 │ │ │ │ │ ├─► ioctl(DRM_IOCTL_MODE_ADDFB, fb_cmd) │ │ │ │ │ └─► 内核创建帧缓冲区 │ │ │ │ │ ├─► DRM Core: drm_mode_addfb() │ │ │ │ │ └─► GPU驱动: 用户空间帧缓冲区接口 │ │ │ │ │ ├─► 关联GEM对象到帧缓冲区 │ │ ├─► 设置帧缓冲区属性 │ │ └─│ 返回帧缓冲区ID │ │ │ │ │ └─► 返回fb_id │ │ │ └─► 显示到屏幕 │ │ │ └─► presentDisplay(displayId, earliestPresentTime) │ │ │ └─► ComposerHal::presentDisplay(display, outPresentFence) │ │ │ └─► AidlComposerHal::presentDisplay(display, outPresentFence) │ │ │ └─► mHal-presentDisplay(display, outPresentFence) │ │ │ └─► 硬件服务执行显示 │ │ │ └─► 厂商实现调用libdrm │ │ │ ├─► 设置显示模式 │ │ │ │ │ └─► drmModeSetCrtc(fd, crtc_id, fb_id, x, y, │ │ connectors, count, mode) │ │ │ │ │ └─► libdrm/xf86drmMode.c │ │ │ │ │ └─► drmModeSetCrtc() │ │ │ │ │ ├─► 准备drm_mode_crtc结构 │ │ │ ├─► 设置帧缓冲区ID │ │ │ ├─► 设置显示位置 │ │ │ ├─│ 设置连接器 │ │ │ └─│ 设置显示模式 │ │ │ │ │ ├─► ioctl(DRM_IOCTL_MODE_SETCRTC, crtc_req) │ │ │ │ │ └─► 内核配置CRTC │ │ │ │ │ ├─► DRM Core: drm_mode_setcrtc() │ │ │ │ │ │ │ └─► GPU驱动: 设置CRTC输出 │ │ │ │ │ │ │ ├─► 配置显示时序 │ │ │ │ ├─► 设置像素时钟 │ │ │ │ ├─│ 设置水平时序 │ │ │ │ ├─│ 设置垂直时序 │ │ │ │ └─│ 其他时序参数 │ │ │ │ │ │ │ ├─► 配置PLL │ │ │ │ ├─► 计算PLL参数 │ │ │ │ ├─│ 设置PLL频率 │ │ │ │ └─│ 锁定PLL │ │ │ │ │ │ │ ├─► 连接帧缓冲区 │ │ │ │ ├─│ 关联FB到CRTC │ │ │ │ └─│ 设置显示地址 │ │ │ │ │ │ │ ├─► 启用编码器 │ │ │ │ ├─│ 配置输出格式 │ │ │ │ ├─│ 设置信号电平 │ │ │ │ └─│ 启用输出驱动器 │ │ │ │ │ │ │ └─► 启用CRTC │ │ │ ├─│ 启用输出信号 │ │ │ ├─│ 开始扫描输出 │ │ │ └─│ 显示生效 │ │ │ │ │ └─► 硬件寄存器编程 │ │ ├─► 显示控制器编程 │ │ ├─► 时钟生成器配置 │ │ ├─► PLL配置 │ │ └─► 输出驱动器使能 │ │ │ └─► 页面翻转 │ │ │ └─► drmModePageFlip(fd, crtc_id, fb_id, flags, user_data) │ │ │ └─► libdrm/xf86drmMode.c │ │ │ └─► drmModePageFlip() │ │ │ ├─► 准备drm_mode_crtc_page_flip结构 │ │ ├─► 设置CRTC ID │ │ ├─► 设置新的帧缓冲区ID │ │ ├─► 设置翻转标志 │ │ │ ├─► DRM_MODE_PAGE_FLIP_EVENT - 事件通知 │ │ │ └─► DRM_MODE_PAGE_FLIP_ASYNC - 异步翻转 │ │ └─│ 设置用户数据 │ │ │ ├─► ioctl(DRM_IOCTL_MODE_PAGE_FLIP, flip_req) │ │ │ └─► 内核执行页面翻转 │ │ │ ├─► DRM Core: drm_mode_page_flip() │ │ │ └─► GPU驱动: 处理页面翻转 │ │ │ ├─► 双缓冲管理 │ │ ├─► 等待VBlank │ │ ├─► 切换前台/后台缓冲区 │ │ └─│ 交换缓冲区指针 │ │ │ ├─► 等待垂直同步 │ │ ├─► 阻塞等待VBlank信号 │ │ ├─│ 获取VBlank时间戳 │ │ └─│ 更新显示时间 │ │ │ └─► 生成释放栅栏 │ │ │ └─► 创建sync_file │ │ │ └─► 用于同步GPU操作 │ └─► 清理和释放资源 │ ├─► drmModeRmFB(fd, fb_id) │ │ │ └─► libdrm/xf86drmMode.c │ │ │ └─► drmModeRmFB() │ │ │ ├─► ioctl(DRM_IOCTL_MODE_RMFB, fb_id) │ │ │ └─► 内核删除帧缓冲区 │ │ │ └─► DRM Core: drm_mode_rmfb() │ │ │ └─► GPU驱动: 释放帧缓冲区资源 │ ├─│ 取消GEM对象关联 │ ├─│ 释放GEM对象 │ └─│ 更新资源状态 │ ├─► munmap(addr, size) │ │ │ └─► 解除用户空间映射 │ │ │ └─► 内核处理munmap │ │ │ └─► 释放页表映射 │ └─► drmClose(fd) │ └─► 关闭DRM设备文件描述符 │ └─► 释放设备资源4. 关键代码片段分析4.1 HWComposer 初始化代码片段// HWComposer.cpp 中的初始化代码HWComposer::HWComposer(std::unique_ptrHwc2::Composercomposer):mComposer(std::move(composer)),mMaxVirtualDisplayDimension(static_castsize_t(sysprop::max_virtual_display_dimension(0))),mUpdateDeviceProductInfoOnHotplugReconnect(sysprop::update_device_product_info_on_hotplug_reconnect(false)),mEnableVrrTimeout(base::GetBoolProperty(debug.sf.vrr_timeout_hint_enableds,true)){}HWComposer::HWComposer(conststd::stringcomposerServiceName):HWComposer(Hwc2::Composer::create(composerServiceName)){}voidHWComposer::setCallback(HWC2::ComposerCallbackcallback){loadCapabilities();loadLayerMetadataSupport();loadOverlayProperties();loadHdrConversionCapabilities();if(mRegisteredCallback){ALOGW(Callback already registered. Ignored extra registration attempt.);return;}mRegisteredCallbacktrue;mComposer-registerCallback(callback);}4.2 显示设备分配代码片段voidHWComposer::allocatePhysicalDisplay(hal::HWDisplayId hwcDisplayId,PhysicalDisplayId displayId){mPhysicalDisplayIdMap[hwcDisplayId]displayId;if(!mPrimaryHwcDisplayId){mPrimaryHwcDisplayIdhwcDisplayId;}autodisplayDatamDisplayData[displayId];autonewDisplaystd::make_uniqueHWC2::impl::Display(*mComposer.get(),mCapabilities,hwcDisplayId,hal::DisplayType::PHYSICAL);newDisplay-setConnected(true);displayData.hwcDisplaystd::move(newDisplay);}4.3 设备组合变更获取代码片段status_tHWComposer::getDeviceCompositionChanges(HalDisplayId displayId,boolframeUsesClientComposition,std::optionalstd::chrono::steady_clock::time_pointearliestPresentTime,nsecs_t expectedPresentTime,Fps frameInterval,std::optionalDeviceRequestedChanges*outChanges){RETURN_IF_INVALID_DISPLAY(displayId,BAD_VALUE);autodisplayDatamDisplayData[displayId];prepareClientTarget(displayData,frameUsesClientComposition,earliestPresentTime,expectedPresentTime,frameInterval);std::vectorLayer*changedLayers;std::vectorCompositioncompositionTypes;uint32_tdisplayRequestMask0;std::vectorLayer*requestedLayers;std::vectoruint32_tlayerRequestMasks;autoerrordisplayData.hwcDisplay-validateAndGetChangedCompositionTypes(earliestPresentTime,expectedPresentTime,frameInterval,changedLayers,compositionTypes,displayRequestMask,requestedLayers,layerRequestMasks);if(errorhal::Error::NONE){DeviceRequestedChanges changes;changes.changedTypesbuildChangedTypesMap(changedLayers,compositionTypes);changes.displayRequestsdisplayRequestMask;changes.layerRequestsbuildLayerRequestsMap(requestedLayers,layerRequestMasks);// 获取客户端目标属性hal::V3_0::ClientTargetPropertyWithBrightness clientTargetProperty;errormComposer-getClientTargetProperty(displayData.hwcDisplay-getId(),clientTargetProperty);if(errorhal::Error::NONE){changes.clientTargetPropertyclientTargetProperty;}*outChangeschanges;}returnstatic_caststatus_t(error);}4.4 显示和栅栏获取代码片段status_tHWComposer::presentAndGetReleaseFences(HalDisplayId displayId,std::optionalstd::chrono::steady_clock::time_pointearliestPresentTime){RETURN_IF_INVALID_DISPLAY(displayId,BAD_VALUE);autodisplayDatamDisplayData[displayId];autoerrordisplayData.hwcDisplay-present(earliestPresentTime);if(error!hal::Error::NONE){RETURN_IF_HWC_ERROR(error,displayId,UNKNOWN_ERROR);}returnOK;}5. libdrm 调用序列图SurfaceFlinger HWComposer ComposerHal 硬件服务 libdrm 内核DRM │ │ │ │ │ │ │ │ │ │ │ │ ├─ init() │ │ │ │ │ │ │ │ │ │ │ │ ├─ create() ────────┤ │ │ │ │ │ │ ├─ create() ──────────┤ │ │ │ │ │ │ ├─ connect() ──────┤ │ │ │ │ │ │ ├─ drmOpen() ──────┤ │ │ │ │ │ │ ├─ open() │ │ │ │ │ │ │ ├─ 设备节点 │ │ │ │ │ │ └─ 返回fd │ │ │ │ │ ├─ 返回fd │ │ │ │ │ │ │ │ │ │ │ ├─ drmGetVersion() ─┤ │ │ │ │ │ │ ├─ ioctl(VERSION) │ │ │ │ │ │ │ ├─ 返回驱动信息 │ │ │ │ │ │ └─ 返回版本 │ │ │ │ │ ├─ 返回版本 │ │ │ │ │ │ │ │ │ │ │ ├─ drmModeGetResources() ────────────┤ │ │ │ │ │ │ ├─ 查询资源数量 │ │ │ │ │ │ ├─ 返回资源列表 │ │ │ │ │ │ └─ 构建资源结构 │ │ │ │ │ ├─ 返回资源信息 │ │ │ │ │ │ │ │ │ │ │ ├─ drmModeGetConnector() ──────────┤ │ │ │ │ │ │ ├─ 查询连接器状态 │ │ │ │ │ │ ├─ 获取支持模式 │ │ │ │ │ │ └─ 返回连接器信息 │ │ │ │ │ ├─ 返回连接器信息 │ │ │ │ │ │ │ │ │ │ │ ├─ drmModeGetEncoder() ────────────┤ │ │ │ │ │ │ ├─ 查询编码器信息 │ │ │ │ │ │ └─ 返回编码器信息 │ │ │ │ │ ├─ 返回编码器信息 │ │ │ │ │ │ │ │ │ │ │ ├─ drmModeGetCrtc() ───────────────┤ │ │ │ │ │ │ ├─ 查询CRTC状态 │ │ │ │ │ │ └─ 返回CRTC信息 │ │ │ │ │ ├─ 返回CRTC信息 │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├─ commit() │ │ │ │ │ │ │ │ │ │ │ ├─ getDeviceCompositionChanges() ──────────────┤ │ │ │ │ │ │ │ │ │ │ │ ├─ validateDisplay() ─┤ │ │ │ │ │ ├─ 重复上述资源查询 │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├─ setClientTarget() ───┤ │ │ │ │ │ ├─ setClientTarget() ─┤ │ │ │ │ │ ├─ 分配GEM对象 │ │ │ │ │ │ ├─ drmIoctl(GEM_CREATE) ──────────┤ │ │ │ │ │ ├─ 创建GEM对象 │ │ │ │ │ ├─ 分配显存 │ │ │ │ │ └─ 返回GEM句柄 │ │ │ │ │ │ │ │ │ ├─ drmIoctl(GEM_MMAP) ────────────┤ │ │ │ │ │ ├─ 映射GEM对象 │ │ │ │ │ ├─ 设置页表 │ │ │ │ │ └─ 返回偏移量 │ │ │ │ │ │ │ │ │ ├─ mmap() ─────────┤ │ │ │ │ │ │ ├─ 映射到用户空间 │ │ │ │ │ └─ 返回用户地址 │ │ │ │ │ │ │ │ │ ├─ drmModeAddFB() ─────────────────┤ │ │ │ │ │ ├─ 创建帧缓冲区 │ │ │ │ │ ├─ 关联GEM对象 │ │ │ │ │ └─ 返回FB ID │ │ │ │ │ │ │ │ │ │ │ │ ├─ presentAndGetReleaseFences() ───────────────┤ │ │ │ │ │ │ │ │ │ │ │ ├─ presentDisplay() ─┤ │ │ │ │ │ │ │ │ │ │ │ ├─ drmModeSetCrtc() ───────────────┤ │ │ │ │ │ ├─ 配置CRTC参数 │ │ │ │ │ ├─ 关联帧缓冲区 │ │ │ │ │ ├─ 设置时序 │ │ │ │ │ └─ 启用输出 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├─ drmModePageFlip() ────────────┤ │ │ │ │ │ ├─ 请求页面翻转 │ │ │ │ │ ├─ 等待VBlank │ │ │ │ │ ├─ 交换缓冲区 │ │ │ │ │ └─ 释放栅栏 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├─ 清理资源 │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├─ drmModeRmFB() ─────────────────┤ │ │ │ │ │ ├─ 删除帧缓冲区 │ │ │ │ │ ├─ 取消GEM关联 │ │ │ │ │ └─ 释放资源 │ │ │ │ │ │ │ │ │ ├─ munmap() ──────┤ │ │ │ │ │ │ ├─ 解除映射 │ │ │ │ │ └─ 释放页表 │ │ │ │ │ │ │ │ │ ├─ drmClose() ────┤ │ │ │ │ │ │ ├─ 关闭设备 │ │ │ │ │ └─ 释放资源