QnA*_*QnA 3 c graphics ioctl drm linux-kernel
这可能是一个愚蠢的问题,因为我对这个主题不太了解...似乎用户应用程序可以直接与 GPU 对话来渲染图像,例如使用 OpenGL,通过 mesa 和 libdrm,其中 libdrm 是各种 ioctl() 调用的包装器,如下图所示。这是否意味着对于 3D 游戏的每个新帧,游戏应用程序都需要调用 ioctl() 一次(如果需要达到 KMS,甚至可能调用两次)?这听起来像是大量的用户-内核空间障碍跨越(想想 120 fps 的游戏)。
libdrm 是一个用户空间包装器,用于对底层 KMS 驱动程序功能执行细粒度访问,例如模式设置、检查所使用的平面是覆盖平面还是主平面等。对于各种 CPU/GPU/OS 组合,libdrm 实现通常有所不同,因为在内核中运行的硬件驱动程序往往支持除标准功能之外的不同功能集。使用 libdrm 的标准方法是打开/dev/节点中可用的 drm 设备并使用从返回的 fd 执行 libdrm 函数调用open().
通常,特定操作系统(如 X11、wayland、hardware-composer)的显示合成器软件需要控制 drm 设备,这意味着非特权应用程序无法成为 DRM 主控。如果尝试使用它们的应用程序不是 DRM 主控,则大多数 libdrm 模式设置功能将不起作用。建议的做法是使用 openGL 或 VULKAN 等标准图形库在应用程序中准备和渲染帧,而不是直接使用 libdrm。
与内核 DRM 模块交互所需的 ioctl 数量很可能不是您在尝试渲染高 FPS 应用程序时面临的最大瓶颈。在与目标系统的显示合成器配合的同时运行高 fps 应用程序的首选方法是
| 归档时间: |
|
| 查看次数: |
1660 次 |
| 最近记录: |