ID3D12Device1::CreatePipelineLibrary 方法 (d3d12.h)
创建缓存的管道库。 对于预期将数据共享在一起的管道状态对象(PSO),在序列化数据之前将它们分组到库中意味着由于元数据而开销较小,并有机会避免将数据写入磁盘的冗余或重复数据。
可以使用 D3D12_FEATURE_SHADER_CACHE 和 D3D12_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(请参阅 LoadComputePipeline 和 LoadGraphicsPipeline)。
在管道库的生命周期中,具有相同子组件的 PSO 之间没有任何重复。
建议的解决方案用于管理提供的指针的生存期,而只需对返回的接口进行 ref-count 即可利用 ID3D12Object::SetPrivateDataInterface,并使用实现 IUnknown的对象,并在 ref-count 达到 0 时释放内存。
线程安全
管道库是线程安全的使用,并将根据需要在内部同步,但有一个例外:多个线程加载同一 PSO(通过 LoadComputePipeline、LoadGraphicsPipeline或 LoadPipeline) 应自行同步,因为此操作可能会以非线程安全的方式修改库中该管道的状态。
例子
请参阅 Direct3D 12 管道状态缓存示例。
要求
要求 | 价值 |
---|---|
目标平台 | 窗户 |
标头 | d3d12.h |
库 | D3d12.lib |
DLL | D3d12.dll |