PFND3DDDI_LOCKASYNC función de devolución de llamada (d3dumddi.h)

La función LockAsync bloquea el recurso especificado o una superficie dentro del recurso.

Sintaxis

PFND3DDDI_LOCKASYNC Pfnd3dddiLockasync;

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

Parámetros

hDevice

Identificador del dispositivo de visualización (contexto de gráficos).

unnamedParam2

pData [in, out]

Puntero a una estructura de D3DDDIARG_LOCKASYNC que describe el recurso o la superficie dentro del recurso que se va a bloquear.

Valor devuelto

LockAsync devuelve uno de los siguientes valores:

Código devuelto Descripción
S_OK El recurso se bloquea correctamente.
E_OUTOFMEMORY LockAsync no pudo asignar la memoria necesaria para que se complete.
D3DDDIERR_WASSTILLDRAWING Cambiar el nombre de la asignación que corresponde al recurso que la estructura de D3DDDIARG_LOCKASYNC especifica un error.
El controlador devuelve este valor solo si la marca Descartar campo de bits se estableció en el miembro Flags de D3DDDIARG_LOCKASYNC.
E_NOTIMPL El controlador de pantalla en modo de usuario no admite LockAsync para el recurso especificado.

Comentarios

En equipos con varios procesadores, el entorno de ejecución de Microsoft Direct3D podría llamar a la mayoría de las funciones del controlador de visualización en modo de usuario desde un subproceso de trabajo en lugar de desde el subproceso de aplicación principal. Esta optimización de varios procesadores es transparente para el controlador de pantalla en modo de usuario. Cuando el tiempo de ejecución usa la optimización de varios procesadores, puede llamar a LockAsync en lugar de a la función Lock para bloquear un recurso.

Opcionalmente, un controlador de pantalla en modo de usuario implementa LockAsync; El tiempo de ejecución de Direct3D llama a LockAsync solo si el controlador implementa las funciones LockAsync, UnlockAsync y Rename . Sin embargo, un controlador de pantalla en modo de usuario debe implementar las funciones LockAsync y UnlockAsync y Rename , ya que las aplicaciones que bloquean con frecuencia los recursos dinámicos pueden lograr un mayor rendimiento.

Cuando el tiempo de ejecución de Direct3D usa la optimización de varios procesadores, llama a la mayoría de las funciones del controlador de visualización en modo de usuario desde un subproceso de trabajo que administra el tiempo de ejecución; sin embargo, el tiempo de ejecución llama a LockAsync en el subproceso principal de la aplicación.

Si un controlador de pantalla en modo de usuario expone una versión DDI de 0x0000000B o superior (el controlador devuelve este valor en el miembro DriverVersion de la estructura D3D10DDIARG_OPENADAPTER en una llamada a la función OpenAdapter del controlador), el tiempo de ejecución de Direct3D llamará a LockAsync de forma reentrant. Cuando el tiempo de ejecución llama a LockAsync de forma reentrant, un subproceso se puede ejecutar dentro de LockAsync mientras que otro subproceso que hace referencia al mismo dispositivo de visualización se ejecuta dentro de otra función de controlador de pantalla en modo de usuario. Además, en este tipo de controlador, el tiempo de ejecución llamará a LockAsync para las superficies de memoria del sistema. Si la marca Descartar campo de bits está establecida en el miembro Flags de D3DDDIARG_LOCKASYNC, el controlador debe intentar cambiar el nombre de la asignación que corresponde al recurso. Normalmente, para cambiar el nombre de una asignación, el controlador llama a la función pfnLockCb con el identificador de asignación que corresponde al recurso que se va a bloquear.

El controlador debe establecer la marca Descartar campo de bits en el miembro Flags de la estructura D3DDDICB_LOCK cuando el controlador llama a pfnLockCb. El controlador debe establecer la marca de campo de bits NoExistingReference de D3DDDICB_LOCK cuando el controlador llama a pfnLockCb solo si la marca de campo de bits NoExistingReferences está establecida en TRUE en el miembro Flags de D3DDDIARG_LOCKASYNC y el controlador no tiene referencias en cola internamente al recurso.

Si el controlador no cambia el nombre de la asignación, la función LockAsync del controlador debe devolver el error al tiempo de ejecución y el controlador no debe vaciar su búfer de comandos. Si el cambio de nombre se realiza correctamente, el controlador debe devolver punteros a la memoria de recursos, el tono y el tono del segmento y un identificador al recurso que representa la asignación cuyo nombre ha cambiado en los miembros de D3DDDIARG_LOCKASYNC. El controlador no debe actualizar sus estructuras de seguimiento internas con el nuevo identificador de asignación que pfnLockCb devuelve. En su lugar, el controlador debe esperar hasta que se llame a su función Rename .

Si la marca de campo de bits NoOverwrite está establecida en el miembro Flags de D3DDDIARG_LOCKASYNC, el controlador debe bloquear la asignación correspondiente con semántica sin sobrescritura. El controlador debe llamar a pfnLockCb con la marca de campo de bits IgnoreSync establecida en el miembro Flags de D3DDDICB_LOCK y, a continuación, devolver punteros a la memoria de recursos, el tono y la inclinación del segmento al entorno de ejecución de Direct3D en los miembros de D3DDDIARG_LOCKASYNC. Si el controlador devuelve éxito (S_OK) de una llamada a su LockAsync con la marca de campo de bits NoOverwrite establecida, se podría llamar a para representar con una superficie bloqueada. El controlador debe devolver el éxito de una llamada a su LockAsync con NoOverwrite establecido solo para superficies que se pueden representar mientras están bloqueadas. El administrador de memoria de vídeo requiere que las asignaciones que corresponden a las superficies se admita en segmentos AGP o de apertura; De lo contrario, se produce un error en las llamadas a la función pfnRenderCb cuando el búfer de comandos hace referencia a una asignación bloqueada.

En resumen, el controlador debe producir un error en las llamadas a su función LockAsync si se produce un error en el cambio de nombre o si no se admite la semántica de no sobrescritura para el recurso. Sin embargo, el tiempo de ejecución de Direct3D se recuperará de estos errores. Para todas las demás situaciones, los controladores deben devolver el éxito de LockAsync para mejorar el rendimiento en varios equipos de procesador.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible en Windows Vista y versiones posteriores de los sistemas operativos Windows.
Plataforma de destino Escritorio
Encabezado d3dumddi.h (incluya D3dumddi.h)

Consulte también

CreateResource

D3DDDIARG_CREATERESOURCE

D3DDDIARG_LOCKASYNC

D3DDDICB_LOCK

D3DDDI_DEVICEFUNCS

Bloquear

Cambiar nombre

UnlockAsync

pfnLockCb

pfnRenderCb