SurfaceFlinger代码笔记

native\native\libs\gui\SurfaceComposerClient.cpp文件里的

class BufferCache类可能是ClientCacheproxy端,关注cache函数的调用,看看CS两侧是怎么建立连接的。

ClientCache类的注释:

// This class manages a cache of buffer handles between SurfaceFlinger clients

// and the SurfaceFlinger process which optimizes away some of the cost of

// sending buffer handles across processes.

//

// Buffers are explicitly cached and uncached by the SurfaceFlinger client. When

// a buffer is uncached, it is not only purged from this cache, but the buffer

// ID is also passed down to CompositionEngine to purge it from a similar cache

// used between SurfaceFlinger and Composer HAL. The buffer ID used to purge

// both the SurfaceFlinger side of this other cache, as well as Composer HAL's

// side of the cache.

//

class ClientCache

看上去这是个从上到下的机制,还涉及到HAL

BufferCache的注释:

/**

 * We use the BufferCache to reduce the overhead of exchanging GraphicBuffers with

 * the server. If we were to simply parcel the GraphicBuffer we would pay two overheads

 *     1. Cost of sending the FD

 *     2. Cost of importing the GraphicBuffer with the mapper in the receiving process.

 * To ease this cost we implement the following scheme of caching buffers to integers,

 * or said-otherwise, naming them with integers. This is the scheme known as slots in

 * the legacy BufferQueue system.

 *     1. When sending Buffers to SurfaceFlinger we look up the Buffer in the cache.

 *     2. If there is a cache-hit we remove the Buffer from the Transaction and instead

 *        send the cached integer.

 *     3. If there is a cache miss, we cache the new buffer and send the integer

 *        along with the Buffer, SurfaceFlinger on it's side creates a new cache

 *        entry, and we use the integer for further communication.

 * A few details about lifetime:

 *     1. The cache evicts by LRU. The server side cache is keyed by BufferCache::getToken

 *        which is per process Unique. The server side cache is larger than the client side

 *        cache so that the server will never evict entries before the client.

 *     2. When the client evicts an entry it notifies the server via an uncacheBuffer

 *        transaction.

 *     3. The client only references the Buffers by ID, and uses buffer->addDeathCallback

 *        to auto-evict destroyed buffers.

 */

class BufferCache

VsyncSchedule

的mRequestHardwareVsync是一个lambda表达式:

 

