这可能是一个愚蠢的问题,因为我对此主题一无所知...似乎用户应用程序可以直接与GPU对话以渲染图像,例如使用OpenGL通过mesa和libdrm,其中libdrm是一个围绕各种ioctl()调用的包装器,如该图所示。这是否意味着对于3D游戏的每个新框架,游戏应用程序都需要调用一次ioctl()(或者如果需要到达KMS,甚至可能两次)?这听起来像是许多用户内核之间的空间障碍穿越(想想120 fps游戏)。
libdrm是一个用户空间包装程序,用于对基础KMS驱动程序功能(如模式设置)进行细粒度访问,检查使用的平面是覆盖平面还是主平面等。libdrm实现通常针对各种CPU / GPU / OS组合而不同,因为在内核中运行的硬件驱动程序倾向于支持除标准功能以外的其他功能集。使用libdrm的标准方法是打开/dev/
node中可用的drm设备,并使用从返回的fd执行libdrm函数调用open()
。
通常,用于特定操作系统(例如X11,Wayland,硬件编写器)的显示合成器软件将需要控制drm设备,这意味着无特权的应用程序无法成为DRM主设备。如果尝试使用libdrm模式设置功能的应用程序不是DRM主服务器,则大多数libdrm模式设置功能将不起作用。建议的做法是使用标准图形库(例如openGL或VULKAN)来代替应用程序,而不是直接使用libdrm。
与内核DRM模块进行交互所需的ioctl数量很可能不是您尝试呈现高FPS应用程序时将面临的最大瓶颈。与目标系统的显示合成器配合运行高fps应用程序的首选方法是:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句