0

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

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

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

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

4

2 回答 2

0

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

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

  • 渲染到 VR 和 AR 护目镜使用前缓冲区渲染,其中没有缓冲区交换,因此没有完成围栏。
  • OpenCL 或 GPU 计算用例往往会渲染回任意内存,而不是可显示的帧,因此同样地,您也可能不会在那里获得帧。
于 2019-04-17T14:36:50.477 回答
0

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

于 2019-04-26T18:58:52.837 回答