Featurezusammenfassung (Direct3D 9 für Windows Vista)

Diese Dokumentation bezieht sich speziell auf die Windows Vista-Erweiterungen für DirectX-Grafiken. Um die Leistung von DirectX für Windows Vista zu entwickeln, müssen Sie das Windows Vista SDK sowie das DirectX SDK installieren. Anwendungen, die DirectX für Windows Vista verwenden, müssen Hardware verwenden, die den WDDM-Treiber (Windows Device Driver Model) im Gegensatz zum XPDM (XP-Treibermodell) verwendet. -Treiber, die das WDDM nicht implementieren, können Windows Vista DirectX-Grafikschnittstellen nicht instanziieren.

Entdecken Sie die neuen DirectX-Grafikfeatures in Windows Vista in einem der folgenden Abschnitte:

Änderungen am Geräteverhalten

Geräte gehen jetzt nur unter zwei Umständen verloren: , wenn die Hardware zurückgesetzt wird, weil sie hängt, und wenn der Gerätetreiber beendet wird. Wenn die Hardware nicht mehr unterstützt wird, kann das Gerät durch Aufrufen von ResetEx zurückgesetzt werden. Wenn die Hardware nicht mehr verfügbar ist, geht der Texturspeicher verloren.

Nachdem ein Treiber beendet wurde, muss das IDirect9Ex-Objekt neu erstellt werden, um das Rendering fortsetzen zu können.

Wenn der Präsentationsbereich von einem anderen Fenster im Fenstermodus verdeckt wird oder wenn eine Vollbildanwendung minimiert wird, gibt PresentEx S _ D3DPRESENTATIONOCCLUDED zurück. Vollbildanwendungen können das Rendering fortsetzen, wenn sie eine WM _ ACTIVATEAPP-Rückrufmeldung erhalten.

In früheren Versionen von DirectX war die einzige Möglichkeit zur Wiederherstellung, wenn eine Anwendung einen Moduswechsel hatte, das Gerät zurückzusetzen und alle Videospeicherressourcen und Austauschketten neu zu erstellen. Jetzt mit DirectX für Windows Vista führt der Aufruf von Reset nach einer Modusänderung nicht dazu, dass Texturspeicheroberflächen, Texturen und Zustandsinformationen verloren gehen und diese Ressourcen nicht neu erstellt werden müssen.

Deaktivieren der Multithread-Softwarevertexverarbeitung

Ein neues Caps-Bit (D3DCREATE DISABLE PSGP THREADING) wurde hinzugefügt, das Multithreading für die _ _ _ Softwarevertexverarbeitung (Swvp) deaktiviert. Verwenden Sie dieses Makro, um ein Verhaltensflag für IDirect3D9::CreateDevice zu generieren.

#define D3DCREATE_DISABLE_PSGP_THREADING

One-Bit-Oberflächen

Es gibt einen neuen Ein-Bit-Oberflächenformattyp, der besonders nützlich für die Verarbeitung von Text-Glyphen sein kann. Das neue Format heißt D3DFMT _ A1. Eine Ein-Bit-Oberfläche ist so konzipiert, dass sie entweder als Pixeltextur verwendet wird, oder die Ausgabe des Renderziels, die von ComposeRects oder ColorFill generiert wird. Es gibt keine separaten Obergrenzen für die Breite und Höhe der Oberfläche. eine Implementierung muss eine Einzelne-Größen-Oberfläche unterstützen, bei der es sich um 2K Texel x 8K Texel handelt.

Eine Ein-Bit-Oberfläche verfügt über ein Bit pro Texel. Daher würde eins bedeuten, dass alle Komponenten (r,g,b,a) eines Pixels 1 und 0 (null) bedeuten würden, dass alle Komponenten gleich 0 sind. Sie können One-Bit-Oberflächen mit den folgenden APIs verwenden: ColorFill, UpdateSurface und UpdateTexture.

Wenn eine 1-Bit-Oberfläche gelesen wird, kann die Runtime entweder Punktbeispiele oder Konvolutionsfilterung durchführen. Der Konvolutionsfilter ist anpassbar (siehe SetConvolutionMonoKernel).

Es gibt einige Einschränkungen für One-Bit-Oberflächen:

  • Mip-Zuordnung wird nicht unterstützt.
  • sRGB-Daten können nicht gelesen oder auf eine Ein-Bit-Oberfläche geschrieben werden.
  • Eine Ein-Bit-Oberfläche kann nicht als Scheitelpunkttextur oder für Multisampling verwendet werden.

Lesen von Tiefen-/Schablonenpuffern

Verwenden Sie IDirect3DDevice9::UpdateSurface, um Tiefen-/Schablonendaten von Oberflächen zu lesen oder zu schreiben, die von IDirect3DDevice9::CreateDepthStencilSurface oder IDirect3DDevice9::GetDepthStencilSurface erhalten wurden.

