在Linux内核中获取帧数

时间:2019-04-17 13:39:41

标签: linux-kernel gpu driver frame-rate mali

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

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

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

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

2 个答案:

答案 0 :(得分:0)

对于Android,您可以监视用于在组件之间进行缓冲区交换的帧完成围栏。这里有更多信息:

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

  • 渲染到VR和AR护目镜时使用前缓冲区渲染,其中将不进行缓冲区交换,因此也没有完成范围。
  • OpenCL或GPU计算用例往往会渲染回任意内存,而不是可显示的帧,因此类似地,您可能也不会在那里获得帧。

答案 1 :(得分:0)

因此,我一直在进行挖掘,最后发现如何从内核中计算出帧总数(自启动以来)。如上面@solidpixel所建议的,这是通过监视同步防护来完成的。首先,重要的是要了解所涉及的缓冲区使用者所创建的防护栏的类型。对于Android,缓冲区使用者是Hardware Composer-HWC。 HWC创建了许多栅栏,但是与渲染的帧相关的一个是“显示”栅栏。因此,您可以检查正在创建的每个围栏的名称,如果它与“ display”匹配,这就是您要计算的数字。每帧仅创建1个显示围栏,因此计算创建显示围栏的次数将为您提供帧数。