Skip to main content
本主題說明晶片內 (onchip) 與晶片外 (offchip) 鑲嵌的優缺點。

鑲嵌涉及的動作

無論鑲嵌是在晶片內或晶片外執行,XBOX One 上的鑲嵌都會執行下列動作。
  1. GPU 將每個個別繪製所產生的所有修補程式 (patch) 分成執行緒群組。
  2. 對於每個執行緒群組,GPU 會在運算單元 (CU) 中配置一定數量的本機資料存放區 (LDS) 記憶體。所有必要的頂點著色器 (VS) 與輪廓著色器 (HS) 執行緒都會排程在該 CU 上。
  3. 對於每個執行緒群組,GPU 執行的 VS 執行緒數量等於輸入控制點數量乘以每個執行緒群組的 patch 數量。
每個著色器階段的執行緒一律以每個 wave 64 個執行緒封裝。
  1. 對於每個執行緒群組,GPU 也會執行數量等於輸出控制點數量乘以每個執行緒群組 patch 數量的 HS 執行緒。
每個著色器階段的執行緒一律以每個 wave 64 個執行緒封裝。
  1. 所有 HS 執行緒都必須以執行緒群組的形式同時執行,因為可能需要同步處理屏障。這與計算著色器執行緒群組的運作方式類似,不同之處在於此情況下的同步處理是隱含的,而不是在高階著色器語言 (HLSL) 中指定。
  2. 接著,GPU 的鑲嵌器會根據 HS 計算出的鑲嵌因數產生要執行的網域著色器 (DS) 執行緒 (同樣以每個 wave 64 個執行緒封裝)。

晶片內鑲嵌模式

根據預設,Direct3D 12 驅動程式一律將 GPU 設定為晶片內鑲嵌模式。在晶片內鑲嵌模式中,輸入與輸出控制點以及每個 patch 常數的所有資料 (包括常數因數) 都儲存在 LDS 中。由於 LDS 是 GPU 內部的記憶體,因此不會產生額外的記憶體頻寬,並保證以低延遲存取資料。 不過,由於鑲嵌執行緒群組中的 patch 所產生的 DS 執行緒需要這些資料,因此所有這類 DS 執行緒都必須在執行同一執行緒群組之 VS 與 HS 執行緒的相同 CU 中執行。這嚴重限制了 GPU 在 12 個可用 CU 之間平衡工作負載的能力,尤其是在鑲嵌因數很高時。 在鑲嵌因數很高時,單一執行緒群組可能會產生許多 wave 的 DS 執行緒,而所使用的 LDS 記憶體會被封鎖,無法用於其他任何用途,包括原本可能可以在該 CU 中執行的其他執行緒群組。(LDS 也用於計算著色器中的執行緒群組本機資料、PS 內插值,以及晶片內 GS 模式。)

晶片外鑲嵌模式

晶片外鑲嵌是一個選項,可讓輪廓著色器與網域著色器使用非 LDS 記憶體。 指定 D3D12XBOX_PIPELINE_STATE_FLAG_GS_ONCHIP_TS_OFFCHIP 或 D3D12XBOX_PIPELINE_STATE_FLAG_GS_OFFCHIP_TS_OFFCHIP 旗標即可啟用 GPU 的晶片外鑲嵌模式。此模式使用的 LDS 數量與晶片內模式相同,但 HS 也會將所有輸出控制點、鑲嵌因數與每個 patch 常數寫入記憶體緩衝區。 接著會使用啟發學習法,在相同 CU 中以晶片內模式執行部分 DS wave 並從 LDS 讀取資料,而在其他 CU 中以晶片外模式執行其他 DS wave 並從記憶體讀取資料。這可讓 GPU 在所有 DS wave 完成甚至啟動之前,就釋放執行緒群組的 LDS 記憶體,也讓 GPU 能在所有 CU 之間更妥善地平衡 DS wave 的負載。 在晶片外執行鑲嵌的優點是可以釋放 LDS 記憶體供其他圖形用途使用。在晶片外執行鑲嵌是否確實能改善效能,很大程度取決於遊戲程式碼。結果不一定會改善效能。

以晶片內或晶片外模式執行 DS wave 所使用的啟發學習法

用於以晶片內模式執行部分 DS wave、以晶片外模式執行其他 DS wave 的啟發學習法,會依每個執行緒群組執行如下。
  • HS 的一個執行緒會收集所有 patch 的所有鑲嵌因數,並計算整個執行緒群組的平均鑲嵌因數。如果此值小於 TfThreshold,則整個執行緒群組會停用晶片外模式。不會將任何資料寫入記憶體,且所有 DS wave 都在相同 CU 中執行。
  • 如果執行緒群組未停用晶片外模式,前 DsWaveThreshold 個 DS wave 會以晶片內模式執行,之後會回收 LDS 記憶體,所有其餘的 DS wave 都在晶片外執行。

啟用晶片外鑲嵌

要搭配晶片外鑲嵌使用的輪廓著色器與網域著色器,應使用下列 #define 陳述式編譯。
設定此值會使輪廓或網域著色器針對晶片外鑲嵌預先編譯,並避免執行階段重新編譯。著色器必須相符,兩者都是晶片外,或兩者都不是晶片外。

設定鑲嵌參數

使用 D3D12XBOX_TESSELLATION_PARAMETERS_DESC

呼叫 HSSetTessellationParameters

若要使用晶片外鑲嵌,請填入 D3D12XBOX_TESSELLATION_PARAMETERS_DESC,並將其傳遞給 CreateGraphicsPipelineStateX、CreateDerivedGraphicsPipelineStateX 或 CreatePipelineState。 呼叫 D3D12XboxInitializeDefaultTessellationParameters 以初始化 D3D12XBOX_TESSELLATION_PARAMETERS_DESC 中的預設值。
此結構的欄位如下。
Last modified on October 6, 2026