Erstellen Sie zunächst mithilfe von IDirect3DDevice9::CreateOffscreenPlainSurface eine sperrbare, nur tiefen- oder Schablonenoberfläche. Verwenden Sie eines der folgenden Formate:

  • D3DFMT _ D16 _ LOCKABLE
  • D3DFMT _ D32F _ LOCKABLE
  • D3DFMT _ D32 _ LOCKABLE
  • D3DFMT _ S8 _ LOCKABLE

Übertragen Sie zweitens Daten zwischen dem Tiefen-/Schablonenpuffer und der neu erstellten sperrbaren Tiefe oder Schablonenoberfläche. Die Übertragung erfolgt mithilfe von IDirect3DDevice9::UpdateSurface.

UpdateSurface kann nicht verwendet werden, wenn beide Oberflächen ein LOCKABLE-Format haben oder beide nicht sperrbar sind.

Die Übertragung nicht vorhandener Daten führt zu einem Fehler (z. B. bei der Übertragung von einer nicht sperrbaren Tiefenoberfläche auf eine D3DFMT _ S8 _ LOCKABLE-Oberfläche).

Die restlichen Einschränkungen für IDirect3DDevice9::UpdateSurface gelten weiterhin.

Freigeben von Ressourcen

Direct3D-Ressourcen können jetzt von Geräten oder Prozessen gemeinsam genutzt werden. Dies gilt für alle Direct3D-Ressourcen, einschließlich Texturen, Scheitelpunktpuffern, Indexpuffern oder Oberflächen (z. B. Renderziele, Tiefen-Schablonenpuffer oder einfache Off-Screen-Oberflächen). Um freigegeben zu werden, müssen Sie zum Zeitpunkt der Erstellung eine Ressource für die Freigabe festlegen und die Ressource im Standardpool (D3DPOOL _ DEFAULT) suchen. Sobald eine Ressource für die Freigabe erstellt wurde, kann sie zwischen Geräten innerhalb eines Prozesses oder prozessübergreifend freigegeben werden.

Um freigegebene Ressourcen zu aktivieren, verfügen die Ressourcenerstellungs-APIs über einen zusätzlichen Handleparameter. Dies ist ein HANDLE, das auf die freigegebene Ressource verweist. In früheren Revisionen von DirectX war dieses Argument Teil der API-Signatur, wurde jedoch nicht verwendet und muss auf NULL festgelegt werden. Ab Windows Vista können Sie pSharedHandle wie folgt verwenden:

  • Legen Sie den Zeiger (pSharedHandle) auf NULL fest, um eine Ressource nicht gemeinsam zu nutzen. Dies ist genauso wie das Verhalten von DirectX vor Windows Vista.
  • Um eine freigegebene Ressource zu erstellen, rufen Sie eine beliebige Ressourcenerstellungs-API (siehe unten) mit einem nicht initialisierten Handle auf (der Zeiger selbst ist nicht NULL (pSharedHandle != NULL), aber der Zeiger zeigt auf einen NULL-Wert ( * pSharedHandle == NULL)). Die API generiert eine freigegebene Ressource und gibt ein gültiges Handle zurück.
  • Legen Sie pSharedHandle auf die Adresse dieses Handles fest, um eine zuvor erstellte freigegebene Ressource mithilfe eines freigegebenen Ressourcenhandles ohne NULL zu öffnen und darauf zu zugreifen. Nachdem Sie die zuvor erstellte freigegebene Ressource auf diese Weise geöffnet haben, können Sie die zurückgegebene Schnittstelle in der Direct3D 9- oder Direct3D 9Ex-API verwenden, als wäre die Schnittstelle eine typische Ressource dieses Typs.

Ressourcenerstellungs-APIs umfassen: CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBuffer, CreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceExund CreateRenderTargetEx.

