ID3D12Device1::CreatePipelineLibrary 方法 (d3d12.h)

创建缓存的管道库。 对于管道状态对象 (预期共享数据的 PSO) ,在序列化数据之前将它们分组到库中意味着元数据产生的开销更少,并且有机会避免将冗余或重复的数据写入磁盘。

可以使用 ID3D12Device::CheckFeatureSupport 查询 ID3D12PipelineLibrary 支持,D3D12_FEATURE_SHADER_CACHED3D12_FEATURE_DATA_SHADER_CACHE。 如果 D3D12_FEATURE_DATA_SHADER_CACHEFlags 成员包含标志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 损坏或无法识别 E_INVALIDARGD3D12_ERROR_DRIVER_VERSION_MISMATCH 提供的数据是否来自旧驱动程序或运行时,以及 D3D12_ERROR_ADAPTER_NOT_FOUND 数据是否来自不同的硬件。

如果传递 nullptrpPipelineLibrary ,则运行时仍会执行 Blob 的验证,但避免创建实际库,并返回S_FALSE(如果已创建库)。

此外,该功能需要更新的驱动程序,尝试在旧驱动程序上使用它将返回DXGI_ERROR_UNSUPPORTED。

备注

管道库支持以下操作。

  • 将管道状态对象 (PSO) 添加到现有库对象 (请参阅 StorePipeline) 。
  • 将 PSO 库序列化为磁盘存储的连续内存块 (请参阅 序列化) 。
  • 从永久性存储中取消序列化 PSO 库, (这由 CreatePipelineLibrary) 处理。
  • 从库中检索单个 PSO (请参阅 LoadComputePipelineLoadGraphicsPipeline) 。

在管道库的生命周期中,具有相同子组件的 PSO 之间没有任何重复。

一种建议的解决方案是利用 ID3D12Object::SetPrivateDataInterface,并使用实现 IUnknown 的对象,并在引用计数达到 0 时释放内存。

线程安全性

管道库是线程安全的,并且会根据需要在内部同步,但有一个例外:多个线程通过 LoadComputePipelineLoadGraphicsPipelineLoadPipeline 加载同一 PSO (,) 应自行同步,因为此操作可能会以非线程安全的方式修改库中该管道的状态。

示例

请参阅 Direct3D 12 管道状态缓存示例

要求

   
目标平台 Windows
标头 d3d12.h
Library D3d12.lib
DLL D3d12.dll

请参阅