Gestion de la création et de la destruction des ressources

Pour permettre au sous-système du noyau graphique Microsoft DirectX de suivre correctement la durée de vie des ressources et d’éviter les fuites de mémoire dans le système d’exploitation, le pilote d’affichage en mode utilisateur doit créer et détruire correctement des ressources.

Le runtime Microsoft Direct3D appelle les fonctions de pilote d’affichage en mode utilisateur suivantes pour créer des ressources en mode utilisateur.

  • CreateResource crée une ressource partagée ou non partagée.

  • OpenResource ouvre une vue sur une ressource partagée existante.

Dans les deux appels, le runtime Direct3D transmet un handle de ressource d’exécution en mode utilisateur unique que le pilote d’affichage en mode utilisateur utilise pour rappeler le runtime. Lorsque CreateResource ou OpenResource retourne correctement, le pilote d’affichage en mode utilisateur retourne un handle unique en mode utilisateur qui représente la ressource. Ce handle est le handle de ressource du pilote en mode utilisateur. Le runtime utilise le handle de ressource de pilote en mode utilisateur dans les appels de pilotes suivants.

Il existe une correspondance un-à-un entre le handle de ressource runtime en mode utilisateur et le handle de ressource de pilote en mode utilisateur. Le runtime Direct3D et le pilote d’affichage en mode utilisateur échangent les handles de runtime et de ressources de pilote en mode utilisateur via les membres hResource des structures D3DDDIARG_CREATERESOURCE et D3DDDIARG_OPENRESOURCE .

Lorsque le pilote d’affichage en mode utilisateur appelle la fonction pfnAllocateCb du runtime Direct3D pour créer des allocations pour une ressource en mode utilisateur, le pilote doit spécifier le handle de ressource runtime en mode utilisateur dans le membre hResource de la structure D3DDDICB_ALLOCATE vers laquelle pointe le paramètre pData . Le runtime Direct3D génère un handle unique en mode noyau à la ressource et le transmet au pilote d’affichage en mode utilisateur dans le membre hKMResource de D3DDDICB_ALLOCATE. Le pilote d’affichage en mode utilisateur peut insérer le handle de ressources en mode noyau dans le flux de commandes pour que le pilote miniport d’affichage soit utilisé ultérieurement.

Note Bien que les handles de ressources en mode utilisateur soient toujours uniques pour chaque création de ressource en mode utilisateur, les handles de ressources en mode noyau ne sont pas toujours uniques. Lorsque le runtime Direct3D appelle la fonction OpenResource du pilote d’affichage en mode utilisateur pour ouvrir une vue sur une ressource partagée existante, le runtime transmet le handle en mode noyau de la ressource dans le membre hKMResource de la structure D3DDDIARG_OPENRESOURCE vers laquelle pointe le paramètre pResource . Le runtime a précédemment créé ce handle en mode noyau après que le runtime a appelé la fonction CreateResource du pilote d’affichage en mode utilisateur.

Pour détruire une ressource en mode utilisateur créée par CreateResource ou OpenResource , le runtime Direct3D transmet le handle de ressource du pilote en mode utilisateur dans le paramètre hResource dans un appel à la fonction DestroyResource du pilote d’affichage en mode utilisateur. Pour libérer le handle de ressource en mode noyau et toutes les allocations associées à la ressource en mode utilisateur, le pilote d’affichage en mode utilisateur transmet le handle de ressource runtime en mode utilisateur dans le membre hResource de la structure D3DDDICB_DEALLOCATE vers laquelle pointe le paramètre pData dans un appel à la fonction pfnDeallocateCb .

Tenez compte des éléments suivants lorsqu’un pilote d’affichage en mode utilisateur crée et détruit des ressources :

  • Pour les allocations créées par le pilote d’affichage en mode utilisateur en réponse aux ressources partagées (autrement dit, en réponse aux appels CreateResource avec l’indicateur de champ de bits SharedResource défini dans le membre Flags de D3DDDIARG_CREATERESOURCE), le pilote doit affecter une valeur non NULL au membre hResource de D3DDDICB_ALLOCATE.

  • Pour les allocations créées par le pilote d’affichage en mode utilisateur en réponse à des ressources non partagées, le pilote n’est pas obligé d’affecter une valeur non NULL au membre hResource de D3DDDICB_ALLOCATE. Si le pilote affecte NULL à hResource, les allocations sont associées à l’appareil et non à une ressource particulière (et à un handle de ressource en mode noyau). Toutefois, si les allocations sont vraiment liées à une ressource, le pilote doit associer les allocations à cette ressource. Note Un handle de ressource en mode noyau est créé uniquement si le pilote d’affichage en mode utilisateur définit le membre hResource de D3DDDICB_ALLOCATE sur le handle de ressource d’exécution en mode utilisateur que le pilote a reçu du membre hResource de la structure D3DDDIARG_CREATERESOURCE dans un appel à CreateResource.

  • Lorsque DestroyResource est appelé pour détruire une ressource en mode utilisateur non partagée, le pilote d’affichage en mode utilisateur peut appeler pfnDeallocateCb avec le membre hResource de D3DDDICB_DEALLOCATE défini sur NULL uniquement si le pilote n’a jamais associé d’allocations à la ressource. Si le pilote d’affichage en mode utilisateur a associé des allocations à la ressource, le pilote doit appeler pfnDeallocateCb avec le membre hResource de D3DDDICB_DEALLOCATE défini sur une valeur non NULL ; dans le cas contraire, une fuite de mémoire se produira.