Minnesalias och dataarv

Placerade och reserverade resurser kan referera till fysiskt minne inom en heap. Placerade resurser möjliggör fler scenarier för dataarv än reserverade resurser när heapen har den delade flagguppsättningen eller när de aliaserade resurserna har fullständigt definierade minneslayouter.

aliasering

En aliasbarriär måste utfärdas mellan användningen av två resurser som delar samma fysiska minne, även om dataarv inte önskas. Enkla användningsmodeller måste minst ange målresursen som ingår i en sådan åtgärd. Mer information och avancerade användningsmodeller finns i CreatePlacedResource.

När en resurs har använts ogiltigförklaras alla resurser som delar fysiskt minne med den resursen, såvida inte arv av data tillåts ske. Läsningar av ogiltiga resurser resulterar i odefinierat resursinnehåll. Skrivningar till ogiltiga resurser resulterar också i odefinierat resursinnehåll, såvida inte två villkor inträffar:

  • Resursen har varken D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET eller D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL.
  • Skrivningen är en kopierings- eller rensningsåtgärd till en hel underresurs eller kakel. Tile-initiering är endast tillgänglig för resurser med 64KB_TILE_UNDEFINED_SWIZZLE och 64KB_TILE_STANDARD_SWIZZLE.

Överlappande ogiltigheter begränsas till mindre kornigheter, när layouter ger information om platsen för texeldata och när resurser finns i vissa övergångsbarriärtillstånd. Men ogiltigförklaringar kan inte vara mindre än resursjusteringsgranulariteten.

En buffertjusteringskornighet är 64 KB och större justeringskornighet har företräde. Detta är viktigt när du överväger 4KB-texturer, eftersom flera 4 KB-texturer kan finnas i en 64 KB-region utan att överlappa varandra. Det går inte att använda en buffert som aliasar samma 64 KB-region tillsammans med någon av dessa 4 KB-texturer. Programmet kan inte på ett tillförlitligt sätt hålla åtkomsten till bufferten från att korsa 4KB-texturerna, eftersom GPU:er tillåts att swizzle 4KB-texturdata inom 64KB-regionen i ett odefinierat mönster.

64KB_TILE_UNDEFINED_SWIZZLE, 64KB_TILE_STANDARD_SWIZZLE och ROW_MAJOR strukturlayouter informerar programmet om vilka överlappande justeringsgranulariteter som blivit ogiltiga. Till exempel: Ett program kan skapa en 2D-renderad målstrukturmatris med 2 matrissektorer, en enda mip-nivå och 64KB_TILE_UNDEFINED_SWIZZLE layout. Anta att programmet förstår att varje matrissnitt upptar 100 64KB-plattor. Programmet kan avstå från att använda matrissektor 0 och återanvända minnet för antingen en ~6 MB buffert, en ~6 MB struktur med odefinierad layout osv. Om du går vidare antar du att programmet inte längre krävde den första panelen i matrissektor 1. Sedan kunde programmet också placera en buffert på 64 KB där tills återgivningen skulle kräva den första panelen i matrisskiva 1. Programmet måste rensa eller kopiera en fullständig panel för att kunna återanvända den första panelen med texturmatrisen igen.

Men även texturer med definierade layouter har fortfarande problematiska fall. Strukturresursstorlekar kan skilja sig avsevärt från vad programmet kan beräkna självt, eftersom vissa adapterarkitekturer allokerar extra minne för texturer för att minska den effektiva bandbredden under vanliga renderingsscenarier. Om det skulle ske några ogiltigförklaringar i den extra minnesregionen så blir hela resursen ogiltigförklarad. Mer information finns i GetResourceAllocationInfo.

Arv av data

Placerade resurser möjliggör flest dataarv för texturer, även med odefinierade minneslayouter. Applikationer kan efterlikna de dataarvsfunktioner som delade allokerade resurser möjliggör genom att hitta två texturer med identiska resursegenskaper på samma offset i en delad heap. Hela resursbeskrivningen måste vara identisk, inklusive det optimerade klarvärdet och typen av metod för resursskapande (placerad eller reserverad). Men båda resurserna kan ha haft olika inledande övergångsbarriärtillstånd.

Reserverade resurser aktiverar arv av data per panel. men det finns ofta begränsningar för barriärtillstånd för resursövergång.

Om du vill ärva data måste båda resurserna ha ett kompatibelt barriärtillstånd för resursövergång:

  • För buffertar, samtidiga åtkomsttexturer och texturer mellan adaptrar är resursövergångstillståndet inte viktigt och alla tillstånd är "kompatibla".
  • För reserverade texturer utan tidigare egenskaper eller andra dataarv per panel via 64KB_TILE_UNDEFINED_SWIZZLE eller 64KB_TILE_STANDARD_SWIZZLE måste resursövergångsbarriärens tillstånd, inklusive panelen, vara i gemensamt tillstånd.
  • För alla andra texturer, där resursbeskrivningarna matchar exakt, måste resursövergångsbarriärens tillstånd för varje motsvarande par av underresurser:
    • Var i det gemensamma tillståndet.
    • Var lika när tillståndet har samma GPU-skrivflagga i sig.

När GPU:n har stöd för standard-swizzle kan buffertar och standardstrukturer för swizzle vara alias för samma minne och ärva data mellan dem. Applikationen kan manipulera texlar från buffertrepresentationen, eftersom swizzle-mönstret beskriver hur texlar är arrangerade i minnet. Det CPU-synliga swizzle-mönstret motsvarar det GPU-synliga swizzle-mönstret som är synligt i buffertar.

underallokering inom Heaps