void Scheduler::registerDisplay(PhysicalDisplayId displayId, RefreshRateSelectorPtr selectorPtr) {

    auto schedulePtr = std::make_shared<VsyncSchedule>(displayId, mFeatures,

                                                       [this](PhysicalDisplayId id, bool enable) {

                                                           onHardwareVsyncRequest(id, enable);

                                                       });

 

然后又调回到

VsyncSchedule::setPendingHardwareVsyncState

SurfaceFlinger::requestHardwareVsync

 

下面看另一个复杂的调用关系:

void SurfaceFlinger::onComposerHalVsync(hal::HWDisplayId hwcDisplayId, int64_t timestamp,

                                        std::optional<hal::VsyncPeriodNanos> vsyncPeriod) {

    ATRACE_NAME(vsyncPeriod

                        ? ftl::Concat(__func__, ' ', hwcDisplayId, ' ', *vsyncPeriod, "ns").c_str()

                        : ftl::Concat(__func__, ' ', hwcDisplayId).c_str());

    Mutex::Autolock lock(mStateLock);

    if (const auto displayIdOpt = getHwComposer().onVsync(hwcDisplayId, timestamp)) {

        if (mScheduler->addResyncSample(*displayIdOpt, timestamp, vsyncPeriod)) {

            // period flushed

            mScheduler->modulateVsync(displayIdOpt, &VsyncModulator::onRefreshRateChangeCompleted);

        }

    }

}

 

addResyncSample是一个模板成员函数:

    template <typename... Args,

              typename Handler = std::optional<VsyncConfig> (VsyncModulator::*)(Args...)>

    void modulateVsync(std::optional<PhysicalDisplayId> id, Handler handler, Args... args) {

        if (id) {

            std::scoped_lock lock(mDisplayLock);

            ftl::FakeGuard guard(kMainThreadContext);

            if (id != mPacesetterDisplayId) {

                return;

            }

        }

        if (const auto config = (*mVsyncModulator.*handler)(args...)) {

            setVsyncConfig(*config, getPacesetterVsyncPeriod());

        }

    }

 

它的参数HandlerVsyncModulator的一个成员函数:onRefreshRateChangeCompleted

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka常用命令

如何进行到Docker容器中运行Kafka&#xff1a; docker ps 找到CONTAINER ID 去前三位 执行docker exec -it bbd bin/bash进入到docker中进入到/opt/bitnami/kafka/bin中执行kafka脚本 ------------------------------------------------------------------------------------…

仿射密码实验——Python实现(完整解析版)

文章目录 前言实验内容实验操作步骤1.编写主程序2.编写加密模块3.编写解密模块4.编写文件加解密模块 实验结果实验心得实验源码scirpt.pyusefile.py 前言 实验目的 1&#xff09;初步了解古典密码 2&#xff09;掌握仿射密码的实现 实验方法 根据下图仿射密码&#xff08;变换…

回归预测 | MATLAB实SVM支持向量机多输入单输出回归预测

效果一览 基本介绍 回归预测 | MATLAB实SVM支持向量机多输入单输出回归预测 …………训练集误差指标………… 1.均方差(MSE)&#xff1a;166116.6814 2.根均方差(RMSE)&#xff1a;407.5741 3.平均绝对误差&#xff08;MAE&#xff09;&#xff1a;302.5888 4.平均相对百分误…

Oracle 批量投入数据方法总结

目录 零. 待投入数据的表结构一. INSERT INTO ... SELECT投入数据1.1 普通的方式投入数据1.2 并行插入&#xff08;Parallel Insert&#xff09;投入数据 二. PL/SQL 循环投入数据2.1 脚本介绍2.2 效果 三. &#x1f4aa;PL/SQL FORALL 批量操作&#x1f4aa;3.1 脚本介绍3.2 效…

Git学习笔记

Git学习笔记 目录 版本控制 本地版本控制 集中版本控制 分布式版本控制 基本使用方式 Git Config Git Remote Git Add Objects Refs Annotation Tag 追溯历史版本 修改历史版本 Git GC Git Clone & Pull & Fetch Git Push 常见问题 不同的工作流 集…

【Block总结】掩码窗口自注意力 (M-WSA)

摘要 论文链接&#xff1a;https://arxiv.org/pdf/2404.07846 论文标题&#xff1a;Transformer-Based Blind-Spot Network for Self-Supervised Image Denoising Masked Window-Based Self-Attention (M-WSA) 是一种新颖的自注意力机制&#xff0c;旨在解决传统自注意力方法在…

卷积神经05-GAN对抗神经网络

卷积神经05-GAN对抗神经网络 使用Python3.9CUDA11.8Pytorch实现一个CNN优化版的对抗神经网络 简单的GAN图片生成 CNN优化后的图片生成 优化模型代码对比 0-核心逻辑脉络 1&#xff09;Anacanda使用CUDAPytorch2&#xff09;使用本地MNIST进行手写图片训练3&#xff09;…

怎么在iPhone手机上使用便签进行记录?

宝子们&#xff0c;在这个快节奏的时代&#xff0c;灵感的火花总是一闪而过&#xff0c;待办事项也常常让人应接不暇。好在咱们的 iPhone手机便签超给力&#xff0c;能满足各种记录需求&#xff01;今天就来给大家分享一下&#xff0c;如何在 iPhone 手机上巧用便签&#xff0c…

基于微信小程序的摄影竞赛系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【从零开始使用系列】StyleGAN2:开源图像生成网络——环境搭建与基础使用篇(附大量测试图)

StyleGAN2 是英伟达团队 NVIDIA 提出的生成对抗网络&#xff08;GAN&#xff09;的一种改进版本。 它通过创新的网络架构&#xff0c;能够生成细节丰富、逼真的图像&#xff0c;特别在高频细节&#xff08;如皮肤纹理、光照等&#xff09;的表现上表现卓越。与传统 GAN 相比&am…

redis(2:数据结构)

1.String 2.key的层级格式 3.Hash 4.List 5.Set 6.SortedSet

LabVIEW 程序中的 R6025 错误

R6025错误 通常是 运行时库 错误&#xff0c;特别是与 C 运行时库 相关。这种错误通常会在程序运行时出现&#xff0c;尤其是在使用 C 编译的程序或依赖 C 运行时库的程序时。 ​ 可能的原因&#xff1a; 内存访问冲突&#xff1a; R6025 错误通常是由于程序在运行时访问无效内…

前端【2】html添加样式、CSS选择器

一、为html添加样式的三种方法 1、内部样式 2、外部样式 3、行内样式 二、css的使用--css选择器 1、css基本选择器 元素选择器 属性选择器 id选择器 class/类选择器 通配符选择器 2、群组选择器-多方面筛选 3、关系选择器 后代选择器【包含选择器】 子元素选择器…

【Elasticsearch】全文搜索与相关性排序

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

【算法】枚举

枚举 普通枚举1.铺地毯2.回文日期3.扫雷 二进制枚举1.子集2.费解的开关3.Even Parity 顾名思义&#xff0c;就是把所有情况全都罗列出来&#xff0c;然后找出符合题目要求的那一个。因此&#xff0c;枚举是一种纯暴力的算法。一般情况下&#xff0c;枚举策略都是会超时的。此时…

51单片机——DS18B20温度传感器

由于DS18B20数字温度传感器是单总线接口&#xff0c;所以需要使用51单片机的一个IO口模拟单总线时序与DS18B20通信&#xff0c;将检测的环境温度读取出来 1、DS18B20模块电路 传感器接口的单总线管脚接至单片机P3.7IO口上 2、DS18B20介绍 2.1 DS18B20外观实物图 管脚1为GN…

云手机技术怎么实现的?

前言 随着亚矩阵云手机在跨境电商、海外社媒矩阵搭建、出海运营、海外广告投放、国内新媒体矩阵运营、品牌应用矩阵运营等领域内的普及和使用&#xff0c;云手机的理念已经被越来越多人所接受和认同。今天我们就一起来浅析一下&#xff0c;到底云手机的技术是怎么实现的&#…

HTML中link的用法

一点寒芒先到&#xff0c;随后&#xff0c;抢出如龙&#xff01; 对于本人而言&#xff0c;这篇笔记内容有些扩展了&#xff0c;有些还未学到的也用上了&#xff0c;但是大概可以使用的明白&#xff0c;坚持下去&#xff0c;相信一定可以建设一个稳固的根基。 该文章为个人成…

闪豆多平台视频批量下载器

1. 视频链接获取与解析 首先&#xff0c;在哔哩哔哩网页中随意点击一个视频&#xff0c;比如你最近迷上了一个UP主的美食制作视频&#xff0c;想要下载下来慢慢学。点击视频后&#xff0c;复制视频页面的链接。复制完成后&#xff0c;不要急着关闭浏览器&#xff0c;因为接下来…

Vulnhub DC-8靶机攻击实战(一)

导语   Vulnhub DC-8靶机教程来了,好久没有更新打靶的教程了,这次我们在来更新一期关于Vulnhub DC-8的打靶训练,如下所示。 安装并且启动靶机 安装并且启动靶机,如下所示。 开始信息采集 进入到Kali中,通过如下的命令来查找到靶机的IP地址。 arp-scan -l根据上面的结…