译自:http://www.yosoygames.com.ar/wp/2015/09/maybe-its-time-to-talk-about-a-new-linux-display-driver-model/
作者: Matias
转自:http://geek.csdn.net/news/detail/39521
译者: 汪辰
随着越来越多新的图形应用编程接口(API)的出现(譬如Vulkan、D3D12、Metal),Steam OS(译者注:一个基于Debian的Linux发行版,关注于提供大屏幕的游戏体验)也在猛烈地推动着Linux上的游戏开发。甚至我自己也感觉到在Linux系统上涉及图像处理的开发工作正变得越来越多。
但在一台装着Ubuntu14.04的电脑上,就图像处理相关内容工作了一段时间后,我发现,Linux上有关图像处理的架构设计简直就是一场灾难。
这些问题在Android系统上也同样存在。首先在Android上想要实现GPU的虚拟化也是不可能的。其次通过GLES(译者注:OpenGL for Embedded Systems,OpenGL的一个子集,适用于嵌入式系统的图形库)进行连接的进程之间在窗口创建,恢复和销毁的接口调用顺序上的实现非常混乱。(例如,我们经常会看到两个连续的onDestroy调用跟在两个连续的onCreate调用后面,而按照规定应该是形如onCreate->onDestroy->onCreate->onDestroy这样的顺序;再比如,我们还会看到OnRestore调用发生在onCreate之前。此类糟糕的问题造成的影响在一些定制版本的Android系统上可能还会被放大)
(译者注:WDDM 即 Windows Display Driver Model,Windows显示驱动模型)
modprobe -rf gpumodule && modprobe gpumodule
(译者注:shell命令,相当于先强制卸载,然后再加载GPU驱动模块)同时还要保证不影响当前运行的非终端关联进程(即在X11窗口桌面会话中的大多数进程)。我对驱动开发不是很了解,我也确信AMD,Intel和NVIDIA的驱动开发专家针对WDDM肯定也会有不少抱怨。但是,在图像显示方面,Linux上的缺点实在太明显。看在上帝的份上,一旦我在合成桌面上打开了垂直同步刷新功能,就几乎无法平滑流畅地播放flash视频。(我指的是在大部分主流的Linux发行版上)。甚至在VLC多媒体播放器上也不能完全实现流畅播放。
随着新的图形应用编程接口(特别是Vulkan)逐渐推出,看起来情况会有所好转,特别是听说Vulkan将会解决大部分在类UNIX系统上我们目前遇到的问题(包括稳定性,性能,缺陷,硬件问题)。对此我真的感到很兴奋。
根据我的了解,在跨GPU通讯问题上,Vulkan目前的处理策略(就像D3D12一样),应该只能算得上是一种临时的变通方法。该方法已经可以让Linux同时支持多个GPU,但目前的性能对游戏软件来说还是远远不够的。而且我们要意识到,由于在操作系统内核层面还没有一个统一的模型支持跨设备通信,寄希望于不同厂家的驱动能够在一起正确地合作实在是一个奢望。
窃以为,如果Linux想要在目前的Vulkan所取得的成绩上继续有所作为,要想在严格意义上更好地支持桌面应用和游戏的话,从驱动层面出发,还是有很多事情可以做的,譬如建立一个可以和WDDM媲美的LDDM(译者注:Linux Display Driver Model,Linux显示驱动模型)。这可不是一件容易的事情。它需要来自Linux内核开发者的主动支持(我的意思是指 Trovalds和他的团队,你懂的),Android端则需要Google的帮助,还要有编写良好的Vulka驱动程序,以及比X系统更好的视窗系统(像Wayland那样的)。这的确涉及到太多的协调和巨大的工作量。
我在这里并不想很正式地讨论有关Linux如何作为一个游戏平台或桌面平台的问题。我之所以发这个帖子,主要的原因是我发现我在Linux上正在从事越来越多有关图像应用的开发工作(拜GL 4.3所赐),而且我也听其他人说和我有同感。随着Vulkan的到来,以及Valve引擎的推动,Linux这个操作系统也正在成为一个主流的游戏平台。
正如我所要指出的,在Vulkan出现之后,Linux的下一个挑战将是要解决如下问题:一个设计优良的显示驱动模型和一个更好的视窗系统。
bumblebee
September 5, 2015 at 18:27
没错,Linux不是Windows,这世界上只有一个Windows和一个Windows的合成桌面系统软件。可世界上不是只有一个Linux。这世界上只有一个Linux内核,但有很多桌面环境,很多合成桌面系统和很多窗口管理器。所以直接将Windows和那些基于Linux内核的操作系统进行对比是没有意义的,因为这不是简单的一对一而是一对多。
所以,在那些基于同一个Linux内核的操作系统上,和Windows只有一个自己的图像系统不同,它们有各自的图像处理系统。很明显这比不上Windows可以集中精力逐步优化一个单一的系统。抱歉我这么说并不是想责备哪一家公司或者哪一个组织。
如果你希望让它变得更‘好’,那所做的绝不会是简单地‘修缮’一下,你将不得不更换整个图形系统中很大的一部分。这反过来将破坏现有的几乎所有东西,没有人会接受这种改变。这就是问题所在:您要么牵头取得社区的支持,包括主流发布版本的支持,要么足够有钱,可以从财力上承担这些改变所需要的一切。
并不是说这个问题解决不了,但问题是没有切实可行的解决办法,所以现在就是这么个尴尬的境地,空有想法和期望,却无法改变现实。
David Airlie
September 5, 2015 at 19:21
从一个内核代码的维护人员角度来看,所有的这些问题都需要时间和投入来解决,而且大部分事情已经在着手进行中。
如果你曾经用过Windows Vista,就应该记得当时的WDDM简直是一场灾难,那时的Windows一样无法支持同时连接两个来自不同厂家的显卡,他们花费了很大的精力试图改善这个问题,这种状况一直延续到Windows8才有所改进。同时我们要知道Windows只有一个单纯的生态系统(这一点和Apple一样),他们只有一种视窗系统及其配套的合成桌面系统。可是Linux的用户空间的碎片化那是相当的严重,你需要花更多的时间来修复来自各种各样的桌面系统,譬如KDE/ GNOME/等的缺陷,这些都是很明显的问题,但一般情况下人们不太意识到。
还记得NVIDIA曾经在相当长的一段时间里力图整体性改造系统所以坚持采用自己的代码替换了将近90%的内核栈吗,结果又怎么样呢?当然现在情况正变得越来越好。
目前Linux上和图像处理相关的项目所取得的进展状况如下:
- glvnd在试图拆分OpenGL的接口,使其不依赖于X。
- wayland提供了一套很好的协议标准设计,但人们仍然只把它看作是X server的替代品,而不是X11的替代品(译者注,X Window作为一套协议标准,其中的定义包括了X Server和X Client),当前唯一能胜任wayland要求的合成桌面系统只有mutter,而mutter还在发展中并不成熟。
内核支持GPU重置(译者注,应该和TDR有关)已有多年,但想要得到GPU厂家的充分测试是一件困难的事情,而且NVIDIA的驱动程序是不开源的,所以有问题也只有他们自己才能解决。
适配器损失是一件麻烦的事情,X11的设计导致解决这个问题很棘手,当前的OpenGL作为API在这点上表现也很糟糕,Direct3D从一开始就内置适配器损失处理机制可以帮助应用程序解决这个问题。
因此,我们并不是真的需要为此重新设计内核栈,当前内核的驱动模型针对其需求已经足够好,Windows的WDDM也是一样。我们需要的是投入更多的人来解决那些重要的问题,太多的人只是在为自己的老板,自己关注的局部需求而工作,而目前全世界真正能够从全局审视整个内核栈设计的人也就在5个左右。(虽然能够为Android/ARM/Chrome写驱动的人很多,但我们仍然花了2~3年的时间才得到足够的资助实现了modesetting编程接口的原子化,这种工作才是对所有人都会有帮助的工作)。