Übersicht über Deskriptoren

Deskriptoren werden durch API-Aufrufe erstellt und identifizieren Ressourcen.

Deskriptordaten

Ein Deskriptor ist ein relativ kleiner Datenblock, der ein Objekt für die GPU vollständig in einem GPU-spezifischen nicht transparenten Format beschreibt. Es gibt verschiedene Typen von Deskriptoren, — die Zielsichten (RTVs), Tiefenschablonenansichten (DSVs), Shaderressourcenansichten (SRVs), ungeordnete Zugriffsansichten (UAVs), Konstantenpufferansichten (CBVs) und Sampler rendern.

Deskriptoren variieren je nach GPU-Hardware in ihrer Größe. Sie können die Größe einer SRV-, UAV- oder CBV-Datei abfragen, indem Sie ID3D12Device::GetDescriptorHandleIncrementSizeaufrufen. Deskriptoren werden in dieser Dokumentation als unteilbare Einheiten angezeigt. Hier ist ein Beispiel.

srv, cbv, uav und sampler

Deskriptoren werden durch API-Aufrufe erstellt und enthalten Informationen wie die Ressource und mip-maps, die der Deskriptor enthalten soll.

Der Treiber verfolgt keine Verweise auf Deskriptoren nach oder enthält diese. Es liegt in der Hand der App, sicherzustellen, dass der richtige Deskriptortyp verwendet wird und dass die Informationen aktuell sind. Hierbei gibt es eine kleine Ausnahme: Der Treiber überprüft Renderzielbindungen, um sicherzustellen, dass Austauschketten ordnungsgemäß funktionieren.

Objektdeskriptoren müssen nicht freigegeben oder freigegeben werden. Treiber fügen keine Zuordnungen an die Erstellung eines Deskriptors an. Ein Deskriptor kann jedoch Verweise auf andere Zuordnungen codieren, für die die Anwendung die Lebensdauer besitzt. Beispielsweise muss ein Deskriptor für einen SRV die virtuelle Adresse der D3D-Ressource (z. B. eine Textur) enthalten, auf die der SRV verweist. Es liegt in der Verantwortung der Anwendung, sicherzustellen, dass sie keinen SRV-Deskriptor verwendet, wenn die zugrunde liegende D3D-Ressource, von der sie abhängt, zerstört wurde oder geändert wird (z. B. als nichtresident deklariert).

Die primäre Möglichkeit zur Verwendung von Deskriptoren besteht darin, sie in Deskriptorheaps zu platzieren, die Arbeitsspeicher für Deskriptoren sichern.

Deskriptorhandles

Ein Deskriptorhandle ist die eindeutige Adresse des Deskriptors. Er ähnelt einem Zeiger, ist aber nicht transparent, da seine Implementierung hardwarespezifisch ist. Das Handle ist für Deskriptorheaps eindeutig, sodass beispielsweise ein Array von Handles auf Deskriptoren in mehreren Heaps verweisen kann.

CPU-Handles dienen zur sofortigen Verwendung, z. B. zum Kopieren, wenn sowohl die Quelle als auch das Ziel identifiziert werden müssen. Unmittelbar nach der Verwendung (z. B. einem Aufruf von ID3D12GraphicsCommandList::OMSetRenderTargets)können sie wiederverwendet oder ihr zugrunde liegender Heap verworfen werden.

GPU-Handles dienen nicht zur sofortigen Verwendung — und identifizieren Speicherorte aus einer Befehlsliste für die Verwendung zur GPU-Ausführungszeit. Sie müssen beibehalten werden, bis alle Befehlslisten, die auf sie verweisen, vollständig ausgeführt wurden.

Um ein Deskriptorhandle für den Anfang eines Heaps zu erstellen, rufen Sie nach dem Erstellen des Deskriptorheaps selbst eine der folgenden Methoden auf:

Diese Methoden geben die folgenden Strukturen zurück:

Da die Größe der Deskriptoren je nach Hardware variiert, wird folgendes verwendet, um das Inkrement zwischen den einzelnen Deskriptoren in einem Heap zu erhalten:

