共用方式為


支援執行緒、命令清單和 3D 管線

本節僅適用于 Windows 7 和更新版本,以及 Windows Server 2008 R2 和更新版本的 Windows 作業系統。

使用者模式顯示驅動程式指出當 Direct3D 第 11 版執行時間呼叫驅動程式的 GetCaps (D3D10_2) 函式時,它支援 (的新 Direct3D 版本 11 功能,例如執行緒、命令清單和 3D 管線) 。 GetCaps (D3D10_2) 是驅動程式在D3D10_2DDI_ADAPTERFUNCS結構中提供的驅動程式配接器特定函式之一,D3D10DDIARG_OPENADAPTER結構pAdapterFuncs_2成員指向該函式。 如需在驅動程式初始化期間提供介面卡特定函式的詳細資訊,請參閱 使用 Direct3D 版本 11 DDI 初始化通訊。 呼叫GetCaps (D3D10_2) 函式時,使用者模式顯示驅動程式會根據要求類型 (,根據GetCaps (D3D10_2) 函式的 pData參數指向) 的TypeD3D10_2DDIARG_GETCAPS成員,提供新的 Direct3D 版本 11 功能。

執行緒和命令清單

Direct3D 11 版 API 需要一種作業模式,以便同步處理應用程式執行緒,以確保一次只有一個執行緒在 DDI 中執行。 Direct3D 11 版 API 也需要具有軟體模擬命令清單的作業模式。 這些作業模式是由 舊版 DDIS (所需,例如 Direct3D 10 DDI) 。 因此,作為驅動程式寫入器的開發協助工具,這些相同的作業模式會擴充為存在於 Direct3D 11 DDI 版上。 驅動程式寫入器可以決定其驅動程式支援 Direct3D 11 DDI 版的作業模式。

所有驅動程式最終應該完全支援所有類型的執行緒作業 (,所有驅動程式最終都應該支援 D3D11DDI_THREADING_CAPS 結構的所有線程功能) 。 不過,驅動程式可能需要 API 模擬命令清單,或強制執行驅動程式的單一線程模式作業。 API 必須在建立 API 裝置期間注意驅動程式的執行緒功能,但在建立 DDI 裝置之前。 因此,執行時間會在呼叫驅動程式的 GetCaps (D3D10_2) 配接器特定函式,並將 D3D10_2DDIARG_GETCAPS 的 Type 成員設定為 D3D11DDICAPS_THREADING 時,判斷驅動程式的執行緒功能。 驅動程式會在識別驅動程式執行緒功能的pData D3D10_2DDIARG_GETCAPS 成員中,傳回D3D11DDI_THREADING_CAPS結構的指標。 如果驅動程式也支援命令清單 (D3D11DDICAPS_COMMANDLISTS_BUILD_2) ,驅動程式必須支援自由執行緒模式 (D3D11DDICAPS_FREETHREADED) ,因為命令清單是以自由執行緒模式建置。 驅動程式必須加入宣告以支援自由執行緒模式和命令清單。 應用程式可以判斷驅動程式透過使用應用層級 CheckFeatureSupport 函式和D3D11_FEATURE_THREADING常數所指示的支援;不過,由於 API 所提供的支援,某些應用程式可能並不小心。

3D 管線層級

不支援 Direct3D 版本 11 DDI 的驅動程式不需要支援 Direct3D 版本 11 DDI 的所有硬體功能。 驅動程式可以在僅支援 Direct3D 版本 10 DDI 的硬體上支援 Direct3D 版本 11 DDI 的新執行緒模型。 當執行時間呼叫驅動程式的 GetCaps (D3D10_2) 函式時,Direct3D 版本 11 執行時間會決定驅動程式的硬體層級上限,並將 D3D10_2DDIARG_GETCAPS 的 Type 成員設定為 D3D11DDICAPS_3DPIPELINESUPPORT 。 驅動程式會傳回D3D10_2DDIARG_GETCAPS pData成員中D3D11DDI_3DPIPELINESUPPORT_CAPS結構的指標,以識別支援的最大硬體層級。

API 不只使用 DDI 版本作為 API 功能層級支援的主要指標;API 可讓驅動程式回到此程式。 執行時間會選擇D3D11DDI_3DPIPELINELEVEL值,並在呼叫驅動程式的CreateDevice (D3D10) 函式時,將值傳回給驅動程式,作為D3D10DDIARG_CREATEDEVICE結構的Flags成員的一部分。

如果驅動程式在 Direct3D 版本 11 DDI 上支援小於 Direct3D 第 11 版的硬體層級,則驅動程式的作業會有次要的影響。 第一個是 Direct3D 第 11 版執行時間可能永遠不會呼叫許多新的 Direct3D 第 11 版 DDI 函式。 例如,如果驅動程式支援小於 Direct3D 第 11 版的硬體功能層級,則 Direct3D 11 版執行時間不會呼叫任何新的著色器階段 DDI 函式 (例如 DsSetShader) 。 其他 DDI 函式會遵循功能層級的規則,並忽略 Direct3D 11 DDI 版本可能與更高功能相關聯的事實。 例如,即使 Direct3D 第 11 版 API 的 IAVertexInputSlots 為 32,Direct3D 第 10 版功能層級仍只允許 16,而這就是驅動程式應該預期的。

已被取代或已轉換的功能呈現另一個有趣的層面。 在 Direct3D 版本 11 DDI 層級無法淘汰,因為取代必須支援能夠表達舊版 DDI 函式。 例如,PIPELINESTATS 的 Direct3D 11 API 版本一律是常數;不過,它會使用 Direct3D 10 功能層級要求不同的 D3D10_DDI_QUERY_DATA_PIPELINE_STATISTICS ,並使用 Direct3D 11 功能層級 D3D11_DDI_QUERY_DATA_PIPELINE_STATISTICS ,依此類故。 雖然 API 嘗試取代文字篩選大小,但驅動程式完全取代 DDI 函式資料表專案會比嘗試針對其他專案重複使用函式資料表專案更容易。

即使支援 Direct3D 版本 11 DDI 的驅動程式不支援完整的 Direct3D 版本 11 功能層級,驅動程式也無法退出宣告「擴充格式感知」,如 支援擴充格式感知中所述。 因為驅動程式支援 Direct3D 11 DDI 版,所以驅動程式應該處理下列工作:

  • 支援 BGR 格式

  • 正確回應 其 CheckFormatSupport 函式的呼叫,以檢查XR_BIAS支援。 驅動程式應宣告支援或拒絕支援。

  • 允許完整型別後端緩衝區的轉換

Direct3D 11 版 API 也會通知驅動程式應用程式是否透過 D3D11DDI_CREATEDEVICE_FLAG_SINGLETHREADED 旗標使用多個執行緒。 如果透過呼叫驅動程式的CreateDevice (D3D10) 函式來建立顯示裝置時,此旗標會出現在D3D10DDIARG_CREATEDEVICE結構的Flags成員中,則驅動程式可以判斷不會建立任何延遲的內容,而且驅動程式不需要同步處理,因為不會發生並行建立。