SurfaceFinger layer创建过程

news2024/9/24 17:12:17

SurfaceFinger layer创建过程


引言

本篇博客重点分析app创建Surface时候,SurfaceFlinger是如何构建对应的Layer的主要工作有那些!

这里参考的Android源码是Android 13 aosp!




app端创建Surface

其核心流程可以分为如下接部分:

  • app使用w,h,format等参数,调用SurfaceComposerClient::createSurface

  • createSurface调用SurfaceComposerClient::createSurfaceChecked;createSurfaceChecked调用mClient->createSurface;mClient是surfaceflinger client的代理;mClient的初始化还没介绍,后面单独写一篇介绍。

  • mClient->createSurface会调用到android12\frameworks\native\services\surfaceflinger\Client.cpp 中Client::createSurface

  • Client::createSurface调用mFlinger->createLayer

核心逻辑代码如下:

surfaceComposerClient->createSurface(String8("SurfaceTestDemo"), resolution.getWidth(),
                  resolution.getHeight(), PIXEL_FORMAT_RGBA_8888,
                  ISurfaceComposerClient::eFXSurfaceBufferState,
                  /*parent*/ nullptr);
                  
sp<SurfaceControl> SurfaceComposerClient::createSurface(const String8& name, uint32_t w, uint32_t h,
                                      PixelFormat format, uint32_t flags,
                                      const sp<IBinder>& parentHandle,
                                      LayerMetadata metadata,
                                      uint32_t* outTransformHint) {
    sp<SurfaceControl> s;
    createSurfaceChecked(name, w, h, format, &s, flags, parentHandle, std::move(metadata),
                         outTransformHint);
    return s;
}
 
status_t SurfaceComposerClient::createSurfaceChecked(const String8& name, uint32_t w, uint32_t h,
                                PixelFormat format,
                                sp<SurfaceControl>* outSurface, uint32_t flags,
                                const sp<IBinder>& parentHandle,
                                LayerMetadata metadata,
                                uint32_t* outTransformHint) {
    status_t err = mStatus;
 
    if (mStatus == NO_ERROR) {
        sp<IBinder> handle;
        sp<IGraphicBufferProducer> gbp;
        err = mClient->createSurface(name, w, h, format, flags, parentHandle, std::move(metadata),
                                     &handle, &gbp, &id, &transformHint);
            *outSurface =
                    new SurfaceControl(this, handle, gbp, id, w, h, format, transformHint, flags);
    }
    return err;
}

image

image



SurfaceFlinger端创建layer过程

SurfaceFlinger构建Layer的核心流程如下:

  • 根据app的flags确定创建layer类型createBufferStateLayer;createEffectLayer还是createContainerLayer;目前尚不清楚不同layer之间的区别,以createBufferStateLayer为例

  • 将传入参数放入LayerCreationArgs args,调用getFactory().createBufferStateLayer(args)创建BufferStateLayer;获取layer handle,并返回

  • 调用SurfaceFlinger::addClientLayer,创建LayerCreatedState,放入mCreatedLayers[handle->localBinder()];使用handle等参数创建composerState,并传入SurfaceFlinger::setTransactionState

  • 创建TransactionState state,并将其放入mTransactionQueue.emplace(state)


这里我们重点看下SurfaceFlinger::addClientLayer的实现,因为后面会用到它。

status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, const sp<IBinder>& handle,
                                        const sp<Layer>& layer, const wp<Layer>& parent,
                                        bool addToRoot, uint32_t* outTransformHint) {
...                                        
    {
        std::scoped_lock<std::mutex> lock(mCreatedLayersLock);
        mCreatedLayers.emplace_back(layer, parent, addToRoot);
    }       
    
     // attach this layer to the client
    if (client != nullptr) {
        client->attachLayer(handle, layer);
            mLayers.add(handle, layer);        
    }   
    
setTransactionFlags(eTransactionNeeded) //提交eTransactionNeeded

    
...    
}



//这个什么时候会触发这个transaction呢,大概流程如下:

MessageQueue::Handler::handleMessage(...)//frameworks/native/services/surfaceflinger/Scheduler/MessageQueue.cpp
    compositor.commit()//这里的compositor指向SurfaceFlinger
        if (clearTransactionFlags(eTransactionFlushNeeded)) {
            needsTraversal |= commitCreatedLayers();
            needsTraversal |= flushTransactionQueues(vsyncId);
        }
  

bool SurfaceFlinger::commitCreatedLayers() {
    for (const auto& createdLayer : createdLayers) {
        handleLayerCreatedLocked(createdLayer);
    }    
}

