DXGKDDI_ACQUIRESWIZZLINGRANGE fonction de rappel (d3dkmddi.h)

La fonction DxgkDdiAcquireSwizzlingRange rend une allocation accessible via l’ouverture de l’unité de traitement centrale (CPU) pour le segment donné.

Syntaxe

DXGKDDI_ACQUIRESWIZZLINGRANGE DxgkddiAcquireswizzlingrange;

NTSTATUS DxgkddiAcquireswizzlingrange(
  [in]     IN_CONST_HANDLE hAdapter,
  [in/out] INOUT_PDXGKARG_ACQUIRESWIZZLINGRANGE pAcquireSwizzlingRange
)
{...}

Paramètres

[in] hAdapter

Handle vers un bloc de contexte associé à un adaptateur d’affichage. Le pilote miniport d’affichage a précédemment fourni ce handle au sous-système du noyau graphique Microsoft DirectX dans le paramètre de sortie MiniportDeviceContext de la fonction DxgkDdiAddDevice .

[in/out] pAcquireSwizzlingRange

Pointeur vers une structure de DXGKARG_ACQUIRESWIZZLINGRANGE qui contient des informations permettant de rendre une allocation accessible via l’ouverture du processeur.

Valeur retournée

DxgkDdiAcquireSwizzlingRange retourne l’une des valeurs suivantes :

Code de retour Description
STATUS_SUCCESS DxgkDdiAcquireSwizzlingRange a correctement rendu l’allocation accessible.
STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED DxgkDdiAcquireSwizzlingRange n’a pas pu programmer la plage de balayage pour l’allocation. Le gestionnaire de mémoire vidéo ne parvient pas à acquérir la plage swizzling sans effectuer d’autres tentatives.
STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE DxgkDdiAcquireSwizzlingRange n’a pas pu programmer la plage de swizzling pour l’allocation, car une autre plage de swizzling utilise actuellement les ressources d’unité de traitement graphique (GPU) requises. Le gestionnaire de mémoire vidéo tente de libérer une plage actuellement utilisée, puis tente de configurer à nouveau la plage de basculement.

Remarques

La fonction DxgkDdiAcquireSwizzlingRange est appelée après que le pilote d’affichage en mode utilisateur demande une adresse virtuelle qui référence les bits d’une allocation (c’est-à-dire, après que le pilote d’affichage en mode utilisateur a appelé la fonction pfnLockCb avec l’indicateur de champ de bits AcquireAperture défini dans le membre Indicateurs de la structure D3DDDICB_LOCK et que l’allocation se trouve actuellement dans un segment de mémoire accessible par le processeur). Si l’indicateur de champ de bits AcquireAperture n’est pas défini dans l’appel à pfnLockCb, DxgkDdiAcquireSwizzlingRange n’est pas appelé et l’allocation doit être dans un format que le pilote d’affichage en mode utilisateur ou une application peut traiter.

Lorsque DxgkDdiAcquireSwizzlingRange est appelé, le pilote de miniport d’affichage doit rendre l’allocation spécifiée (c’est-à-dire le membre hAllocation de la structure DXGKARG_ACQUIRESWIZZLINGRANGE vers laquelle pointe le paramètre pAcquireSwizzlingRange ) accessible via l’ouverture du processeur pour le segment spécifié (autrement dit, le membre SegmentId de DXGKARG_ACQUIRESWIZZLINGRANGE). L’allocation doit apparaître exactement comme elle apparaît dans la mémoire de l’ordinateur après une éviction sans balayage.

Toutes les demandes du pilote d’affichage en mode utilisateur ne sont pas accessibles au pilote miniport d’affichage. Les plages swizzling acquises par le gestionnaire de mémoire vidéo sont mises en cache en fonction de l’allocation à laquelle elles sont associées et des données privées spécifiées. Lors de la première demande du pilote d’affichage en mode utilisateur d’accéder à une allocation, la fonction DxgkDdiAcquireSwizzlingRange du pilote d’affichage miniport est appelée pour rendre l’allocation accessible. Sur les demandes suivantes avec des données privées correspondantes, le mappage précédemment configuré est utilisé pour accéder à l’allocation.

