Dela via


Dela upp en DMA-buffert

Delningspunkter används av videominneshanteraren för att dela upp ett stort arbetsobjekt som skickas av miniportdrivrutinen för visning i mindre arbetsobjekt som kräver mindre GPU-resurser för att köras. En stor DMA-buffert kan till exempel referera till en uppsättning allokeringar som eventuellt inte får plats i det lokala videominnet eller icke-lokalt minne. Det enda sättet att bearbeta ett sådant arbetsobjekt är att dela upp det i flera mindre arbetsobjekt som kräver mindre GPU-resurser.

Obs DMA-buffertdelning och DMA-buffertpreemption är olika, oberoende begrepp. En miniportdrivrutin för visning måste alltid ha stöd för DMA-buffertdelning även i ett system med en GPU där DMA-buffertförpreemption inte är möjligt. I ett system med en GPU där det inte går att spara och återställa kontext schemalägger GPU-schemaläggaren delade delar av en DMA-buffert tillbaka till bakåt så att de delade delarna inte interfolieras med en annan DMA-buffert från en annan GPU-kontext. En växlingsbuffert bör dock skickas mellan delar av en delad DMA-buffert eftersom växlingsåtgärder krävs mellan delade delar av en DMA-buffert. Varje delningspunkt som drivrutinen använder för att skapa en program-DMA-ström används av videominneshanteraren. En skickad DMA-buffert bör omprogrammera GPU-statusen tillräckligt efter varje uppdelningspunkt för att ta hänsyn till en potentiell sidväxlingsbuffert som kan infogas på den platsen.

Om du vill ange delade punkter anger miniportdrivrutinen för visning värden i SplitOffset - och SlotId-medlemmarna i D3DDDI_PATCHLOCATIONLIST-strukturen för varje allokering som refereras till i AllocationIndex-medlemmen i D3DDDI_PATCHLOCATIONLIST. För att spåra allokeringsanvändning inom en viss DMA-buffert skapar videominneshanteraren de nödvändiga dimensionerna för en matris med hjälp av MaxAllocationListSlotId-medlemmen i den DXGK_DRIVERCAPS struktur som drivrutinen tillhandahöll via ett anrop till dess DxgkDdiQueryAdapterInfo-funktion . Den här matrisen initieras till noll och fylls i när delade poster av listan över patch-platser bearbetas. SlotId-medlemmen i D3DDDI_PATCHLOCATIONLIST för korrigeringsplatsen anger vilken rad i resurstabellen som måste uppdateras medan SplitOffset-medlemmen anger förskjutningen i DMA-bufferten där allokeringen krävs. DMA-bufferten kan köras upp till den punkt som anges av SplitOffset utan att resursen är tillgänglig för GPU:n. Om en ny delningsdelspost för korrigeringsplats refererar till samma SlotId ersätts den tidigare allokeringen av den nya allokeringen och den tidigare allokeringen inte längre krävs (det vill: den tidigare allokeringen kan vara utspänd).

När man hämtar de resurser som krävs av en DMA-buffert behandlar videominneshanteraren listan med korrigeringsplatser genom att börja med det första elementet och fortsätta nedåt till det sista elementet. De D3DDDI_PATCHLOCATIONLIST elementen som fylls i av drivrutinen måste innehålla värden i sina SplitOffset-medlemmar; Elementen ökar strikt (det vill säga, allokeringar måste visas i den ordning de används i strömmen). Videominneshanterarens sidor i allokeringar som refereras till i listan över korrigeringsplatser i den ordning de tillhandahålls. När en punkt nås där videominneshanteraren inte längre kan ladda in en allokering i minnet på grund av ett lågt minnestillstånd, skickar videominneshanteraren den aktuella delen av DMA-bufferten som förbereds till GPU-schemaläggaren för körning. DMA-bufferten körs från början av den föregående delningspunkten upp till det SplitOffset-värde som har angetts för en allokering som inte kunde tas in. När den har skickats avgör videominneshanteraren listan över nödvändiga allokeringar vid den aktuella delningsförskjutningen i DMA-strömmen med hjälp av resurstabellen. Alla allokeringar i tabellen behålls på den aktuella fysiska platsen medan andra allokeringar som inte längre används kan avlägsnas. Videominneshanteraren fortsätter sedan att bearbeta listan över korrigeringsplatser, vilket kan innebära att den delar upp processen flera gånger igen.

Drivrutinen bör ange avgränsningspunkter varje gång en allokering är bunden eller obunden. Om du vill ange att en allokering är obunden kan drivrutinen ange en NULL-allokeringsreferens i medlemmen hDeviceSpecificAllocation i DXGK_ALLOCATIONLIST struktur med lämpligt värde i SlotId-medlemmen i den associerade D3DDDI_PATCHLOCATIONLIST. Drivrutinen bör frigöra stora resurser för att öka sannolikheten att videominneshanteraren kan lösa komplexa problem med minnesplacering.

På samma sätt bör föraren omprogrammera stora resurser vid varje delningspunkt. När en delningspunkt tas tvingas videominneshanteraren att lämna en tidigare allokering bunden till föregående allokering. Detta orsakar fragmentering av minne som kan leda till att det inte går att lösa komplexa problem med minnesplacering som kan ha lösts om inte för den tidigare bundna allokeringsbegränsningen. Vid beräkning av tillståndet vid en delad punkt avgör videominneshanteraren vilken fackidentifierare (SlotId) som omprogrammeras vid den delningspunkten (det vill säga varje listelement för korrigeringsplats som delar samma SplitOffset-värde med andra element) och ignorerar placeringsbegränsningen på den här delningspunkten. Om drivrutinen till exempel använder en textur på 64 MB ger omprogrammering av den strukturen vid varje delningsplats videominneshanteraren flexibiliteten att flytta runt strukturen i minnet mellan delade punkter om det behövs.