Behandeln von Ressourcenerstellung und -zerstörung
Damit das Microsoft DirectX-Grafikkernsystem die Ressourcenlebensdauer ordnungsgemäß nachverfolgen und Speicherverluste im Betriebssystem verhindern kann, muss der Anzeigetreiber im Benutzermodus Ressourcen ordnungsgemäß erstellen und zerstören.
Die Microsoft Direct3D-Runtime ruft die folgenden Anzeigetreiberfunktionen für den Benutzermodus auf, um Ressourcen im Benutzermodus zu erstellen.
CreateResource erstellt eine neue freigegebene oder nicht freigegebene Ressource.
OpenResource öffnet eine Ansicht für eine vorhandene freigegebene Ressource.
In beiden Aufrufen übergibt die Direct3D-Runtime ein eindeutiges Benutzermodus-Ressourcenhandle , das der Benutzermodusanzeigetreiber verwendet, um in die Runtime zurückzurufen. Wenn CreateResource oder OpenResource erfolgreich zurückgegeben wird, gibt der Anzeigetreiber für den Benutzermodus ein eindeutiges Benutzermodushandle zurück, das die Ressource darstellt. Dieses Handle ist das Benutzermodus-Treiberressourcenhandle. Die Runtime verwendet das Benutzermodus-Treiberressourcenhandle in nachfolgenden Treiberaufrufen.
Zwischen dem Benutzermodus-Laufzeitressourcenhandle und dem Benutzermodus-Treiberressourcenhandle besteht eine 1:1-Korrespondenz. Die Direct3D-Runtime und der Benutzermodusanzeigetreiber tauschen die Benutzermodusruntime- und Treiberressourcenhandles über die hResource-Member der D3DDDIARG_CREATERESOURCE - und D3DDDIARG_OPENRESOURCE-Strukturen aus.
Wenn der Benutzermodusanzeigetreiber die PfnAllocateCb-Funktion der Direct3D-Runtime aufruft, um Zuordnungen für eine Benutzermodusressource zu erstellen, sollte der Treiber das Benutzermodus-Ressourcenhandle im hResource-Element der D3DDDICB_ALLOCATE Struktur angeben, auf die der pData-Parameter verweist. Die Direct3D-Runtime generiert ein eindeutiges Kernelmodushandle für die Ressource und übergibt es an den Benutzermodusanzeigetreiber im hKMResource-Member von D3DDDICB_ALLOCATE. Der Anzeigetreiber für den Benutzermodus kann das Kernelmodus-Ressourcenhandle in den Befehlsstream einfügen, damit der Anzeige-Miniporttreiber später verwendet werden kann.
Hinweis Obwohl Benutzermodus-Ressourcenhandles für jede Erstellung von Benutzermodusressourcen immer eindeutig sind, sind Die Kernelmodus-Ressourcenhandles nicht immer eindeutig. Wenn die Direct3D-Runtime die OpenResource-Funktion des Benutzermodusanzeigetreibers aufruft, um eine Ansicht für eine vorhandene freigegebene Ressource zu öffnen, übergibt die Laufzeit das Kernelmodushandle der Ressource im hKMResource-Member der D3DDDIARG_OPENRESOURCE-Struktur , auf die der pResource-Parameter verweist. Die Runtime hat dieses Kernelmodushandle zuvor erstellt, nachdem die Runtime die CreateResource-Funktion des Benutzermodusanzeigetreibers aufgerufen hat.
Um eine Von CreateResource oder OpenResource erstellte Benutzermodusressource zu zerstören, übergibt die Direct3D-Runtime das Benutzermodus-Treiberressourcenhandle im hResource-Parameter in einem Aufruf der DestroyResource-Funktion des Benutzermodusanzeigetreibers. Um das Kernelmodus-Ressourcenhandle und alle Zuordnungen freizugeben, die der Benutzermodusressource zugeordnet sind, übergibt der Benutzermodusanzeigetreiber das Benutzermodus-Laufzeitressourcenhandle im hResource-Member der D3DDDICB_DEALLOCATE-Struktur , auf die der pData-Parameter in einem Aufruf der pfnDeallocateCb-Funktion verweist.
Berücksichtigen Sie die folgenden Punkte, wenn ein Benutzermodus-Anzeigetreiber Ressourcen erstellt und zerstört:
Für Zuordnungen, die der Benutzermodusanzeigetreiber als Reaktion auf freigegebene Ressourcen erstellt (d. h. als Reaktion auf CreateResource-Aufrufe mit dem SharedResource-Bitfeldflag, das im Flags-Member von D3DDDIARG_CREATERESOURCE festgelegt ist), muss der Treiber dem hResource-Member von D3DDDICB_ALLOCATE einen Wert ungleich NULL zuweisen.
Bei Zuordnungen, die der Benutzermodusanzeigetreiber als Reaktion auf nicht freigegebene Ressourcen erstellt, muss der Treiber dem hResource-Member von D3DDDICB_ALLOCATE keinen Wert ungleich NULL zuweisen. Wenn der Treiber hResourceNULL zuweist, werden die Zuordnungen dem Gerät und nicht einer bestimmten Ressource (und einem Kernelmodus-Ressourcenhandle) zugeordnet. Wenn Zuordnungen jedoch tatsächlich mit einer Ressource verknüpft sind, sollte der Treiber die Zuordnungen dieser Ressource zuordnen. Hinweis Ein Kernelmodus-Ressourcenhandle wird nur erstellt, wenn der Benutzermodusanzeigetreiber das hResource-Element von D3DDDICB_ALLOCATE auf das Benutzermodus-Laufzeitressourcenhandle festlegt, das der Treiber vom hResource-Member der D3DDDIARG_CREATERESOURCE-Struktur bei einem Aufruf von CreateResource empfangen hat.
Wenn DestroyResource aufgerufen wird, um eine nicht freigegebene Benutzermodusressource zu zerstören, kann der Benutzermodusanzeigetreiber pfnDeallocateCb aufrufen, wobei der hResource-Member von D3DDDICB_DEALLOCATE nur dann auf NULL festgelegt ist, wenn der Treiber der Ressource nie Zuordnungen zugeordnet hat. Wenn der Benutzermodusanzeigetreiber zuordnungen mit der Ressource verknüpft ist, muss der Treiber pfnDeallocateCb aufrufen, wobei der hResource-Member von D3DDDICB_DEALLOCATE auf einen Wert ungleich NULL festgelegt ist. Andernfalls tritt ein Speicherverlust auf.