Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
GPU-preemptionsmodellen uppdaterades i Windows 8 (WDDM 1.2). Operativsystemet i den uppdaterade modellen:
- Tillåter inte att visningsdrivrutinen i kernelläge (KMD) inaktiverar preemptionen av GPU DMA-paket.
- Garanterar att begäranden om förebyggande åtgärder skickas till GPU:n innan den initierar en TDR-process (Timeout Detection and Recovery).
| Krav | Beskrivning |
|---|---|
| Drivrutinsimplementering – Endast fullständig grafik och återgivning | Obligatorisk |
| KRAV och tester för WHLK | Device.Graphics... Preemption Test, Device.Graphics... FlipOnVSyncMmIo |
Om operativsystemet inte kan föregripa tidskrävande paket kan du:
- GPU-arbete med hög prioritet (till exempel arbete som krävs av Desktop Window Manager (DWM)) kan fördröjas. Den här fördröjningen resulterar i problem under fönsterövergångar och animeringar.
- TDR-processen kan återställa GPU:n upprepade gånger och så småningom orsaka en systemfelkontroll.
Alla WDDM 1.2 KMD måste ha stöd för Windows 8-preemptionsmodellen. Vid drift kan dock WDDM 1.2-drivrutiner också avvisa Windows 8-preemptionsmodellen och istället behålla beteendet från Windows 7 med hjälp av DirectX-grafikkärnundersystemets (Dxgkrnl) schemaläggare.
Gränssnitt för GPU-preemption
KMD kan använda följande DDI:er för att implementera Windows 8 GPU-preemptionsmodellen.
- DxgkCbCreateContextAllocation
- DxgkCbDestroyContextAllocation
- pfnSetPriorityCb
- Dxgkrnl-gränssnitt
- DXGKRNL_INTERFACE
- D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY
- D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY
- D3DKMDT_PREEMPTION_CAPS
- D3DKMT_QUERYADAPTERINFO
- DXGK_DRIVERCAPS
- DXGK_SUBMITCOMMANDFLAGS
- DXGK_VIDSCHCAPS
- DXGKARGCB_CREATECONTEXTALLOCATION
Implementeringssteg för drivrutin
Följ dessa allmänna steg för att implementera Windows 8 GPU-preemptionsmodellen i din KMD:
- Kompilera drivrutinen mot rubriker som har DXGKDDI_INTERFACE_VERSION>= DXGKDDI_INTERFACE_VERSION_WIN8.
- Deklarera stöd för Windows 8 GPU-preemptionsmodellen genom att ange PreemptionAware - och MultiEngineAware-medlemmarna i DXGK_VIDSCHCAPS-strukturen till 1. Om du vill stödja Windows 7-preemption-modellen anger du PreemptionAware till noll.
- Ange den nivå av preemptionskornighet som stöds i D3DKMDT_PREEMPTION_CAPS-strukturen , som tar konstanta värden från D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY och D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY uppräkningar.
- Om maskinvaran stöder lat kontextväxling ska du skicka en buffert med noll längd till funktionen DxgkDdiSubmitCommand och ange medlemmen pSubmitCommand->Flags->ContextSwitch till 1. Observera diskussionen under ContextSwitch-medlemmen i strukturen DXGK_SUBMITCOMMANDFLAGS.
- Ange GPU-kontextallokeringar och enhetskontextallokeringar genom att anropa funktionen DxgkCbCreateContextAllocation . Observera de specifika instruktioner och begränsningar som anges i Kommentarer för funktionen.
- Anropa funktionen DxgkCbDestroyContextAllocation för att förstöra GPU-kontextallokeringar och enhetskontextallokeringar som skapades med DxgkCbCreateContextAllocation.
- När du förbereder DMA-bufferten som svar på ett anrop till funktionen DxgkDdiBuildPagingBuffer initierar du kontextresursen genom att fylla i den interna strukturen InitContextResource i den DXGKARG_BUILDPAGINGBUFFER strukturen. Om kontextresurser avlägsnas eller flyttas bevarar videominneshanteraren innehållet i kontextresurserna.
- Drivrutinen måste stödja minnesmappad I/O-skärmvändning vid nästa lodräta synkronisering. I Windows 8 försöker GPU-schemaläggaren att avbryta maskinvaran även om skärmvändningar är väntande. Därför måste drivrutinen stödja den minnesmappade I/O-vändmodellen för att förhindra att artefakter slits och återges och måste ange FlipOnVSyncMmIo-medlemmen i DXGK_FLIPCAPS-strukturen till 1 och stödja de åtgärder som beskrivs under FlipOnVSyncMmIo.
Överväganden för minnesmappning i implementeringen
Följ den här vägledningen för att skapa en robust drivrutin som stöder Windows 8 GPU-preemptionsmodellen och ger en användarupplevelse av hög kvalitet:
- Begär mitten av DMA-buffertpreemption från GPU:n när Dxgkrnl-schemaläggaren skickar ett preemption-kommando. Maskinvaruenheter som har en finare kornighet i mitten av DMA-buffertpreemption bör ge en bättre kundupplevelse.
- Tillåt att växlingskommandots stängsel-ID:er återanvänds: om en begäran om preemption resulterade i förinställda växlingskommandon i maskinvarukön skickar Dxgkrnl-schemaläggaren om förinställda växlingskommandon med samma stängsel-ID:t som ursprungligen användes för dem, och växlingskommandona schemaläggs före andra kommandon på motorn. Icke-växlingskommandon skickas på nytt med nyligen tilldelade stängsel-ID:er.
- Ange en lista över korrigeringsplatser för delade DMA-buffertar. Mer information finns i Dela upp en DMA-buffert.
- Ett verifieringsläge, kallat bindningsläckageidentifiering, är tillgängligt. Det här verifieringsläget går igenom listan över korrigeringsplatser och avvisar paket som inte avbinds eller som inte omprogrammerar allokeringar för varje delat paket. Viss maskinvara stöder virtuella adresser, vilket ger en extra indirekt nivå som kan göra verifieringen onödig. För att ange att drivrutinen väljer bort verifieringsläget, ställ in NoDmaPatching för medlemmen i DXGK_VIDSCHCAPS strukturen till 1.
- I Windows 7 garanterar Dxgkrnl-schemaläggaren att alla delade DMA-paket som motsvarar samma återgivningskommando körs sekventiellt utan att växla till en annan återgivningskontext. I Windows 8-preemptionsmodellen kan schemaläggaren köra renderningspaket från en annan kontext mellan två delade paket som motsvarar samma återgivningskommando. Därför bör drivrutiner som är medvetna om preemption hantera en delad/partiell DMA-paketöverföring på samma sätt som en vanlig fullständig paketöverföring. I synnerhet måste GPU-tillståndet sparas eller återställas vid gränsen för sådana inlämningar.
- En preemptionsmedveten drivrutin får inte ändra innehållet i en delad DMA-buffert när den sänds till flera kort i LDA-läge (linked display adapter), där flera fysiska GPU:er är länkade till en enda, snabbare, virtuell GPU. I Windows 8-preemptionsmodellen garanterar Dxgkrnl-schemaläggaren inte längre synkron körning av en sekvens med delade paket utan att växla till en annan kontext. En drivrutin som ändrade innehållet i ett delat DMA-paket skulle äventyra integriteten för paketets data. Mer specifikt, om paketet kördes på en annan motor, skulle det fungera på samma kopia av DMA-buffertdata.
- I Windows 8 GPU-preemptionsmodellen möjliggör Dxgkrnl-schemaläggaren preemption för paket som har associerade synkroniseringsprimitiver för "signal vid inlämning". Om en enhet använder synkroniseringsprimitiver av typen "signal vid avsändning" med maskinvarubaserade väntetillstånd, måste den stödja möjligheten att avbryta en vänteinstruktion innan väntevillkoret uppfylls.
Krav för maskinvarucertifiering
Information om de krav som maskinvaruenheter måste uppfylla när de implementerar den här funktionen finns i relevant WHLK-dokumentation på Device.Graphics... Preemption Test och Device.Graphics... FlipOnVSyncMmIo.