ID3D12Device1::CreatePipelineLibrary 方法 (d3d12.h)
创建缓存的管道库。 对于管道状态对象 (预期共享数据的 PSO) ,在序列化数据之前将它们分组到库中意味着元数据产生的开销更少,并且有机会避免将冗余或重复的数据写入磁盘。
可以使用 ID3D12Device::CheckFeatureSupport 查询 ID3D12PipelineLibrary 支持,D3D12_FEATURE_SHADER_CACHE和D3D12_FEATURE_DATA_SHADER_CACHE。 如果 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。 通常使用 宏 IID_PPV_ARGS(&Library)
设置此参数和以下参数,其中 Library 是对象的名称。
ppPipelineLibrary
类型:[out] void**
返回指向所创建库的指针。
返回值
类型: HRESULT
如果函数成功,则返回 S_OK。 否则,它将返回 HRESULT错误代码,包括 blob 损坏或无法识别 E_INVALIDARG 、 D3D12_ERROR_DRIVER_VERSION_MISMATCH 提供的数据是否来自旧驱动程序或运行时,以及 D3D12_ERROR_ADAPTER_NOT_FOUND 数据是否来自不同的硬件。
如果传递 nullptr
pPipelineLibrary ,则运行时仍会执行 Blob 的验证,但避免创建实际库,并返回S_FALSE(如果已创建库)。
此外,该功能需要更新的驱动程序,尝试在旧驱动程序上使用它将返回DXGI_ERROR_UNSUPPORTED。
备注
管道库支持以下操作。
- 将管道状态对象 (PSO) 添加到现有库对象 (请参阅 StorePipeline) 。
- 将 PSO 库序列化为磁盘存储的连续内存块 (请参阅 序列化) 。
- 从永久性存储中取消序列化 PSO 库, (这由 CreatePipelineLibrary) 处理。
- 从库中检索单个 PSO (请参阅 LoadComputePipeline 和 LoadGraphicsPipeline) 。
在管道库的生命周期中,具有相同子组件的 PSO 之间没有任何重复。
一种建议的解决方案是利用 ID3D12Object::SetPrivateDataInterface,并使用实现 IUnknown 的对象,并在引用计数达到 0 时释放内存。
线程安全性
管道库是线程安全的,并且会根据需要在内部同步,但有一个例外:多个线程通过 LoadComputePipeline、 LoadGraphicsPipeline 或 LoadPipeline 加载同一 PSO (,) 应自行同步,因为此操作可能会以非线程安全的方式修改库中该管道的状态。
示例
请参阅 Direct3D 12 管道状态缓存示例。
要求
目标平台 | Windows |
标头 | d3d12.h |
Library | D3d12.lib |
DLL | D3d12.dll |
请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