Swapchains
Swap chains steuern die Rückwärtspufferrotation und bilden die Grundlage der Grafikanimation.
Übersicht
Das Programmiermodell für Swap chains in Direct3D 12 ist nicht mit dem in früheren Versionen von D3D identisch. Die Programmierfreundlichkeit der Unterstützung der automatischen Ressourcenrotation, die in D3D10 und D3D11 vorhanden war, wird nicht mehr unterstützt. Apps mit automatischer Ressourcenrotation können dasselbe API-Objekt rendern, während die tatsächliche Oberfläche, die gerendert wird, jeden Frame ändert. Das Verhalten von Swapchains wird mit Direct3D 12 geändert, um anderen Features von Direct3D 12 einen geringen CPU-Mehraufwand zu ermöglichen. Automatische Farbtasten und Multisampling werden nicht unterstützt, obwohl insbesondere dehnungs- und drehungsaktiv sind.
Pufferlebensdauer
Apps dürfen vorab erstellte Deskriptoren speichern, die auf Back-Puffer verweisen Dies wird aktiviert, indem sichergestellt wird, dass sich der Satz von Puffern, die einer Swapkette gehören, während der Lebensdauer der Swapchain nie ändert. Der Von IDXGISwapChain::GetBuffer zurückgegebene Puffersatz ändert sich erst, wenn bestimmte APIs aufgerufen werden:
Die Reihenfolge der von GetBuffer zurückgegebenen Puffer ändert sich nie.
IDXGISwapChain3::GetCurrentBackBufferIndex gibt den Index des aktuellen Backpuffers an die App zurück.
Tauscheffekte
Die einzigen unterstützten Swapeffekte sind DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL und DXGI_SWAP_EFFECT_FLIP_DISCARD, sodass die Pufferanzahl größer als eins sein muss.
Übergang zwischen Fenstermodus und Vollbildmodus
Direct3D 12 unterstützt den exklusiven Vollbildmodus (Fullscreen Exclusive Mode, FSE) nicht. Wenn ein Spiel die einzige sichtbare Anwendung auf dem Bildschirm ist, verwendet das Betriebssystem stattdessen eine Strategie namens Vollbildoptimierungen (FSO), um einen ähnlichen Effekt wie FSE ohne Leistungseinbußen zu erzielen. Weitere Informationen zum einmaligen Anmelden finden Sie unter Demystifizieren von Vollbildoptimierungen.
Direct3D 12 behält die Einschränkung bei, dass Anwendungen ResizeBuffers nach dem Übergang zwischen Fenster- und Vollbildmodus aufrufen müssen (D3D11-Flipmodell-Swapketten haben dieselben Einschränkungen).
Die IDXGISwapChain::SetFullscreenState-Übergänge ändern nicht den Satz von app-sichtbaren Puffern in der Swap chain. Nur die Aufrufe ResizeBuffers und ResizeTarget erstellen oder zerstören app-sichtbare Puffer. In Direct3D 12 IDXGISwapChain::SetFullscreenState wechselt jedoch nicht in den exklusiven Vollbildmodus und ändert einfach Auflösungen und Aktualisierungsraten, um Vollbildoptimierungen zu ermöglichen. Diese Änderungen können von einer App ohne die Verwendung dieser Methode vorgenommen werden.
Wenn oder IDXGISwapChain::P resent oder IDXGISwapChain1::P resent aufgerufen wird, muss sich der anzuzeigende Backpuffer im D3D12_RESOURCE_STATE_PRESENT Zustand befinden. Present schlägt mit DXGI_ERROR_INVALID_CALL fehl, wenn dies nicht der Fall ist.
Für Vollbild-Swapketten gilt weiterhin die Einschränkung, dass SetFullscreenState(FALSE, NULL) vor dem endgültigen Release der Swap chain aufgerufen werden muss. SetFullscreenState(FALSE) ist auf Swapchain erfolgreich, die auf Direct3D 12-Geräten ausgeführt werden.
Aktuelle Vorgänge werden in der 3D-Warteschlange ausgeführt, die bei der Swapchainerstellung bereitgestellt wird, und Apps können mehrere Swapchains gleichzeitig darstellen und Befehlslisten aufzeichnen und ausführen.
Wenn der letzte Teil der Grafikarbeit (z. B. frame postprocessing) in einer Computewarteschlange ausgeführt wird oder nicht die Grafikwarteschlange des Geräts umfasst, kann das Erstellen einer zweiten 3D-Warteschlange für die Präsentation von Vorteil sein und verhindern, dass die Wartezeit der Präsentation den Start des nächsten Frames verzögert.
Beispiel
Der folgende Beispielcode wäre in der Standard Renderingschleife vorhanden:
void Present()
{
m_swapChain->Present(0, m_presentFlags);
m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}
Erstellen von Swapchains
Beachten Sie bei Verwendung der Aufrufe CreateSwapChainForHwnd, CreateSwapChainForCoreWindow oder CreateSwapChainForComposition , dass der pDevice-Parameter tatsächlich einen Zeiger auf eine direkte Befehlswarteschlange in Direct3D 12 und nicht auf ein Gerät erfordert.
Präsentieren unter Windows 7
Wenn Direct3D 12 unter Windows 7 als Ziel verwendet wird, sind die erforderlichen DXGI-Typen für Direct3D 12 nicht vorhanden. Daher müssen Sie den von D3D12On7 bereitgestellten ID3D12CommandQueueDownLevel (von der direkten Befehlswarteschlange abgefragt) verwenden.
Sie stellen eine offene Befehlsliste für die vorhandene Windows 7-Methode bereit, die dann verwendet, geschlossen und automatisch an das Gerät für Sie übermittelt wird. Sie müssen einen Backpuffer bereitstellen, der von einer App erstellt werden muss, eine commitierte Ressource sein muss, eine Einzelsample sein muss und eines der folgenden Formate sein muss.
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
- DXGI_FORMAT_B8G8R8X8_UNORM
- DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB