Share via


加速狀態管理

加速狀態管理是在單一呼叫中跨 API 和 DDI 通訊大型狀態變更的機制。 此配置可讓應用程式將狀態集呼叫的集合定義為單一整數所定義的狀態欄塊。 以轉譯狀態傳送這個整數,會在一次呼叫中執行所有狀態變更。

這可藉由減少所需的 IDirect3DDevice7::SetRenderState 方法呼叫數目來減少 API 額外負荷,並可藉由允許驅動程式在定義狀態欄塊時,將其「先行編譯」階段變更為自己的硬體特定格式,來改善驅動程式的效率,而不是在每個狀態變更的執行時。 Direct3D SDK 檔說明 IDirect3DDevice7::SetRenderState

大部分的應用程式只會以少數狀態轉譯,因此處理精細的狀態轉換很少重要。 更重要的是,能夠定義狀態欄塊,當驅動程式在常見的轉譯案例之間切換時可以交換。 這是加速狀態管理的整個點。

狀態設定權杖可用來記錄驅動程式中的狀態。 控制碼是指狀態集合。 D3DHAL_DP2STATESET結構會通知驅動程式要執行哪些狀態設定作業。

如果D3DHAL_DP2STATESET結構的 dwOperation 成員設定為 D3DHAL_STATESETBEGIN,驅動程式就會開始記錄 dwParam 成員中包含的控制碼狀態。 當驅動程式收到D3DHAL_STATESETEND 的 dwOperation 時 ,它會停止錄製狀態。

如果 dwOperation 成員D3DHAL_STATESETDELETE,則 應該刪除 dwParam 控制碼所參考的狀態集。

如果 dwOperation 成員D3DHAL_STATESETEXECUTE, 則 dwParam 控制碼所參考的狀態欄塊應該套用在裝置中。

如果 dwOperation 成員D3DHAL_STATESETCAPTURE,則驅動程式中的目前狀態應該以特定方式擷取,並提供狀態欄塊中定義之目前狀態的快照集。 也就是說,只會擷取已在狀態欄塊中的狀態。 因此,狀態欄塊會做為一種遮罩,只會記錄其中定義的狀態。 例如,如果狀態欄塊中有D3DRENDERSTATE_ZENABLE轉譯狀態,則會擷取D3DRENDERSTATE_ZENABLE的目前狀態,並放入狀態欄塊中。 如果狀態欄塊中沒有D3DRENDERSTATE_ZENABLE,則不會擷取該狀態。

狀態群組可用來讓泛型狀態欄塊針對不同的轉譯案例稍微修改。 這些預先定義的群組 (在 DirectX SDK 檔中的 D3DSTATEBLOCKTYPE 中列舉,) 定義一般狀態欄塊,之後可以隨著狀態變更進行修改,以容納預期的週期性轉譯案例。 例如,驅動程式可能會建立 100 個泛型預先定義狀態欄塊,然後稍微修改每個區塊,以容納不同的轉譯案例。 狀態欄塊類型會在 D3DHAL_DP2STATESET 結構的 sbType 成員中傳遞。

sbType成員僅適用于D3DHAL_STATESETBEGIN和D3DHAL_STATESETEND,並指定具有下列其中一個 D3DSTATEBLOCKTYPE 列舉類型的預先定義狀態欄塊類型:Null表示無狀態、針對所有狀態D3DSBT_ALL、圖元狀態D3DSBT_PIXELSTATE,以及頂點狀態的D3DSBT_VERTEXSTATE。

除非驅動程式實作轉譯狀態延伸,否則驅動程式應該忽略sbType 成員。 如果驅動程式實作延伸轉譯狀態,也就是 Direct3D 執行時間所提供的轉譯狀態以外的轉譯狀態,則可以使用 sbType來判斷正在使用哪種類型的預先定義轉譯狀態。 從這項資訊中,它可以判斷如何適當地附加狀態欄塊,以支援其延伸模組。