Share via


API risorsa riquadri

Le API descritte in questa sezione funzionano con risorse e pool di riquadri riquadri.

Assegnazione di riquadri da un pool di riquadri a una risorsa

ID3D11DeviceContext2::UpdateTileMappings e ID3D11DeviceContext2::CopyTileMappings modificano e modificano i mapping dei riquadri delle query. Le chiamate di aggiornamento influiscono solo sui riquadri identificati nella chiamata e altri vengono lasciati come definito in precedenza.

Qualsiasi riquadro specificato da un pool di riquadri può essere mappato a più posizioni in una risorsa e anche più risorse. Questo mapping include riquadri in una risorsa con layout scelto dall'implementazione (imballaggio mipmap) in cui più mipmap vengono raggruppati in un singolo riquadro. Il catch è che se i dati vengono scritti nel riquadro tramite un mapping, ma letti tramite un mapping configurato in modo diverso, i risultati non sono definiti. L'uso attento di questa flessibilità può comunque essere utile per un'applicazione, ad esempio la condivisione di un riquadro tra le risorse che non verranno usate simultaneamente, in cui il contenuto del riquadro viene sempre inizializzato tramite lo stesso mapping delle risorse da cui verranno successivamente letti. Analogamente, un riquadro mappato per contenere le mipmap di più risorse diverse con le stesse dimensioni di superficie funzionerà correttamente. I dati verranno visualizzati nello stesso modo in entrambi i mapping.

Le modifiche alle assegnazioni di riquadri per una risorsa possono essere apportate in qualsiasi momento in un contesto immediato o posticipato.

Esecuzione di query sul tiling e il supporto delle risorse

Per eseguire query sul tiling delle risorse, usare ID3D11Device2::GetResourceTiling.

Per altre risorse di supporto, usare ID3D11Device2::CheckMultisampleQualityLevels1.

Copia dei dati riquadri

Tutti i metodi in Direct3D per lo spostamento dei dati sul lavoro con le risorse riquadri, come se non siano riquadri, ad eccezione della presenza di scritture in aree non mappate vengono eliminate e le letture da aree non mappate producono 0. Se un'operazione di copia comporta la scrittura nella stessa posizione di memoria più volte perché più posizioni nella risorsa di destinazione vengono mappate alla stessa memoria del riquadro, le scritture risultanti nei riquadri con mapping multiplo non sono deterministiche e non ripetibili. Vale a dire, gli accessi si verificano in qualsiasi ordine in cui l'hardware accade per eseguire la copia.

Direct3D 11.2 introduce metodi per questi modi aggiuntivi per copiare:

  • Copiare tra i riquadri in una risorsa riquadri riquadri (a 64 KB) e (a/da) un buffer nella memoria dell'unità di elaborazione grafica (GPU) (o risorsa di gestione temporanea) - ID3D11DeviceContext2::CopyTiles
  • Copiare dalla memoria fornita dall'applicazione ai riquadri in una risorsa riquadri - ID3D11DeviceContext2::UpdateTiles

Questi metodi swizzle/deswizzle in base alle esigenze e consentono un flag di D3D11_TILE_COPY_NO_OVERWRITE quando il chiamante promette che la memoria di destinazione non viene fatto riferimento al lavoro della GPU in anteprima.

I riquadri coinvolti nella copia non possono includere riquadri contenenti mipmap compressi o che hanno risultati non definiti. Per trasferire i dati da/verso mipmap che i pacchetti hardware vengono inseriti in un riquadro, è necessario usare le API di copia/aggiornamento standard o ID3D11DeviceContext::GenerateMips per l'intera catena mip.

Nota su GenerateMips: l'uso di ID3D11DeviceContext::GenerateMips in una risorsa con riquadri parzialmente mappati produrrà risultati che seguono semplicemente le regole per la lettura e la scrittura di NULL applicate a qualsiasi algoritmo l'hardware e il driver di visualizzazione si verifichino per GenerateMips. Quindi, non è particolarmente utile per un'applicazione che si preoccupa di eseguire questa operazione, a meno che in qualche modo le aree con mapping NULL (e il loro effetto su altri mips durante la fase di generazione) non avrà alcuna conseguenza sulle parti dell'applicazione di superficie.

La copia dei dati del riquadro da un'area di gestione temporanea o dalla memoria dell'applicazione sarebbe il modo per caricare i riquadri che potrebbero essere stati trasmessi dal disco, ad esempio. Una variazione quando lo streaming fuori disco carica alcuni tipi di dati compressi nella memoria GPU e quindi decodifica sulla GPU. La destinazione di decodifica può essere una risorsa buffer nella memoria GPU, da cui CopiaTiles copia quindi nella risorsa riquadri effettiva. Questo passaggio di copia consente alla GPU di eseguire lo scorrimento rapido quando il modello swizzle non è noto. Il swizzling non è necessario se la risorsa riquadri stessa è una risorsa buffer (ad esempio, anziché una trama).

Il layout di memoria dei riquadri nel lato della risorsa buffer non riquadri riquadri del buffer non riquadri è semplicemente lineare in memoria entro 64 KB, che l'hardware e il driver di visualizzazione avrebbero swizzle/deswizzle per riquadro in base alle esigenze quando si trasferisce a/da una risorsa riquadri riquadri. Per le superfici antiasasing multisample (MSAA), gli esempi di ogni pixel vengono attraversati nell'ordine di indice di esempio prima di passare al pixel successivo. Per i riquadri parzialmente riempiti sul lato destro (per una superficie che ha una larghezza non più di larghezza del riquadro in pixel), il passo/stride per spostare una riga è la dimensione completa in byte dei pixel di numero che si adattano nel riquadro se il riquadro era pieno. Quindi, può esserci uno spazio tra ogni riga di pixel in memoria. Per semplicità delle specifiche, le mappe mipmap più piccole di un riquadro non vengono raggruppate nel layout lineare. Questo sembra essere uno spreco di spazio di memoria, ma come accennato copia in mips che i pacchetti hardware non sono consentiti tramite CopyTiles o UpdateTiles. L'applicazione può usare solo API Generic UpdateSubresource*() o CopySubresource*() per copiare singoli mips di piccole dimensioni, anche se nel caso di CopySubresource*() significa che la memoria lineare deve essere la stessa dimensione della risorsa riquadri - CopySubresource*() non può copiare da una risorsa buffer in una trama2D per esempio.

Se viene definito uno swizzle standard hardware, i flag possono essere aggiunti per indicare che i dati nel buffer devono essere interpretati in tale formato (nessuna opzione swizzle necessaria per il trasferimento), anche se gli approcci alternativi per il caricamento dei dati possono essere utile anche in questo caso, ad esempio consentire alle applicazioni l'accesso diretto alla memoria del pool di riquadri.

Le operazioni di copia possono essere eseguite in un contesto immediato o posticipato.

Ridimensionamento del pool di riquadri

Per ridimensionare un pool di riquadri, usare ID3D11DeviceContext2::ResizeTilePool.

Barriera delle risorse riquadri

Per specificare un vincolo di ordinamento degli accessi ai dati tra più risorse riquadri, usare ID3D11DeviceContext2::TiledResourceBarrier.

Risorse riquadri