PFND3DDDI_MAKERESIDENTCB回调函数 (d3dumddi.h)

pfnMakeResidentCb 用于指示 OS 将资源添加到设备驻留列表,并增加此分配的驻留引用计数。

语法

PFND3DDDI_MAKERESIDENTCB Pfnd3dddiMakeresidentcb;

HRESULT Pfnd3dddiMakeresidentcb(
  HANDLE hDevice,
  D3DDDI_MAKERESIDENT *unnamedParam2
)
{...}

参数

hDevice

显示设备的句柄。

unnamedParam2

pData [in, out]

指向 D3DDDI_MAKERESIDENT 结构的指针,该结构描述要驻留的内存页。

返回值

pfnMakeResidentCb 返回以下值之一:

返回代码 说明
S_OK 退出此函数后,所有分配都已驻留在 GPU 上,并可供立即访问。
E_PENDING 分配已添加到设备驻留要求列表,但仍有待完成的分页操作才能成功访问。 在这种情况下,用户模式驱动程序必须等待与 hPagingQueue 关联的受监视围栏同步对象上的 PagingFenceValue 收到信号,然后才能提交引用分配或 GPU 页面出错的命令缓冲区。
E_OUTOFMEMORY 视频内存管理器无法使每个请求的分配驻留。 发生这种情况时,提供的列表中的任何分配都不会看到其驻留计数被修改。 换句话说,这是一个原子操作,其中要么所有分配都增加其驻留计数,要么没有增加任何一个。 此外,NumBytesToTrim 向驱动程序指示必须通过调用 pfnEvictCb 从设备驻留要求列表中剪裁多少个字节,然后再尝试使失败的分配再次驻留。
与应用程序关联的内存预算可能会随着应用程序运行而异步更改。 因此,剪裁请求的字节数并不能保证下一次尝试使分配集驻留成功,因为应用程序的内存预算可能已减少。 因此,驱动程序应确保它在循环中尝试驻留请求,在每次迭代之间剪裁,直到请求成功,或者驱动程序已剪裁一切,以在单个操作上向前推进,并在最后一次尝试中使用所需的资源。 如果最后一次尝试失败,基础设备将出错,用户模式驱动程序应中止请求并返回到应用程序。 内核不允许进一步提交到属于错误设备的任何上下文。
对于 DirectX 12.0 用户模式驱动程序,pfnMakeResidentCb 的行为略有不同,因为它不再负责在分配中剪裁或分页。 这样做是为了确保从 调用返回后所有分配的状态与调用前的状态保持一致。 这意味着,如果从 函数返回E_OUTOFMEMORY:
- 所有分配都保持其原始状态。
- 分配不是常驻的。
- 应忽略 PagingFenceValue。
如果驱动程序需要分批执行 pfnMakeResidentCb 调用以适应资源到分配的转换,则驱动程序应撤消之前对 pfnMakeResidentCb 的任何调用,并等效调用 pfnEvictCb,并将错误代码传播回运行时。

要求

要求
最低受支持的客户端 Windows 10
最低受支持的服务器 Windows Server 2016
目标平台 桌面
标头 d3dumddi.h (包括 D3dumddi.h)

另请参阅

D3DDDI_MAKERESIDENT

pfnEvictCb