windows - D3D11\_USAGE\_STAGING, hvilken type GPU/CPU-hukommelse bruges?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg læser D3D11-brugssiden og kommer fra en CUDA-baggrund. Jeg undrer mig over, hvilken slags hukommelse der ville være en tekstur markeret som D3D11\_USAGE\_STAGING gemt i. [17]


Jeg antager i CUDA, at det ville være fastgjort sidelåst nulkopi hukommelse. Jeg målte overførselstiden fra en ID3D11Texture2D med D3D11\_USAGE\_STAGING til en værtsbuffer tildelt med malloc, og det tog næsten 7 millisekunder (ret meget i streaming/gaming), og jeg troede det ville være den tid der kræves fra GPU global hukommelse til det hukommelsesområde.


Er nogen af ​​mine antagelser korrekte? Hvad er D3D11\_USAGE\_STAGING bruger som GPU-hukommelse?

Bedste reference


Den primære brug for D3D11\_USAGE\_STAGING er som en måde at indlæse data på i andre D3D11\_USAGE\_DEFAULT poolressourcer. En anden almindelig brug er for 'tilbagekobling' af et gengivelsesmål til CPU tilgængelig hukommelse. Du kan bruge CopySubResourceRegion til at flytte data mellem DEFAULT og STAGING ressourcer (diskret hardware bruger ofte direkte hukommelsesadgang til at håndtere dataoverførsel mellem systemminne og VRAM). [18]


Dette er en generalisering, fordi det afhænger af arkitektur og driver valg, men kort sagt ::



  • D3D11\_USAGE\_STAGING betyder, at den er i systemhukommelse, og GPU'en kan ikke få adgang til den.

  • D3D11\_USAGE\_DEFAULT sætter den i VRAM, kan CPU'en ikke få adgang til den. For at sætte data ind i det kræver kopiering af data fra en STAGING ressource. Du kan tænke på UpdateSubresource som en bekvemmelighedsfunktion, der skaber en STAGING ressource, kopierer dataene til den, kopierer fra STAGING til DEFAULT og frigiver derefter STAGING kopien.



    • Der er en valgfri funktion i DirectX 11.2 eller nyere, end den kan implementeres af føreren, hvis de vælger at tillade CPU-adgang til og med D3D11\_USAGE\_DEFAULT pool-ting. Dette afhænger af, hvordan de har deres hukommelsessystemopsætning (dvs. i Unified Memory Architectures, System RAM og VRAM er det samme).


  • D3D11\_USAGE\_IMMUTABLE er stort set det samme som D3D11\_USAGE\_DEFAULT, men du siger, at du kun vil initialisere det en gang i oprettelsesopkaldet. [19]

  • D3D11\_USAGE\_DYNAMIC betyder at sætte det i delt systemhukommelse, CPU & GPU har begge brug for adgang til det. Der er normalt en ydeevne, der gør det muligt for GPU'en at læse fra dette i forhold til DEFAULT, så du vil bruge det sparsomt. Det er virkelig for ting, du genererer hver ramme på CPU'en og derefter skal gøre (f.eks. Terrænsystemer eller proceduremæssige geometri).




  Spil, der bruger indholdsstreaming, har typisk et sæt STAGING-teksturer, som de indlæser data i i baggrunden, og kopierer det derefter til DEFAULT teksturer, da de bliver tilgængelige for effektiv gengivelse. Dette lader dem genbruge både STAGING og DEFAULT teksturer uden overhead for at ødelægge/skabe ressourcer hver ramme.



Se denne lidt daterede MSDN-artikel: Best Practices Best Practice Management [20]