Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Podział punktów jest używany przez menedżera pamięci wideo do dzielenia dużego elementu roboczego przesłanego przez sterownik miniportu wyświetlacza na mniejsze elementy robocze, które wymagają mniejszej ilości zasobów procesora GPU do wykonania. Na przykład duży bufor DMA może odwoływać się do zestawu alokacji, które być może nie zmieszczą się w lokalnej pamięci wideo lub w nielokalnej pamięci. Jedynym sposobem przetwarzania takiego elementu roboczego jest podzielenie go na wiele mniejszych elementów roboczych, które wymagają mniejszej ilości zasobów procesora GPU.
Uwaga Dzielenie buforu DMA i wywłaszczanie buforu DMA są różnymi, niezależnymi pojęciami. Sterownik miniportu wyświetlacza musi zawsze obsługiwać dzielenie buforu DMA nawet w systemie z procesorem GPU, gdzie nie jest możliwe wywłaszczanie buforu DMA. W systemie z procesorem GPU, gdzie zapisywanie i przywracanie kontekstu nie jest możliwe, harmonogram procesora GPU planuje podzielone części buforu DMA jeden po drugim, chroniąc, aby podzielone części nie były mieszane z innym buforem DMA pochodzącym z innego kontekstu GPU. Bufor stronicowania powinien jednak zostać przesłany między częściami podzielonego buforu DMA, ponieważ operacje stronicowania są wymagane między podzielonymi częściami buforu DMA. Każdy punkt podziału używany przez sterownik do tworzenia strumienia DMA aplikacji jest używany przez menedżera pamięci wideo. Przesłany bufor DMA powinien przeprogramować wystarczający stan GPU po każdym punkcie podziału, aby uwzględnić możliwość wstawienia potencjalnego bufora stronicowania w tej lokalizacji.
Aby określić punkty podziału, sterownik miniportu wyświetlania określa wartości w elementach członkowskich SplitOffset i SlotId struktury D3DDDI_PATCHLOCATIONLIST dla każdej alokacji, do której odwołuje się element członkowski AllocationIndex D3DDDI_PATCHLOCATIONLIST. Aby monitorować użycie alokacji w określonym buforze DMA, menedżer pamięci wideo tworzy wymagane wymiary tablicy za pomocą elementu członkowskiego MaxAllocationListSlotId struktury DXGK_DRIVERCAPS, dostarczonego przez sterownik za pośrednictwem wywołania funkcji DxgkDdiQueryAdapterInfo. Ta tablica jest inicjowana z wartością zero i jest wypełniana w miarę przetwarzania wpisów części podzielonej listy patch-location. Członek SlotId w D3DDDI_PATCHLOCATIONLIST dla lokalizacji łatki wskazuje, który wiersz tabeli zasobów musi zostać zaktualizowany, podczas gdy członek SplitOffset wskazuje przesunięcie w buforze DMA, gdzie wymagana jest alokacja. Bufor DMA można uruchomić do punktu określonego przez SplitOffset bez dostępności zasobu dla procesora GPU. Podobnie, jeśli nowy wpis dotyczący lokalizacji podziału poprawek odnosi się do tego samego identyfikatora SlotId, poprzednia alokacja jest zastępowana przez nową, a wcześniejsza alokacja nie jest już potrzebna (to znaczy, że poprzednia alokacja może zostać usunięta z pamięci).
Podczas stronicowania zasobów wymaganych przez bufor DMA menedżer pamięci wideo przetwarza listę poprawek, zaczynając od pierwszego elementu i przechodząc w dół w kierunku ostatniego elementu. Elementy D3DDDI_PATCHLOCATIONLIST wypełnione przez sterownik muszą zawierać wartości w ich elementach członkowskich SplitOffset ; elementy są ściśle rosnące (czyli alokacje muszą pojawiać się w kolejności, w której są używane w strumieniu). Menedżer pamięci wideo ładuje alokacje, do których odwołuje się lista lokalizacji poprawek, w podanej kolejności. Po osiągnięciu punktu, w którym menedżer pamięci wideo nie może już załadować alokacji z powodu niskiego stanu pamięci, menedżer pamięci wideo przesyła bieżącą część przygotowywanego buforu DMA do harmonogramu GPU w celu wykonania. Bufor DMA jest uruchamiany od początku poprzedniego punktu podziału do wartości SplitOffset określonej dla alokacji, która nie może zostać wprowadzona. Po przesłaniu menedżer pamięci wideo określa listę wymaganych alokacji na bieżącym przesunięciu podziału w strumieniu DMA przy użyciu tabeli zasobów. Wszystkie alokacje w tabeli są przechowywane w bieżącej lokalizacji fizycznej, podczas gdy inne alokacje, które nie są już używane, mogą być usunięte. Menedżer pamięci wideo będzie następnie przetwarzać listę lokalizacji poprawek, co może spowodować ponowne podzielenie.
Sterownik powinien określać punkty podziału za każdym razem, gdy alokacja jest powiązana lub rozłączona. Aby określić, że alokacja jest niezwiązana, sterownik może określić uchwyt alokacji NULL w elemencie hDeviceSpecificAllocation struktury DXGK_ALLOCATIONLIST z odpowiednią wartością w elemencie SlotId skojarzonego D3DDDI_PATCHLOCATIONLIST. Sterownik powinien cofnąć powiązanie dużych zasobów, aby zwiększyć prawdopodobieństwo, że menedżer pamięci wideo może rozwiązać złożone problemy z umieszczaniem pamięci.
Podobnie sterownik powinien przeprogramować duże zasoby w każdym punkcie podziału. Podczas dzielenia punktu menedżer pamięci wideo jest zmuszony do pozostawienia wcześniej powiązanej alokacji z poprzednią alokacją. Powoduje to fragmentację pamięci, która może prowadzić do problemów w rozwiązywaniu złożonych problemów z umieszczaniem danych w pamięci, które mogły zostać rozwiązane, gdyby nie wcześniejsze ograniczenia dotyczące alokacji. Podczas obliczania stanu w punkcie podziału menedżer pamięci wideo określa, który identyfikator miejsca (SlotId) jest przeprogramowany w tym punkcie podziału (czyli każdy element listy lokalizacji poprawek, który współużytruje tę samą wartość splitOffset z innymi elementami) i ignoruje ograniczenie umieszczania w tym punkcie podziału. Na przykład, jeśli sterownik używa tekstury o rozmiarze 64 MB, to przeprogramowywanie tej tekstury w każdym punkcie podziału daje menedżerowi pamięci wideo możliwość elastycznego przenoszenia tej tekstury w pamięci między punktami podziału, jeśli zajdzie taka potrzeba.