Bloqueo de asignaciones desenredadas

El administrador de memoria de vídeo proporciona compatibilidad especial con el acceso directo a la CPU a las asignaciones desenredadas (es decir, las asignaciones en las que la función DxgkDdiCreateAllocation del controlador de minipuerto de pantalla establece la marca Swizzled en el miembro Flags de la estructura DXGK_ALLOCATIONINFO ).

Cuando el administrador de memoria de vídeo expulsa las asignaciones accesibles para la CPU que no están marcadas por el controlador como desenredadas desde un segmento de memoria, el controlador de miniporte de pantalla siempre debe almacenarlas en un formato lineal. Por lo tanto, estas asignaciones no se pueden girar mientras se encuentran en un segmento de apertura, y siempre deben ser aturdidos o desenredados por la función DxgkDdiBuildPagingBuffer del controlador.

Por otro lado, las asignaciones marcadas como desenredadas no son necesarias para almacenarse siempre en un formato lineal cuando se expulsan de un segmento de memoria. Para estas asignaciones, el administrador de memoria de vídeo realiza un seguimiento del estado de estas asignaciones y solo requiere la función DxgkDdiBuildPagingBuffer del controlador para desenrutar una asignación durante determinadas operaciones de transferencia.

Después de que el controlador de pantalla en modo de usuario llame a la función pfnLockCb del entorno de ejecución de Microsoft Direct3D, el administrador de memoria de vídeo y el controlador de minipuerto de pantalla se comportan de las siguientes maneras en función del estado de la asignación:

  1. Asignación ubicada en un segmento de memoria

    El administrador de memoria de vídeo intenta adquirir una apertura de CPU para proporcionar acceso lineal a la asignación. Si el administrador de memoria de vídeo no puede adquirir la apertura, el administrador de memoria de vídeo expulsa la asignación a la memoria del sistema (a menos que el controlador establezca el miembro DonotEvict de la estructura D3DDDICB_LOCKFLAGS ). Cuando el administrador de memoria de vídeo llama a la función DxgkDdiBuildPagingBuffer del controlador de miniporte para mostrar para transferir la asignación, el controlador de miniporte de pantalla debe desenvolver la asignación.

  2. Asignación expulsada (eswizzled) o ubicada en un segmento de apertura

    La asignación debe desenredarse antes de que la CPU pueda acceder a ella. Por lo tanto, el administrador de memoria de vídeo intenta primero paginar en la asignación en un segmento de memoria. Una vez que la asignación se encuentra en un segmento de memoria, el administrador de memoria de vídeo y el controlador de miniporte se comportan como en el número 1.

  3. Asignación expulsada (desenredada)

    Si la asignación ya está desenredada en la memoria del sistema, el administrador de memoria de vídeo devuelve el puntero de asignación existente sin procesamiento adicional.

    Para que la GPU use una asignación que anteriormente no se había desenredado, la asignación se debe volver a activar antes de que la GPU la use. Por lo tanto, en un error de superficie, el administrador de memoria de vídeo y el controlador de minipuerto de pantalla se comportan de las siguientes maneras:

    • Asignación en un segmento de memoria (desenredado sobre la marcha por la apertura de la CPU)

      La asignación ya está en un formato desconcertado que la GPU puede procesar. Por lo tanto, el administrador de memoria de vídeo no requiere ningún procesamiento adicional.

    • Asignación expulsada a la memoria del sistema (desenredada)

      Las páginas de la asignación contienen datos desenredados y no se pueden asignar a un segmento de apertura. Por lo tanto, la asignación debe paginarse en un segmento de memoria. Cuando el administrador de memoria de vídeo llama a la función DxgkDdiBuildPagingBuffer del controlador de miniporte para mostrar a la página de la asignación, el administrador de memoria de vídeo solicita que el controlador de miniporte de pantalla desenfrene la asignación.

Nota Después de que una asignación desenredada esté bajo el acceso a la CPU a través de una apertura de CPU, todavía se puede expulsar antes de que el controlador de pantalla en modo de usuario finalice el acceso a la CPU. Este caso se controla como en el número 2. La expulsión se realiza de forma que sea invisible para la aplicación y el controlador de pantalla en modo de usuario. Además, no se permite un bloqueo sin sobrescribir (es decir, un bloqueo obtenido estableciendo el miembro IgnoreSync de D3DDDICB_LOCKFLAGS) en una asignación desenredada. Solo la CPU o la GPU pueden acceder a dicha asignación en un momento dado.