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.
Een geplaatste of gereserveerde bron kan mogelijk overeenkomen met fysiek geheugen binnen een heap. Geplaatste resources maken meer scenario's voor gegevensovername mogelijk dan gereserveerde resources wanneer de heap de gedeelde vlag heeft ingesteld of wanneer de aliasresources volledig gedefinieerde geheugenindelingen hebben.
Aliasing
Er moet een aliasbarrière worden uitgegeven tussen het gebruik van twee resources die hetzelfde fysieke geheugen delen, zelfs als gegevensovername niet gewenst is. Eenvoudige gebruiksmodellen moeten ten minste de doelresource aangeven die betrokken is bij een dergelijke bewerking. Zie CreatePlacedResource- voor meer informatie en geavanceerde gebruiksmodellen.
Nadat een resource is geopend, worden alle resources die fysiek geheugen delen met die resource ongeldig, tenzij overname van gegevens is toegestaan. Leesbewerkingen van ongeldige resources resulteren in niet-gedefinieerde resource-inhoud. Schrijfbewerkingen naar ongeldig gemaakte resources leiden ook tot ongedefinieerde resource-inhoud, tenzij aan twee voorwaarden wordt voldaan:
- De resource heeft noch de D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET, noch de D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL.
- De schrijfhandeling is een kopieer- of wisactie naar een hele subresource of tegel. Tegel-initialisatie is alleen beschikbaar voor resources met 64KB_TILE_UNDEFINED_SWIZZLE en 64KB_TILE_STANDARD_SWIZZLE.
Overlappende ongeldigheden zijn beperkt tot kleinere granulariteiten, wanneer layouts informatie bieden over de locatie van texelgegevens en wanneer resources zich in bepaalde overgangstoestanden bevinden. Ongeldigverklaringen kunnen echter niet kleiner gaan dan de granulariteit van de uitlijning van resources.
Een bufferuitlijningsgranulariteit is 64 kB en grotere uitlijningsgranulatie heeft voorrang. Dit is belangrijk bij het overwegen van 4 kB-patronen, omdat meerdere 4 kB-patronen zich in een regio van 64 kB kunnen bevinden zonder elkaar te overlappen. Maar een bufferalias voor dezelfde regio van 64 kB kan niet worden gebruikt in combinatie met een van deze 4KB-patronen. De toepassing kan niet op betrouwbare wijze voorkomen dat de toegang tot de buffer de 4KB texturen kruist, omdat GPU's 4KB textuurgegevens in de 64KB-regio mogen herschikken in een niet-gedefinieerd patroon.
64KB_TILE_UNDEFINED_SWIZZLE, 64KB_TILE_STANDARD_SWIZZLE en ROW_MAJOR textuurindelingen informeren de toepassing over welke overlappende uitlijningsgranulaties ongeldig zijn geworden. Een toepassing kan bijvoorbeeld een 2D-matrix met doelpatroon maken met 2 matrixsegmenten, één mipniveau en de indeling 64KB_TILE_UNDEFINED_SWIZZLE. Stel dat de toepassing begrijpt dat elk matrixsegment 100 64 kB-tegels in beslag neemt. De toepassing kan ervoor kiezen matrixsegment 0 niet te gebruiken en dat geheugen opnieuw te gebruiken voor een buffer van ~6 MB, een ~6 MB textuur met een ongedefinieerde indeling, enzovoort. Verder aangenomen dat de toepassing de eerste tile van arraysegment 1 niet langer nodig heeft. Vervolgens kan de toepassing daar ook een buffer van 64 kB vinden totdat voor rendering opnieuw de eerste tegel van matrixsegment 1 is vereist. De toepassing moet een volledige tegel wissen of kopiëren om de eerste tegel opnieuw te gebruiken met de textuurarray.
Zelfs patronen met gedefinieerde indelingen hebben echter nog steeds problematische gevallen. Structuurresourcegrootten kunnen aanzienlijk verschillen van wat de toepassing zelf kan berekenen, omdat sommige adapterarchitecturen extra geheugen toewijzen voor patronen om de effectieve bandbreedte tijdens algemene renderingscenario's te verminderen. Ongeldige gegevens in die extra geheugenregio zorgen ervoor dat de hele resource ongeldig wordt. Zie GetResourceAllocationInfo voor meer informatie.
Gegevensovername
Geplaatste resources maken de meeste gegevensovername mogelijk voor patronen, zelfs met niet-gedefinieerde geheugenindelingen. Toepassingen kunnen de mogelijkheden voor gegevensoverdracht nabootsen die gedeelde vastgelegde middelen mogelijk maken door twee texturen met identieke eigenschappen op dezelfde offset in een gedeelde heap te plaatsen. De volledige resourcebeschrijving moet identiek zijn, inclusief de geoptimaliseerde duidelijke waarde en het type resourcecreatiemethode (geplaatst of gereserveerd). Maar beide resources hebben mogelijk verschillende initiële overgangsbarrièrestatussen gehad.
Gereserveerde resources maken overname van gegevens per tegel mogelijk; maar er bestaan vaak beperkingen voor overgangsstatussen voor resources.
Om gegevens over te nemen, moeten beide resources zich in een compatibele overgangsbarrière toestand voor resources bevinden.
- Voor buffers, patronen voor gelijktijdige toegang en patronen voor meerdere adapters is de status van de resourceovergang niet belangrijk en zijn alle statussen compatibel.
- Voor gereserveerde texturen zonder de vorige eigenschappen of andere overname van gegevens per tegel via 64KB_TILE_UNDEFINED_SWIZZLE of 64KB_TILE_STANDARD_SWIZZLE, moet de status van de overgangsbarrière voor resources, inclusief de tegel, in de algemene toestand zijn.
- Voor alle andere patronen, waarbij de resourcebeschrijvingen exact overeenkomen, moet de status van de resourceovergang voor elk overeenkomend paar subresources:
- Wees in de gemeenschappelijke staat.
- Gelijk zijn wanneer de status dezelfde GPU-schrijfvlag heeft.
Wanneer de GPU ondersteuning biedt voor standaardswizzle, kunnen buffers en standaardswizzle texturen worden toegewezen aan hetzelfde geheugen en gegevens ertussen overnemen. De toepassing kan texels manipuleren vanuit de bufferweergave, omdat het standaard zwenkpatroon beschrijft hoe texels in het geheugen worden ingedeeld. Het CPU-zichtbare zwenkpatroon is gelijk aan het GPU-zichtbare zwenkpatroon dat in buffers wordt gezien.
Verwante onderwerpen