void SurfaceFlinger::handleLayerCreatedLocked(const LayerCreatedState& state) {
    sp<Layer> layer = state.layer.promote();
    if (!layer) {
        ALOGD("Layer was destroyed soon after creation %p", state.layer.unsafe_get());
        return;
    }

    sp<Layer> parent;
    bool addToRoot = state.addToRoot;
    if (state.initialParent != nullptr) {
        parent = state.initialParent.promote();
        if (parent == nullptr) {
            ALOGD("Parent was destroyed soon after creation %p", state.initialParent.unsafe_get());
            addToRoot = false;
        }
    }

    if (parent == nullptr && addToRoot) {
        layer->setIsAtRoot(true);
        mCurrentState.layersSortedByZ.add(layer);//注意这里对应的Layer是BufferStateLayer
    } else if (parent == nullptr) {
        layer->onRemovedFromCurrentState();
    } else if (parent->isRemovedFromCurrentState()) {
        parent->addChild(layer);
        layer->onRemovedFromCurrentState();
    } else {
        parent->addChild(layer);
    }

    layer->updateTransformHint(mActiveDisplayTransformHint);

    mInterceptor->saveSurfaceCreation(layer);
}
        

其中SurfaceFlinger端各种Layer的关系如下:

在这里插入图片描述


image


== 这里需要注意的点是==:

  • SurfaceFlinger::setTransactionState中比较复杂容易忽略将TransactionState state放入mTransactionQueue的过程,mTransactionQueue在后面创建hwc layer的时候会用到



遗留思考问题

在Android 11中添加了一个彩蛋就是增加了BLASTBufferQueue,这个我们要怎么理解它呢!它的核心作用就是将Android GraphicBuffer的管理全部交由App应用端处理,而不经过SurfaceFlinger处理。这里我存在的疑问就是:

  • App端渲染完成之后,怎么将这些buffer提交给SurfaceFlinger进行继续处理呢!
  • App端申请的Surface Buffer怎么和SF端对应的Layer关联起来呢
  • App端构建的SurfaceControl在App端和SurfaceFlinger的交互中的作用是什么

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1706248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用nvm管理node多版本(安装、卸载nvm,配置环境变量,更换npm淘宝镜像)淘宝的镜像域名更换

最近 使用nvm 管理 node 的时候发现nvm install node版本号 总是失败。 nvm install 20.12.2Error retrieving "http://npm.taobao.org/mirrors/node/latest/SHASUMS256.txt": HTTP Status 404查看原因&#xff0c;因为淘宝的镜像域名更换&#xff0c;由于 npm.taob…

搜维尔科技:【系统集成案例】三面CAVE系统案例

用户名称&#xff1a;成都东软学院 主要产品&#xff1a;工业激光投影机、光学跟踪系统、主动立体眼镜、主动式立体眼镜发生器 在4米x9米的空间内&#xff0c;通过三通道立体成像&#xff0c;对立体模型进行数字化验证&#xff0c;辅助unity课程设计。 立体投影大屏方案采用的…

行波进位加法器和超前进位加法器比较

文章目录 1.行波进位加法器2.超前进位加法器 1.行波进位加法器 行波进位加法器就是将全加器串联起来&#xff0c;将低位的进位输出作为高位的进位输入。 由全加器公式可知&#xff1a; S A ⊕ B ⊕ C i n C o u t A B B C i n A C i n SA\oplus B\oplus C_{in}\\ C_{out}…

ssm教职工防疫打卡小程序-计算机毕业设计源码73760

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;教职工防疫打卡小程序被用户普遍使用&#xff0c;为方便用…

QGIS:根据已知色带数组生成sld文件

1、将已知的色带数组转换为Excel文件&#xff08;Test.xlsx&#xff09; 格式如下&#xff1a; 2、Python生成QGIS colormap文件&#xff08;.txt&#xff09; import numpy as np import os import sys import pandas as pd#QGSI输入文件 #读取C中导出的Rainbow数组 fp_rain…

电商API接口||电商数据连接器:一键连接,效率加倍!

电商数据API接口&#xff1a; 一键连接&#xff0c;效率加倍&#xff01; 打造智能数据生态&#xff0c;让数据流动更加高效 在数字化时代&#xff0c;数据已成为企业发展的核心驱动力。电商API数据采集接口&#xff0c;助力电商企业实现数据的高效管理和应用。 电商数据API…

【乐吾乐3D可视化组态编辑器】模型类型与属性

编辑器地址&#xff1a;3D可视化组态 - 乐吾乐Le5le 本章主要为您介绍模型的属性功能。 一个模型至少会包含一个节点&#xff08;Node&#xff09;&#xff0c;从节点类型上可以分为转换节点&#xff08;TransformNode&#xff09;、网格&#xff08;Mesh&#xff09;、实例网…

【OpenGL手册-13】光源和颜色模型

文章目录 一、说明二、颜色综述三、灯光场景四、光源位置 一、说明 光源和颜色模型也是OpenGL的重要模型之一&#xff0c;我们将光源也看成是一个物体&#xff0c;这个物体特点是&#xff0c;不仅可以自己移动位置&#xff0c;而且要和其它物体颜色进行反射运算&#xff0c;从而…

