ID3D12Device1::CreatePipelineLibrary メソッド (d3d12.h)
キャッシュされたパイプライン ライブラリを作成します。 データを共有することが予想されるパイプライン状態オブジェクト (PSO) の場合、それらをシリアル化する前にライブラリにグループ化すると、メタデータによるオーバーヘッドが少なくなり、冗長なデータや重複するデータがディスクに書き込まれるのを回避できます。
ID3D12Device::CheckFeatureSupportを使用して、D3D12_FEATURE_SHADER_CACHE と D3D12_FEATURE_DATA_SHADER_CACHEを使用して、ID3D12PipelineLibrary サポートを照会できます。 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 を指定します。 通常、このパラメーターと次のパラメーターをマクロ
ppPipelineLibrary
型: [out] void**
作成されたライブラリへのポインターを返します。
戻り値
型: HRESULT
関数が成功した場合は、S_OKを返します。 それ以外の場合は、HRESULTエラー コードが返されます。これには、BLOB が破損しているか認識できない場合は E_INVALIDARG、提供されたデータが古いドライバーまたはランタイムから取得された場合は D3D12_ERROR_DRIVER_VERSION_MISMATCH、データが別のハードウェアから取得された場合は D3D12_ERROR_ADAPTER_NOT_FOUND が含まれます。
pPipelineLibrary の nullptr
を渡した場合、ランタイムは引き続き BLOB の検証を実行しますが、実際のライブラリを作成することは避け、ライブラリが作成された場合はS_FALSEを返します。
また、この機能には更新されたドライバーが必要であり、古いドライバーで使用しようとするとDXGI_ERROR_UNSUPPORTEDが返されます。
備考
パイプライン ライブラリを使用すると、次の操作を実行できます。
- パイプライン状態オブジェクト (PCO) を既存のライブラリ オブジェクトに追加する (StorePipeline
参照)。 - PSO ライブラリをディスク ストレージ用の連続したメモリ ブロックにシリアル化する (のシリアル化
参照)。 - 永続ストレージからの PSO ライブラリのシリアル化解除 (これは、CreatePipelineLibrary
によって処理されます)。 - ライブラリから個々の PSO を取得する (LoadComputePipeline と LoadGraphicsPipeline
参照)。
パイプライン ライブラリのライフサイクルの時点では、同じサブコンポーネントを持つ PSO 間に重複はありません。
返されたインターフェイスを参照カウントするだけで済む一方で、指定されたポインターの有効期間を管理するための推奨ソリューションは、ID3D12Object::SetPrivateDataInterfaceを利用し、IUnknownを実装するオブジェクトを使用し、ref カウントが 0 に達したときにメモリを解放することです。
スレッド セーフ
パイプライン ライブラリはスレッド セーフで、必要に応じて内部的に同期されます。1 つの例外として、同じ PSO を読み込む複数のスレッド (LoadComputePipeline、LoadGraphicsPipeline、または LoadPipelineを使用) は、ライブラリ内のパイプラインの状態をスレッド セーフでない方法で変更する可能性があるため、同期する必要があります。
例
Direct3D 12 パイプライン状態キャッシュのサンプルを参照してください。
必要条件
要件 | 価値 |
---|---|
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | d3d12.h |
ライブラリ | D3d12.lib |
DLL | D3d12.dll |