【原創】Linux環境下的圖形系統和AMD R600顯卡編程(3)——AMD顯卡簡介


  早期的顯卡僅用於顯示,后來顯卡中加入了2D加速部件,這些部件用於做拷屏,畫點,畫線等操作。隨着游戲、三維模擬以及科學計算可視化等需要,對3D的需求逐漸增加,早期圖形繪制工作由CPU來完成,要達到真實感和實時效果,只能繪制一些簡單的線框模型,上世紀80年代,斯坦福大學的Jim Clark教授率先提出用專用集成電路技術實現一個專用的3D圖形處理器的設想,於1984年推出了世界上第一個通用圖形工作站IRIS1400。

  AMD最早的顯卡從R100開始,一直到R900(R600以后也使用HD xxxx作為代號),R900(HD 6xxx)之后是HD 7xxx系列,目前最新的顯卡使用 Rx 2xx代號,最新的是Radeon R9 2xx系列。這里只描述R600顯卡的編程,因此只討論R600之前和之后不久的顯卡。

  AMD顯卡的演變過程如下(參考wiki頁和Plan9操作系統開發人員的PPT):

圖1

  R100是一款固定功能流水線的顯卡,R200為可編程處理器,R300在R200的基礎上發生了比較大的變化,此后的R400 和R300差別不大。到R500的時候GPU除了有vbios外,還引入了atombios,atombios是一段比較簡單的腳本,和具體平台無關,解釋器解釋執行(代碼集成在內核驅動里面),然而3D核較R300變化不大,寄存器變化也比較少(變化主要變化在pixel shader 部分)。

  R600在R500的基礎上發生很大的變化,2D部件被廢除,3D部件改成了unified shader架構,GPU的寄存器和原來完全不同,由於體系結構的變化,對硬件編程也和原來有了很大變化。R700 GPU是R600的優化版,在驅動層面上,R700的編程和R60的編程基本上是一樣的,后續的Evergreen、Southern Island和Northern Island都是這種unified shader架構的延續,因此理解R600的編程后將比較容易理解后續GPU核的編程。

  本書的后續部分針對R600核心進行描述,總體來說,R600硬件在R500基礎上重要的變化包括(參考Radeon R6xx/R7xx Acceleration):

  • 不再包含2D加速部件,所有的加速都使用3D部件完成
  • 使用Shader Model 4.0,使用Unified shader架構,vertex shader、fragment shader(以及geometry shader)不再分成單獨的部件,而是被統一起來,另外包含Geometry shader

  除了以上變化之外,還有一點值得注意的是,R600顯卡GPU核的計算都是基於標量的,而不是像以前的那樣基於矢量的(參考ATI Radeon HD 2000 programming guide)。

  對於軟件編程而言寄存器讀寫方式上也有比較大的變化,過去對R500編程的時候,所有的對硬件的編程都是可以用命令包或者普通的直接寫寄存器的方式進行的,但是R600的部分寄存器是不能夠通過直接寫寄存器的方式進行編程的,必須通過3型命令包的方式進行(看到的代碼都是這樣的,R600寄存器手冊上有很多寄存器地址都是一樣的,但是含義不同,這些寄存器偏移都大於等於0x8000,是否正確??)。

  Linux系統下的drm、exa、mesa代碼也和這種變化相對應,通常來說,以Radeon_開頭的函數名針對的是r100顯卡或者后續顯卡的公共代碼,R200_開頭的函數僅針對r200核心的顯卡,R300_開頭的函數針對r300、r400和r500,R600_開頭的函數針對r600、r700,Evergreen_開頭的的函數針對HD5xxx和HD6xxx系列。

  后續的blog將介紹AMD顯卡的顯存管理機制、命令處理、中斷機制,然后介紹3D引擎,3D引擎部分包括顯卡的圖形流水線和對3D引擎的編程以及R600的指令集。后續的內容是閱讀代碼和AMD公開的部分資料后對相關內容的理解,這些理解肯定有不少錯誤,僅供參考。

 

相關參考資料:

AMD公布的資料可以在這里看到,AMD公布的R500核心的編程資料是最完整和最詳細的,這部分資料詳細介紹了R500顯卡工作的原理和一些編程細節。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM