Compartir a través de


División de un búfer DMA

El administrador de memoria de vídeo usa puntos de división para dividir un elemento de trabajo grande enviado por el controlador de minipuerto de pantalla en elementos de trabajo más pequeños que requieren menos recursos de GPU para ejecutarse. Por ejemplo, un búfer DMA grande podría hacer referencia a un conjunto de asignaciones que posiblemente no caben en la memoria de vídeo local o en la memoria no local. La única manera de procesar este tipo de elemento de trabajo es dividirlo en varios elementos de trabajo más pequeños que requieren menos recursos de GPU.

Nota La división de búferes DMA y el adelantamiento del búfer DMA son diferentes conceptos independientes. Un controlador de minipuerto de pantalla siempre debe admitir la división de búfer DMA incluso en un sistema con una GPU en la que el adelantamiento del búfer DMA no es posible. En un sistema con una GPU en la que no es posible guardar y restaurar contexto, el programador de GPU programa partes divididas de un búfer DMA de nuevo para asegurarse de que las partes divididas no se intercalan con otro búfer DMA desde un contexto de GPU diferente. Sin embargo, se debe enviar un búfer de paginación entre partes de un búfer DMA dividido porque las operaciones de paginación son necesarias entre partes divididas de un búfer DMA. El administrador de memoria de vídeo usa cada punto de división que usa el controlador para compilar una secuencia DMA de aplicación. Un búfer DMA enviado debe volver a programar suficiente estado de GPU después de cada punto de división para tener en cuenta un búfer de paginación potencial que se pueda insertar en esa ubicación.

Para especificar puntos de división, el controlador de miniporte de pantalla especifica los valores de los miembros SplitOffset y SlotId de la estructura de D3DDDI_PATCHLOCATIONLIST para cada asignación a la que se hace referencia en el miembro AllocationIndex de D3DDDI_PATCHLOCATIONLIST. Para realizar un seguimiento del uso de asignación dentro de un búfer DMA determinado, el administrador de memoria de vídeo crea las dimensiones necesarias de una matriz mediante el miembro MaxAllocationListSlotId de la estructura de DXGK_DRIVERCAPS que el controlador proporcionó a través de una llamada a su función DxgkDdiQueryAdapterInfo . Esta matriz se inicializa en cero y se rellena como entradas de partes divididas de la lista de ubicación de revisión. El miembro SlotId de D3DDDI_PATCHLOCATIONLIST para la ubicación de revisión indica qué fila de la tabla de recursos se debe actualizar mientras el miembro SplitOffset indica el desplazamiento dentro del búfer DMA donde se requiere la asignación. El búfer DMA se puede ejecutar hasta el punto especificado por SplitOffset sin que el recurso sea accesible para la GPU. Del mismo modo, si una nueva entrada de división de ubicación de revisión hace referencia al mismo SlotId, la asignación anterior se reemplaza por la nueva asignación y la asignación anterior ya no es necesaria (es decir, la asignación anterior se puede paginar).

Al paginar en los recursos requeridos por un búfer DMA, el administrador de memoria de vídeo procesa la lista de ubicaciones de revisión empezando por el primer elemento y avanzando hacia el último elemento. Los elementos D3DDDI_PATCHLOCATIONLIST rellenados por el controlador deben contener valores en sus miembros SplitOffset ; los elementos están aumentando estrictamente (es decir, las asignaciones deben aparecer en el orden en que se usan en la secuencia). Páginas del administrador de memoria de vídeo en asignaciones a las que se hace referencia en la lista de ubicaciones de revisión en el orden en que se proporcionan. Cuando se alcanza un punto en el que el administrador de memoria de vídeo ya no puede paginar una asignación debido a una condición de memoria baja, el administrador de memoria de vídeo envía la parte actual del búfer DMA que se prepara al programador de GPU para su ejecución. El búfer DMA se ejecuta desde el principio del punto de división anterior hasta el valor SplitOffset especificado para una asignación que no se pudo incorporar. Una vez enviado, el administrador de memoria de vídeo determina la lista de asignaciones necesarias en el desplazamiento dividido actual en la secuencia DMA mediante la tabla de recursos. Todas las asignaciones de la tabla se mantienen en su ubicación física actual, mientras que otras asignaciones que ya no están en uso se pueden expulsar. A continuación, el administrador de memoria de vídeo continúa procesando la lista de ubicaciones de revisión, lo que puede dividirse varias veces más.

El controlador debe especificar puntos de división cada vez que una asignación está enlazada o sin enlazar. Para especificar que una asignación no está vinculada, el controlador puede especificar un identificador de asignación NULL en el miembro hDeviceSpecificAllocation de la estructura DXGK_ALLOCATIONLIST con el valor adecuado en el miembro SlotId del D3DDDI_PATCHLOCATIONLIST asociado. El controlador debe desenlazar recursos grandes para aumentar las posibilidades de que el administrador de memoria de vídeo pueda resolver problemas complejos de colocación de memoria.

Del mismo modo, el controlador debe volver a programar recursos grandes en cada punto de división. Al tomar un punto de división, el administrador de memoria de vídeo se ve obligado a dejar una asignación enlazada previamente a la asignación anterior. Esto provoca la fragmentación de la memoria que puede provocar un error al resolver problemas complejos de ubicación de memoria que podrían haberse resuelto si no para la restricción de asignación enlazada anteriormente. Al calcular el estado en un punto de división, el administrador de memoria de vídeo determina qué identificador de ranura (SlotId) se está programando en ese punto de división (es decir, cada elemento de lista de ubicación de revisión que comparte el mismo valor SplitOffset con otros elementos) y omite la restricción de colocación en este punto de división. Por ejemplo, si el controlador usa una textura de 64 MB, la reprogramación de esa textura en cada punto de división proporciona al administrador de memoria de vídeo la flexibilidad de mover esa textura alrededor de la memoria entre puntos de división si es necesario.