Envío de un búfer de comandos
La siguiente secuencia de operaciones debe realizarse para pasar un búfer de comandos a través de la pila de gráficos de Windows Vista:
El controlador de pantalla en modo de usuario inicia un envío de búfer de comandos si el tiempo de ejecución de Direct3D llama a una de las siguientes funciones de controlador de pantalla en modo de usuario para realizar la operación especificada:
- Función Present para mostrar gráficos.
- Función Flush para enviar comandos de hardware.
- Función Lock para bloquear un recurso, que se usa en el lote de comandos actual.
Tenga en cuenta que el controlador de pantalla en modo de usuario también siempre inicia un envío de búfer de comandos cada vez que el búfer de comandos está lleno.
El controlador de pantalla en modo de usuario llama a la función pfnRenderCb del entorno de ejecución de Direct3D para enviar el búfer de comandos al tiempo de ejecución.
El subsistema del kernel de gráficos de DirectX llama a la función DxgkDdiRender o DxgkDdiRenderKm del controlador de miniporte para validar el búfer de comandos, escribir un búfer DMA en el formato del hardware y generar una lista de asignación que describa las superficies usadas. Tenga en cuenta que el búfer DMA aún no se ha revisado (es decir, direcciones físicas asignadas). Nota Si el tiempo de ejecución inició el envío del búfer de comandos llamando a la función Present del controlador de pantalla en modo de usuario, el subsistema de gráficos llama a la función DxgkDdiPresent del controlador de miniporte de pantalla, en lugar de DxgkDdiRender o DxgkDdiRenderKm.
El administrador de memoria de vídeo llama a la función DxgkDdiBuildPagingBuffer del controlador de miniporte para crear búferes DMA de propósito especial, conocidos como búferes de paginación, que mueven las asignaciones especificadas en la lista de asignación que acompaña al búfer DMA hacia y desde la memoria accesible para GPU. Para obtener más información, consulte Paginación de recursos de memoria de vídeo.
El programador de GPU llama a la función DxgkDdiPatch del controlador de miniporte para asignar direcciones físicas a los recursos del búfer DMA. Sin embargo, no es necesario que el programador llame a DxgkDdiPatch para asignar direcciones físicas al búfer de paginación porque las direcciones físicas del búfer de paginación se pasaron y se asignaron durante la llamada a DxgkDdiBuildPagingBuffer .
El programador de GPU llama a la función DxgkDdiSubmitCommand del controlador de miniporte para solicitar que el controlador pone en cola el búfer de paginación en la unidad de ejecución de GPU.
El programador de GPU llama a la función DxgkDdiSubmitCommand del controlador de miniporte para solicitar que el controlador pone en cola el búfer DMA en la unidad de ejecución de GPU. Cada búfer DMA enviado a la GPU contiene un identificador de barrera. Una vez que la GPU termine de procesar el búfer DMA, la GPU genera una interrupción.
El controlador de minipuerto de pantalla recibe una notificación de la interrupción en su función DxgkDdiInterruptRoutine . El controlador de minipuerto de pantalla debe leer, desde la GPU, el identificador de barrera del búfer DMA que acaba de completar.
El controlador de minipuerto de pantalla debe llamar a la función DxgkCbNotifyInterrupt para notificar al programador de GPU que se completó el búfer DMA.
El controlador de minipuerto de pantalla debe llamar a la función DxgkCbQueueDpc para poner en cola una llamada a procedimiento diferido (DPC).
El DPC del controlador de miniporte de pantalla recibe una notificación para controlar la mayoría del procesamiento del búfer DMA.