M1 Mac開源驅動開發者揭秘了蘋果定制GPU解決方案的特殊渲染方法
儘管蘋果一直在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發行版網站查看。