ID3D12Device1::CreatePipelineLibrary 方法 (d3d12.h)
建立快取的管線程式庫。 針對管線狀態物件, (預期會共用資料) ,在序列化資料之前將它們分組到程式庫,這表示由於中繼資料而產生較少的額外負荷,以及避免將重複或重複的資料寫入磁片的機會。
您可以使用ID3D12Device::CheckFeatureSupport查詢ID3D12PipelineLibrary支援,以及D3D12_FEATURE_SHADER_CACHE和D3D12_FEATURE_DATA_SHADER_CACHE。 如果D3D12_FEATURE_DATA_SHADER_CACHE的Flags成員包含旗標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錯誤碼,包括如果 Blob 損毀或無法辨識,D3D12_ERROR_DRIVER_VERSION_MISMATCH如果提供的資料來自舊驅動程式或執行時間,則傳回E_INVALIDARG,如果資料來自不同的硬體,則D3D12_ERROR_ADAPTER_NOT_FOUND。
如果您針對pPipelineLibrary傳遞 , nullptr
則執行時間仍會執行 Blob 的驗證,但請避免建立實際的程式庫,並在程式庫已建立時傳回S_FALSE。
此外,此功能需要更新的驅動程式,而且嘗試在舊驅動程式上使用此功能將會傳回DXGI_ERROR_UNSUPPORTED。
備註
管線程式庫會啟用下列作業。
- 將管線狀態物件 (PSOs) 新增至現有的程式庫物件, (參考 StorePipeline) 。
- 將 PSO 程式庫序列化為磁片儲存體的連續記憶體區塊, (請參閱 序列化) 。
- 從永續性儲存體取消序列化 PSO 程式庫 (這是 由 CreatePipelineLibrary) 處理。
- 從程式庫擷取個別 PSO (請參閱 LoadComputePipeline 和 LoadGraphicsPipeline) 。
管線程式庫生命週期中沒有任何重複的 PDO 具有相同子元件。
管理所提供指標存留期的建議解決方案,而只需要 ref-count 傳回的介面即可利用 ID3D12Object::SetPrivateDataInterface,並使用實作 IUnknown的物件,並在 ref-count 達到 0 時釋放記憶體。
執行緒安全性
管線程式庫是安全線程使用,而且會視需要內部同步處理,但有一個例外狀況:多個 (執行緒會透過LoadComputePipeline、LoadGraphicsPipeline 或 LoadPipeline) 同步處理,因為此動作可能會以非執行緒安全的方式修改程式庫中該管線的狀態。
範例
請參閱 Direct3D 12 管線狀態快取範例。
需求
目標平台 | Windows |
標頭 | d3d12.h |
程式庫 | D3d12.lib |
Dll | D3d12.dll |
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應