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 由于内存不足而无法完成。 (当系统内存非常低且没有足够的空间来分配页面数组时,会发生此错误。 |
E_INVALIDARG | 参数已验证并确定不正确。 |
此函数还可以返回其他 HRESULT 值。
言论
用户模式显示驱动程序必须调用 pfnUnlockCb 函数,才能解锁以前在调用 pfnLockCb 函数时锁定的分配。 如果驱动程序未调用 pfnUnlockCb,则Microsoft Direct3D 运行时、用户模式显示驱动程序和显示微型端口驱动程序之间的协调将丢失。
用户模式显示驱动程序通常调用 pfnUnlockCb,以响应其 解锁 或 ResourceUnmap 函数(或 ResourceUnmap 的其他变体(如 DynamicIABufferUnmap)来解锁资源或资源中的图面。 在从 解锁 或 ResourceUnmap 调用返回之前,用户模式显示驱动程序必须先将资源或图面映射到相应的分配,然后调用 pfnUnlockCb 解锁分配。
用户模式显示驱动程序还可以调用 pfnUnlockCb,以响应对其 DestroyDevice 或 DestroyDevice(D3D10) 函数的调用,以释放为设备分配的所有资源。 在设备的生存期内,每次调用 pfnLockCb 以锁定分配时,都必须与对 pfnUnlockCb 函数的调用配对才能解锁分配。
用户模式显示驱动程序可以通过将 D3DDDICB_UNLOCK 结构的 NumAllocations 成员设置为由 D3DDDICB_UNLOCK phAllocations 成员指定的数组中的分配数,在一次调用 pfnUnlockCb 中解锁多个分配。
在调用 pfnRenderCb 函数之前,用户模式显示驱动程序应调用 pfnUnlockCb 来解锁命令流中引用的所有分配。 驱动程序可以锁定分配以支持-例如,NoOverwrite 位字段标志。 如果驱动程序未解锁所有这些分配,则可能需要视频内存管理器将这些分配放置在 AGP 内存中。
用户模式显示驱动程序不应调用 pfnUnlockCb 来解锁应用程序可以使用的分配。 当驱动程序在相应资源上收到对其 解锁 或 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) |