Udostępnij przez


Deskryptory — przegląd

Deskryptory są tworzone przez wywołania interfejsu API i identyfikują zasoby.

Dane deskryptora

Deskryptor to stosunkowo mały blok danych, który w pełni opisuje obiekt dla procesora GPU w ukrytym formacie specyficznym dla GPU. Istnieje kilka różnych typów deskryptorów — widoki docelowe renderowania (RTV), widoki bufora głębokości (DSV), widoki zasobów cieniowania (SRV), widoki dostępu nieuporządkowanego (UAV), widoki bufora stałego (CBV) i próbkujące.

Deskryptory różnią się rozmiarem, w zależności od sprzętu GPU. Możesz uzyskać informację o rozmiarze SRV, UAV lub CBV, wywołując ID3D12Device::GetDescriptorHandleIncrementSize. Deskryptory są wyświetlane w tej dokumentacji jako jednostki niepodzielne; oto przykład.

srv, cbv, uav i próbnik

Deskryptory są tworzone przez wywołania interfejsu API i będą zawierać informacje, takie jak zasoby i mapy miplów, które chcesz, aby deskryptor zawierał.

Sterownik nie śledzi ani nie przechowuje odwołań do deskryptorów, dlatego to odpowiedzialność aplikacji, aby upewnić się, że jest używany prawidłowy typ deskryptora i że informacje są aktualne. Istnieje jeden mały wyjątek od tego; sterownik sprawdza wiązania celu renderowania, aby upewnić się, że łańcuchy swap działają poprawnie.

Deskryptory obiektów nie muszą być zwalniane ani uwalniane. Sterowniki nie dołączają żadnych alokacji do tworzenia deskryptora. Deskryptor może jednak kodować odwołania do innych alokacji, dla których aplikacja zarządza cyklem życia. Na przykład deskryptor SRV musi zawierać wirtualny adres zasobu D3D (np. tekstura), do którego odwołuje się SRV. Obowiązkiem aplikacji jest upewnienie się, że nie używa deskryptora SRV, gdy podstawowy zasób D3D, od którego zależy, został usunięty lub jest modyfikowany (na przykład zadeklarowany jako nie-rezydentny).

Podstawowym sposobem użycia deskryptorów jest umieszczenie ich w stertach deskryptorów, które są pamięcią wspierającą dla deskryptorów.

Uchwyty deskryptora

Uchwyt deskryptora jest unikatowym adresem deskryptora. Jest podobny do wskaźnika, ale jest nieprzezroczysty, ponieważ jego implementacja jest specyficzna dla sprzętu. Uchwyt jest unikatowy w obrębie stert deskryptorów, więc na przykład tablica dojść może odwoływać się do deskryptorów w wielu stertach.

Uchwyty CPU są przeznaczone do natychmiastowego użycia, takie jak kopiowanie, gdzie trzeba zidentyfikować źródło i miejsce docelowe. Natychmiast po użyciu (na przykład wywołanie ID3D12GraphicsCommandList::OMSetRenderTargets), można je ponownie użyć lub podstawową stertę można usunąć.

Uchwyty procesora GPU nie są przeznaczone do natychmiastowego użycia — identyfikują lokalizacje z listy poleceń do użycia w czasie wykonywania procesora GPU. Należy je zachować do momentu, aż wszystkie listy poleceń odwołujące się do nich zostały w pełni wykonane.

Aby utworzyć uchwyt deskryptora na początku sterty, po utworzeniu sterty deskryptorów, wywołaj jedną z następujących metod:

Te metody zwracają następujące struktury:

Ponieważ rozmiar deskryptorów różni się w zależności od sprzętu, aby uzyskać przyrost między poszczególnymi deskryptorami w stosie, użyj:

Można bezpiecznie przesunąć lokalizację początkową o określoną liczbę przyrostów, skopiować uchwyty i przekazać uchwyty do wywołań interfejsu API. Nie można bezpiecznie odwołać się do uchwytu, jakby był prawidłowym wskaźnikiem CPU, ani analizować bitów w uchwycie.

Dodano niektóre struktury pomocnicze z członkami inicjalizacyjnymi, aby ułatwić zarządzanie uchwytami.

Deskryptory o wartości null

Podczas tworzenia deskryptorów przy użyciu wywołań interfejsu API aplikacje przekazują wartość NULL dla wskaźnika zasobów w definicji deskryptora, aby uzyskać efekt braku powiązania podczas uzyskiwania dostępu przez shader.

Pozostała część deskryptora musi być wypełniona w możliwie największym stopniu. Na przykład w przypadku widoków zasobów cieniowania (SRV) deskryptor może służyć do odróżnienia typu widoku (Texture1D, Texture2D itd.). Parametry liczbowe w deskryptorze widoku, takie jak liczba map mip, muszą być ustawione na wartości prawidłowe dla zasobu.

W wielu przypadkach istnieje zdefiniowane zachowanie umożliwiające uzyskiwanie dostępu do niezwiązanego zasobu, takiego jak woluminy SRV, które zwracają wartości domyślne. Będą one respektowane podczas uzyskiwania dostępu do deskryptora o wartości NULL, o ile typ dostępu do cieniowania jest zgodny z typem deskryptora. Jeśli na przykład shader oczekuje SRV typu Texture2D i uzyskuje dostęp do wartości NULL SRV określonej jako Texture1D, zachowanie jest niezdefiniowane i może spowodować zresetowanie urządzenia.

Podsumowując, aby utworzyć deskryptor o wartości null, przekaż null dla parametru pResource podczas tworzenia widoku przy użyciu metod takich jak CreateShaderResourceView. Dla parametru opisu widoku pDescustaw konfigurację, która będzie działać, jeśli zasób nie ma wartości null (w przeciwnym razie może wystąpić awaria na pewnym sprzęcie).

Jednak deskryptory główne nie powinny być ustawione na wartość null.

Na sprzęcie warstwy 1 (zobacz Warstwy sprzętu, wszystkie deskryptory powiązane (za pośrednictwem tabel deskryptorów) muszą być inicjowane jako rzeczywiste deskryptory lub deskryptory o wartości null, nawet jeśli nie są dostępne przez sprzęt, w przeciwnym razie zachowanie jest niezdefiniowane.

Na sprzęcie warstwy 2 dotyczy to powiązanych deskryptorów CBV i UAV, ale nie dotyczy deskryptorów SRV.

W przypadku sprzętu Tier3 nie ma żadnych ograniczeń, pod warunkiem, że nigdy nie są używane niezainicjowane deskryptory.

Domyślne deskryptory

Aby utworzyć domyślny deskryptor dla określonego widoku, przekaż prawidłowy parametr pResource do metody tworzenia widoku (na przykład CreateShaderResourceView), ale przekaż NULL dla parametru pDesc. Jeśli na przykład zasób zawierał 14 mips, widok będzie zawierał 14 mips. Przypadek domyślny obejmuje najbardziej widoczne mapowanie zasobu na widok. Wymaga to przydzieleniu zasobu z w pełni kwalifikowaną nazwą formatu (na przykład DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, a nie DXGI_FORMAT_R8G8B8A8_TYPELESS).

Domyślnych deskryptorów nie można używać z widokiem struktury akceleracji raytracingu, ponieważ podany parametr pResource musi być NULL, a lokalizacja musi zostać przekazana za pośrednictwem D3D12_RAYTRACING_ACCELERATION_STRUCTURE_SRV.

Deskryptory