Delen via


Opdrachtenlijsten uitvoeren en synchroniseren

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 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:

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:

  1. 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.

  2. 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.

Werk indienen in Direct3D 12