Es ist sicher, eine Startposition mit einer Reihe von Schritten zu versetzen, Handles zu kopieren und Handles an API-Aufrufe zu übergeben. Es ist nicht sicher, ein Handle so zu dereferenzieren, als wäre es ein gültiger CPU-Zeiger, noch die Bits in einem Handle zu analysieren.

Einige Hilfsstrukturen wurden mit Initialisierungsmembern hinzugefügt, um die Verwaltung von Handles etwas zu vereinfachen.

NULL-Deskriptoren

Beim Erstellen von Deskriptoren mitHILFE von API-Aufrufen übergeben Anwendungen NULL für den Ressourcenzeiger in der Deskriptordefinition, um den Effekt zu erzielen, dass nichts gebunden wird, wenn ein Shader darauf zugreift.

Der Rest des Deskriptors muss so weit wie möglich aufgefüllt werden. Im Fall von Shader-Ressourcenansichten (SrVs) kann der Deskriptor beispielsweise verwendet werden, um den Typ der Ansicht zu unterscheiden(Texture1D, Texture2D usw.). Numerische Parameter im Ansichtsdeskriptor, z. B. die Anzahl von Mipmaps, müssen alle auf Werte festgelegt werden, die für eine Ressource gültig sind.

In vielen Fällen gibt es ein definiertes Verhalten für den Zugriff auf eine ungebundene Ressource, z. B. SRVs, die Standardwerte zurückgeben. Diese werden beim Zugriff auf einen NULL-Deskriptor berücksichtigt, solange der Typ des Shaderzugriffs mit dem Deskriptortyp kompatibel ist. Wenn ein Shader beispielsweise einen Texture2D-SRV erwartet und auf eine NULL-SRV zugreift, die als Texture1D definiert ist, ist das Verhalten nicht definiert und kann zu einer Geräterücksetzung führen.

Um einen NULL-Deskriptor zu erstellen, übergeben Sie zusammenfassend null für den pResource-Parameter, wenn Sie die Sicht mit Methoden wie CreateShaderResourceViewerstellen. Legen Sie für den Ansichtsbeschreibungsparameter pDesc eine Konfiguration fest, die funktioniert, wenn die Ressource nicht NULL ist (andernfalls kann es auf einer Hardware zu einem Absturz kommen).

Stammdeskriptoren sollten jedoch nicht auf NULL festgelegt werden.

Auf Hardware der Ebene 1 (siehe Hardwareebenen)müssen alle gebundenen Deskriptoren (über Deskriptortabellen) entweder als echte Deskriptoren oder NULL-Deskriptoren initialisiert werden, selbst wenn nicht von der Hardware darauf zugegriffen wird. Andernfalls ist das Verhalten nicht definiert.

Auf Tier2-Hardware gilt dies für gebundene CBV- und UAV-Deskriptoren, aber nicht für SRV-Deskriptoren.

Auf Hardware der Ebene 3 gibt es hierfür keine Einschränkung, vorausgesetzt, dass nie auf nicht initialisierte Deskriptoren zugegriffen wird.

Standarddeskriptoren

Um einen Standarddeskriptor für eine bestimmte Ansicht zu erstellen, übergeben Sie einen gültigen pResource-Parameter an die Create View-Methode (z. B. CreateShaderResourceView),übergeben Sie jedoch NULL für den pDesc-Parameter. Wenn die Ressource beispielsweise 14 Mips enthält, enthält die Ansicht 14 Mips. Der Standardfall deckt die offensichtlichste Zuordnung einer Ressource zu einer Ansicht ab. Dies erfordert, dass die Ressource mit einem vollqualifizierten Formatnamen (z. B. DXGI_FORMAT_R8G8B8A8_UNORM_SRGB anstelle von DXGI_FORMAT_R8G8B8A8_TYPELESS) zugeordnet wird.

Standarddeskriptoren können nicht mit einer Raytracingbeschleunigungsstrukturansicht verwendet werden, da der bereitgestellte pResource-Parameter NULL sein muss und der Speicherort über ein [D3D12_RAYTRACING_ACCELERATION_STRUCTURE_SRV]/windows/win32/api/d3d12/ns-d3d12-d3d12_raytracing_acceleration_structure_srv) übergeben werden muss.

Deskriptoren