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 de retorno | 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 se estableció la marca de campo de bits Descartar en el miembro Flags de D3DDDIARG_LOCKASYNC. |
E_NOTIMPL | El controlador de visualización en modo de usuario no admite LockAsync para el recurso especificado. |
Observaciones
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 pantalla en modo de usuario desde un subproceso de trabajo en lugar del 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 la función lock de 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 de LockAsync, UnlockAsyncy Cambiar nombre funciones. Sin embargo, un controlador de pantalla en modo de usuario debe implementar lockAsync y el UnlockAsync de y Cambiar nombre funciones porque las aplicaciones que suelen bloquear 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 visualización 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 de 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 reentrante, un subproceso se puede ejecutar dentro de LockAsync mientras que otro subproceso que hace referencia al mismo dispositivo para mostrar se ejecuta dentro de otra función de controlador de pantalla en modo de usuario. Además, en este tipo de controlador, el entorno de ejecución llamará a LockAsync para las superficies de memoria del sistema. Si el Descartar marca de campo de bits se establece 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 marcas de de la estructura de D3DDDICB_LOCK cuando el controlador llama a pfnLockCb. El controlador debe establecer la marca noExistingReference marca de campo de bits de D3DDDICB_LOCK cuando el controlador llama a pfnLockCb solo si el noExistingReferences marca de campo de bits se establece 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 Cambiar nombre función.
Si el noOverwrite marca de campo de bits se establece 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 el tono de 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 el NoOverwrite marca de campo de bits 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 establecer solo para las 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 producen errores 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 al cambiar el nombre o si no se admite la semántica de sobrescritura para el recurso. Sin embargo, el entorno 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 con varios procesadores.
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Disponible en Windows Vista y versiones posteriores de los sistemas operativos Windows. |
de la plataforma de destino de | Escritorio |
encabezado de | d3dumddi.h (incluya D3dumddi.h) |