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 ,以响应对其 UnlockResourceUnmap 函数的调用, (或 ResourceUnmap 的其他变体(如 DynamicIABufferUnmap) )来解锁资源或资源中的图面。 在从 UnlockResourceUnmap 调用返回之前,用户模式显示驱动程序必须先将资源或图面映射到相应的分配,然后调用 pfnUnlockCb 来解锁分配。

用户模式显示驱动程序还可以调用 pfnUnlockCb ,以响应对其 DestroyDeviceDestroyDevice (D3D10) 函数的调用,以释放它为设备分配的所有资源。 在设备的生存期内,每次调用 pfnLockCb 以锁定分配时,都必须与对 pfnUnlockCb 函数的调用配对才能解锁分配。

用户模式显示驱动程序可以通过将 D3DDDICB_UNLOCK 结构的 NumAllocations 成员设置为数组中由 D3DDDICB_UNLOCK 的 phAllocations 成员指定的分配数,在一次调用 pfnUnlockCb 中解锁多个分配。

在调用 pfnRenderCb 函数之前,用户模式显示驱动程序应调用 pfnUnlockCb 以解锁命令流中引用的所有分配。 驱动程序的分配可能锁定为 support,例如 NoOverwrite 位字段标志。 如果驱动程序未解锁所有这些分配,则视频内存管理器可能需要将这些分配放在 AGP 内存中。

用户模式显示驱动程序不应调用 pfnUnlockCb 来解锁应用程序可能使用的分配。 当驱动程序在相应资源上收到对其 UnlockResourceUnmap 函数的调用时,将通知驱动程序应用程序不再从分配中读取或写入。

示例

下面的代码示例演示如何解锁分配。

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)

另请参阅

D3DDDICB_UNLOCK

D3DDDI_DEVICECALLBACKS

DestroyDevice

DestroyDevice (D3D10)

ResourceUnmap

Unlock

pfnLockCb

pfnRenderCb