ID3D12Device1::CreatePipelineLibrary 方法 (d3d12.h)

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

可以使用 D3D12_FEATURE_SHADER_CACHED3D12_FEATURE_DATA_SHADER_CACHE查询 ID3D12PipelineLibrary 支持 ID3D12Device::CheckFeatureSupport。 如果 D3D12_FEATURE_DATA_SHADER_CACHE标志 成员包含标志 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 不为空,则会验证该 Blob 的完整性、分析和存储指针。 作为此方法输入提供的指针在返回对象的生存期内必须保持有效。 出于效率原因,不会复制数据。

BlobLength

类型:SIZE_T

指定 pLibraryBlob 的长度(以字节为单位)。

riid

类型:REFIID

ID3D12PipelineLibrary 对象指定唯一的 REFIID。 通常,使用宏 IID_PPV_ARGS(&Library)设置此参数,其中 是对象的名称。

ppPipelineLibrary

类型:[out] void**

返回指向已创建的库的指针。

返回值

类型:HRESULT

如果函数成功,则返回 S_OK。 否则,它将返回 HRESULT错误代码,包括 E_INVALIDARG blob 损坏或无法识别,D3D12_ERROR_DRIVER_VERSION_MISMATCH 提供的数据来自旧驱动程序或运行时,如果数据来自不同的硬件,D3D12_ERROR_ADAPTER_NOT_FOUND

如果为 pPipelineLibrary 传递 nullptr,则运行时仍会执行 blob 的验证,但避免创建实际库,并在创建库时返回S_FALSE。

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

言论

管道库启用以下操作。

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

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

建议的解决方案用于管理提供的指针的生存期,而只需对返回的接口进行 ref-count 即可利用 ID3D12Object::SetPrivateDataInterface,并使用实现 IUnknown的对象,并在 ref-count 达到 0 时释放内存。

线程安全

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

例子

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

要求

要求 价值
目标平台 窗户
标头 d3d12.h
D3d12.lib
DLL D3d12.dll

另请参阅