Zaawansowane korzystanie z tabel deskryptora
Poniższe sekcje zawierają informacje o zaawansowanym użyciu tabel deskryptorów.
- zmienianie wpisów tabeli deskryptora między wywołaniami renderowania
- indeksowania poza granicami
- pochodnych cieniowania i indeksowania rozbieżnego
- Tematy pokrewne
Zmienianie wpisów tabeli deskryptora między wywołaniami renderowania
Po listach poleceń, które ustawiają tabele deskryptorów zostały przesłane do kolejki do wykonania, aplikacja nie może edytować z procesora CPU części stertów deskryptora, do których może się odwoływać procesor GPU, dopóki aplikacja nie wie, że procesor GPU zakończył korzystanie z odwołań.
Ukończenie pracy można określić w ścisłej granicy przy użyciu ogrodzeń interfejsu API do śledzenia postępu procesora GPU lub bardziej grubszych mechanizmów, takich jak oczekiwanie na wyświetlenie renderowania — niezależnie od tego, co odpowiada aplikacji. Jeśli aplikacja wie, że tylko podzbiór regionu, do którego będzie uzyskiwany dostęp punkt tabeli deskryptora (np. ze względu na sterowanie przepływem w cieniu), inne deskryptory nieużywane są nadal wolne do zmiany. Jeśli aplikacja musi przełączać się między różnymi tabelami deskryptorów między wywołaniami renderowania, istnieje kilka podejść, z których można wybrać aplikację:
- Przechowywanie wersji tabeli deskryptora: utwórz (lub ponownie) oddzielną tabelę deskryptora dla każdej unikatowej kolekcji deskryptorów, do których ma odwoływać się lista poleceń. Podczas edytowania i ponownego używania wcześniej wypełnionych obszarów na stertach deskryptora aplikacje muszą najpierw upewnić się, że procesor GPU zakończył korzystanie z dowolnej części stertu deskryptora, który zostanie poddany recyklingu.
- Indeksowanie dynamiczne: aplikacje mogą rozmieścić obiekty, które różnią się w zależności od rysowania/wysyłania (a nawet różnią się w obrębie rysowania) w zakresie stert deskryptora, zdefiniuj tabelę deskryptora obejmującą wszystkie te obiekty, a także z cieniowania, używając dynamicznego indeksowania tabeli podczas wykonywania cieniowania, aby wybrać obiekt, który ma być używany.
- Bezpośrednie umieszczanie deskryptorów w podpisie głównym. W ten sposób można zarządzać tylko niewielką liczbą deskryptorów, ponieważ przestrzeń sygnatury głównej jest ograniczona.
Implikacją używania obsługi wersji tabeli deskryptora jest to, że pamięć deskryptora poza stertą deskryptora musi być spalona dla każdego unikatowego zestawu deskryptorów przywoływanych przez potok grafiki dla każdej listy poleceń, które mogą być wykonywane, w kolejce do wykonywania lub rejestrowane w dowolnym momencie.
D3D12 pozostawia odpowiedzialność za zarządzanie przechowywaniem wersji w aplikacji dla typów obiektów zarządzanych za pośrednictwem stert deskryptorów i tabel deskryptorów. Jedną z zalet jest to, że aplikacje mogą zdecydować się na ponowne użycie spisu treści tabeli deskryptora tak bardzo, jak to możliwe, a nie zawsze definiowania nowej wersji tabeli deskryptora dla każdego przesłania listy poleceń. Sygnatura główna to przestrzeń, którą sterownik D3D12 automatycznie wersje.
Możliwość powiązania wielu tabel deskryptora z podpisem głównym (a tym samym z potokiem) jednocześnie umożliwia aplikacjom grupowanie i przełączanie zestawów odwołań deskryptorów z różnymi częstotliwościami, jeśli jest to konieczne. Na przykład aplikacja może użyć niewielkiej liczby (być może tylko jednej) dużych tabel deskryptora statycznego, które rzadko się zmieniają, lub w których regionach w podstawowej pamięci sterty deskryptora są wypełniane w razie potrzeby, przy użyciu indeksowania dynamicznego z cieniowania do wybierania tekstur. Jednocześnie aplikacja może obsługiwać inną klasę zasobów, w której zestaw przywoływane przez każde wywołanie rysowania jest przełączany z procesora CPU przy użyciu techniki przechowywania wersji tabeli deskryptora.
Indeksowanie poza granicami
Indeksowanie z dowolnej tabeli deskryptora z cieniowania powoduje w dużej mierze niezdefiniowany dostęp do pamięci, w tym możliwość odczytywania dowolnej pamięci w procesie tak, jakby była deskryptorem stanu sprzętu i żyje z konsekwencją tego, co sprzęt robi z tym. Może to spowodować zresetowanie urządzenia, ale nie spowoduje awarii systemu Windows.
Pochodne cieniowania i indeksowanie rozbieżne
Jeśli wywołania cieniowania pikseli wykonywane w sygnaturze 2x2 (w celu obsługi obliczeń pochodnych) wybierają różne indeksy tekstur do próbkowania z tabeli deskryptora, a jeśli wybrana konfiguracja próbkatora i tekstura dla danego piksela wymaga obliczenia LOD z pochodnych współrzędnych tekstury, obliczenia LOD i proces próbkowania tekstury jest wykonywany przez sprzęt niezależnie dla każdego odnośnika tekstury w sygnaturze 2x2, co będzie miało wpływ na wydajność.
Tematy pokrewne