ID3D12Device1
COM公式ドキュメント
仮想アダプターを表し、ID3D12Device が提供するメソッドの範囲を拡張します。
解説(Remarks)
デバイスを作成するには D3D12CreateDevice を使用します。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
キャッシュされたパイプラインライブラリを作成します。
| pLibraryBlob | void* | in | 入力ライブラリ BLOB が空の場合、ライブラリの初期内容は空になります。入力ライブラリ BLOB が空でない場合は、整合性が検証され、解析されたうえでポインターが保持されます。このメソッドに入力として渡すポインターは、返されるオブジェクトの有効期間中、有効であり続ける必要があります。効率上の理由から、データはコピーされません。 |
| BlobLength | UINT_PTR | in | pLibraryBlob の長さをバイト単位で指定します。 |
| riid | GUID* | in | ID3D12PipelineLibrary オブジェクトの一意の REFIID を指定します。通常は、マクロ IID_PPV_ARGS(&Library) を使用してこのパラメーターと次のパラメーターを設定します (Library はオブジェクトの名前です)。 |
| ppPipelineLibrary | void** | out | 作成されたライブラリへのポインターを返します。 |
戻り値
型: 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 が返されます。
解説(Remarks)
パイプラインライブラリでは次の操作が可能です。
- 既存のライブラリオブジェクトへのパイプラインステートオブジェクト (PSO) の追加 (StorePipeline を参照)。
- ディスクへ保存するために PSO ライブラリを連続したメモリブロックへシリアル化 (Serialize を参照)。
- 永続ストレージからの PSO ライブラリの逆シリアル化 (これは CreatePipelineLibrary が行います)。
- ライブラリからの個々の PSO の取得 (LoadComputePipeline および LoadGraphicsPipeline を参照)。
パイプラインライブラリのライフサイクルのどの時点においても、同一のサブコンポーネントを持つ PSO 間で重複が生じることはありません。
返されるインターフェイスの参照カウントのみを管理しつつ、渡したポインターの有効期間を管理するための推奨される方法は、ID3D12Object::SetPrivateDataInterface を利用し、IUnknown を実装して参照カウントが 0 になった時点でメモリを解放するオブジェクトを使用することです。
スレッドセーフティ
パイプラインライブラリはスレッドセーフに使用でき、必要に応じて内部で同期を行いますが、1 つだけ例外があります。複数のスレッドが同じ PSO を読み込む場合 (LoadComputePipeline、 LoadGraphicsPipeline、または LoadPipeline を使用)、この操作はライブラリ内のそのパイプラインの状態をスレッドセーフでない方法で変更する可能性があるため、スレッド側で同期を行う必要があります。
例
Direct3D 12 pipeline state cache sample を参照してください。
複数のフェンスのうち 1 つ以上が指定した値に達したときに発生させるイベントを指定します。
| ppFences | ID3D12Fence** | in | ID3D12Fence オブジェクトを指定する、長さ NumFences の配列です。 |
| pFenceValues | ULONGLONG* | in | イベントがシグナル状態になるために必要なフェンス値を指定する、長さ NumFences の配列です。 |
| NumFences | DWORD | in | 対象に含めるフェンスの数を指定します。 |
| Flags | D3D12_MULTIPLE_FENCE_WAIT_FLAGS | in | 処理方法を決定する D3D12_MULTIPLE_FENCE_WAIT_FLAGS のいずれか 1 つを指定します。 |
| hEvent | HANDLE | in | イベントオブジェクトへのハンドルです。 |
戻り値
型: HRESULT
このメソッドは HRESULT の成功コードまたはエラーコードを返します。
解説(Remarks)
単一のフェンスを指定する場合は、SetEventOnCompletion メソッドを参照してください。
hEvent が null ハンドルの場合、この API は指定されたフェンス値に達するまで戻りません。
このメソッドは、指定したオブジェクトのリストに対してレジデンシー優先度を設定します。
| NumObjects | DWORD | in | ppObjects 配列および pPriorities 配列に含まれるオブジェクトの数を指定します。 |
| ppObjects | ID3D12Pageable** | in | ID3D12Pageable オブジェクトへの参照を格納した、長さ NumObjects の配列を指定します。 |
| pPriorities | D3D12_RESIDENCY_PRIORITY* | in | オブジェクトのリストに対応する D3D12_RESIDENCY_PRIORITY 値を格納した、長さ NumObjects の配列を指定します。 |
戻り値
型: HRESULT
このメソッドは HRESULT の成功コードまたはエラーコードを返します。
解説(Remarks)
詳細については、Residency を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ID3D12Device1 "{77ACCE80-638E-4E65-8895-C1F23386863E}" #usecom global ID3D12Device1 IID_ID3D12Device1 "{}" #comfunc global ID3D12Device1_CreatePipelineLibrary 44 sptr,sptr,var,sptr #comfunc global ID3D12Device1_SetEventOnMultipleFenceCompletion 45 sptr,var,int,int,sptr #comfunc global ID3D12Device1_SetResidencyPriority 46 int,sptr,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ID3D12Device1 "{77ACCE80-638E-4E65-8895-C1F23386863E}" #usecom global ID3D12Device1 IID_ID3D12Device1 "{}" #comfunc global ID3D12Device1_CreatePipelineLibrary 44 sptr,sptr,sptr,sptr #comfunc global ID3D12Device1_SetEventOnMultipleFenceCompletion 45 sptr,sptr,int,int,sptr #comfunc global ID3D12Device1_SetResidencyPriority 46 int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。