Es gibt einige Einschränkungen für die Verwendung freigegebener Ressourcen. Dazu gehören:

  • Die API, die Sie zum Öffnen einer freigegebenen Ressource verwenden, muss mit der API übereinstimmen, die Sie zum Erstellen der freigegebenen Ressource verwendet haben. Wenn Sie beispielsweise CreateTexture zum Erstellen einer freigegebenen Ressource verwendet haben, müssen Sie CreateTexture verwenden, um diese freigegebene Ressource zu öffnen. Wenn Sie CreateRenderTarget zum Erstellen einer freigegebenen Ressource verwendet haben, müssen Sie CreateRenderTarget verwenden, um diese freigegebene Ressource zu öffnen, und so weiter.
  • Wenn Sie eine freigegebene Ressource öffnen, müssen Sie D3DPOOL _ DEFAULT angeben.
  • Sperrbare Ressourcen (z. B. Texturen mit D3DUSAGE DYNAMIC, Scheitelpunktpuffer und Indexpuffer) können bei der Freigabe eine schlechte _ Leistung aufweisen. Sperrbare Rendertargets können auf einigen Hardwarekomponenten nicht freigegeben werden.
  • Verweise auf eine prozessübergreifende freigegebene Ressource müssen die gleichen Dimensionen wie die ursprüngliche Ressource haben. Wenn Sie ein Handle prozessübergreifend übergeben, schließen Sie die Dimensionsinformationen ein, damit der Verweis identisch erstellt werden kann.
  • Freigegebene prozessübergreifende Oberflächen bieten keinen Synchronisierungsmechanismus. Lese-/Schreibänderungen an einer freigegebenen Oberfläche spiegeln möglicherweise nicht die Ansicht der Oberfläche eines verweisenden Prozesses wider, wenn dies erwartet wird. Verwenden Sie zum Bereitstellen der Synchronisierung Ereignisabfragen, oder sperren Sie die Textur.
  • Nur der Prozess, der anfänglich eine freigegebene Ressource erstellt, kann sie sperren (jeder Prozess, der einen Verweis auf diese freigegebene Ressource öffnet, kann sie nicht sperren).
  • Wenn eine freigegebene Ressource gesperrt ist, gibt es keine Überprüfung für andere Prozesse, um zu wissen, ob die Ressource verfügbar ist.

sRGB-Konvertierung vor dem Mischen

Sie können nun überprüfen, ob das Gerät Pipelinedaten vor dem Mischen von Framepuffern in sRGB konvertieren kann. Dies bedeutet, dass das Gerät die Renderzielwerte aus sRGB konvertiert. Um zu überprüfen, ob die Konvertierung von der Hardware unterstützt wird, überprüfen Sie, ob diese Obergrenze gilt:

D3DPMISCCAPS_POSTBLENDSRGBCONVERT

Diese Obergrenze identifiziert Hardware, die die Konvertierung in sRGB vor dem Mischen unterstützt. Diese Funktion ist wichtig für das hochwertige Rendering von fp16-Framepuffern im Desktopfenster-Manager (DWM).

StretchRect-Verbesserungen

In früheren Versionen von DirectX gelten für StretchRect viele Einschränkungen für verschiedene Treiber (siehe IDirect3DDevice9::StretchRect). Windows Vista basiert auf dem Windows Device Driver Model (WDDM). Dieses neue Treibermodell ist wesentlich stabiler und ermöglicht es Treibern, Sonderfälle in der Hardware zu verarbeiten.

Im Allgemeinen besteht die einzige verbleibende Einschränkung in der Verwendung des Renderziels (D3DUSAGE _ RENDERTARGET). Diese Einschränkung wird aufgehoben, wenn Sie eine einfache Kopie erstellen (wobei Quelle und Dest das gleiche Format, dieselbe Größe und keine untergeordneten Rechtecke haben).

Texturerstellung im Systemspeicher

Anwendungen, die mehr Flexibilität bei der Verwendung, Zuordnung und Löschung des Systemspeichers benötigen, können jetzt Texturen aus einem Systemspeicherzeiger erstellen. Beispielsweise könnte eine Anwendung eine Direct3D-Textur aus einem GDI-Systemspeicherbitmapzeiger erstellen.

Sie müssen zwei Dinge tun, um eine solche Textur zu erstellen:

  • Ordnen Sie genügend Systemspeicher zu, um die Texturoberfläche zu halten. Die Mindestanzahl von Bytes ist Breite x Höhe x Bytes pro Pixel.
  • Übergeben Sie die Adresse eines Zeigers auf die Systemspeicheroberfläche für den * HANDLE-Parameter an IDirect3DDevice9::CreateTexture.

Hier ist der Funktionsprototyp für IDirect3DDevice9::CreateTexture:

STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels, 
    DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, 
    HANDLE* pSharedHandle)

Für eine Textur des Systemspeichers gelten die folgenden Einschränkungen:

  • Die Texturhöhe muss der Texturbreite entsprechen, die der Anzahl der Bytes pro Pixel entspricht.
  • Bei Verwendung komprimierter Formate (DXT-Formate) ist die Anwendung für die Zuordnung der richtigen Größe verantwortlich.
  • Nur Texturen mit einer einzelnen Mipmapebene werden unterstützt.
  • Der wert, der für das Pool-Argument an CreateTexture übergeben wird, muss D3DPOOL _ SYSTEMMEM sein.
  • Diese API umschließt den bereitgestellten Speicher in einer Textur. Geben Sie die Zuordnung dieses Arbeitsspeichers erst wieder auf, wenn Sie damit fertig sind.