最后更新一次进度,这应该是近期最后一次更新了。现在X11下和Wayland下的2D软件渲染已经都可用了(你用loongarchlinux的话,装我打的包就是开箱即用,我下面详细介绍),我自己用了快一个星期,貌似没啥问题。接下来的主要的工作是用户空间的mesa 3D驱动,这个工作量比较大,所以近期应该没啥消息。
如何安装使用:如果你用的是Loongarchlinux的话,直接用我打的包 https://github.com/cl91/linux-gsgpu-archpkg,prebuilt 目录下面的 Linux 内核和 xorg-server. 需要后者是因为(1)loongarchlinux打包的时候没打开udev_kms选项(2)上游的 xorg-server 需要 patch 一下,因为7A2000的显卡的PCI device class 是0x4不是0x3,xf86-video-modesetting 默认只识别 PCI device class 0x3 的 PCI 设备,所以默认认不出来。这两个bug的症状其实非常诡异,故障的表象是xf86-video-modesetting可以正常加载并且读取和设置分辨率,但初始化的最后一步会无法获取DRM master,大家可以试试用原版的xorg-server复现这个bug。这个bug花了我很长时间,最后printf大法拉了无数log之后才定位到错误地点,因为是两个bug共同产生的结果。我准备把这个补丁推到上游xorg和loongarchlinux。
安装完这两个包后,重启后选择 linux-gsgpu 内核就行了(当然需要重新生成 grub.cfg)。注意如果你的桌面用了3D效果的话,是没法正确显示的,因为没有mesa 3D驱动(话说即使有3D驱动的话,用龙芯独显就别开3D桌面特效啦,这显卡的性能带不动)。2D软件渲染都没有问题。我在X11+i3, Wayland (weston, sway) 下都进行了测试,都可用。性能比我想象的要好,mpv看个1080p视频还是毫无压力的。当然两个1080p视频同时开就开始掉帧了,3个视频掉帧严重,4个及以上视频就是在看ppt。
想用Wayland的话,weston可用而且性能不错(注意要开软件渲染,--use-pixman)。sway和其他基于wlroots的compositor会有一定的性能问题,因为wlroots的软件渲染没有实现shadow framebuffer。大家做过图形相关的底层开发就会知道,由于缓存的问题(显存某种程度上可以理解为一片只能写入不能读取的内存空间,而且写入还得是顺序写入),软件渲染是不能直接在映射到系统总线上的显存里进行渲染的,必须要先渲染到系统内存里的buffer,然后把这个buffer顺序地拷贝到显存里。wlroots的开发者貌似没有意识到这个问题,他们直接就在显存里捣鼓了😆 ,这是错误的。wlroots还有一个问题是硬件光标渲染是虚的,这个应该也是他们的bug,因为我在X11和Weston下打开硬件光标都没有问题。所以大家想用sway或者其他基于wlroots的compositor的话,要等mesa 3D驱动出来之后才能比较开心的用了。
我接下来的计划是如果龙芯公司不愿意开源用户态的3D驱动的话,要实现mesa 3D驱动我就只能逆向GSGPU的shader ISA了 (貌似是基于AMD GCN指令集的,这方面资料还是挺多的,大家有兴趣可以加入我)。这个有很大的工程量,所以最近几个月应该没有多少进展,而且达到可用并且基本没有bug还得花很多时间。我的计划是第一步先把软件3D渲染搞定,就是调用llvmpipe渲染到shadow buffer然后拷贝到VRAM,这个工作量应该不是非常大,就是给mesa的gallium架构增加一个用gsgpu的buffer object的winsys,shadow buffer渲染完后用gsgpu的XDMA引擎DMA到显存里去。先把这个搞定再去考虑shader compiler。总之这里的工程量还是很大的,所以我在这里呼吁龙芯公司还是把3D驱动开源吧,省得社区重复劳动了。AMD这个指令集反正是公开的,甚至还有开源的实现,所以貌似也不存在专利权的问题。