UMA-Optimierungen: Barrierefreie CPU-Texturen und Swizzle-Standardtest

UMA-GPUs (Universal Memory Architecture) bieten einige Effizienzvorteile gegenüber diskreten GPUs, insbesondere bei der Optimierung für mobile Geräte. Wenn Ressourcen CPU-Zugriff erhalten, wenn die GPU UMA ist, kann der Kopieraufwand zwischen CPU und GPU reduziert werden. Es wird zwar nicht empfohlen, anwendungen blind CPU-Zugriff auf alle Ressourcen in UMA-Entwürfen zu geben, aber es gibt Möglichkeiten, die Effizienz zu verbessern, indem sie den richtigen RESSOURCEN CPU-Zugriff bieten. Im Gegensatz zu diskreten GPUs kann die CPU technisch gesehen einen Zeiger auf alle Ressourcen haben, auf die die GPU zugreifen kann.

Übersicht über CPU-zugängliche Texturen

CPU-zugängliche Texturen in der Grafikpipeline sind ein Feature der UMA-Architektur, das CPUs Lese- und Schreibzugriff auf Texturen ermöglicht. Bei gängigeren diskreten GPUs hat die CPU keinen Zugriff auf Texturen in der Grafikpipeline.

Der allgemeine Best Practice-Rat für Texturen besteht darin, diskrete GPUs zu unterstützen. Dies umfasst in der Regel das Folgen der Prozesse unter Hochladen von Texturdatenüber Puffer, zusammengefasst als:

  • Der Großteil der Texturen hat keinen CPU-Zugriff.
  • Festlegen des Texturlayouts auf D3D12 _ TEXTURE _ LAYOUT _ UNKNOWN.
  • Hochladen der Texturen auf die GPU mit CopyTextureRegion.

In bestimmten Fällen können CPU und GPU jedoch so häufig mit denselben Daten interagieren, dass Zuordnungstexturen hilfreich sind, um Energie zu sparen oder ein bestimmtes Design auf bestimmten Adaptern oder Architekturen zu beschleunigen. Anwendungen sollten diese Fälle erkennen und die unnötigen Kopien optimieren. Berücksichtigen Sie in diesem Fall Folgendes, um eine optimale Leistung zu erzielen:

  • Beginnen Sie erst dann, wenn D3D12 _ FEATURE _ DATA _ ARCHITECTURE::UMA true ist, um die bessere Leistung der Zuordnungstexturn zu erzielen. Achten Sie dann auf CacheCoherentUMA, wenn Sie entscheiden, welche CPU-Cacheeigenschaften für den Heap verwendet werden müssen.

  • Die Nutzung des CPU-Zugriffs für Texturen ist komplizierter als bei Puffern. Die effizientesten Texturlayouts für GPUs sind selten _ Zeilen-Hauptlayouts. Tatsächlich können einige GPUs beim Kopieren von Texturdaten nur _ Zeilen-Haupttexturen unterstützen.

  • UMA-GPUs sollten universell von einer einfachen Optimierung profitieren, um Ladezeiten auf Ebene zu reduzieren. Nach der Erkennung von UMA kann die Anwendung die anfängliche CopyTextureRegion optimieren, um Texturen zu füllen, die die GPU nicht ändert. Anstatt die Textur in einem Heap mit D3D12 HEAP TYPE DEFAULT zu erstellen und die Texturdaten zu marshallen, kann die Anwendung _ _ _ WriteToSubresource verwenden, um ein Verständnis des tatsächlichen Texturlayouts zu vermeiden.

  • In D3D12 sind Texturen, die mit D3D12 TEXTURE LAYOUT UNKNOWN und ohne CPU-Zugriff erstellt wurden, am effizientesten für _ _ _ häufiges GPU-Rendering und -Sampling. Bei Leistungstests sollten diese Texturen mit D3D12 TEXTURE LAYOUT UNKNOWN mit _ _ _ CPU-Zugriff und D3D12 _ TEXTURE LAYOUT STANDARD _ _ _ SWIZZLE mit _ _ _ CPU-Zugriff und D3D12 TEXTURE LAYOUT ROW _ MAJOR für adapterübergreifende Unterstützung verglichen werden.

  • Die Verwendung von D3D12 TEXTURE LAYOUT UNKNOWN mit CPU-Zugriff ermöglicht die Methoden _ _ _ WriteToSubresource, ReadFromSubresource, Map (anwendungszugriff auf Zeiger voreinschließend) und Unmap;kann jedoch die Effizienz des GPU-Zugriffs verfeinern.

  • Die Verwendung von D3D12 TEXTURE LAYOUT STANDARD SWIZZLE mit CPU-Zugriff ermöglicht _ _ _ _ WriteToSubresource, ReadFromSubresource, Map (die einen gültigen Zeiger auf die Anwendung zurückgibt) und Unmap . Es kann auch die Effizienz des GPU-Zugriffs mehr als D3D12 _ _ TEXTURLAYOUT _ UNBEKANNT mit CPU-Zugriff verfingen.

