Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I Microsoft Direct3D 12 finns inte längre det omedelbara läget för tidigare versioner. I stället skapar appar kommandolistor och paket och registrerar sedan uppsättningar med GPU-kommandon. Kommandoköer används för att skicka kommandolistor som ska köras. Den här modellen gör det möjligt för utvecklare att ha mer kontroll över den effektiva användningen av både grafikprocessorn (GPU) och CPU.
- översikt över kommandokö
- Initiering av en kommandokö
- Utför kommandolisterna
- Åtkomst till resurser från flera kommandoköer
- Synkronisera körning av kommandolista med hjälp av kommandoköstängsel
- Synkronisera resurser som används av kommandoköer
- Kommandokö-stöd för tesselerade resurser
- Relaterade ämnen
Översikt över kommandokö
Direct3D 12-kommandoköer ersätter körnings- och drivrutinssynkronisering av omedelbar arbetsöverföring i läget, som tidigare inte exponerades för utvecklaren, med API:er för att uttryckligen hantera samtidighet, parallellitet och synkronisering. Kommandoköer ger följande förbättringar för utvecklare:
- Gör att utvecklare kan undvika oavsiktliga ineffektiviteter som orsakas av oväntad synkronisering.
- Gör att utvecklare kan introducera synkronisering på en högre nivå där den nödvändiga synkroniseringen kan fastställas mer effektivt och korrekt. Det innebär att körningen och grafikdrivrutinen ägnar mindre tid åt att reaktivt konstruera parallellitet.
- Gör dyra åtgärder mer explicita.
Dessa förbättringar möjliggör eller förbättrar följande scenarier:
- Ökad parallellitet – Program kan använda djupare köer för bakgrundsarbetsbelastningar, till exempel videoavkodning, när de har separata köer för förgrundsarbete.
- Asynkront och lågprioriterat GPU-arbete – Kommandokömodellen möjliggör samtidig körning av GPU-arbete med låg prioritet och atomiska åtgärder som gör att en GPU-tråd kan använda resultatet av en annan osynkroniserad tråd utan att blockera.
- Högprioriterat beräkningsarbete – Med den här designen kan scenarier som kräver avbrytande 3D-återgivning utföra en liten mängd beräkningsarbete med hög prioritet så att resultatet kan hämtas tidigt för ytterligare bearbetning av processorn.
Initiera en kommandokö
Kommandoköer kan skapas genom att anropa ID3D12Enhet::CreateCommandQueue. Den här metoden tar en D3D12_COMMAND_LIST_TYPE som anger vilken typ av kö som ska skapas och därför vilken typ av kommandon som kan skickas till kön. Kom ihåg att paket endast kan anropas från direktkommandolistor och inte kan skickas direkt till en kö. De kötyper som stöds är:
I allmänhet accepterar DIRECT-köer och kommandolistor alla kommandon, COMPUTE-köer och kommandolistor accepterar beräknings- och kopieringsrelaterade kommandon, och COPY-köer och kommandolistor accepterar endast kopieringskommandon.
Utför kommandolistor
När du har spelat in en kommandolista och antingen hämtat standardkommandokön eller skapat en ny, kör du kommandolistor genom att anropa ID3D12CommandQueue::ExecuteCommandLists.
Program kan skicka kommandolistor till valfri kommandokö från flera trådar. Körtiden utför arbetet med att serialisera dessa begäranden i den ordning de skickas in.
Körtiden validerar den skickade kommandolistan och utelämnar anropet till ExecuteCommandLists om någon av begränsningarna överträds. Samtal tas bort av följande skäl:
- Den angivna kommandolistan är ett paket, inte en direkt kommandolista.
- ID3D12GraphicsCommandList::Close har inte anropats i den angivna kommandolistan för att slutföra inspelningen.
- ID3D12CommandAllocator::Återställ har anropats på kommandoallokeraren som är associerad med kommandolistan sedan den spelades in. Mer information om kommandoallokerare finns i Skapa och registrera kommandolistor och paket.
- Kommandoköstaketet anger att en tidigare körning av kommandolistan ännu inte har slutförts. Kommandokö-staket beskrivs i detalj nedan.
- Före- och eftertillstånd för frågor, som anges med anrop till ID3D12GraphicsCommandList::BeginQuery och ID3D12GraphicsCommandList::EndQuery, matchas inte korrekt.
- Före- och eftertillstånden för resursövergångsbarriärer matchas inte korrekt. Mer information finns i Använda resursbarriärer för att synkronisera resurstillstånd.
Åtkomst till resurser från flera kommandoköer
Det finns ett par regler som införts av körningen som begränsar åtkomsten till resurser från flera kommandoköer. Dessa regler är följande:
Det går inte att skriva en resurs till från flera kommandoköer samtidigt. När en resurs har övergått till ett skrivbart tillstånd i en kö anses den vara exklusivt ägd av kön och måste övergå till ett läs- eller COMMON-tillstånd (se D3D12_RESOURCE_STATES) innan den kan nås av en annan kö.
När en resurs är i lästillstånd kan den läsas från flera kommandoköer samtidigt, inklusive mellan processer, baserat på dess lästillstånd.
Mer information om begränsningar för resursåtkomst och hur du använder resursbarriärer för att synkronisera åtkomst till resurser finns i Använda resursbarriärer för att synkronisera resurstillstånd.
Synkronisera körning av kommandolista med hjälp av kommandoköbarriärer
Stödet för flera parallella kommandoköer i Direct3D 12 ger dig mer flexibilitet och kontroll över prioriteringen av asynkront arbete på GPU:n. Den här designen innebär också att appar uttryckligen måste hantera synkroniseringen av arbete, särskilt när kommandolistorna i en kö är beroende av resurser som körs i en annan kommandokö. Några exempel på detta är att vänta på att en åtgärd i en beräkningskö ska slutföras så att resultatet kan användas för en återgivningsåtgärd i 3D-kön och väntar på att en 3D-åtgärd ska slutföras så att en åtgärd i beräkningskö kan komma åt en resurs för skrivning. För att aktivera synkronisering av arbete mellan köer använder Direct3D 12 begreppet stängsel, som representeras i API:et av ID3D12Fence-gränssnittet.
Ett staket är ett heltal som representerar den aktuella arbetsenheten som bearbetas. När appen flyttar fram stängslet genom att anropa ID3D12CommandQueue::Signal, uppdateras heltalet. Appar kan kontrollera värdet för ett staket och avgöra om en arbetsenhet har slutförts för att avgöra om en efterföljande åtgärd kan startas.
Synkronisera resurser som åtkoms av kommandoköer
I Direct3D 12 implementeras synkronisering av tillståndet för vissa resurser med resursbarriärer. Vid varje resursbarriär deklarerar en app tillståndet före och efter för en resurs. Ett vanligt exempel är att en resurs övergår mellan en skuggningsresursvy till en återgivningsmålvy. För det mesta hanteras dessa resursbarriärer i kommandolistor. När felsökningsskikten är aktiverade framtvingar systemet att före- och eftertillstånden för alla resurser matchar, vilket garanterar att resursen är i rätt tillstånd för en viss åtgärd vid en barriärövergång.
Mer information om hur du synkroniserar resurstillstånd finns i Använda resursbarriärer för att synkronisera resurstillstånd.
Stöd för kommandoköer för tillagda resurser
Metoder för att hantera tillagda resurser, som exponerades via ID3D11DeviceContext2-gränssnittet i Direct3D 11, tillhandahålls av ID3D12CommandQueue-gränssnittet i Direct3D 12. Dessa metoder omfattar:
| Metod | Beskrivning |
|---|---|
| CopyTileMappings | Kopierar mappningar från en källkaklad resurs till en målkaklad resurs. |
| UpdateTileMappings | Uppdaterar mappningar av panelplatser i tilldelade resurser till minnesplatser i en ressurshög. |
Mer information om hur du använder tillagda resurser i Direct3D 12-appar finns i Direct3D11 Tiled Resources.