在Linux内核中获取帧计数

问题描述 投票:0回答:2

我试图找到一个变量/某个度量,可以帮助我计算Linux内核中Midgard GPU驱动程序中呈现的实际帧数。

在用户级程序上测试我的算法时,我使用系统调用(如下所示)从SurfaceFlinger获取帧数并将此值存储到文件中,我稍后在用户级程序中读取该文件。

system("setsid adb shell service call SurfaceFlinger 1013 | \
   grep -o -E \\([a-fA-F0-9]+\\ \\)> frames.txt");

注意:我正在尝试创建一个使用此信息的dvfs调控器,但我似乎找不到在Midgard驱动程序中访问它的方法。我只能访问GPU核心的“利用率”,但这并不总是与帧数相匹配。关于如何解决这个问题的任何想法?

linux-kernel gpu driver frame-rate mali
2个回答
0
投票

对于Android,您可以监视用于组件之间缓冲交换的帧完成范围。更多信息:

但请注意,这是一类传统意义上没有“框架”的用例。

  • 渲染到VR和AR护目镜使用前缓冲区渲染,其中没有缓冲区交换,因此没有完成栅栏。
  • OpenCL或GPU计算用例倾向于渲染回任意内存,而不是可显示的帧,因此类似地,您也可能无法获得帧。

0
投票

所以我一直在挖掘,我终于找到了如何从内核计算总帧数(自启动以来)。这是通过监视同步栅栏来完成的,如上面的@solidpixel所示。首先,了解缓冲消费者创建的围栏类型非常重要。对于Android,缓冲消费者是硬件编写器 - HWC。 HWC创建了许多围栏,但与渲染帧相关的围栏是“显示”围栏。因此,您可以检查正在创建的每个围栅的名称,如果它与“显示”匹配,则这是您想要计算的内容。每帧只创建一个显示围栏,因此计算显示围栏的次数将为您提供帧数。

© www.soinside.com 2019 - 2024. All rights reserved.