Control de la creación y destrucción de recursos

Para permitir que el subsistema del kernel de gráficos de Microsoft DirectX realice un seguimiento correcto de la duración de los recursos y evitar pérdidas de memoria en el sistema operativo, el controlador de pantalla en modo de usuario debe crear y destruir los recursos correctamente.

El tiempo de ejecución de Microsoft Direct3D llama a las siguientes funciones del controlador de visualización en modo de usuario para crear recursos en modo de usuario.

En ambas llamadas, el tiempo de ejecución de Direct3D pasa un identificador de recurso en tiempo de ejecución en modo de usuario único que el controlador de pantalla en modo de usuario usa para volver a llamar al entorno de ejecución. Cuando CreateResource o OpenResource se devuelven correctamente, el controlador de pantalla en modo usuario devuelve un identificador de modo usuario único que representa el recurso. Este identificador es el identificador de recursos del controlador en modo de usuario. El tiempo de ejecución usa el identificador de recursos del controlador en modo de usuario en las llamadas posteriores al controlador.

Existe una correspondencia uno a uno entre el identificador de recursos en tiempo de ejecución del modo de usuario y el identificador de recursos del controlador en modo de usuario. El entorno de ejecución de Direct3D y el controlador de visualización en modo de usuario intercambian los identificadores de recursos de controlador y tiempo de ejecución del modo de usuario a través de los miembros hResource de las estructuras D3DDDIARG_CREATERESOURCE y D3DDDIARG_OPENRESOURCE .

Cuando el controlador de pantalla en modo de usuario llama a la función pfnAllocateCb del entorno de ejecución de Direct3D para crear asignaciones para un recurso en modo de usuario, el controlador debe especificar el identificador de recursos en tiempo de ejecución en modo de usuario en el miembro hResource de la estructura D3DDDICB_ALLOCATE a la que apunta el parámetro pData . El tiempo de ejecución de Direct3D genera un identificador de modo kernel único para el recurso y lo pasa al controlador de pantalla en modo de usuario en el miembro hKMResource de D3DDDICB_ALLOCATE. El controlador de pantalla en modo de usuario puede insertar el identificador de recursos en modo kernel en el flujo de comandos para que el controlador de miniporte de pantalla se use más adelante.

Nota Aunque los identificadores de recursos en modo usuario siempre son únicos para cada creación de recursos en modo de usuario, los identificadores de recursos en modo kernel no siempre son únicos. Cuando el tiempo de ejecución de Direct3D llama a la función OpenResource del controlador de visualización en modo de usuario para abrir una vista a un recurso compartido existente, el runtime pasa el identificador del modo kernel del recurso en el miembro hKMResource de la estructura D3DDDIARG_OPENRESOURCE a la que apunta el parámetro pResource . El tiempo de ejecución creó anteriormente este identificador de modo kernel después del tiempo de ejecución denominado la función CreateResource del controlador de visualización en modo de usuario.

Para destruir un recurso en modo de usuario que creó CreateResource o OpenResource , el entorno de ejecución de Direct3D pasa el identificador de recursos del controlador en modo de usuario en el parámetro hResource en una llamada a la función DestroyResource del controlador de pantalla en modo de usuario. Para liberar el identificador de recursos en modo kernel y todas las asignaciones asociadas al recurso en modo de usuario, el controlador de visualización en modo de usuario pasa el identificador de recursos en tiempo de ejecución del modo de usuario en el miembro hResource de la estructura D3DDDICB_DEALLOCATE a la que apunta el parámetro pData en una llamada a la función pfnDeallocateCb .

Tenga en cuenta los siguientes elementos cuando un controlador de pantalla en modo de usuario crea y destruye recursos:

  • Para las asignaciones que el controlador de visualización en modo de usuario crea en respuesta a los recursos compartidos (es decir, en respuesta a las llamadas a CreateResource con la marca de campo de bits SharedResource establecida en el miembro Flags de D3DDDIARG_CREATERESOURCE), el controlador debe asignar un valor distinto de NULL al miembro hResource de D3DDDICB_ALLOCATE.

  • Para las asignaciones que el controlador de visualización en modo de usuario crea en respuesta a recursos no compartidos, el controlador no es necesario para asignar un valor distinto de NULL al miembro hResource de D3DDDICB_ALLOCATE. Si el controlador asigna NULL a hResource, las asignaciones están asociadas con el dispositivo y no con un recurso determinado (y un identificador de recursos en modo kernel). Sin embargo, si las asignaciones están realmente relacionadas con un recurso, el controlador debe asociar las asignaciones a ese recurso. Nota Solo se crea un identificador de recursos en modo kernel si el controlador de visualización en modo de usuario establece el miembro hResource de D3DDDICB_ALLOCATE en el controlador en tiempo de ejecución del modo de usuario que el controlador recibió del miembro hResource de la estructura de D3DDDIARG_CREATERESOURCE en una llamada a CreateResource.

  • Cuando se llama a DestroyResource para destruir un recurso en modo de usuario no compartido, el controlador de pantalla en modo de usuario puede llamar a pfnDeallocateCb con el miembro hResource de D3DDDICB_DEALLOCATE establecido en NULL solo si el controlador nunca ha asociado ninguna asignación con el recurso. Si el controlador de visualización en modo de usuario asocia asignaciones con el recurso, el controlador debe llamar a pfnDeallocateCb con el miembro hResource de D3DDDICB_DEALLOCATE establecido en un valor distinto de NULL ; de lo contrario, se producirá una fuga de memoria.