Condividi tramite


Aliasing della memoria e ereditarietà dei dati

La risorsa inserita e riservata può aliasre la memoria fisica all'interno di un heap. Le risorse inserite consentono più scenari di ereditarietà dei dati rispetto alle risorse riservate quando l'heap ha il flag condiviso impostato o quando le risorse con alias hanno layout di memoria completamente definiti.

Aliasing

È necessario eseguire una barriera di aliasing tra l'utilizzo di due risorse che condividono la stessa memoria fisica, anche se l'ereditarietà dei dati non è desiderata. I modelli di utilizzo semplici devono indicare, almeno, la risorsa di destinazione coinvolta in un'operazione di questo tipo. Per altri dettagli e modelli di utilizzo avanzati, vedere CreatePlacedResource.

Dopo l'accesso a una risorsa, tutte le risorse che condividono memoria fisica con tale risorsa diventano invalidate, a meno che non venga consentita l'ereditarietà dei dati. Le letture delle risorse invalidate generano contenuto di risorse non definito. Le scritture nelle risorse invalidate comportano anche contenuti di risorse non definiti, a meno che non si verifichino due condizioni:

  • La risorsa non dispone del D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET o del D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL.
  • La scrittura è un'operazione di copia o cancellazione in un'intera sottorisorsa o riquadro. L'inizializzazione dei riquadri è disponibile solo per le risorse con 64KB_TILE_UNDEFINED_SWIZZLE e 64KB_TILE_STANDARD_SWIZZLE.

Le invalidazioni sovrapposte sono limitate alle granularità più piccole, quando i layout forniscono informazioni sulla posizione dei dati di texel e quando le risorse si trovano in determinati stati di barriera di transizione. Tuttavia, le invalidazioni non possono superare le granularità di allineamento delle risorse.

La granularità dell'allineamento del buffer è di 64 KB e la granularità dell'allineamento più grande ha la precedenza. Questo aspetto è importante quando si considerano trame di 4 KB, poiché più trame da 4 KB possono risiedere in un'area di 64 KB senza sovrapporsi tra loro. Tuttavia, non è possibile usare un alias di buffer della stessa area di 64 KB insieme a una di queste trame da 4 KB. L'applicazione non può mantenere in modo affidabile l'accesso al buffer intersecando le trame da 4 KB, perché le GPU possono eseguire lo scorrimento rapido dei dati delle trame di 4 KB all'interno dell'area di 64 KB in un modello non definito.

64KB_TILE_UNDEFINED_SWIZZLE, 64KB_TILE_STANDARD_SWIZZLE e ROW_MAJOR layout delle trame informano l'applicazione che le granularità di allineamento sovrapposte non sono più valide. Ad esempio: un'applicazione può creare una matrice di trama di destinazione di rendering 2D con 2 sezioni di matrice, un singolo livello mip e il layout 64KB_TILE_UNDEFINED_SWIZZLE. Si supponga che l'applicazione comprenda ogni sezione della matrice occupa 100 riquadri da 64 KB. L'applicazione può usare la sezione matrice 0 e riutilizzare tale memoria per un buffer di ~6 MB, una trama di ~6 MB con layout non definito e così via. Si supponga che l'applicazione non richieda più il primo riquadro della sezione matrice 1. Quindi, l'applicazione potrebbe anche individuare un buffer da 64 KB fino a quando il rendering non richiederebbe di nuovo il primo riquadro della sezione di matrice 1. L'applicazione dovrà eseguire un riquadro completo non crittografato o copiarlo per riutilizzare il primo riquadro con la matrice di trame.

Tuttavia, anche le trame con layout definiti presentano casi problematici. Le dimensioni delle risorse trama possono essere notevolmente diverse da quelle che l'applicazione può calcolare, perché alcune architetture di adattatori allocano memoria aggiuntiva per le trame per ridurre la larghezza di banda effettiva durante scenari di rendering comuni. Eventuali invalidazioni in tale area di memoria aggiuntiva causano l'invalidazione dell'intera risorsa. Per altri dettagli, vedere GetResourceAllocationInfo.

Ereditarietà dei dati

Le risorse inserite consentono la maggior parte dell'ereditarietà dei dati per le trame, anche con layout di memoria non definiti. Le applicazioni possono simulare le funzionalità di ereditarietà dei dati abilitate dalle risorse di cui è stato eseguito il commit individuando due trame con proprietà di risorse identiche allo stesso offset in un heap condiviso. L'intera descrizione della risorsa deve essere identica, inclusi il valore non crittografato ottimizzato e il tipo di metodo di creazione delle risorse (inserito o riservato). Tuttavia, entrambe le risorse potrebbero avere stati di barriera di transizione iniziali diversi.

Le risorse riservate abilitano l'ereditarietà dei dati per riquadro; ma esistono in genere restrizioni per gli stati delle barriere di transizione delle risorse.

Per ereditare i dati, entrambe le risorse devono trovarsi in uno stato di barriera di transizione delle risorse compatibile:

  • Per i buffer, le trame di accesso simultaneo e le trame tra adattatori, lo stato della transizione delle risorse non è importante e tutti gli stati sono "compatibili".
  • Per le trame riservate senza le proprietà precedenti o altre ereditarietà dei dati per riquadro tramite 64KB_TILE_UNDEFINED_SWIZZLE o 64KB_TILE_STANDARD_SWIZZLE, lo stato della barriera di transizione delle risorse, incluso il riquadro, deve essere nello stato comune.
  • Per tutte le altre trame, in cui le descrizioni delle risorse corrispondono esattamente, lo stato della barriera di transizione delle risorse per ogni coppia corrispondente di sottorisorse deve:
    • Essere nello stato comune.
    • Essere uguale quando lo stato contiene lo stesso flag di scrittura GPU.

Quando la GPU supporta lo scorrimento rapido standard, i buffer e le trame swizzle standard possono essere aliasati alla stessa memoria e ereditano i dati tra di essi. L'applicazione può modificare i texel dalla rappresentazione del buffer, perché il modello swizzle standard descrive il modo in cui i texel sono disposti in memoria. Il modello swizzle visibile dalla CPU equivale al modello swizzle visibile dalla GPU visualizzato nei buffer.

Sottorilevazione all'interno di heap