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-Gerätetreibermodell) im Gegensatz zum XPDM (XP-Treibermodell) verwendet. Treiber, die 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
- Deaktivieren der Multithread-Softwarevertexverarbeitung
- Ein-Bit-Oberflächen
- Lesetiefe/Schablonenpuffer
- Freigeben von Ressourcen
- sRGB-Konvertierung vor dem Mischen
- StretchRect-Verbesserungen
- Texturerstellung im Systemspeicher
Geräte gehen jetzt nur noch unter zwei Umständen verloren; , wenn die Hardware zurückgesetzt wird, weil sie hängt, und wenn der Gerätetreiber angehalten wird. Wenn die Hardware hängt, kann das Gerät zurückgesetzt werden, indem ResetEx aufgerufen wird. Wenn die Hardware hängt, geht der Texturspeicher verloren.
Nachdem ein Treiber beendet wurde, muss das IDirect9Ex-Objekt neu erstellt werden, um das Rendering fortzusetzen.
Wenn der Präsentationsbereich von einem anderen Fenster im Fenstermodus verdeckt wird oder eine Vollbildanwendung minimiert wird, gibt PresentEx S_D3DPRESENTATIONOCCLUDED zurück. Vollbildanwendungen können das Rendern fortsetzen, wenn sie eine WM_ACTIVATEAPP Rückrufnachricht erhalten.
In früheren Versionen von DirectX, wenn eine Anwendung einen Modus geändert hat, bestand die einzige Möglichkeit zur Wiederherstellung 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 Reset nach einer Modusänderung nicht dazu, dass Texturspeicheroberflächen, Texturen und Zustandsinformationen verloren gehen, und diese Ressourcen müssen nicht neu erstellt werden.
Es wurde ein neues Caps-Bit (D3DCREATE_DISABLE_PSGP_THREADING) 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
Es gibt einen neuen Ein-Bit-Oberflächenformattyp, der besonders nützlich für die Verarbeitung von Textglyphen sein kann. Das neue Format wird als D3DFMT_A1 bezeichnet. Eine Ein-Bit-Oberfläche ist so konzipiert, dass sie entweder als Textur pro Pixel oder als Renderzielausgabe verwendet wird, die von ComposeRects oder ColorFill generiert wird. Es gibt keine separaten Kappen für die Breite und Höhe der Oberfläche. Eine Implementierung muss eine Oberfläche mit einer Größe von 2K Texels x 8K unterstützen.
Eine Ein-Bit-Oberfläche hat ein Bit pro Texel; eins würde daher 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 Ein-Bit-Oberfläche gelesen wird, kann die Runtime entweder Punktbeispiele oder Faltungsfilterung durchführen. Der Faltungsfilter ist einstellbar (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 One-Bit-Oberfläche geschrieben werden.
- Eine Ein-Bit-Oberfläche kann nicht als Vertextextur oder für Multisampling verwendet werden.
Verwenden Sie IDirect3DDevice9::UpdateSurface, um Tiefen-/Schablonendaten von Oberflächen zu lesen oder zu schreiben, die von IDirect3DDevice9::CreateDepthStencilSurface oder IDirect3DDevice9::GetDepthStencilSurface abgerufen wurden.
Erstellen Sie zunächst mithilfe von IDirect3DDevice9::CreateOffscreenPlainSurface eine sperrbare, nur tiefe oder schablonenfähige Oberfläche. Verwenden Sie eines der folgenden Formate:
- D3DFMT_D16_LOCKABLE
- D3DFMT_D32F_LOCKABLE
- D3DFMT_D32_LOCKABLE
- D3DFMT_S8_LOCKABLE
Zweitens übertragen Sie Daten zwischen dem Tiefen-/Schablonenpuffer und der neu erstellten sperrbaren Tiefe oder Schablonenoberfläche. Die Übertragung erfolgt mit IDirect3DDevice9::UpdateSurface.
UpdateSurface schlägt fehl, wenn beide Oberflächen ein LOCKABLE-Format haben oder beide nicht gesperrt werden können.
Das Übertragen nicht vorhandener Daten führt zu einem Fehler (z. B. das Übertragen von einer nicht sperrbaren Tiefenoberfläche auf eine D3DFMT_S8_LOCKABLE Oberfläche).
Die restlichen Einschränkungen für IDirect3DDevice9::UpdateSurface gelten weiterhin.
Direct3D-Ressourcen können jetzt von Geräten oder Prozessen gemeinsam genutzt werden. Dies gilt für alle Direct3D-Ressourcen, einschließlich Texturen, Vertexpuffern, Indexpuffern oder Oberflächen (z. B. Renderziele, Tiefenschablonenpuffer oder einfache Oberflächen außerhalb des Bildschirms). Um freigegeben zu werden, müssen Sie zum Zeitpunkt der Erstellung eine Ressource für die Freigabe festlegen und die Ressource im Standardpool suchen (D3DPOOL_DEFAULT). Sobald eine Ressource für die Freigabe erstellt wurde, kann sie auf allen Geräten innerhalb eines Prozesses oder prozessübergreifend freigegeben werden.
Um freigegebene Ressourcen zu aktivieren, verfügen die RESSOURCENerstellungs-APIs über einen zusätzlichen Handle-Parameter. 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, damit keine Ressource freigegeben wird. Dies entspricht dem Verhalten von DirectX vor Windows Vista.
- Um eine freigegebene Ressource zu erstellen, rufen Sie eine beliebige API zur Ressourcenerstellung (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 zu öffnen und darauf zuzugreifen. 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.
Zu den APIs zur Ressourcenerstellung gehören CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBuffer, CreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceEx und 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 usw.
- Wenn Sie eine freigegebene Ressource öffnen, müssen Sie D3DPOOL_DEFAULT angeben.
- Sperrbare Ressourcen (Texturen mit D3DUSAGE_DYNAMIC, Vertexpuffer und Indexpuffer für instance) können eine schlechte Leistung erzielen, wenn sie freigegeben werden. Sperrbare Rendertargets können auf einer Hardware nicht freigegeben werden.
- Verweise auf eine prozessübergreifende freigegebene Ressource müssen die gleichen Dimensionen wie die ursprüngliche Ressource aufweisen. 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 eines Verweisenden Prozesses auf der Oberfläche wider, wenn erwartet. Um eine Synchronisierung bereitzustellen, verwenden Sie Ereignisabfragen, oder sperren Sie die Textur.
- 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, gibt es keine Überprüfung für andere Prozesse, um festzustellen, ob die Ressource verfügbar ist.
Sie können jetzt überprüfen, ob das Gerät Pipelinedaten vor der Framepuffermischung in sRGB konvertieren kann. Dies impliziert, dass das Gerät die Renderzielwerte aus sRGB konvertiert. Um festzustellen, ob die Konvertierung von der Hardware unterstützt wird, überprüfen Sie, ob diese Obergrenze vorhanden ist:
D3DPMISCCAPS_POSTBLENDSRGBCONVERT
Diese Obergrenze identifiziert Hardware, die vor dem Mischen die Konvertierung in sRGB unterstützt. Diese Funktion ist wichtig für das qualitativ hochwertige Rendering von fp16-Framepuffern im Desktopfenster-Manager (DWM).
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 es Treibern, spezielle Fälle in der Hardware zu verarbeiten.
Im Allgemeinen besteht die einzige verbleibende Einschränkung darin, dass das Renderziel mit Renderzielverwendung (D3DUSAGE_RENDERTARGET) erstellt worden sein muss. Diese Einschränkung wird aufgehoben, wenn Sie eine einfache Kopie durchführen (wobei quell und dest das gleiche Format, die gleiche Größe haben und keine Untergeordneten Rechtecke vorhanden sind).
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-Systemspeicher-Bitmapzeiger erstellen.
Sie müssen zwei Dinge tun, um eine solche Textur zu erstellen:
- Weisen 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 ihre 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 Systemspeichertextur gelten die folgenden Einschränkungen:
- Der Texturabstand muss der Texturbreite mal der Anzahl von Bytes pro Pixel entsprechen.
- Bei Verwendung komprimierter Formate (DXT-Formate) ist die Anwendung für die Zuweisung der richtigen Größe verantwortlich.
- Es werden nur Texturen mit einer einzelnen Mipmap-Ebene unterstützt.
- Der an CreateTexture für das Argument Pool übergebene Wert muss D3DPOOL_SYSTEMMEM sein.
- Diese API umschließt den bereitgestellten Arbeitsspeicher in einer Textur. Heben Sie die Zuordnung dieses Speichers erst auf, wenn Sie damit fertig sind.