PFND3DDDI_LOCKASYNC回调函数 (d3dumddi.h)

LockAsync 函数锁定指定的资源或资源中的图面。

语法

PFND3DDDI_LOCKASYNC Pfnd3dddiLockasync;

HRESULT Pfnd3dddiLockasync(
  HANDLE hDevice,
  D3DDDIARG_LOCKASYNC *unnamedParam2
)
{...}

参数

hDevice

显示设备的句柄 (图形上下文) 。

unnamedParam2

pData [in, out]

指向 D3DDDIARG_LOCKASYNC 结构的指针,该结构描述要锁定的资源或图面。

返回值

LockAsync 返回以下值之一:

返回代码 说明
S_OK 资源已成功锁定。
E_OUTOFMEMORY LockAsync 无法分配完成所需的内存。
D3DDDIERR_WASSTILLDRAWING 重命名与 D3DDDIARG_LOCKASYNC 结构指定的资源对应的分配失败。
仅当在 D3DDDIARG_LOCKASYNC 的 Flags 成员中设置了 Discard 位字段标志时,驱动程序才会返回此值。
E_NOTIMPL 用户模式显示驱动程序不支持指定资源的 LockAsync。

注解

在多处理器计算机上,Microsoft Direct3D 运行时可能会从工作线程而不是从main应用程序线程调用用户模式显示驱动程序的大多数函数。 这种多处理器优化对用户模式显示驱动程序是透明的。 当运行时使用多处理器优化时,它可能会调用 LockAsync 而不是 Lock 函数来锁定资源。

用户模式显示驱动程序(可选)实现 LockAsync;仅当驱动程序实现 LockAsync、UnlockAsyncRename 函数时,Direct3D 运行时才会调用 LockAsync 但是,用户模式显示驱动程序应实现 LockAsync 以及 UnlockAsyncRename 函数,因为频繁锁定动态资源的应用程序可以实现更高的性能。

当 Direct3D 运行时使用多处理器优化时,它会从运行时管理的工作线程调用大多数用户模式显示驱动程序函数;但是,运行时在应用程序的main线程上调用 LockAsync

如果用户模式显示驱动程序公开了 0x0000000B 或更高版本的 DDI 版本, (驱动程序在调用驱动程序的 OpenAdapter 函数) 的 D3D10DDIARG_OPENADAPTER 结构的 DriverVersion 成员中返回此值,则 Direct3D 运行时将以可重入的方式调用 LockAsync。 当运行时以可重入方式调用 LockAsync 时,一个线程可以在 LockAsync 内执行,而另一个引用同一显示设备的线程可在另一个用户模式显示驱动程序函数内执行。 此外,在此类型的驱动程序上,运行时将为系统内存图面调用 LockAsync。 如果在 D3DDDIARG_LOCKASYNCFlags 成员中设置了 Discard 位字段标志,驱动程序应尝试重命名与资源对应的分配。 通常,若要重命名分配,驱动程序会使用与要锁定的资源对应的分配句柄调用 pfnLockCb 函数。

当驱动程序调用 pfnLockCb 时,驱动程序应在 D3DDDICB_LOCK 结构的 Flags 成员中设置 Discard 位字段标志。 仅当驱动程序调用 pfnLockCb 时,驱动程序应设置 D3DDDICB_LOCK 的 NoExistingReferences 位字段标志,前提是在 D3DDDIARG_LOCKASYNC 的 Flags 成员中将 NoExistingReferences 位字段标志设置为 TRUE,并且驱动程序没有对资源进行内部排队的引用。

如果驱动程序无法重命名分配,驱动程序的 LockAsync 函数应将故障返回给运行时,并且驱动程序不应刷新其命令缓冲区。 如果重命名成功,驱动程序应返回指向资源内存、间距和切片间距的指针,以及表示 D3DDDIARG_LOCKASYNC成员中重命名分配的资源句柄。 驱动程序不应使用 pfnLockCb 返回的新分配句柄更新其内部跟踪结构。 相反,驱动程序应等待,直到调用其 Rename 函数。

如果在 D3DDDIARG_LOCKASYNC 的 Flags 成员中设置了 NoOverwrite 位字段标志,驱动程序应使用不覆盖语义锁定相应的分配。 驱动程序应使用在 D3DDDICB_LOCKFlags 成员中设置的 IgnoreSync 位字段标志调用 pfnLockCb,然后应将指向资源内存、间距和切片间距的指针返回到 D3DDDIARG_LOCKASYNC 成员中的 Direct3D 运行时。 如果驱动程序从设置了 NoOverwrite 位字段标志的 LockAsync 调用返回成功 (S_OK) ,则可能会调用该驱动程序以使用锁定的图面呈现。 驱动程序应从调用 其 LockAsync 返回成功,且仅针对锁定时可以呈现的图面设置 NoOverwrite 。 视频内存管理器要求 AGP 或光圈段必须支持与图面对应的分配;否则,当命令缓冲区引用锁定的分配时,对 pfnRenderCb 函数的调用将失败。

总之,如果重命名失败或资源不支持不覆盖语义,驱动程序应无法调用其 LockAsync 函数。 但是,Direct3D 运行时将从这些故障中恢复。 对于所有其他情况,驱动程序应从 LockAsync 返回成功,以提高多处理器计算机上的性能。

要求

要求
最低受支持的客户端 在 Windows Vista 和更高版本的 Windows 操作系统中可用。
目标平台 桌面
标头 d3dumddi.h (包括 D3dumddi.h)

另请参阅

CreateResource

D3DDDIARG_CREATERESOURCE

D3DDDIARG_LOCKASYNC

D3DDDICB_LOCK

D3DDDI_DEVICEFUNCS

Lock

重命名

UnlockAsync

pfnLockCb

pfnRenderCb