ID3D12Device1::CreatePipelineLibrary 方法 (d3d12.h)
建立快取的管線連結庫。 對於預期要一起共用數據的管線狀態物件,在串行化數據之前,將它們分組到連結庫,表示因為元數據而負擔較少,以及避免將重複或重複的數據寫入磁碟的機會。
您可以使用 D3D12_FEATURE_SHADER_CACHE 和 D3D12_FEATURE_DATA_SHADER_CACHE,使用 ID3D12Device::CheckFeatureSupport查詢 ID3D12PipelineLibrary 支援。 如果 旗標D3D12_FEATURE_DATA_SHADER_CACHE 成員包含旗標 D3D12_SHADER_CACHE_SUPPORT_LIBRARY,則支援 ID3D12PipelineLibrary 介面。 如果沒有,呼叫此函式時,一律會傳回 DXGI_ERROR_NOT_SUPPORTED。
語法
HRESULT CreatePipelineLibrary(
const void *pLibraryBlob,
SIZE_T BlobLength,
REFIID riid,
void **ppPipelineLibrary
);
參數
pLibraryBlob
類型:[in] const void*
如果輸入連結庫 Blob 是空的,則連結庫的初始內容是空的。 如果輸入連結庫 Blob 不是空的,則會驗證其完整性、剖析,並儲存指標。 提供做為這個方法輸入的指標,在傳回之物件的存留期內必須保持有效。 基於效率考慮,數據不會複製。
BlobLength
類型:SIZE_T
指定以位元組為單位 pLibraryBlob 長度。
riid
類型:REFIID
為 ID3D12PipelineLibrary 物件指定唯一的 REFIID。 一般而言,使用宏 IID_PPV_ARGS(&Library)
來設定這個 和下列參數,其中 Library 是 對象的名稱。
ppPipelineLibrary
類型: [out] void**
傳回所建立連結庫的指標。
傳回值
類型:HRESULT
如果函式成功,它會傳回 S_OK。 否則,它會傳回 HRESULT錯誤碼,E_INVALIDARG 包括如果 Blob 損毀或無法辨識,D3D12_ERROR_DRIVER_VERSION_MISMATCH 如果提供的數據來自舊驅動程式或運行時間,則為 D3D12_ERROR_ADAPTER_NOT_FOUND 數據來自不同的硬體。
如果您傳遞 nullptr
pPipelineLibrary,則運行時間仍會執行 Blob 的驗證,但請避免建立實際的連結庫,並在連結庫建立時傳回S_FALSE。
此外,此功能需要更新的驅動程式,而且嘗試在舊驅動程式上使用此功能會傳回DXGI_ERROR_UNSUPPORTED。
言論
管線連結庫會啟用下列作業。
- 將管線狀態物件 (PSO) 新增至現有的連結庫物件 (請參閱 StorePipeline)。
- 將 PSO 連結庫串行化為磁碟記憶體的連續記憶體區塊(請參閱 串行化)。
- 從永續性記憶體取消串行化 PSO 連結庫(這是由 createPipelineLibrary
處理。 - 從連結庫擷取個別 PSO (請參閱 LoadComputePipeline 和 LoadGraphicsPipeline)。
管線連結庫生命週期中沒有任何重複的 POS 與相同子元件。
管理所提供指標存留期的建議解決方案,而只需要 ref-count 傳回的介面,就是利用 ID3D12Object::SetPrivateDataInterface,並使用實作 IUnknown的物件,並在 ref-count 達到 0 時釋放記憶體。
線程安全性
管線連結庫是安全線程使用,而且會視需要在內部同步處理,但有一個例外:多個線程載入相同的 PSO(透過 LoadComputePipeline、LoadGraphicsPipeline或 LoadPipeline)應該同步處理自己,因為此動作可能會以非線程安全的方式修改連結庫中該管線的狀態。
例子
請參閱 Direct3D 12 管線狀態快取範例。
要求
要求 | 價值 |
---|---|
目標平臺 | 窗戶 |
標頭 | d3d12.h |
連結庫 | D3d12.lib |
DLL | D3d12.dll |