Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
GPU's (Unified Memory Architecture) bieden enkele efficiëntievoordelen ten opzichte van discrete GPU's, met name bij het optimaliseren van mobiele apparaten. Het geven van CPU-toegang tot resources wanneer de GPU UMA is, kan de hoeveelheid kopiëren die plaatsvindt tussen CPU en GPU verminderen. Hoewel we toepassingen niet blind cpu-toegang geven tot alle resources op UMA-ontwerpen, zijn er mogelijkheden om de efficiëntie te verbeteren door de juiste resources CPU-toegang te geven. In tegenstelling tot afzonderlijke GPU's kan de CPU technisch gezien een verwijzing hebben naar alle resources waartoe de GPU toegang heeft.
Overzicht van toegankelijke CPU-patronen
Cpu-toegankelijke patronen zijn in de grafische pijplijn een functie van UMA-architectuur, waardoor CPU's lees- en schrijftoegang tot patronen mogelijk maken. Op de meest voorkomende discrete GPU's heeft de CPU geen toegang tot patronen in de grafische pijplijn.
Het algemene best practice advies voor texturen is om discrete GPU's te verwerken. Dit omvat doorgaans het volgen van de processen in Het uploaden van bitmapgegevens via buffers, samengevat als:
- Geen CPU-toegang voor het merendeel van de patronen.
- De patroonindeling instellen op D3D12_TEXTURE_LAYOUT_UNKNOWN.
- Upload de patronen naar de GPU met CopyTextureRegion.
Voor bepaalde gevallen kan de CPU en GPU echter zo vaak op dezelfde gegevens communiceren, dat het toewijzen van patronen nuttig wordt om energie te besparen of om een bepaald ontwerp op bepaalde adapters of architecturen te versnellen. Toepassingen moeten deze gevallen detecteren en de overbodige kopieën optimaliseren. Houd in dit geval rekening met het volgende voor de beste prestaties:
Begin alleen de betere prestaties van toewijzingspatroon te onderhouden wanneer D3D12_FEATURE_DATA_ARCHITECTURE::UMA WAAR is. Let vervolgens op CacheCoherentUMA als u bepaalt welke eigenschappen van de CPU-cache u op de heap wilt kiezen.
Het gebruik van CPU-toegang voor patronen is ingewikkelder dan voor buffers. De meest efficiënte patroonindelingen voor GPU's zijn zelden row_major. Sommige GPU's kunnen zelfs alleen ondersteuning bieden voor row_major patronen bij het kopiëren van patroongegevens.
GPU's van UMA moeten universeel profiteren van een eenvoudige optimalisatie om laadtijden op niveau te verminderen. Nadat de UMA is herkend, kan de toepassing de eerste CopyTextureRegion optimaliseren om patronen te vullen die de GPU niet zal wijzigen. In plaats van het patroon in een heap te maken met D3D12_HEAP_TYPE_DEFAULT en de bitmapgegevens te marshallen, kan de toepassing WriteToSubresource- gebruiken om te voorkomen dat u de werkelijke structuurindeling begrijpt.
In D3D12 zijn patronen die zijn gemaakt met D3D12_TEXTURE_LAYOUT_UNKNOWN en geen CPU-toegang het meest efficiënt voor frequente GPU-rendering en -steekproeven. Bij het testen van de prestaties moeten deze patronen worden vergeleken met D3D12_TEXTURE_LAYOUT_UNKNOWN met CPU-toegang en D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE met CPU-toegang en D3D12_TEXTURE_LAYOUT_ROW_MAJOR voor ondersteuning voor meerdere adapters.
Met behulp van D3D12_TEXTURE_LAYOUT_UNKNOWN met CPU-toegang kunt u de methoden WriteToSubresource, ReadFromSubresource, Toewijzen (toepassingstoegang tot aanwijzer blokkeren) en Unmap; maar kan efficiëntie van GPU-toegang opofferen.
Met D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE met CPU-toegang kunt u WriteToSubresource, ReadFromSubresource, Map (waarmee een geldige aanwijzer naar toepassing wordt geretourneerd) en Unmapongedaan maken. Het kan ook de efficiëntie van GPU-toegang meer dan D3D12_TEXTURE_LAYOUT_UNKNOWN met CPU-toegang opofferen.
Overzicht van Standard Swizzle
D3D12 (en D3D11.3) introduceren een standaard multidimensionale gegevensindeling. Dit wordt gedaan om meerdere verwerkingseenheden in staat te stellen om op dezelfde gegevens te werken zonder de gegevens te kopiëren of de gegevens tussen meerdere indelingen te kopiëren. Een gestandaardiseerde lay-out maakt efficiëntieverbeteringen mogelijk door netwerkeffecten en stelt algoritmen in staat om short-cuts te maken uitgaande van een bepaald patroon.
Raadpleeg D3D12_TEXTURE_LAYOUTvoor een gedetailleerde beschrijving van de patroonindelingen.
Houd er rekening mee dat deze standaardwizzle een hardwarefunctie is en mogelijk niet wordt ondersteund door alle GPU's.
Raadpleeg Z-ordercurvevoor achtergrondinformatie over zwenken.
Apis
In tegenstelling tot D3D11.3 biedt D3D12 standaard ondersteuning voor patroontoewijzing, dus u hoeft geen query's uit te voeren op D3D12_FEATURE_DATA_D3D12_OPTIONS. D3D12 biedt echter niet altijd ondersteuning voor standaard-zwenk. Deze functie moet worden opgevraagd met een aanroep naar CheckFeatureSupport en het controleren van het veld StandardSwizzle64KBSupported veld van D3D12_FEATURE_DATA_D3D12_OPTIONS.
De volgende API's verwijzen naar patroontoewijzing:
Opsommingen
- D3D12_TEXTURE_LAYOUT: bepaalt het zwenkpatroon van standaardpatronen en schakelt ondersteuning voor kaartondersteuning in voor CPU toegankelijke patronen.
Structuren
- D3D12_RESOURCE_DESC: beschrijft een resource, zoals een patroon, dit is een uitgebreid gebruikte structuur.
- D3D12_HEAP_DESC : beschrijft een heap.
Methoden
- ID3D12Device::CreateCommittedResource : maakt één resource en back-up van de juiste grootte en uitlijning.
- ID3D12Device::CreateHeap : maakt een heap voor een buffer of bitmappatroon.
- ID3D12Device::CreatePlacedResource : maakt een resource die in een specifieke heap wordt geplaatst, meestal een snellere methode voor het maken van een resource dan CreateHeap-.
- ID3D12Device::CreateReservedResource : maakt een resource die is gereserveerd, maar nog niet is vastgelegd of in een heap is geplaatst.
- ID3D12CommandQueue::UpdateTileMappings: updates toewijzingen van tegellocaties in betegelde resources aan geheugenlocaties in een resource-heap.
- ID3D12Resource::Map: haalt een aanwijzer op naar de opgegeven gegevens in de resource en weigert de GPU-toegang tot de subresource.
- ID3D12Resource::GetDesc: haalt de resource-eigenschappen op.
- ID3D12Heap::GetDesc de heap-eigenschappen krijgt.
- ReadFromSubresource: kopieert gegevens uit een patroon dat is toegewezen met Map.
- WriteToSubresource-: kopieert gegevens naar een patroon dat is toegewezen met Map.
Resources en bovenliggende heaps hebben uitlijningsvereisten:
- D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT (4 MB) voor patronen met meerdere steekproeven.
- D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT (64 kB) voor enkel voorbeeldpatroon en buffers.
- Lineaire subresourcekopie moet worden uitgelijnd op D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512 bytes), waarbij rijhoogte wordt uitgelijnd op D3D12_TEXTURE_DATA_PITCH_ALIGNMENT (256 bytes).
- Constante bufferweergaven moeten worden uitgelijnd op D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT (256 bytes).
Patronen die kleiner zijn dan 64 kB moeten worden verwerkt via CreateCommittedResource-.
Met dynamische texturen (patronen die elk frame wijzigen) schrijft de CPU lineair naar de upload-heap, gevolgd door een GPU-kopieerbewerking.
Doorgaans maakt u dynamische resources een grote buffer in een upload-heap (raadpleeg Sublocatie binnen buffers). Als u faseringsbronnen wilt maken, maakt u een grote buffer in een readback-heap. Als u standaard statische resources wilt maken, maakt u aangrenzende resources in een standaard-heap. Als u standaardaliasbronnen wilt maken, maakt u overlappende resources in een standaard heap.
WriteToSubresource en ReadFromSubresource bitmappatroongegevens opnieuw rangschikken tussen een indeling met rijen en een niet-gedefinieerde resource-indeling. De bewerking is synchroon, dus de toepassing moet rekening houden met CPU-planning. De toepassing kan het kopiëren altijd opsplitsen in kleinere regio's of deze bewerking in een andere taak plannen. MSAA-resources en dieptestencilresources met ondoorzichtige resource-indelingen worden niet ondersteund door deze CPU-kopieerbewerkingen en veroorzaken een fout. Indelingen die geen power-of-two-elementgrootte hebben, worden ook niet ondersteund en veroorzaken ook een fout. Retourcodes voor onvoldoende geheugen kunnen optreden.
Verwante onderwerpen