Le gestionnaire de mémoire vidéo appelle la fonction DxgkDdiReleaseSwizzlingRange du pilote de miniport d’affichage pour libérer une plage de balayage lorsqu’une allocation est supprimée ou détruite, ou lorsqu’une autre allocation nécessite une ouverture. Une allocation peut être associée à n’importe quel nombre de plages pivotantes (par exemple, une ouverture par niveau MIP).

Le nombre de plages de balayage qu’un adaptateur prend en charge est exposé par le pilote dans le membre NumberOfSwizzlingRanges de la structure DXGK_DRIVERCAPS lorsque la fonction DxgkDdiQueryAdapterInfo du pilote est appelée. Toutes les plages sont égales (autrement dit, n’importe quelle plage peut déwizzle ou jusqu’à ce que n’importe quel type de tourbillon ou de mosaïques). Le gestionnaire de mémoire vidéo arbitre les plages swizzling disponibles parmi toutes les applications qui en ont besoin.

Le pilote doit utiliser les E/S mappées en mémoire (MMIO) pour configurer une plage de basculement. Ces accès swizzling-range ne doivent pas interférer avec l’exécution du GPU (autrement dit, le GPU ne doit pas être inactif lorsque DxgkDdiAcquireSwizzlingRange est appelé).

Tous les appels à DxgkDdiAcquireSwizzlingRange sont sérialisés entre eux, mais pas avec une autre fonction DDI.

Si le GPU prend en charge des plages de balayage qui redirigent les accès du processeur vers des segments de mémoire non accessibles par le processeur ou vers la mémoire système, le pilote d’affichage en mode utilisateur peut définir la combinaison des indicateurs de champ binaire AcquireAperture et UseAlternateVA dans le membre Indicateurs de la structure D3DDDICB_LOCK dans un appel à la fonction pfnLockCb pour verrouiller l’allocation. Dans ce cas, le gestionnaire de mémoire vidéo appelle la fonction DxgkDdiAcquireSwizzlingRange du pilote miniport d’affichage pour acquérir une plage de balayage pour l’allocation, même si l’allocation se trouve dans un segment de mémoire non accessible par le processeur ou un segment d’ouverture. Les plages swizzling sont associées à certaines ressources GPU (par exemple, les plages d’ouverture PCI) que le pilote gère et qui ne sont pas accessibles ou prises en compte par le gestionnaire de mémoire vidéo.

Un appel à DxgkDdiAcquireSwizzlingRange pour acquérir une plage swizzling peut échouer, car une ressource gérée par le pilote est à court. Bien que la plage swizzling elle-même soit gratuite, elle peut ne pas être utilisable en raison de la ressource manquante. Le pilote peut indiquer qu’une plage de balayage n’est pas disponible pour le gestionnaire de mémoire vidéo en retournant STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE à partir de DxgkDdiAcquireSwizzlingRange. Le gestionnaire de mémoire vidéo tente ensuite de libérer une plage swizzling actuellement utilisée, puis appelle à nouveau la fonction DxgkDdiAcquireSwizzlingRange du pilote pour configurer la nouvelle plage swizzling. Si toutes les plages swizzling sont libérées et que le pilote échoue toujours avec STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE, le gestionnaire de mémoire vidéo ne parvient pas à acquérir une plage swizzling pour l’allocation.

DxgkDdiAcquireSwizzlingRange doit être rendu paginable.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Vista
Plateforme cible Desktop (Expérience utilisateur)
En-tête d3dkmddi.h
IRQL PASSIVE_LEVEL

Voir aussi

D3DDDICB_LOCK

DXGKARG_ACQUIRESWIZZLINGRANGE

DXGK_DRIVERCAPS

DxgkDdiAddDevice

DxgkDdiCreateAllocation

DxgkDdiQueryAdapterInfo

DxgkDdiReleaseSwizzlingRange

pfnLockCb