应急响应-网页篡改-技术操作只指南

初步判断 网页篡改事件区别于其他安全事件地明显特点是&#xff1a;打开网页后会看到明显异常。 业务系统某部分出现异常字词 网页被篡改后&#xff0c;在业务系统某部分网页可能出现异常字词&#xff0c;例如&#xff0c;出现赌博、色情、某些违法APP推广内容等。2019年4月…

【一小时学会Charles抓包详细教程】初识Charles (1)

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 Charles介绍 …

1、pyton环境的安装-windows系统下

python官网 https://www.python.org/ 点击黄色的按钮&#xff0c;下载完成&#xff0c;如下&#xff1a; 双击安装&#xff0c;我现在以3.10.4版本进行安装说明&#xff1a; 一定要勾选上下边的to path&#xff0c;然后选择自定义安装 全选&#xff0c;点击next 选择要安装的路…

HTML大雪纷飞

目录 写在前面 HTML简介 完整代码 代码分析 运行结果 系列文章 写在后面 写在前面 小编又又又出现啦&#xff01;这次小编给大家带来大雪纷飞HTML版&#xff0c;不需要任何的环境&#xff0c;只要有一个浏览器&#xff0c;就可以随时随地下一场大雪哦&#xff01; HTM…

从金蝶云星空到旺店通·企业奇门通过接口配置打通数据

从金蝶云星空到旺店通企业奇门通过接口配置打通数据 对接系统金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上&#xff0c;提供了标准的管理模式&#xff1b;通过标准的业务架构&#xff1a;多会计准则、多币别、多地点、多组织、多税制应用框架等&#xff0c;有…

QT:协议概述

文章目录 概念帧结构&#xff1a;通信流程 示例&#xff1a;请求帧&#xff1a;响应帧&#xff1a; 概念 帧结构&#xff1a; | SOF (1 byte) | Frame Length (1 byte) | Command (1 byte) | Data Field (N bytes) | Checksum (1 byte) | 通信流程 示例&#xff1a; 请求帧&a…

ld链接文件

文章目录 1. sections缩写2. 链接脚本2.1 MEMORY&#xff08;内存命令&#xff09;2.1.1 作用2.1.2 格式 2.2 SECTIONS&#xff08;段命令&#xff09;2.2.1 作用2.2.2 格式 2.3 特殊符号含义2.4 通配符2.5 Eg 1. sections缩写 2. 链接脚本 https://www.cnblogs.com/jianhua19…

如何处理 Google Chrome中的代理服务器错误?

如果您在 Google Chrome 浏览器中遇到代理服务器错误&#xff0c;您可以采取一些步骤来排除故障并解决问题。代理服务器充当您的设备和互联网之间的中介&#xff0c;与其相关的错误有时会破坏您的浏览体验。以下是帮助您解决该问题的一些步骤&#xff1a; 1. 检查您的互联网连接…

shell脚本编译成二进制文件shc

文章目录 1. 安装shc2. 使用shc编译Shell脚本3. 执行二进制文件4. 编译后执行效率 将Shell脚本转换为二进制执行文件&#xff0c;可以使用 shc工具。 shc是一个Shell编译器&#xff0c;它可以将Shell脚本编译成二进制文件。以下是详细步骤&#xff1a; 1. 安装shc 在大多数L…

图片缩放随心所欲,自定义保存尽在掌控,解锁全新图片处理神器,轻松驾驭视觉创作之旅!

在数字化浪潮汹涌的今天&#xff0c;图片作为视觉信息的核心载体&#xff0c;已经渗透到我们生活的方方面面。一张精美的图片&#xff0c;往往能够成为我们表达思想、分享生活的得力助手。然而&#xff0c;面对大小不一、格式各异的图片&#xff0c;如何轻松实现缩放并自定义保…

新火种AI|警钟长鸣!教唆自杀,威胁人类,破坏生态,AI的“反攻”值得深思...

作者&#xff1a;小岩 编辑&#xff1a;彩云 在昨天的文章中&#xff0c;我们提到了谷歌的AI Overview竟然教唆情绪低迷的网友“从金门大桥跳下去”。很多人觉得&#xff0c;这只是AI 模型的一次错误判断&#xff0c;不会有人真的会因此而照做。但现实就是比小说电影中的桥段…

Jetpack架构组件_2. 数据绑定库

1.理论基础 数据绑定库是一个支持库&#xff0c;可让您使用声明性格式&#xff08;而不是以程序化方式&#xff09;将布局中的界面组件绑定到应用中的数据源。 布局通常使用调用界面框架方法的代码在 activity 中定义。例如&#xff0c;以下代码会调用 findViewById() 来查找 T…