Übersicht über Swizzle Standard

D3D12 (und D3D11.3) führen ein mehrdimensionales Standarddatenlayout ein. Dies geschieht, damit mehrere Verarbeitungseinheiten mit denselben Daten arbeiten können, ohne die Daten zu kopieren oder zwischen mehreren Layouts zu wischen. Ein standardisiertes Layout ermöglicht Effizienzsteigerungen durch Netzwerkeffekte und ermöglicht Algorithmen, unter Annahme eines bestimmten Musters kurze Schnitte zu machen.

Eine ausführliche Beschreibung der Texturlayouts finden Sie unter D3D12 _ TEXTURE _ LAYOUT.

Beachten Sie jedoch, dass dieses Standardfeature ein Hardwarefeature ist und möglicherweise nicht von allen GPUs unterstützt wird.

Hintergrundinformationen zum Swizzling finden Sie unter Z-Order Curve.

APIs

Im Gegensatz zu D3D11.3 unterstützt D3D12 standardmäßig die Texturzuordnung, sodass D3D12 _ FEATURE _ DATA _ D3D12 _ OPTIONSnicht abfragen muss. D3D12 unterstützt jedoch nicht immer standard swizzle. Dieses Feature muss mit einem Aufruf von CheckFeatureSupport abgefragt werden und das Feld StandardSwizzle64KBSupported von D3D12 _ FEATURE DATA _ _ D3D12 _ OPTIONS überprüfen.

Die folgenden APIs verweisen auf textur mapping:

Enumerationen

  • D3D12 _ _TEXTURLAYOUT: Steuert das Swizzle-Muster von Standardtexturen und aktiviert die Kartenunterstützung für CPU-zugängliche Texturen.

Strukturen

Methoden

Für Ressourcen und übergeordnete Heaps gelten Ausrichtungsanforderungen:

  • D3D12 _ DEFAULT _ MSAA RESOURCE PLACEMENT ALIGNMENT _ _ _ (4MB) für Texturen mit mehreren Stichproben.
  • D3D12 _ DEFAULT RESOURCE PLACEMENT ALIGNMENT _ _ _ (64 KB) für einzelne Beispieltexturen und Puffer.
  • Das lineare Kopieren von Unterressourcen muss an D3D12 TEXTURE DATA PLACEMENT ALIGNMENT (512 Byte) ausgerichtet sein, bei dem die Zeilenhöhe an _ _ _ _ D3D12 _ TEXTURE DATA PITCH ALIGNMENT _ _ _ (256 Byte) ausgerichtet ist.
  • Konstante Pufferansichten müssen an D3D12 _ CONSTANT BUFFER DATA PLACEMENT ALIGNMENT _ _ _ _ (256 Byte) ausgerichtet werden.

Texturen, die kleiner als 64 KB sind, sollten über CreateCommittedResource verarbeitet werden.

Bei dynamischen Texturen (Texturen, die jeden Frame ändern) schreibt die CPU linear in den Upload-Heap, gefolgt von einem GPU-Kopiervorgang.

In der Regel erstellen Sie zum Erstellen dynamischer Ressourcen einen großen Puffer in einem Upload-Heap (siehe Unterzuordnung innerhalb von Puffern). Erstellen Sie zum Erstellen von Stagingressourcen einen großen Puffer in einem Readback-Heap. Um statische Standardressourcen zu erstellen, erstellen Sie angrenzende Ressourcen in einem Standardhap. Um Standardmäßige Aliasressourcen zu erstellen, erstellen Sie überlappende Ressourcen in einem Standardhap.

WriteToSubresource und ReadFromSubresource ordnen Texturdaten zwischen einem Zeilen-Hauptlayout und einem nicht definierten Ressourcenlayout neu an. Der Vorgang ist synchron, daher sollte die Anwendung die CPU-Planung im Hinterkopf behalten. Die Anwendung kann den Kopiervorgang immer in kleinere Regionen aufbrechen oder diesen Vorgang in einer anderen Aufgabe planen. MSAA-Ressourcen und Tiefen-Schablonenressourcen mit nicht transparenten Ressourcenlayouts werden von diesen CPU-Kopiervorgängen nicht unterstützt und verursachen einen Fehler. Formate, die keine Zwei-Elemente-Größe haben, werden ebenfalls nicht unterstützt und verursachen auch einen Fehler. Es können Nicht genügend Arbeitsspeicher-Rückgabecodes auftreten.

Kernkonst constants

ID3D12Heap

Ressourcenbindung