Das DirectX-Team von Microsoft hat am 30. März 2023 die Vorschauversion 1.710.0 des Agility SDK veröffentlicht und damit zwei Funktionen für Direct3D 12 eingeführt: GPU Upload Heaps und Non-normalized Sampling. Beide setzen an Stellen im Renderpfad an, an denen Entwickler bislang Umwege in Kauf nehmen mussten. Treiber der drei großen GPU-Hersteller und der Profiler PIX bringen die Unterstützung ab dem ersten Tag mit. Die Schnittstelle steht in der Tradition jener Low-Level-Idee, die Microsoft 2014 mit der Ankündigung von DirectX 12 formuliert hatte.
GPU Upload Heaps: direkter Zugriff auf den VRAM ohne PCI-Kopien
GPU Upload Heaps erlauben es CPU und GPU, denselben Videospeicher gleichzeitig direkt anzusprechen. Damit entfällt der Zwischenschritt, Daten zunächst in einen Upload-Heap im Systemspeicher zu schreiben und anschließend über den PCI-Express-Bus in den VRAM zu kopieren. Ressourcen werden über den neuen Heap-Typ D3D12_HEAP_TYPE_GPU_UPLOAD angelegt, kombiniert mit D3D12_CPU_PAGE_PROPERTY_UNKNOWN und D3D12_MEMORY_POOL_UNKNOWN, und danach gemappt und unmittelbar genutzt. Für Asset-Streaming und Upload-Pfade in PC-Spielen ergibt sich daraus ein Effizienzgewinn, weil redundante Kopiervorgänge wegfallen. Genau solche Pfade spielen etwa bei Engines eine Rolle, wie es schon der Wechsel zeigte, als Epic Games DirectX 12 in Fortnite integrierte.
Voraussetzung bei dedizierten Grafikkarten ist ein aktiviertes Resizable BAR im BIOS, da die CPU den gesamten VRAM adressierbar machen muss. Integrierte GPUs benötigen keine BIOS-Änderung, weil sie ihren gemeinsamen Speicher ohnehin als L0-Memory in einer UMA-Architektur führen. Ob die Funktion verfügbar ist, lässt sich über das Feld D3D12_FEATURE_DATA_D3D12_OPTIONS16::GPUUploadHeapSupported abfragen. Die Vorschauversion setzt den Developer Mode voraus.
Non-normalized Sampling und Treiberunterstützung
Die zweite Neuerung ist ein Sampler-Flag, das Texturkoordinaten als absolute Texel-Positionen interpretiert statt im üblichen normalisierten Bereich von 0 bis 1,0. Das Flag D3D12_SAMPLER_FLAG_NON_NORMALIZED_COORDINATES kommt mit Einschränkungen: Es lässt sich nur auf TEXTURE1D oder TEXTURE2D anwenden, der Mip-Count muss 1 betragen, MIN- und MAG-Filter müssen übereinstimmen, der Mip-Filter muss POINT sein, und die Adressierung ist auf CLAMP oder BORDER begrenzt.
Die Treiberunterstützung steht zum Start bereit. AMD liefert einen Vorschautreiber für die Radeon-RX-7000-Serie, Intel den Arc- und Iris-Xe-Grafiktreiber in Version 31.0.101.4255 und NVIDIA die Game-Ready- beziehungsweise Studio-Treiber ab Version 531.41. Bei NVIDIA gilt für GPU Upload Heaps die Architektur Ampere oder neuer, während Non-normalized Sampling auf allen GPUs funktioniert. Der Profiler PIX unterstützt beide Funktionen ab Version 2303.30-preview.
