PFND3DDDI_UNLOCKCB回调函数 (d3dumddi.h)
pfnUnlockCb 函数解锁通过调用 pfnLockCb 函数锁定的分配。
语法
PFND3DDDI_UNLOCKCB Pfnd3dddiUnlockcb;
HRESULT Pfnd3dddiUnlockcb(
HANDLE hDevice,
const D3DDDICB_UNLOCK *unnamedParam2
)
{...}
参数
hDevice
显示设备的句柄 (图形上下文) 。
unnamedParam2
pData [in]
指向描述要解锁的分配 的D3DDDICB_UNLOCK 结构的指针。
返回值
pfnUnlockCb 返回以下值之一:
返回代码 | 说明 |
---|---|
S_OK | 已成功解锁分配。 |
E_OUTOFMEMORY | 由于内存不足,pfnUnlockCb 无法完成。 (当系统处于极低的内存状态并且没有足够的空间来分配 pages 数组时,会发生此错误。) |
E_INVALIDARG | 参数已验证并确定为不正确。 |
此函数还可能返回其他 HRESULT 值。
注解
用户模式显示驱动程序必须调用 pfnUnlockCb 函数来解锁之前在调用 pfnLockCb 函数时锁定的分配。 如果驱动程序不调用 pfnUnlockCb,Microsoft Direct3D 运行时、用户模式显示驱动程序和显示微型端口驱动程序之间的协调将丢失。
用户模式显示驱动程序通常调用 pfnUnlockCb ,以响应对其 Unlock 或 ResourceUnmap 函数的调用, (或 ResourceUnmap 的其他变体(如 DynamicIABufferUnmap) )来解锁资源或资源中的图面。 在从 Unlock 或 ResourceUnmap 调用返回之前,用户模式显示驱动程序必须先将资源或图面映射到相应的分配,然后调用 pfnUnlockCb 来解锁分配。
用户模式显示驱动程序还可以调用 pfnUnlockCb ,以响应对其 DestroyDevice 或 DestroyDevice (D3D10) 函数的调用,以释放它为设备分配的所有资源。 在设备的生存期内,每次调用 pfnLockCb 以锁定分配时,都必须与对 pfnUnlockCb 函数的调用配对才能解锁分配。
用户模式显示驱动程序可以通过将 D3DDDICB_UNLOCK 结构的 NumAllocations 成员设置为数组中由 D3DDDICB_UNLOCK 的 phAllocations 成员指定的分配数,在一次调用 pfnUnlockCb 中解锁多个分配。
在调用 pfnRenderCb 函数之前,用户模式显示驱动程序应调用 pfnUnlockCb 以解锁命令流中引用的所有分配。 驱动程序的分配可能锁定为 support,例如 NoOverwrite 位字段标志。 如果驱动程序未解锁所有这些分配,则视频内存管理器可能需要将这些分配放在 AGP 内存中。
用户模式显示驱动程序不应调用 pfnUnlockCb 来解锁应用程序可能使用的分配。 当驱动程序在相应资源上收到对其 Unlock 或 ResourceUnmap 函数的调用时,将通知驱动程序应用程序不再从分配中读取或写入。
示例
下面的代码示例演示如何解锁分配。
HRESULT CD3DContext::SyncEnginesUsingLock(VOID) {
HRESULT hr;
D3DDDICB_LOCK lockCB;
D3DDDICB_UNLOCK Unlock;
memset(&lockCB, 0, sizeof(D3DDDICB_LOCK));
lockCB.hAllocation = m_HandleUsedInLastSubmit;
lockCB.PrivateDriverData = 0;
hr = m_d3dCallbacks.pfnLockCb(m_hD3D, &lockCB);
if (FAILED(hr)) {
DBG_BREAK;
return hr;
}
Unlock.NumAllocations = 1;
Unlock.phAllocations = &m_HandleUsedInLastSubmit;
m_d3dCallbacks.pfnUnlockCb(m_hD3D, &Unlock);
return hr;
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 在 Windows Vista 和更高版本的 Windows 操作系统中可用。 |
目标平台 | 桌面 |
标头 | d3dumddi.h (包括 D3dumddi.h) |