DXGKDDI_QUERYCURRENTFENCE funzione di callback (d3dkmddi.h)

La funzione DxgkDdiQueryCurrentFence esegue query sull'identificatore di recinto di invio completato più recente nell'unità di esecuzione dei comandi hardware.

Sintassi

DXGKDDI_QUERYCURRENTFENCE DxgkddiQuerycurrentfence;

NTSTATUS DxgkddiQuerycurrentfence(
  [in]     IN_CONST_HANDLE hAdapter,
  [in/out] INOUT_PDXGKARG_QUERYCURRENTFENCE pCurrentFence
)
{...}

Parametri

[in] hAdapter

Handle a un blocco di contesto associato a una scheda di visualizzazione. Il driver miniport visualizzato in precedenza ha fornito questo handle al sottosistema kernel della grafica Microsoft DirectX nel parametro di output MiniportDeviceContext della funzione DxgkDdiAddDevice .

[in/out] pCurrentFence

Puntatore a una struttura DXGKARG_QUERYCURRENTFENCE che contiene informazioni sui dati di recinzione correnti.

Valore restituito

DxgkDdiQueryCurrentFence restituisce STATUS_SUCCESS o un risultato di errore appropriato se i dati di recinzione non vengono recuperati correttamente.

Commenti

Un recinto è un'istruzione contenente 64 bit di dati e un indirizzo. Il driver miniport di visualizzazione può inserire un recinto nel flusso DMA (Direct Memory Access) inviato all'unità di elaborazione grafica (GPU). Quando la GPU legge il recinto, la GPU scrive i dati di recinzione nell'indirizzo di recinzione specificato. Tuttavia, prima che la GPU possa scrivere i dati di recinzione in memoria, deve assicurarsi che tutti i pixel delle primitive che precedono l'istruzione di recinzione vengano ritirati e scritti correttamente nella memoria.

Nota La GPU non è necessaria per arrestare l'intera pipeline mentre attende l'ultimo pixel dalle primitive che precedono l'istruzione di recinzione per ritirarsi; la GPU può invece eseguire le primitive che seguono l'istruzione di recinzione.
 
L'hardware che supporta lo spazio indirizzi virtuale per ogni GPU-contesto deve supportare i tipi di recinzioni seguenti:
  • Le recinzioni regolari sono recinzioni che possono essere inserite in un buffer DMA creato in modalità utente. Poiché il contenuto di un buffer DMA dalla modalità utente non è attendibile, le barriere all'interno di un buffer DMA devono fare riferimento a un indirizzo virtuale nello spazio indirizzi del contesto gpu e non a un indirizzo fisico. L'accesso a tale indirizzo virtuale è associato allo stesso meccanismo di convalida della memoria di qualsiasi altro indirizzo virtuale a cui accede la GPU.
  • Le recinzioni con privilegi sono recinzioni che possono essere inserite solo in un buffer DMA creato (e accessibile solo) in modalità kernel. Le recinzioni all'interno di un buffer DMA di questo tipo fanno riferimento a un indirizzo fisico in memoria.

    Si noti che se l'indirizzo di destinazione della recinzione è stato accessibile in modalità utente, il software dannoso potrebbe eseguire un'operazione grafica sulla posizione di memoria per la recinzione e quindi eseguire l'override del contenuto del kernel previsto per la ricezione.

Si noti che un buffer DMA con privilegi può contenere sia recinzioni regolari che con privilegi. Tuttavia, se un buffer DMA con privilegi contiene una normale recinzione, il componente del kernel che ha generato tale buffer DMA è consapevole che la normale recinzione all'interno potrebbe non essere mai accessibile.

Se il driver miniport visualizzato ha perso l'ultimo recinto di un buffer DMA, la funzione DxgkDdiQueryCurrentFence del driver potrebbe essere chiamata per segnalare la recinzione mancante. Ad esempio, se l'hardware genera una recinzione in memoria, la funzione DxgkDdiInterruptRoutine del driver viene attivata per leggere la memoria. Tuttavia, se i dati del recinto non sono disponibili quando il driver tenta di leggere i dati (ad esempio, se è presente un chipset difettoso), la recinzione viene in genere segnalata all'interruzione successiva, a meno che non siano stati arrestati gli interruzioni. Se gli interruzioni sono stati arrestati e il sottosistema del kernel grafico DirectX attende troppo tempo per una recinzione, il sottosistema chiama la funzione DxgkDdiQueryCurrentFence del driver per verificare la recinzione corrente e determinare qualsiasi recinzione in sospeso che potrebbe non essere stata interrotta.

Prima che il driver miniport visualizzato venga restituito da una chiamata a DxgkDdiQueryCurrentFence, se l'identificatore di recinzione di invio completato dall'hardware più recente non è ancora stato segnalato, il driver deve chiamare la funzione DxgkCbNotifyInterrupt per segnalare la recinzione. Per implementare questa funzionalità, il driver:

  1. Tracce che sono state segnalate per ultimo al sistema operativo.
  2. Genera IRQL all'interruzione del dispositivo. Per aumentare il livello di interruzione di IRQL, il driver può chiamare la funzione DxgkCbSynchronizeExecution per sincronizzare con la relativa funzione DxgkDdiInterruptRoutine .
  3. All'interruzione del dispositivo IRQL confronta l'ultimo recinto segnalato con la recinzione più recente completata dall'hardware.
  4. All'interruzione del dispositivo IRQL chiama DxgkCbNotifyInterrupt solo quando l'hardware più recente è più recente rispetto all'ultimo recinto segnalato.
DxgkDdiQueryCurrentFence deve essere reso paginabile.

Requisiti

Requisito Valore
Client minimo supportato Windows Vista
Piattaforma di destinazione Desktop
Intestazione d3dkmddi.h (include D3dkmddi.h)
IRQL PASSIVE_LEVEL

Vedi anche

DXGKARG_QUERYCURRENTFENCE

DxgkCbNotifyInterrupt

DxgkCbSynchronizeExecution

DxgkDdiAddDevice

DxgkDdiInterruptRoutine