Richiesta e uso della memoria di Surface

Il driver di visualizzazione in modalità utente riceve chiamate alla funzione CreateResource quando il runtime di Microsoft Direct3D richiede la creazione di un elenco di superfici. Il runtime Direct3D specifica un handle di risorsa per l'elenco delle superfici usate dal driver di visualizzazione in modalità utente per richiamare il runtime. Il driver di visualizzazione in modalità utente crea un oggetto risorsa per rappresentare l'elenco delle superfici, genera un handle univoco per questo oggetto e restituisce l'handle al runtime Direct3D. Il runtime utilizza questo handle univoco nelle successive chiamate del driver per identificare l'elenco delle superfici. Il runtime identifica una particolare superficie specificando l'indice della superficie nella matrice contenuta nel membro pSurfList della struttura D3DDDIARG_CREATERESOURCE .

Poiché il driver di visualizzazione in modalità utente riceve l'handle di risorse definito dal driver nelle chiamate che fanno riferimento alla risorsa, il driver non è necessario per eseguire una ricerca di handle costosa per individuare l'oggetto risorsa definito dal driver. Analogamente, in modo che il runtime non sia necessario anche per eseguire una ricerca di handle, il driver di visualizzazione in modalità utente usa l'handle di risorsa definito dal runtime Direct3D quando il driver di visualizzazione in modalità utente chiama nuovamente nel runtime.

Il driver di visualizzazione in modalità utente chiama la funzione pfnAllocateCb per allocare memoria per le superfici. Nella chiamata pfnAllocateCb , il driver di visualizzazione in modalità utente può passare i dati privati per l'elenco delle superfici e per ogni singola superficie nei membri pPrivateDriverData delle strutture D3DDDICB_ALLOCATE e D3DDDI_ALLOCATIONINFO rispettivamente. Tuttavia, il driver di visualizzazione in modalità utente non può ricevere dati privati dai membri pPrivateDriverData . Il driver di visualizzazione in modalità utente può allocare memoria per questi dati privati e può liberare la memoria dopo la restituzione della chiamata pfnAllocateCb oppure può usare la memoria dello stack per passare questi dati privati. La funzione pfnAllocateCb torna al driver di visualizzazione in modalità utente un handle per ogni allocazione per ogni superficie allocata.

Nota Il driver di visualizzazione in modalità utente deve chiamare la funzione pfnAllocateCb una volta per ogni superficie condivisa per ogni dispositivo. Ad esempio, se il dispositivo 1 crea una superficie condivisa usata anche dai dispositivi 2, 3 e 4, i dispositivi 2, 3 e 4 devono anche chiamare pfnAllocateCb una volta per la superficie condivisa per recuperare l'handle di allocazione.

Il driver di visualizzazione in modalità utente deve tenere traccia di ogni superficie associandola a ciascun handle di allocazione, tipicamente mantenendo una tabella delle associazioni da superficie a handle di allocazione. Il driver di visualizzazione in modalità utente deve archiviare ogni handle di allocazione all'interno dell'oggetto risorsa definito dal driver.

Quando il runtime Direct3D esegue un'operazione su una superficie allocata in precedenza (ad esempio, in una chiamata alla funzione Blt del driver di visualizzazione in modalità utente), il driver di visualizzazione in modalità utente riceve l'handle per la risorsa, possibilmente con un indice di superficie. Il driver di visualizzazione in modalità utente usa questo handle di risorse per recuperare l'oggetto risorsa definito dal driver. Il driver ottiene gli handle di allocazione archiviati nell'oggetto risorsa e li assembla nel buffer dei comandi. Il driver di visualizzazione in modalità utente usa gli handle di allocazione che corrispondono alle superfici quando si chiama la funzione pfnRenderCb per inviare un buffer di comandi al driver del miniport di visualizzazione. Il driver miniport di visualizzazione può chiamare la funzione DxgkCbGetHandleData per determinare le allocazioni di superficie a cui fa riferimento il driver di visualizzazione in modalità utente.