Gestione della creazione e della distruzione delle risorse

Per abilitare il sottosistema del kernel grafico Microsoft DirectX per tenere traccia della durata corretta delle risorse e per evitare perdite di memoria nel sistema operativo, il driver di visualizzazione in modalità utente deve creare e distruggere correttamente le risorse.

Il runtime di Microsoft Direct3D chiama le funzioni del driver di visualizzazione in modalità utente seguenti per creare risorse in modalità utente.

  • CreateResource crea una nuova risorsa condivisa o non condivisa.

  • OpenResource apre una visualizzazione a una risorsa condivisa esistente.

In entrambe le chiamate, il runtime Direct3D passa un handle univoco della risorsa di runtime in modalità utente che il driver di visualizzazione in modalità utente usa per richiamare il runtime. Quando CreateResource o OpenResource restituisce correttamente, il driver di visualizzazione in modalità utente restituisce un handle univoco in modalità utente che rappresenta la risorsa. Questo handle è l'handle delle risorse del driver in modalità utente. Il runtime usa l'handle della risorsa driver in modalità utente nelle chiamate driver successive.

Esiste una corrispondenza uno-a-uno tra l'handle delle risorse runtime in modalità utente e l'handle delle risorse del driver in modalità utente. Il runtime Direct3D e il driver di visualizzazione in modalità utente scambiano gli handle di runtime e driver in modalità utente tramite i membri hResource delle strutture D3DDDIARG_CREATERESOURCE e D3DDDIARG_OPENRESOURCE .

Quando il driver di visualizzazione in modalità utente chiama la funzione pfnAllocateCb del runtime Direct3D per creare allocazioni per una risorsa in modalità utente, il driver deve specificare l'handle della risorsa runtime in modalità utente nel membro hResource della struttura D3DDDICB_ALLOCATE a cui punta il parametro pData . Il runtime Direct3D genera un handle univoco in modalità kernel alla risorsa e lo passa al driver di visualizzazione in modalità utente nel membro hKMResource di D3DDDICB_ALLOCATE. Il driver di visualizzazione in modalità utente può inserire l'handle della risorsa in modalità kernel nel flusso di comando per il driver miniport visualizzato da usare in un secondo momento.

Nota Anche se gli handle delle risorse in modalità utente sono sempre univoci per ogni creazione di risorse in modalità utente, gli handle delle risorse in modalità kernel non sono sempre univoci. Quando il runtime Direct3D chiama la funzione OpenResource del driver di visualizzazione in modalità utente per aprire una visualizzazione a una risorsa condivisa esistente, il runtime passa l'handle in modalità kernel della risorsa nel membro hKMResource della struttura D3DDDIARG_OPENRESOURCE a cui punta il parametro pResource . Il runtime ha creato in precedenza questo handle in modalità kernel dopo il runtime denominato funzione di visualizzazione in modalità utente CreateResource del driver.

Per eliminare una risorsa in modalità utente creata da CreateResource o OpenResource , il runtime Direct3D passa l'handle della risorsa driver in modalità utente nel parametro hResource in una chiamata alla funzione Distruzioneresource del driver di visualizzazione in modalità utente. Per rilasciare l'handle di risorse in modalità kernel e tutte le allocazioni associate alla risorsa in modalità utente, il driver di visualizzazione in modalità utente passa l'handle della risorsa runtime in modalità utente nel membro hResource della struttura D3DDDICB_DEALLOCATE a cui punta il parametro pData in una chiamata alla funzione pfnDeallocateCb .

Prendere in considerazione gli elementi seguenti quando un driver di visualizzazione in modalità utente crea e elimina le risorse:

  • Per le allocazioni create dal driver di visualizzazione in modalità utente in risposta alle risorse condivise, ovvero in risposta alle chiamate CreateResource con il flag di campo a bit SharedResource impostato nel membro Flags di D3DDDIARG_CREATERESOURCE, il driver deve assegnare un valore non NULL al membro hResource di D3DDDICB_ALLOCATE.

  • Per le allocazioni create dal driver di visualizzazione in modalità utente in risposta alle risorse non condivise, il driver non è necessario per assegnare un valore non NULL al membro hResource di D3DDDICB_ALLOCATE. Se il driver assegna NULL a hResource, le allocazioni sono associate al dispositivo e non a una determinata risorsa (e handle di risorse in modalità kernel). Tuttavia, se le allocazioni sono veramente correlate a una risorsa, il driver deve associare le allocazioni a tale risorsa. Nota Viene creato un handle di risorse in modalità kernel solo se il driver di visualizzazione in modalità utente imposta il membro hResource di D3DDDICB_ALLOCATE all'handle della risorsa runtime in modalità utente che il driver ricevuto dal membro hResourcedella struttura D3DDDIARG_CREATERESOURCE in una chiamata a CreateResource.

  • Quando DestroyResource viene chiamato per eliminare una risorsa in modalità utente non condivisa, il driver di visualizzazione in modalità utente può chiamare pfnDeallocateCb con il membro hResource di D3DDDICB_DEALLOCATE impostato su NULL solo se il driver non ha mai associato alcuna allocazione alla risorsa. Se il driver di visualizzazione in modalità utente associato alle allocazioni con la risorsa, il driver deve chiamare pfnDeallocateCb con il membro hResource di D3DDDICB_DEALLOCATE impostato su un valore non NULL ; in caso contrario, si verificherà una perdita di memoria.