Rozdělení vyrovnávací paměti DMA

Rozdělené body používají správce paměti videa k rozdělení velké pracovní položky odeslané ovladačem miniportu zobrazení na menší pracovní položky, které vyžadují méně prostředků GPU ke spuštění. Například velká vyrovnávací paměť DMA může odkazovat na sadu alokací, které se pravděpodobně nevejdou do lokální video paměti nebo nelokální paměti. Jediným způsobem, jak takovou pracovní položku zpracovat, je rozdělit ji na několik menších pracovních položek, které vyžadují méně prostředků GPU.

Poznámka Rozdělení vyrovnávací paměti DMA a preempce vyrovnávací paměti DMA jsou různé nezávislé koncepty. Ovladač miniportu displeje musí vždy podporovat rozdělení vyrovnávací paměti DMA i v systému s GPU, kde preempce vyrovnávací paměti DMA není možná. V systému s GPU, kde není možné uložit a obnovit kontext, plánovač GPU naplánuje rozdělené části vyrovnávací paměti DMA za sebou, aby se rozdělené části neprokládaly s jinou vyrovnávací pamětí DMA z jiného kontextu GPU. Vyrovnávací paměť stránkování by však měla být odeslána mezi částmi rozdělené vyrovnávací paměti DMA, protože operace stránkování jsou vyžadovány mezi těmito rozdělenými částmi. Každý rozdělený bod, který ovladač používá k sestavení datového proudu DMA aplikace, je používán správcem paměti videa. Odeslaná vyrovnávací paměť DMA by měla přeprogramovat stav GPU dostatečně po každém rozlišovacím bodu, aby zohlednila potenciální stránkovací vyrovnávací paměť, která by mohla být vložena do tohoto umístění.

Chcete-li určit body rozdělení, ovladač miniportu zobrazení specifikuje hodnoty členů SplitOffset a SlotId struktury D3DDDI_PATCHLOCATIONLIST pro každé přidělení, na které odkazuje člen AllocationIndex D3DDDI_PATCHLOCATIONLIST. Pokud chcete sledovat využití přidělení v rámci konkrétní vyrovnávací paměti DMA, videopaměťový správce vytvoří nutné rozměry pole pomocí MaxAllocationListSlotId člena DXGK_DRIVERCAPS struktury, kterou ovladač poskytl pomocí volání funkce DxgkDdiQueryAdapterInfo. Toto pole se inicializuje na nulu a naplní se, jakmile jsou zpracovány položky rozdělených částí seznamu umístění záplat. Člen SlotIdD3DDDI_PATCHLOCATIONLIST pro umístění opravy označuje, který řádek tabulky prostředků musí být aktualizován, zatímco člen SplitOffset označuje posun v vyrovnávací paměti DMA, kde je vyžadováno přidělení. Vyrovnávací paměť DMA lze spustit až do bodu určeného SplitOffsetem, aniž by byl prostředek přístupný GPU. Podobně, pokud nová položka pro rozdělení části oprav odkazuje na stejný SlotId, je předchozí přidělení nahrazeno novým a již není potřebné (to znamená, že předchozí přidělení může být stránkováno).

Při přidělování prostředků požadovaných vyrovnávací pamětí DMA správce video paměti zpracovává seznam umístění oprav tím, že začne s prvním prvkem a postupně se přesune k poslednímu prvku. Elementy D3DDDI_PATCHLOCATIONLIST, které vyplňuje ovladač, musí obsahovat hodnoty ve svých prvcích SplitOffset; prvky jsou přísně vzestupné (to znamená, že přidělení musí být v pořadí, v jakém se používají ve streamu). Správce paměti videa zpracovává přidělení, na které se odkazuje v seznamu umístění oprav, v pořadí, v jakém jsou uvedeny. Když je dosažen bod, kdy správce paměti videa už nemůže z důvodu nedostatku paměti načíst přidělení do paměti, správce paměti videa odešle aktuálně připravovanou část vyrovnávací paměti DMA plánovači GPU ke spuštění. Vyrovnávací paměť DMA je spuštěna od začátku předchozího rozdělovacího bodu až po hodnotu SplitOffset, která je určena pro přidělení, které nelze načíst. Po odeslání správce paměti videa zjišťuje seznam požadovaných přidělení v aktuálním místě rozdělení proudu dat DMA pomocí tabulky prostředků. Všechny alokace v tabulce se uchovávají na svém aktuálním fyzickém umístění, zatímco jiné alokace, které se již nepoužívají, mohou být vyřazeny. Správce paměti videa pak pokračuje ve zpracovávání seznamu umístění záplat a může jej znovu několikrát rozdělit.

Ovladač by měl určit rozdělovací body pokaždé, když je přidělení svázáno nebo rozvázáno. Aby bylo možné určit, že přidělení je nevázané, může ovladač zadat NULL jako popisovač přidělení v členu hDeviceSpecificAllocation struktury DXGK_ALLOCATIONLIST, s příslušnou hodnotou v členu SlotId přidružené struktury D3DDDI_PATCHLOCATIONLIST. Ovladač by měl zrušit vazbu velkých prostředků, aby se zvýšila pravděpodobnost, že správce videopaměti dokáže vyřešit složité problémy s umísťováním paměti.

Podobně by softwareový ovladač měl přeprogramovat velké prostředky na každém rozdělovacím bodě. Při dělení bodu je správce paměti videa nucen opustit dříve vázané přidělení k předchozímu přidělení. To způsobuje fragmentaci paměti, která může vést k selhání při řešení složitých problémů s umístěním paměti, které by mohly být vyřešeny, nebýt dříve stanoveného omezení přidělení. Při výpočtu stavu v rozděleném bodě správce paměti videa určuje, který identifikátor slotu (SlotId) se v tomto rozděleném bodě přeprogramuje (tj. každý prvek seznamu umístění oprav, který sdílí stejnou hodnotu SplitOffset s jinými prvky) a ignoruje omezení umístění tohoto rozděleného bodu. Pokud například ovladač používá texturu 64 MB, přeprogramování této textury v každém rozděleném bodě dává správci paměti videa flexibilitu pro přesunutí této textury v paměti mezi rozdělenými body v případě potřeby.