Featurezusammenfassung (Direct3D 9 für Windows Vista)
Diese Dokumentation bezieht sich speziell auf die Windows Vista-Erweiterungen für DirectX-Grafiken. Um die Leistungsfähigkeit 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 die WDDM nicht implementieren, können keine Windows Vista DirectX-Grafikschnittstellen instanziieren.
Entdecken Sie die neuen DirectX-Grafikfeatures in Windows Vista in einem der folgenden Abschnitte:
- Änderungen des Geräteverhaltens
- Deaktivieren der Multithread-Softwarevertexverarbeitung
- Oberflächen mit einem Bit
- Lesen von Tiefen-/Schablonenpuffern
- Gemeinsame Nutzung von Ressourcen
- sRGB-Konvertierung vor dem Überblenden
- StretchRect-Verbesserungen
- Texturerstellung im Systemspeicher
Änderungen des Geräteverhaltens
Geräte gehen jetzt nur unter zwei Umständen verloren: wenn die Hardware zurückgesetzt wird, weil sie hängen geblieben ist, und wenn der Gerätetreiber beendet wird. Wenn die Hardware hängt, kann das Gerät zurückgesetzt werden, indem man ResetExaufruft. Wenn die Hardware hängen bleibt, geht der Texturspeicher verloren.
Nachdem ein Treiber beendet wurde, muss das IDirect9Ex-Objekt neu erstellt werden, um das Rendering fortzusetzen.
Wenn der Präsentationsbereich im Fenstermodus von einem anderen Fenster verdeckt wird oder eine Vollbildanwendung minimiert ist, gibt PresentEx S_D3DPRESENTATIONOCCLUDED zurück. Vollbildanwendungen können das Rendering fortsetzen, wenn sie eine Rückrufnachricht vom Typ WM_ACTIVATEAPP empfangen.
In früheren Versionen von DirectX, wenn eine Anwendung eine Modusänderung erlebt hat, bestand die einzige Möglichkeit zum Wiederherstellen darin, das Gerät zurückzusetzen und alle Videospeicherressourcen und Swapchains neu zu erstellen. Bei DirectX für Windows Vista führt das Aufrufen von "Zurücksetzen 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 Bit für die Obergrenze (D3DCREATE_DISABLE_PSGP_THREADING) wurde hinzugefügt, das Multithreading für die Softwarevertexverarbeitung (swvp) deaktiviert. Verwenden Sie dieses Makro, um eine Verhaltenskennzeichnung für IDirect3D9::CreateDevice zu generieren.
#define D3DCREATE_DISABLE_PSGP_THREADING
Oberflächen mit einem Bit
Es gibt einen neuen Ein-Bit-Oberflächenformattyp, der besonders für die Verarbeitung von Textglyphen nützlich sein kann. Das neue Format wird als D3DFMT_A1 bezeichnet. Eine Oberfläche mit einem Bit ist so konzipiert, dass sie entweder als pixelbasierte Textur oder als Renderzielausgabe verwendet wird, 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 Oberfläche mit einer Größe von 2.000 x 8.000 Texel unterstützen.
Eine Ein-Bit-Oberfläche hat ein Bit pro Texel; Daher würde eins bedeuten, dass alle Komponenten (r,g,b,a) eines Pixels 1 sind, und Null würde bedeuten, dass alle Komponenten gleich 0 sind. Sie können one-Bit-Oberflächen mit den folgenden APIs verwenden: ColorFill, UpdateSurface und UpdateTexture.
Wenn eine Oberfläche mit einem Bit gelesen wird, kann die Laufzeit entweder Punktstichproben- oder Konvolutionsfilterung anwenden. Der Konvolutionsfilter kann angepasst werden (siehe SetConvolutionMonoKernel).
Es gibt einige Einschränkungen für One-Bit-Oberflächen:
- MIP-Zuordnung wird nicht unterstützt
- sRGB-Daten können nicht auf eine Ein-Bit-Oberfläche gelesen oder geschrieben werden.
- Eine Oberfläche mit einem Bit kann nicht als Vertextextur oder für Multisampling verwendet werden.
Lesen von Tiefen-/Schablonenpuffern
Verwenden Sie „IDirect3DDevice9::UpdateSurface“ zum Lesen oder Schreiben von Tiefen-/Schablonendaten von Oberflächen, die von „IDirect3DDevice9::CreateDepthStencilSurface“ oder „IDirect3DDevice9::GetDepthStencilSurface“ abgerufen werden.
Erstellen Sie mit „IDirect3DDevice9::CreateOffscreenPlainSurface“ zunächst eine sperrbare Oberfläche nur für die Tiefe bzw. nur für Schablonen. Verwenden Sie eines der folgenden Formate:
- D3DFMT_D16_LOCKABLE
- D3DFMT_D32F_LOCKABLE
- D3DFMT_D32_LOCKABLE
- D3DFMT_S8_LOCKABLE
Übertragen Sie als Nächstes Daten zwischen dem Tiefen-/Schablonenpuffer und der neu erstellten sperrbaren Tiefen- oder Schablonenoberfläche. Die Übertragung erfolgt mithilfe von IDirect3DDevice9::UpdateSurface.
„UpdateSurface“ ist nicht erfolgreich, wenn beide Oberflächen das Format LOCKABLE aufweisen oder beide nicht sperrbar sind.
Das Übertragen nicht vorhandener Daten führt zu einem Fehler (z. B. das Übertragen von einer nicht sperrbaren Oberfläche nur für die Tiefe auf eine D3DFMT_S8_LOCKABLE-Oberfläche).
Die restlichen Einschränkungen für IDirect3DDevice9::UpdateSurface gelten weiterhin.
Teilen von Ressourcen
Direct3D-Ressourcen können jetzt zwischen Geräten oder Prozessen gemeinsam genutzt werden. Dies gilt für jede Direct3D-Ressource, einschließlich Texturen, Vertexpuffer, Indexpuffer oder Oberflächen (z. B. Renderziele, Tiefenschablonenpuffer oder einfache Oberflächen außerhalb des Bildschirms). Um freigegeben zu werden, müssen Sie eine Ressource für die Freigabe zum Zeitpunkt der Erstellung festlegen und die Ressource im Standardpool (D3DPOOL_DEFAULT) suchen. Sobald eine Ressource für die Freigabe erstellt wurde, kann sie geräteübergreifend innerhalb eines Prozesses oder prozessübergreifend freigegeben werden.
Um die gemeinsame Nutzung von Ressourcen zu ermöglichen, verfügen die Ressourcenerstellungs-APIs über einen zusätzlichen Handle-Parameter. Dies ist ein HANDLE, das auf die freigegebene Ressource verweist. In früheren Überarbeitungen von DirectX war dieses Argument Teil der API-Signatur, wurde jedoch nicht verwendet und musste auf NULLfestgelegt werden. Verwenden Sie ab Windows Vista pSharedHandle auf folgende Weise:
- Legen Sie den Zeiger (pSharedHandle) auf NULL- fest, um keine Ressource zu teilen. Dies ist genau wie das Verhalten von DirectX vor Windows Vista.
- Rufen Sie zum Erstellen einer freigegebenen Ressource eine beliebige Ressourcenerstellungs-API (siehe unten) mit einem nicht initialisierten Handle auf. (Der Zeiger selbst ist nicht NULL (pSharedHandle != NULL), aber der Zeiger verweist auf einen NULL-Wert (*pSharedHandle == NULL).) Die API generiert eine freigegebene Ressource und gibt ein gültiges Handle zurück.
- Um eine zuvor erstellte freigegebene Ressource mithilfe eines freigegebenen Ressourcenhandle ungleich NULL zu öffnen und darauf zuzugreifen, legen Sie „pSharedHandle“ auf die Adresse dieses Handle fest. 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, CreateOffscreenPlainSurfaceEx und CreateRenderTargetEx.
Es gelten 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, Vertexpuffer und Indexpuffer) können bei gemeinsamer Nutzung zu einer schlechten Leistung führen. Sperrbare Renderziele können auf bestimmter Hardware nicht freigegeben werden.
- Verweise auf eine prozessübergreifende freigegebene Ressource müssen dieselben Dimensionen wie die ursprüngliche Ressource aufweisen. Wenn Sie ein Handle prozessübergreifend übergeben, schließen Sie die Dimensionsinformationen ein, damit ein identischer Verweis erstellt werden kann.
- Gemeinsam genutzte prozessübergreifende Oberflächen bieten keinen Synchronisierungsmechanismus. Lese-/Schreibänderungen an einer freigegebenen Oberfläche spiegeln möglicherweise nicht wie erwartet die Sicht eines Verweisprozesses auf die Oberfläche wider. Verwenden Sie Ereignisabfragen oder sperren Sie die Textur, um die Synchronisierung bereitzustellen.
- Nur der Prozess, der zunächst 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, können andere Prozesse nicht überprüfen, ob die Ressource verfügbar ist.
sRGB-Konvertierung vor dem Überblenden
Sie können nun überprüfen, ob das Gerät Pipelinedaten vor der Framepufferüberblendung in sRGB konvertieren kann. Dies bedeutet, dass das Gerät die Renderzielwerte aus dem sRGB-Farbraum konvertiert. Um festzustellen, ob die Konvertierung von der Hardware unterstützt wird, überprüfen Sie diese Obergrenze:
D3DPMISCCAPS_POSTBLENDSRGBCONVERT
Diese Obergrenze identifiziert Hardware, die die Konvertierung in sRGB vor der Vermischung unterstützt. Diese Funktion ist wichtig für das qualitativ hochwertige Rendering von FP16-Framepuffern im Desktopfenster-Manager (Desktop Window Manager, DWM).
StretchRect-Verbesserungen
In früheren Versionen von DirectX hat StretchRect viele Einschränkungen, um verschiedene Treiber zu berücksichtigen (siehe IDirect3DDevice9::StretchRect). Windows Vista basiert auf dem Windows Device Driver Model (WDDM). Dieses neue Treibermodell ist wesentlich robuster und ermöglicht Treibern die Behandlung von Sonderfällen in der Hardware.
Im Allgemeinen besteht die einzige verbleibende Einschränkung darin, dass das Renderziel mit Renderzielnutzung (D3DUSAGE_RENDERTARGET) erstellt worden sein muss. Diese Einschränkung wird aufgehoben, wenn Sie eine einfache Kopie ausführen (wobei Quelle und Ziel das gleiche Format und die gleiche Größe haben und keine Unterrechtecke vorhanden sind).
Texturerstellung im Systemspeicher
Anwendungen, die mehr Flexibilität bei der Verwendung, Zuweisung 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-Bitmapzeiger im Systemspeicher erstellen.
Sie müssen zwei Dinge tun, um eine solche Textur zu erstellen:
- Weisen Sie genügend Systemspeicher zu, um die Texturoberfläche zu speichern. 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)
Eine Systemspeichertextur hat die folgenden Einschränkungen:
- Der Texturabstand muss der Texturbreite mal der Anzahl der Bytes pro Pixel entsprechen.
- Bei Verwendung komprimierter Formate (DXT-Formate) ist die Anwendung für die Zuordnung der richtigen Größe verantwortlich.
- Es werden nur Texturen mit einer einzelnen Mipmap-Ebene unterstützt.
- Der an „CreateTexture“ für das Pool-Argument übergebene Wert muss D3DPOOL_SYSTEMMEM sein.
- Diese API umschließt den bereitgestellten Speicher in einer Textur. Geben Sie diesen Speicher erst frei, wenn Sie damit fertig sind.