Api:er för tillagda resurser
API:erna som beskrivs i det här avsnittet fungerar med tillagda resurser och panelpool.
- Tilldela paneler från en panelpool till en resurs
- Köra frågor mot resursklinker och stöd för
- Kopiera tillagda data
- Ändra storlek på panelpoolen
- tillagda resursbarriären
- Relaterade ämnen
Tilldela paneler från en panelpool till en resurs
ID3D11DeviceContext2::UpdateTileMappings och ID3D11DeviceContext2::CopyTileMappings API:er manipulerar och frågepanelmappningar. Uppdateringsanrop påverkar bara de paneler som identifierades i anropet och andra lämnas enligt definitionen tidigare.
En viss panel från en panelpool kan mappas till flera platser i en resurs och till och med flera resurser. Den här mappningen innehåller paneler i en resurs som har en implementeringsvald layout (Mipmap-packning) där flera mipmaps packas ihop till en enda panel. Fångsten är att om data skrivs till panelen via en mappning, men läs via en annan konfigurerad mappning, är resultatet odefinierat. Försiktig användning av den här flexibiliteten kan fortfarande vara användbar för ett program, till exempel att dela en panel mellan resurser som inte kommer att användas samtidigt, där innehållet i panelen alltid initieras via samma resursmappning som de senare kommer att läsas från. På samma sätt fungerar en panel som mappats för att lagra de packade mipmapsna för flera olika resurser med samma ytdimensioner. Data visas på samma sätt i båda mappningarna.
Ändringar i paneltilldelningar för en resurs kan göras när som helst i en omedelbar eller uppskjuten kontext.
Fråga efter resurs tiling och support
Om du vill köra frågor mot resurspaneler använder du ID3D11Device2::GetResourceTiling.
Använd ID3D11Device2::CheckMultisampleQualityLevels1för annat stöd för resurssampling.
Kopiera tillagda data
Alla metoder i Direct3D för att flytta data runt fungerar med tillagda resurser precis som om de inte är tillagda, förutom att skrivningar till ommappade områden tas bort och läsningar från ommappade områden ger 0. Om en kopieringsåtgärd innebär att skriva till samma minnesplats flera gånger eftersom flera platser i målresursen mappas till samma panelminne, är de resulterande skrivningarna till flermappade paneler icke-deterministiska och icke-repeterbara. Det vill säga åtkomst sker i vilken ordning maskinvaran råkar köra kopian.
Direct3D 11.2 introducerar metoder för dessa ytterligare sätt att kopiera:
- Kopiera mellan paneler i en tildelad resurs (med 64 KB panelkornighet) och (till/från) en buffert i GPU-minne (grafikprocessor) (eller mellanlagringsresurs) – ID3D11EnhetContext2::CopyTiles
- Kopiera från programminne till paneler i en tildelad resurs – ID3D11EnhetContext2::UpdateTiles
Dessa metoder swizzle/deswizzle efter behov och tillåter en D3D11_TILE_COPY_NO_OVERWRITE flagga när anroparen lovar att målminnet inte refereras av GPU-arbete som är under flygning.
Panelerna som ingår i kopian kan inte innehålla paneler som innehåller packade mipmaps eller som har resultat som är odefinierade. Om du vill överföra data till/från mipmaps som maskinvarupaketen till en panel måste du använda standard-API:erna (icke-panelspecifika) Kopiera/uppdatera API:er eller ID3D11DeviceContext::GenerateMips för hela mip-kedjan.
Note on GenerateMips: Using ID3D11DeviceContext::GenerateMips on a resource with partially mapped tiles will produce results that simply follow the rules for reading and writing NULL applied to whatever algorithm the hardware and display driver happen to use to GenerateMips. Så det är inte särskilt användbart för ett program att bry sig om att göra detta om inte på något sätt de områden med NULL mappningar (och deras effekt på andra mips under genereringsfasen) kommer inte att ha någon inverkan på de delar av ytan som programmet bryr sig om.
Att kopiera paneldata från en mellanlagringsyta eller från programminnet skulle till exempel vara ett sätt att ladda upp paneler som kan ha strömmats från disken. En variant när du strömmar från disken är att ladda upp någon form av komprimerade data till GPU-minnet och sedan avkoda på GPU:n. Avkodningsmålet kan vara en buffertresurs i GPU-minnet, från vilken CopyTiles sedan kopieras till den faktiska tiled-resursen. Det här kopieringssteget gör att GPU:n kan swizzle när swizzle-mönstret inte är känt. Swizzling behövs inte om själva den tillagda resursen är en buffertresurs (till exempel i motsats till en struktur).
Minneslayouten för panelerna i den icke-tillagda buffertresurssidan i kopian är helt enkelt linjär i minnet inom 64 KB-paneler, vilket maskinvaru- och visningsdrivrutinen skulle swizzle/deswizzle per panel efter behov vid överföring till/från en kaklad resurs. För MSAA-ytor (multisample antialiasing) bläddras varje pixels exempel i exempelindexordning innan de flyttas till nästa pixel. För paneler som delvis är fyllda på höger sida (för en yta som har en bredd som inte har flera panelbredder i bildpunkter) är tonhöjden/steget för att flytta ned en rad full storlek i byte av antalet bildpunkter som skulle passa över panelen om panelen var full. Det kan därför finnas ett mellanrum mellan varje rad med bildpunkter i minnet. För enkelhetens skull packas inte mipmaps som är mindre än en panel ihop i den linjära layouten. Detta verkar vara ett slöseri med minnesutrymme, men som nämnts kopiera till mips att maskinvarupaket tillsammans inte tillåts via CopyTiles eller UpdateTiles. Programmet kan bara använda generiska API:er för UpdateSubresource*() eller CopySubresource*() för att kopiera små mips individuellt, men när det gäller CopySubresource*() innebär det att det linjära minnet måste vara samma dimension som den tillagda resursen – CopySubresource*() kan inte kopiera från en buffertresurs till en Texture2D till exempel.
Om en maskinvarustandard swizzle definieras kan flaggor läggas till för att indikera att data i bufferten ska tolkas i det formatet (ingen swizzle krävs vid överföring), även om alternativa metoder för att ladda upp data också kan vara meningsfulla i det fallet, till exempel att tillåta program direkt åtkomst till panelpoolminne.
Kopieringsåtgärder kan utföras i en omedelbar eller uppskjuten kontext.
Ändra storlek på panelpool
Om du vill ändra storlek på en panelpool använder du ID3D11DeviceContext2::ResizeTilePool.
Resursbarriär med tillagda plattor
Om du vill ange en begränsning för dataåtkomstordning mellan flera tillagda resurser använder du ID3D11DeviceContext2::TiledResourceBarrier.
Relaterade ämnen