盡管蘋果一直在 M1 系列定制處理器的內部細節守口如瓶,但為 M1 Mac 硬件打造開源驅動程序的 Asahi Linux 發行版開發團隊,還是努力在對其展開逆向工程。可知在艱苦的逆向工作期間,他們也發現了一些相當古怪且酷炫的地方。以 M1 開源圖形驅動程序為例,Alyssa Rosenzweig 最近就在 M1 GPU 渲染管道中發現了一個化解錯誤的關鍵點。

據悉,問題始于 GPU 對內存訪問的不暢。作為一款性能超強的 GPU,它與 iPhone 上的 A 系列移動SoC 一樣,需要通過走一些捷徑來保持高效率。
可知與獨顯相比,M1 沒有直接渲染到幀緩沖區,而是對幀進行兩次傳遞 —— 首先找到頂點,然后搞定其它更加密集的事務。

為此,蘋果利用了專用硬件將幀分割成小塊(基本上是迷你幀),并于二傳時一次取一個小塊來處理。
平鋪方案很好地化解了緩存資源不足的問題,但為了稍后將之湊成完整的一幀,GPU 需要保留每個頂點數據的緩沖區。
結果 Rosenzweig 發現,每當這個緩沖區溢出時、渲染就無法正常進行下去。

蘋果在某個演示文稿中解釋稱,當緩沖區已滿時,GPU 只會輸出部分渲染(本例中為半只兔子)。
在第一方應用程序中,蘋果稱之為參數緩沖區,且這個名詞術語似乎取自 Imagination 的 PowerVR 文檔。
作為一家總部位于英國的、與 ARM 類似的芯片設計公司,Imagination 于 2020 年初與蘋果簽署了一項廣泛的知識產權許可協議。
而 2020 下半年上市的 M1 定制 SoC,就以該公司的 PowerVR GPU 架構為其圖形硬件的基礎。

言歸正傳,正如你可能已經猜到的那樣,軟件可通過將各部分渲染疊加到一起、以完成整只兔子的渲染(當然中間還有十幾個額外的步驟)。
遺憾的是,這種渲染方式仍然不太準確(仔細留意兔子的足部)。Rosenzweig 指出,這是因為幀的不同部分在顏色 / 深度緩沖區之間被分割,而后者在加載部分渲染時會出現異常行為。
好消息是,得益于蘋果驅動程序的逆向工程參考配置,Asahi Linux 開發團隊最終搞定了這個問題,最終渲染輸出的兔子如圖所示。

TechSpot 總結道:不僅 Rosenzweig 的 M1 開源圖形驅動程序跳過了相關環節來渲染圖像,而是該 GPU 在架構設計之初就沒有考慮到此類 3D 渲染應用場景。
即便如此,蘋果還是相當巧妙地讓 PowerVR 圖形 IP 成為了可與獨顯相媲美的軟硬件解決方案。即便在許多方面都沒有實現完全的超越,其表現依然相當酷炫。
最后,想要深入了解 M1 GPU 渲染工作、以及針對 M1 逆向工程的其它探索,還請移步至 Rosenzweig 的個人技術博客和 Asahi Linux 發行版網站查看。