> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# CreatePipelineLibrary

> キャッシュされたパイプライン ライブラリを作成します。

キャッシュされたパイプライン ライブラリを作成します。データを共有すると予想されるパイプライン ステート オブジェクト (PSO) の場合、それらをシリアライズする前にライブラリにグループ化すると、メタデータによるオーバーヘッドが減少するとともに、冗長または重複したデータがディスクに書き込まれるのを回避する機会が得られます。

**ID3D12PipelineLibrary** のサポートは、[**D3D12\_FEATURE\_SHADER\_CACHE**](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/enums/d3d12_feature_public.md) および [**D3D12\_FEATURE\_DATA\_SHADER\_CACHE**](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/structs/d3d12_feature_data_shader_cache_public.md) を指定した [**ID3D12Device::CheckFeatureSupport**](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12device/methods/id3d12device_checkfeaturesupport_public.md) を使用して照会できます。[**D3D12\_FEATURE\_DATA\_SHADER\_CACHE**](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/structs/d3d12_feature_data_shader_cache_public.md) の *Flags* メンバーにフラグ [**D3D12\_SHADER\_CACHE\_SUPPORT\_LIBRARY**](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/enums/d3d12_shader_cache_support_flags_public.md) が含まれている場合、**ID3D12PipelineLibrary** インターフェイスがサポートされています。それ以外の場合、この関数が呼び出されると常に **DXGI\_ERROR\_NOT\_SUPPORTED** が返されます。

## 構文

```cpp theme={null}
HRESULT CreatePipelineLibrary(
    const void  pLibraryBlob,
    SIZE_T BlobLength,
    const IID & riid,
    void  ppPipelineLibrary
)
```

### パラメーター

*pLibraryBlob*\
型: const void \*

入力ライブラリ BLOB が空の場合、ライブラリの初期コンテンツは空です。入力ライブラリ BLOB が空でない場合、整合性が検証され、解析され、ポインターが保存されます。このメソッドへの入力として提供されるポインターは、返されるオブジェクトの有効期間中は有効なままである必要があります。効率上の理由から、データはコピーされません。

*BlobLength*\
型: SIZE\_T

*pLibraryBlob* の長さをバイト単位で指定します。

*riid*\
型: const IID &

[ID3D12PipelineLibrary](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12pipelinelibrary/id3d12pipelinelibrary_public.md) オブジェクトの一意の REFIID を指定します。通常、これと次のパラメーターはマクロ `IID_PPV_ARGS(&Library)` で設定します。ここで、**Library** はオブジェクトの名前です。

*ppPipelineLibrary*\
型: void \*\*

作成されたライブラリへのポインターを返します。

### 戻り値

型: HRESULT

関数が成功した場合、**S\_OK** を返します。それ以外の場合は、[**HRESULT**](https://learn.microsoft.com/en-us/windows/win32/com/structure-of-com-error-codes) [エラー コード](https://learn.microsoft.com/en-us/windows/win32/com/com-error-codes-10) を返します。BLOB が破損しているか認識されない場合は **E\_INVALIDARG**、提供されたデータが古いドライバーまたはランタイムからのものである場合は **D3D12\_ERROR\_DRIVER\_VERSION\_MISMATCH**、データが異なるハードウェアからのものである場合は **D3D12\_ERROR\_ADAPTER\_NOT\_FOUND** を含みます。

*pPipelineLibrary* に `nullptr` を渡した場合、ランタイムは依然として BLOB の検証を実行しますが、実際のライブラリの作成は回避し、ライブラリが作成される予定であった場合は S\_FALSE を返します。

また、この機能には更新されたドライバーが必要であり、古いドライバーで使用しようとすると DXGI\_ERROR\_UNSUPPORTED が返されます。

## 解説

パイプライン ライブラリでは次の操作が可能です。

* 既存のライブラリ オブジェクトにパイプライン ステート オブジェクト (PSO) を追加する ([StorePipeline](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12pipelinelibrary/methods/id3d12pipelinelibrary_storepipeline_public.md) を参照)。
* ディスク ストレージ用に PSO ライブラリを連続したメモリ ブロックにシリアライズする ([Serialize](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12pipelinelibrary/methods/id3d12pipelinelibrary_serialize_public.md) を参照)。
* 永続ストレージから PSO ライブラリをデシリアライズする (これは **CreatePipelineLibrary** によって処理されます)。
* ライブラリから個々の PSO を取得する ([LoadComputePipeline](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12pipelinelibrary/methods/id3d12pipelinelibrary_loadcomputepipeline_public.md) および [LoadGraphicsPipeline](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12pipelinelibrary/methods/id3d12pipelinelibrary_loadgraphicspipeline_public.md) を参照)。

パイプライン ライブラリのライフサイクル中、同一のサブコンポーネントを持つ PSO 間で重複することは決してありません。

返されたインターフェイスの参照カウントのみを行いながら、提供されたポインターの有効期間を管理するための推奨ソリューションは、[ID3D12Object::SetPrivateDataInterface](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12object/methods/id3d12object_setprivatedatainterface_public.md) を活用し、**IUnknown** を実装するオブジェクトを使用して、参照カウントが 0 に達したときにメモリを解放することです。

### スレッド安全性

パイプライン ライブラリはスレッド セーフに使用でき、必要に応じて内部で同期を行いますが、1 つの例外があります。同じ PSO を複数のスレッドがロードする場合 ([**LoadComputePipeline**](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12pipelinelibrary/methods/id3d12pipelinelibrary_loadcomputepipeline_public.md)、[**LoadGraphicsPipeline**](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12pipelinelibrary/methods/id3d12pipelinelibrary_loadgraphicspipeline_public.md)、または [**LoadPipeline**](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12pipelinelibrary1/methods/id3d12pipelinelibrary1_loadpipeline_public.md) 経由)、スレッド セーフではない方法でライブラリ内のそのパイプラインの状態が変更される可能性があるため、これらのスレッドは自身で同期する必要があります。

## 例

[Direct3D 12 パイプライン ステート キャッシュ サンプル](https://github.com/microsoft/DirectX-Graphics-Samples/tree/master/Samples/Desktop/D3D12PipelineStateCache) を参照してください。

## 要件

**ヘッダー:** d3d12\_xs.h または d3d12\_x.h\
**ライブラリ:** d3d12\_xs.lib または d3d12\_x.lib\
**サポートされているプラットフォーム**: XBOX Series 本体および XBOX One ファミリ

## 関連項目

* [ID3D12Device1](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12device1/id3d12device1_public.md)
* [Direct3D 12 パイプライン ステート キャッシュ サンプル](https://github.com/microsoft/DirectX-Graphics-Samples/tree/master/Samples/Desktop/D3D12PipelineStateCache)


## Related topics

- [ID3D12PipelineLibrary](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12pipelinelibrary/id3d12pipelinelibrary_public.md)
- [StorePipeline](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12pipelinelibrary/methods/id3d12pipelinelibrary_storepipeline_public.md)
- [LoadGraphicsPipeline](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12pipelinelibrary/methods/id3d12pipelinelibrary_loadgraphicspipeline_public.md)
- [LoadComputePipeline](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12pipelinelibrary/methods/id3d12pipelinelibrary_loadcomputepipeline_public.md)
- [GetSerializedSize](https://docs.xbox.com/ja-jp/reference/graphics/d3d12/interfaces/id3d12pipelinelibrary/methods/id3d12pipelinelibrary_getserializedsize_public.md)
