Verrouillage des allocations swizzled
Le gestionnaire de mémoire vidéo fournit une prise en charge spéciale de l’accès direct du processeur aux allocations swizzled (autrement dit, les allocations dans lesquelles la fonction DxgkDdiCreateAllocation du pilote miniport d’affichage définit l’indicateur Swizzled dans le membre Flags de la structure DXGK_ALLOCATIONINFO ).
Lorsque le gestionnaire de mémoire vidéo supprime les allocations accessibles au processeur qui ne sont pas marquées par le pilote comme étant extraites d’un segment de mémoire, le pilote miniport d’affichage doit toujours les stocker dans un format linéaire. Par conséquent, ces allocations ne peuvent pas être swizzled tant qu’elles sont situées dans un segment d’ouverture, et elles doivent toujours être swizzled ou déswizzled par la fonction DxgkDdiBuildPagingBuffer du pilote.
En revanche, les allocations marquées comme swizzled ne doivent pas toujours être stockées dans un format linéaire lorsqu’elles sont supprimées d’un segment de mémoire. Pour de telles allocations, le gestionnaire de mémoire vidéo suit l’état de basculement de ces allocations et nécessite uniquement la fonction DxgkDdiBuildPagingBuffer du pilote pour annuler une allocation pendant certaines opérations de transfert.
Une fois que le pilote d’affichage en mode utilisateur a appelé la fonction pfnLockCb du runtime Microsoft Direct3D, le gestionnaire de mémoire vidéo et le pilote de miniport d’affichage se comportent de la manière suivante en fonction de l’état de l’allocation :
Allocation située dans un segment de mémoire
Le gestionnaire de mémoire vidéo tente d’acquérir une ouverture du processeur pour fournir un accès linéaire à l’allocation. Si le gestionnaire de mémoire vidéo ne peut pas acquérir l’ouverture, le gestionnaire de mémoire vidéo supprime l’allocation à la mémoire système (sauf si le pilote définit le membre DonotEvict de la structure D3DDDICB_LOCKFLAGS ). Lorsque le gestionnaire de mémoire vidéo appelle la fonction DxgkDdiBuildPagingBuffer du pilote miniport d’affichage pour transférer l’allocation, le pilote de miniport d’affichage doit annuler l’allocation.
Allocation supprimée (swizzled) ou située dans un segment d’ouverture
L’allocation doit être décompressée pour que le processeur puisse y accéder. Par conséquent, le gestionnaire de mémoire vidéo tente d’abord de paginer l’allocation dans un segment de mémoire. Une fois l’allocation située dans un segment de mémoire, le gestionnaire de mémoire vidéo et le pilote de miniport d’affichage se comportent comme dans le numéro 1.
Allocation supprimée (nonwizzled)
Si l’allocation est déjà décompressée dans la mémoire système, le gestionnaire de mémoire vidéo retourne le pointeur d’allocation existant sans traitement supplémentaire.
Pour que le GPU utilise une allocation qui a été précédemment déwizzled, l’allocation doit être reswizzled avant que le GPU ne l’utilise. Par conséquent, sur une erreur de surface, le gestionnaire de mémoire vidéo et le pilote de miniport d’affichage se comportent de la manière suivante :
Allocation dans un segment de mémoire (non-wizzzled à la volée par l’ouverture du processeur)
L’allocation est déjà dans un format swizzled que le GPU peut traiter. Par conséquent, aucun autre traitement n’est requis par le gestionnaire de mémoire vidéo.
Allocation supprimée de la mémoire système (nonwizzled)
Les pages de l’allocation contiennent des données nonwizzled et ne peuvent pas être mappées dans un segment d’ouverture. Par conséquent, l’allocation doit être paginée dans un segment de mémoire. Lorsque le gestionnaire de mémoire vidéo appelle la fonction DxgkDdiBuildPagingBuffer du pilote miniport d’affichage pour pager dans l’allocation, le gestionnaire de mémoire vidéo demande que le pilote de miniport d’affichage swizzle l’allocation.
Note Une fois qu’une allocation swizzled est sous l’accès du processeur via une ouverture du processeur, elle peut toujours être supprimée avant que le pilote d’affichage en mode utilisateur arrête l’accès au processeur. Ce cas est traité comme dans le numéro 2. L’éviction est effectuée de manière à être invisible pour l’application et le pilote d’affichage en mode utilisateur. En outre, un verrou sans remplacement (autrement dit, un verrou obtenu en définissant le membre IgnoreSync de D3DDDICB_LOCKFLAGS) n’est pas autorisé sur une allocation swizzled. Seul le processeur ou le GPU peut accéder à une telle allocation à un moment donné.