ID3D12Device::MakeResident 方法 (d3d12.h)
使对象驻留在设备中。
语法
HRESULT MakeResident(
UINT NumObjects,
[in] ID3D12Pageable * const *ppObjects
);
参数
NumObjects
类型: UINT
ppObjects 数组中要为设备驻留的对象数。
[in] ppObjects
类型: ID3D12Pageable*
指向内存块的指针,该内存块包含对象的 ID3D12Pageable 接口指针数组。
尽管大多数 D3D12 对象继承自 ID3D12Pageable,但仅以下对象支持驻留更改:描述符堆、堆、提交的资源和查询堆
返回值
类型: HRESULT
此方法返回 Direct3D 12 返回代码之一。
注解
MakeResident 从磁盘加载与资源关联的数据,并从资源的相应内存池重新分配内存。 应在拥有物理内存的 对象上调用此方法。
使用此方法和 Evict 来管理 GPU 视频内存,请注意,这是在 D3D11 中自动完成的,但现在必须在 D3D12 中由应用完成。
MakeResident 和 Evict 可帮助应用程序管理许多适配器上的驻留预算。 MakeResident 显式分页数据,然后排除分页,以便 GPU 可以访问数据。 Evict 启用分页。
由于没有足够的 GPU 虚拟地址空间,某些 GPU 体系结构无法受益于驻留操作。 使用 D3D12_FEATURE_DATA_GPU_VIRTUAL_ADDRESS_SUPPORT 和 IDXGIAdapter3::QueryVideoMemoryInfo 来识别每个进程的最大 GPU VA 空间太小或与驻留预算大致相同的大小。 对于此类体系结构,驻留预算将始终受 GPU 虚拟地址空间量的限制。 逐出 不会释放此类系统上的任何居住预算。
应用程序必须处理 MakeResident 故障,即使似乎有足够的可用驻留预算。 物理内存碎片和适配器体系结构异常可能会阻止使用较大的连续范围。 在重试之前,申请应释放更多的居住预算。
MakeResident 被引用计数,因此在 Evict生效之前,Evict 的调用次数必须与 MakeResident 相同。 支持驻留的对象在创建过程中成为常驻对象,因此单个 Evict 调用实际上会逐出对象。
应用程序必须使用围栏来确保 GPU 不使用非驻留对象。 在 GPU 执行引用对象的命令列表之前,MakeResident 必须返回 。 在 GPU 执行完引用对象的命令列表后,必须调用 Evict。
被逐出的对象仍使用相同的 GPU 虚拟地址和相同数量的 GPU 虚拟地址空间。 因此,资源描述符和其他 GPU 虚拟地址引用在 Evict 后不会失效。
要求
要求 | 值 |
---|---|
目标平台 | Windows |
标头 | d3d12.h |
Library | D3D12.lib |
DLL | D3D12.dll |