2011-06-15 49 views
8

我想更好地瞭解GPU如何工作,我對他們如何處理Direct3D或OpenGL等高級API感到困惑。看到圖形卡廣告支持Direct3D和OpenGL硬件加速是非常常見的。這是否意味着他們直接在硬件中處理Direct3D和OpenGL指令? 我一直無法找到明確的證據,或者他們被編譯成GPU可以處理的組裝表示。如果有這樣的轉換誰這樣做?軟件庫(Direct3D/OpenGL),驅動程序還是GPU本身? 在同一行上,圖形管道在哪裏定義?在GPU硬件,驅動程序或軟件庫中?這使我特別想到可編程管道的概念。如何在圖形卡中處理Direct3D和OpenGL指令?

有沒有一個很好的資源,我可以找到關於這些細節的信息?

回答

9

您已經提出了一個非常廣泛和複雜的問題。其實,你問幾個廣泛,複雜的問題。

對任何硬件的操作進行最終管理的軟件稱爲硬件的「驅動程序」。當然,對於圖形硬件,這被稱爲「圖形驅動程序」。像所有驅動程序一樣,圖形驅動程序實際上是OS的可安裝部分;操作系統是圖形驅動程序能夠完成工作並與硬件通信的原因。這兩項工作攜手共進。

有效的兩種D3D或OpenGL(以前稱爲「API」)調用:那些與驅動程序交談和那些沒有。實際吸引某些東西的每個呼叫都需要(最終)與驅動程序通話,但稍後設置的呼叫可能只是在本地存儲數據。

當您進行繪圖調用時,API會執行一些檢查以確保您作爲用戶進行了有效的呈現調用。如果是這樣,那麼API可以選擇做什麼。事實證明,直接與司機談話需要很長時間,不管你開始說話時你給了多少指令。因此,經常發生的事情是,API會存儲您的呈現調用並立即返回。然後,可能在另一個線程中,它可能會查看已存儲多少個呈現調用。如果有「足夠」,那麼它會將它們轉發給駕駛員。這被稱爲「編組」。

驅動程序的工作是將這些已轉發的調用轉換成GPU將執行的內容。

在同一行上,圖形管道在哪裏定義?在GPU硬件,驅動程序或軟件庫中?

這些日子實際上是一個非常棘手的問題,並且每一代硬件都變得更加棘手。

在過去,圖形管道的構建是由GPU硬件嚴格控制的。這些日子,這是不太正確的,雖然有一些硬件控制。在現代硬件上(能夠使用OpenGL 3.0或Direct3D10或更高版本),如果您可以直接訪問圖形驅動程序,則理論上可以設計使用某種圖形管道版本的API。所以這些API決定了圖形管道看起來像什麼。

渲染流水線中的每個階段都將寶貴階段的某些值作爲輸入,並生成一些數值作爲輸出。如果用於從輸入生成輸出的機制涉及執行用戶提供的程序(稱爲「着色器」),則該階段是「可編程的」。所以沒有可編程管線(還)的東西;只是一個固定管道的可編程階段。

+1

非常感謝。我很清楚我的問題有多廣泛......對此抱歉,但感謝您花時間給我一個很好的答案。它澄清了很多事情。如果我的判斷正確,那麼API會驗證呼叫,將它們分組並最終通過發送累積呼叫的系統調用來調用驅動程序。這是否會調用驅動程序看起來更像彙編,高級別direct3d/opengl命令還是兩者都不? – cloudraven 2011-06-15 07:26:12

+0

驅動程序只是操作系統加載的.dll或其他形式的庫。它只是普通的代碼,它像普通的代碼一樣獲得函數調用。什麼傳遞給驅動程序的數據結構看起來就是依賴於實現(它甚至會改變同一操作系統上的驅動程序),並且最終對於沒有實際編寫驅動程序的任何人都無關緊要。 – 2011-06-15 07:35:53

+1

對不起,我這麼晚了,但後續的問題:API(OpenGL或DirectX)如何知道如何與所有不同的驅動程序交談?有Nvidia驅動程序,AMD/ATI驅動程序,以及每個驅動程序的許多版本?應用程序鏈接到一個設定版本的例如OpenGL,所以如果我更新我的驅動程序,OpenGL的舊版本如何知道如何與我的驅動程序交談?驅動程序和OpenGL之間的協調工作如何? – pomeroy 2014-05-01 15:35:51

7

有沒有這樣的事情D3D或OGL說明。 Direct3D或OpenGL將調用圖形驅動程序,他們將執行任何他們需要做的事情來實現它。這完全不是真正的着色器,它在API(D3D/OGL)級別具有統一的字節碼,在這種情況下,API提供了一個編譯器,但據我所知,這些仍然轉換成在執行之前依賴於硬件的方式。當然,Direct3D和OpenGL還包含用戶模式組件,以提高性能或提供更好的界面 - 例如,它們將批量調用內核以減少上下文切換。

GPU製作的實際情況是,微軟和nVidia/ATi聚在一起,思考他們想要什麼和實現什麼是可行的,並提出一個組規範,因爲現實是,如果主要的硬件和軟件供應商沒有合作。沒有人會購買不支持DirectX的GPU,並且沒有人會購買沒有GPU實現DirectX的Windows。當然,「無人」是相對的,但是對於所有相關人員來說這將是一個巨大的損失,當然,如果您有一款僅爲D3D10 API構建的遊戲,那麼支持D3D10的驅動程序是運行遊戲的必須 - 通過增加可運行軟件的範圍來有效提高產品的價值,這是一個賣點。這意味着由硬件供應商或軟件供應商定義的語義差異是最小的,尤其是在PC,OpenGL和Direct3D上只有兩個真正的3D渲染API遵循非常類似的圖形管道模型的情況下,我知道。

但是,使用新的可編程GPU,您可能會爭辯說圖形管線並不存在 - 如果您有耐心編程,DX11設備可用於您可以想象的任何圖形管線。

最終,GPU受到強大的驅動程序級抽象的保護。它實現了一個C風格的接口,並且在該實現中允許或必需的內容。之後的所有內容都完全由實現定義。

您可以查看的圖形驅動程序的MSDN文檔。我已經看到它,但沒有方便的鏈接,它描述了你必須遵守的接口和其他東西。

+0

這確實很有意義。看看司機應該如何寫作應該給出我所有問題的確切答案。我會檢查出來 – cloudraven 2011-06-15 07:27:11