Wisselketens
Wisselketens regelen de draaiing van de backbuffer, die de basis vormen van grafische animatie.
Overzicht
Het programmeermodel voor wisselketens in Direct3D 12 is niet identiek aan dat in eerdere versies van D3D. Het programmeergemak, bijvoorbeeld voor het ondersteunen van automatische resourcerotatie die aanwezig was in D3D10 en D3D11, wordt niet meer ondersteund. Apps waarvoor automatische resourcerotatie is ingeschakeld om hetzelfde API-object weer te geven terwijl het werkelijke oppervlak dat wordt weergegeven, elk frame wijzigt. Het gedrag van wisselketens wordt gewijzigd met Direct3D 12 om andere functies van Direct3D 12 in staat te stellen lage CPU-overhead te hebben. Automatische kleursleutel en multisampling worden niet ondersteund, hoewel met name stretching en rotatie nog steeds.
Bufferlevensduur
Apps mogen vooraf gemaakte descriptors opslaan die verwijzen naar backbuffers. Dit wordt ingeschakeld door ervoor te zorgen dat de set buffers die eigendom zijn van een wisselketen, nooit verandert voor de levensduur van de wisselketen. De set buffers die worden geretourneerd door IDXGISwapChain::GetBuffer- wordt pas gewijzigd als bepaalde API's worden aangeroepen:
De volgorde van buffers die worden geretourneerd door GetBuffer nooit verandert.
IDXGISwapChain3::GetCurrentBackBufferIndex retourneert de index van de huidige backbuffer naar de app.
Wisseleffecten
De enige ondersteunde wisseleffecten zijn DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL en DXGI_SWAP_EFFECT_FLIP_DISCARD, waarvoor het aantal buffers groter moet zijn dan één.
Schakelen tussen venstermodus en modus voor volledig scherm
Direct3D 12 biedt geen ondersteuning voor volledig scherm exclusieve modus (FSE). In plaats daarvan, wanneer een game de enige zichtbare toepassing op het scherm is, gebruikt het besturingssysteem een strategie genaamd optimalisaties op volledig scherm (FSO) om een vergelijkbaar effect te bereiken als FSE zonder de prestatienadelen. Zie Demystifying Fullscreen Optimizationsvoor meer informatie over FSO.
Direct3D 12 handhaaft de beperking die toepassingen moeten aanroepen ResizeBuffers na de overgang tussen venster- en volledig schermmodi (D3D11 flip-model wisselketens hebben dezelfde beperkingen).
De IDXGISwapChain::SetFullscreenState overgangen wijzigen de set app-zichtbare buffers in de wisselketen niet. Alleen de ResizeBuffers en ResizeTarget aanroepen maken of vernietigen app-zichtbare buffers. In Direct3D 12 IDXGISwapChain::SetFullscreenState wordt echter niet de exclusieve modus voor volledig scherm geactiveerd en worden oplossingen en vernieuwingsfrequenties gewijzigd om optimalisaties op volledig scherm mogelijk te maken. Deze wijzigingen kunnen worden aangebracht door een app zonder gebruik te maken van deze methode
Wanneer of IDXGISwapChain::P resent of IDXGISwapChain1::P resent wordt aangeroepen, moet de te presenteren backbuffer de status D3D12_RESOURCE_STATE_PRESENT hebben. Aanwezig mislukt met DXGI_ERROR_INVALID_CALL als dit niet het geval is.
Wisselketens in volledig scherm blijven de beperking hebben die SetFullscreenState(FALSE, NULL) moet worden aangeroepen vóór de definitieve release van de wisselketen. SetFullscreenState(FALSE) slaagt in wisselketens die worden uitgevoerd op Direct3D 12-apparaten.
De huidige bewerkingen worden uitgevoerd in de 3D-wachtrij die is opgegeven bij het maken van de wisselketen en apps kunnen gelijktijdig meerdere wisselketens presenteren, en opdrachtenlijsten vastleggen en uitvoeren.
Wanneer het laatste deel van het grafische werk (bijvoorbeeld frame postprocessing) wordt uitgevoerd in een rekenwachtrij of niet de grafische wachtrij van het apparaat, kan het maken van een tweede 3D-wachtrij nuttig zijn en voorkomen dat de latentie van de presentatie het begin van het volgende frame vertraagt.
Voorbeeld
De volgende voorbeeldcode zou aanwezig zijn in de hoofdrenderingslus:
void Present()
{
m_swapChain->Present(0, m_presentFlags);
m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}
Wisselketens maken
Wanneer u de CreateSwapChainForHwnd, CreateSwapChainForCoreWindowof CreateSwapChainForComposition aanroepen gebruikt, moet de parameter pDevice eigenlijk een aanwijzer naar een directe opdrachtwachtrij in Direct3D 12 en geen apparaat vereisen.
Presenteren in Windows 7
Bij het richten van Direct3D 12 op Windows 7 zijn de benodigde DXGI-typen voor Direct3D 12 niet aanwezig, dus u moet de D3D12On7-opgegeven ID3D12CommandQueueDownLevel (opgevraagd uit de wachtrij voor directe opdrachten) gebruiken om te presenteren.
U geeft een open opdrachtlijst op voor de huidige Windows 7-methode, die vervolgens wordt gebruikt, gesloten en automatisch voor u naar het apparaat wordt verzonden. U moet een backbuffer opgeven die door de app moet worden gemaakt, moet een vastgelegde resource zijn, moet één steekproef hebben en moet een van de volgende indelingen hebben.
- 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