Anfordern und Verwenden von Surface-Arbeitsspeicher
Der Benutzermodusanzeigetreiber empfängt Aufrufe seiner CreateResource-Funktion , wenn die Microsoft Direct3D-Runtime die Erstellung einer Liste von Oberflächen erfordert. Die Direct3D-Runtime gibt ein Ressourcenhandle für die Liste der Oberflächen an, die der Benutzermodusanzeigetreiber verwendet, um in die Runtime zurückzurufen. Der Benutzermodusanzeigetreiber erstellt ein Ressourcenobjekt, um die Liste der Oberflächen darzustellen, generiert ein eindeutiges Handle für dieses Objekt und gibt das Handle zurück an die Direct3D-Runtime. Die Runtime verwendet dieses eindeutige Handle in nachfolgenden Treiberaufrufen, um die Liste der Oberflächen zu identifizieren. Die Runtime identifiziert eine bestimmte Oberfläche, indem sie den Index der Oberfläche in dem Array angibt, das im pSurfList-Element der D3DDDIARG_CREATERESOURCE-Struktur enthalten ist.
Da der Benutzermodusanzeigetreiber das vom Treiber definierte Ressourcenhandle in Aufrufen empfängt, die sich auf die Ressource beziehen, muss der Treiber keine kostspielige Handle-Suche durchführen, um das vom Treiber definierte Ressourcenobjekt zu finden. Ebenso verwendet der Anzeigetreiber für den Benutzermodus den direct3D-Runtime-definierten Ressourcenhandle, wenn der Benutzermodus-Anzeigetreiber zurück in die Runtime ruft, damit die Runtime nicht mehr von der Runtime ausgeht, damit die Runtime von der Runtime nicht mehr benötigt wird.
Der Benutzermodusanzeigetreiber ruft die PfnAllocateCb-Funktion auf, um Arbeitsspeicher für die Oberflächen zuzuweisen. Im pfnAllocateCb-Aufruf kann der Benutzermodusanzeigetreiber private Daten für die Liste der Oberflächen und für jede einzelne Oberfläche in den pPrivateDriverData-Membern der D3DDDICB_ALLOCATE - bzw . D3DDDI_ALLOCATIONINFO-Strukturen übergeben. Der Benutzermodusanzeigetreiber kann jedoch keine privaten Daten von den pPrivateDriverData-Membern empfangen. Der Benutzermodusanzeigetreiber kann Arbeitsspeicher für diese privaten Daten zuordnen und den Speicher freigeben, nachdem der pfnAllocateCb-Aufruf zurückgegeben wurde, oder stapelspeichern, um diese privaten Daten zu übergeben. Die pfnAllocateCb-Funktion gibt zum Benutzermodusanzeigetreiber ein Handle für jede Zuordnung für jede zugeordnete Oberfläche zurück.
Hinweis Der Benutzermodusanzeigetreiber muss die PfnAllocateCb-Funktion für jede freigegebene Oberfläche für jedes Gerät einmal aufrufen. Wenn Beispielsweise Gerät 1 eine freigegebene Oberfläche erstellt, die auch von den Geräten 2, 3 und 4 verwendet wird, müssen Geräte 2, 3 und 4 auch einmal pfnAllocateCb für die freigegebene Oberfläche aufrufen, um den Zuordnungshandle abzurufen.
Der Benutzermodusanzeigetreiber muss jede Oberfläche bis zu jedem Zuordnungshandle nachverfolgen, in der Regel durch Beibehaltung einer Surface-to-Allocation-Handle-Tabelle. Der Benutzermodusanzeigetreiber sollte jedes Zuordnungshandle innerhalb des vom Treiber definierten Ressourcenobjekts speichern.
Wenn die Direct3D-Runtime einen Vorgang auf einer zuvor zugewiesenen Oberfläche ausführt (z. B. bei einem Aufruf der Blt-Funktion des Benutzermodusanzeigetreibers), empfängt der Benutzermodusanzeigetreiber den Handle für die Ressource, möglicherweise mit einem Oberflächenindex. Der Benutzermodusanzeigetreiber verwendet dieses Ressourcenhandle, um das vom Treiber definierte Ressourcenobjekt abzurufen. Der Treiber ruft die Zuordnungshandles ab, die im Ressourcenobjekt gespeichert sind, und stellt sie im Befehlspuffer zusammen. Der Benutzermodusanzeigetreiber verwendet die Zuordnungshandles, die den Oberflächen entsprechen, wenn die PfnRenderCb-Funktion aufgerufen wird, um einen Befehlspuffer an den Anzeigeminiporttreiber zu übermitteln. Der Anzeigeminiporttreiber kann die DxgkCbGetHandleData-Funktion aufrufen, um zu bestimmen, auf welche Oberflächenzuordnungen sich der Benutzermodusanzeigetreiber bezieht.