Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In Microsoft Direct3D 12 is de directe modus van eerdere versies niet meer aanwezig. In plaats daarvan maken apps opdrachtenlijsten en bundels en nemen sets van GPU-opdrachten op. Opdrachtwachtrijen worden gebruikt om opdrachtlijsten te verzenden die moeten worden uitgevoerd. Met dit model kunnen ontwikkelaars meer controle hebben over het efficiënte gebruik van zowel GPU (Graphics Processing Unit) als CPU.
- Overzicht opdrachtwachtrij
- een opdrachtwachtrij initialiseren
- Opdrachtlijsten uitvoeren
- Toegang tot resources uit meerdere opdrachtwachtrijen
- Uitvoering van opdrachtlijst synchroniseren met behulp van opdrachtwachtrijheiningen
- Het synchroniseren van resources die toegankelijk zijn voor opdrachtwachtrijen
- ondersteuning voor opdrachtwachtrij voor tegelbronnen
- Verwante onderwerpen
Overzicht van opdrachtwachtrij
Direct3D 12-opdrachtwachtrijen vervangen de runtime- en stuurprogrammasynchronisatie van directe modus-werkverzending, die voorheen niet aan de ontwikkelaar werd blootgesteld, door API's voor het expliciet beheren van gelijktijdigheid, parallelle processen en synchronisatie. Opdrachtwachtrijen bieden de volgende verbeteringen voor ontwikkelaars:
- Hiermee kunnen ontwikkelaars onbedoelde inefficiënties voorkomen die worden veroorzaakt door onverwachte synchronisatie.
- Hiermee kunnen ontwikkelaars synchronisatie op een hoger niveau introduceren, waarbij de vereiste synchronisatie efficiënter en nauwkeuriger kan worden bepaald. Dit betekent dat de runtime en het grafische stuurprogramma minder tijd zullen besteden aan het reactief ontwikkelen van parallelle verwerking.
- Maakt dure bewerkingen explicieter.
Met deze verbeteringen worden de volgende scenario's mogelijk of verbeterd:
- Verhoogde parallelle uitvoering: toepassingen kunnen diepere wachtrijen gebruiken voor achtergrondworkloads, zoals videodecodering, wanneer ze afzonderlijke wachtrijen voor voorgrondwerk hebben.
- Asynchroon en GPU-werk met lage prioriteit: het opdrachtwachtrijmodel maakt gelijktijdige uitvoering van GPU-werk met lage prioriteit en atomische bewerkingen mogelijk waarmee één GPU-thread de resultaten van een andere niet-gesynchroniseerde thread kan gebruiken zonder te blokkeren.
- Rekenwerk met hoge prioriteit: met dit ontwerp kunnen scenario's waarvoor 3D-rendering moet worden onderbroken, een kleine hoeveelheid rekenwerk met hoge prioriteit uitvoeren, zodat het resultaat vroeg kan worden verkregen voor extra verwerking op de CPU.
Een opdrachtwachtrij initialiseren
Opdrachtwachtrijen kunnen worden gemaakt door ID3D12Device::CreateCommandQueueaan te roepen. Deze methode gebruikt een D3D12_COMMAND_LIST_TYPE die aangeeft welk type wachtrij moet worden gemaakt, en daarom welk type opdrachten kunnen worden verzonden naar die wachtrij. Houd er rekening mee dat bundels alleen kunnen worden aangeroepen vanuit lijsten met directe opdrachten en niet rechtstreeks naar een wachtrij kunnen worden verzonden. De ondersteunde wachtrijtypen zijn:
In het algemeen accepteren DIRECT-wachtrijen en opdrachtlijsten alle opdrachten, COMPUTE-wachtrijen en opdrachtlijsten reken- en kopieergerelateerde opdrachten, en COPY-wachtrijen en opdrachtlijsten accepteren alleen kopieeropdrachten.
Opdrachtlijsten uitvoeren
Nadat u een opdrachtlijst hebt opgenomen en de standaardopdrachtwachtrij hebt opgehaald of een nieuwe hebt gemaakt, voert u opdrachtlijsten uit door ID3D12CommandQueue::ExecuteCommandListsaan te roepen.
Toepassingen kunnen opdrachtlijsten verzenden naar elke opdrachtwachtrij vanuit meerdere threads. De runtime voert het werk uit van het serialiseren van deze aanvragen in de volgorde van indiening.
De runtime valideert de ingediende opdrachtlijst en verwijdert de aanroep naar ExecuteCommandLists als een van de beperkingen wordt geschonden. Oproepen worden om de volgende redenen verwijderd:
- De opgegeven opdrachtlijst is een bundel, geen directe opdrachtlijst.
- ID3D12GraphicsCommandList::Close is niet aangeroepen in de opgegeven opdrachtlijst om de opname te voltooien.
- ID3D12CommandAllocator::Reset is aangeroepen op de opdrachttoewijzing die is gekoppeld aan de opdrachtlijst sinds deze is vastgelegd. Zie Opdrachtlijsten en bundels maken en opnemenvoor meer informatie over opdrachttoewijzers.
- De omheining van de opdrachtwachtrij geeft aan dat een eerdere uitvoering van de opdrachtlijst nog niet is voltooid. De barrières van de opdrachtwachtrij worden hieronder in detail besproken.
- De voor- en nastatussen van query's, ingesteld met aanroepen naar ID3D12GraphicsCommandList::BeginQuery en ID3D12GraphicsCommandList::EndQuery, komen niet goed overeen.
- De voor- en nastaten van overgangsbarrières van hulpbronnen komen niet goed overeen. Zie Resourcebarrières gebruiken om resourcestatussen te synchroniserenvoor meer informatie.
Toegang tot resources vanuit meerdere opdrachtwachtrijen
Er zijn een aantal regels die worden opgelegd door de runtime waarmee de toegang van resources vanuit meerdere opdrachtwachtrijen wordt beperkt. Deze regels zijn als volgt:
Een resource kan niet tegelijkertijd vanuit meerdere opdrachtwachtrijen worden geschreven. Wanneer een resource is overgezet naar een schrijfbare status in een wachtrij, wordt deze beschouwd als exclusief eigendom van die wachtrij en moet deze overschakelen naar een lees- of COMMON-status (raadpleeg D3D12_RESOURCE_STATES) voordat deze kan worden geopend door een andere wachtrij.
Wanneer een resource een leesstatus heeft, kan een resource tegelijkertijd vanuit meerdere opdrachtwachtrijen worden gelezen, ook tussen processen, op basis van de leesstatus.
Zie Resourcebarrières gebruiken om resourcestatussen te synchroniserenvoor meer informatie over resourcetoegangsbeperkingen en het gebruik van resourcebarrières om toegang tot resources te synchroniseren.
Uitvoering van de opdrachtlijst synchroniseren met behulp van opdrachtwachtrijbarrières
De ondersteuning voor meerdere parallelle opdrachtwachtrijen in Direct3D 12 biedt meer flexibiliteit en controle over de prioriteitstelling van asynchroon werk op de GPU. Dit ontwerp betekent ook dat apps de synchronisatie van werk expliciet moeten beheren, met name wanneer de opdrachtlijsten in één wachtrij afhankelijk zijn van resources die worden beheerd door een andere opdrachtwachtrij. Enkele voorbeelden hiervan zijn wachten tot een bewerking in een rekenwachtrij is voltooid, zodat het resultaat kan worden gebruikt voor een renderingbewerking in de 3D-wachtrij en wacht tot een 3D-bewerking is voltooid, zodat een bewerking in de rekenwachtrij toegang heeft tot een resource voor schrijven. Om de synchronisatie van werk tussen wachtrijen mogelijk te maken, maakt Direct3D 12 gebruik van het concept van hekken, die worden weergegeven in de API door de ID3D12Fence interface.
Een omheining is een geheel getal dat de huidige werkeenheid vertegenwoordigt die wordt verwerkt. Wanneer de app de omheining verder brengt door ID3D12CommandQueue::Signalaan te roepen, wordt de integer bijgewerkt. Apps kunnen de waarde van een omheining controleren en bepalen of een werkeenheid is voltooid om te bepalen of een volgende bewerking kan worden gestart.
Het synchroniseren van bronnen die worden benaderd door commandoqueues
In Direct3D 12 wordt het synchroniseren van de status van sommige resources geïmplementeerd met resourcebarrières. Bij elke resourcebarrière declareert een app de voor- en nastatussen van een resource. Een veelvoorkomend voorbeeld is dat een resource overgaat van een shader-resourceweergave naar een renderdoelweergave. Voor het grootste deel worden deze resourcebarrières beheerd in opdrachtlijsten. Wanneer de foutopsporingslagen zijn ingeschakeld, dwingt het systeem af dat de voor- en nastatussen van alle resources overeenkomen, zodat de resource de juiste status heeft voor een bepaalde bewerking bij een overgang van een barrière.
Zie Resourcebarrières gebruiken om resourcestatussen te synchroniserenvoor meer informatie over het synchroniseren van resourcestatussen.
Ondersteuning voor opdrachtwachtrijen voor betegelde resources
Methoden voor het beheren van tegelresources, die beschikbaar zijn gesteld via de interface ID3D11DeviceContext2 in Direct3D 11, worden geleverd door de interface ID3D12CommandQueue in Direct3D 12. Deze methoden zijn onder andere:
| Methode | Beschrijving |
|---|---|
| CopyTileMappings | Hiermee kopieert u toewijzingen van een bronbetegelde resource naar een doelbetegelde resource. |
| UpdateTileMappings | Hiermee worden de toewijzingen van tegellocaties in tegelresources bijgewerkt naar geheugenlocaties in een resource-heap. |
Raadpleeg Direct3D11 Tiled Resourcesvoor meer informatie over het gebruik van tiled resources in Direct3D 12-toepassingen.