Condividi tramite


Blocco di allocazioni Swizzled

La gestione memoria video offre supporto speciale per l'accesso diretto della CPU alle allocazioni swizzled, ovvero le allocazioni in cui la funzione DxgkDdiCreateAllocation del driver di visualizzazione imposta il flag Swizzled nel membro Flag della struttura DXGK_ALLOCATIONINFO.

Quando la gestione memoria video elimina le allocazioni accessibili dalla CPU che non sono contrassegnate dal driver come swizzled da un segmento di memoria, il driver miniport visualizzato deve sempre archiviarli in un formato lineare. Pertanto, tali allocazioni non possono essere swizzled mentre si trovano in un segmento di apertura e devono sempre essere swizzled o unswizzled dalla funzione DxgkDdiBuildPagingBuffer del driver.

D'altra parte, le allocazioni contrassegnate come swizzled non devono essere sempre archiviate in un formato lineare quando vengono rimosse da un segmento di memoria. Per tali allocazioni, la gestione memoria video tiene traccia dello stato di scorrimento di tali allocazioni e richiede solo la funzione DxgkDdiBuildPagingBuffer del driver per annullare l'allocazione durante determinate operazioni di trasferimento.

Dopo che il driver di visualizzazione in modalità utente chiama la funzione pfnLockCb del runtime di Microsoft Direct3D, la gestione memoria video e il driver miniport visualizzato si comportano nei modi seguenti a seconda dello stato dell'allocazione:

  1. Allocazione situata in un segmento di memoria

    Gestione memoria video tenta di acquisire un'apertura della CPU per fornire l'accesso lineare all'allocazione. Se la gestione memoria video non può acquisire l'apertura, la gestione memoria video elimina l'allocazione alla memoria di sistema (a meno che il driver non imposta il membro DonotEvict della struttura di D3DDDICB_LOCKFLAGS ). Quando la gestione memoria video chiama la funzione DxgkDdiBuildPagingBuffer per trasferire l'allocazione, il driver miniport visualizzato deve annullare l'allocazione.

  2. Allocazione eliminata (swizzled) o situata in un segmento di apertura

    L'allocazione deve essere annullata prima che la CPU possa accedervi. Pertanto, la gestione memoria video tenta prima di tutto di paginare nell'allocazione in un segmento di memoria. Dopo che l'allocazione si trova in un segmento di memoria, la gestione memoria video e il driver miniport si comportano come nel numero 1.

  3. Allocazione rimossa (nonwizzled)

    Se l'allocazione non è già swizzled alla memoria di sistema, la gestione memoria video restituisce il puntatore di allocazione esistente senza ulteriore elaborazione.

    Per consentire alla GPU di usare un'allocazione precedentemente nonwizzled, l'allocazione deve essere reswizzled prima dell'uso della GPU. Pertanto, in un errore di superficie, la gestione memoria video e il driver miniport display si comportano nei modi seguenti:

    • Allocazione in un segmento di memoria (unswizzled sul volo dall'apertura della CPU)

      L'allocazione è già in formato swizzled che la GPU può elaborare. Pertanto, nessun'ulteriore elaborazione è necessaria dalla gestione memoria video.

    • Allocazione eliminata alla memoria di sistema (nonwizzled)

      Le pagine dell'allocazione contengono dati nonwizzled e non possono essere mappate in un segmento di apertura. Pertanto, l'allocazione deve essere impaginata in un segmento di memoria. Quando la gestione memoria video chiama la funzione DxgkDdiBuildPagingBuffer del driver di visualizzazione per la pagina nell'allocazione, la gestione memoria video richiede che il driver miniport visualizzato ha eseguito il swizzle dell'allocazione.

Nota Dopo che un'allocazione swizzled è in accesso alla CPU tramite un'apertura della CPU, può comunque essere rimossa prima che il driver di visualizzazione in modalità utente termina l'accesso alla CPU. Questo caso viene gestito come nel numero 2. La rimozione viene eseguita in modo da essere invisibile all'applicazione e al driver di visualizzazione in modalità utente. Inoltre, non è consentito un blocco senza sovrascrivere , ovvero un blocco ottenuto impostando il membro IgnoreSync di D3DDDICB_LOCKFLAGS, non è consentito in un'allocazione swizzled. Solo la CPU o la GPU possono accedere a tale allocazione in qualsiasi momento.