Share via


D3D11On12

D3D11On12 è un meccanismo per cui gli sviluppatori possono usare interfacce e oggetti D3D11 per guidare l'API D3D12. D3D11on122 consente ai componenti scritti usando D3D11 (ad esempio, testo d2D e interfaccia utente) di lavorare insieme ai componenti scritti per l'API D3D12. D3D11on12 consente anche la conversione incrementale di un'applicazione da D3D11 a D3D12, abilitando parti dell'app per continuare a indirizzare D3D11 per semplicità mentre altre destinazione D3D12 per le prestazioni, pur avendo sempre rendering completo e corretto. D3D11On12 semplifica l'uso di tecniche di interoperabilità per condividere le risorse e sincronizzare il lavoro tra le due API.

Inizializzazione di D3D11On12

Per iniziare a usare D3D11On12, il primo passaggio consiste nel creare un dispositivo D3D12 e una coda di comandi. Questi oggetti vengono forniti come input al metodo di inizializzazione D3D11On12CreateDevice. È possibile pensare a questo metodo come creare un dispositivo D3D11 con il tipo di driver immaginari D3D_DRIVER_TYPE_11ON12, dove il driver D3D11 è responsabile della creazione di oggetti e dell'invio di elenchi di comandi all'API D3D12.

Dopo avere un dispositivo D3D11 e un contesto immediato, è possibile QueryInterface disattivare il dispositivo per l'interfaccia ID3D11On12Device . Si tratta dell'interfaccia primaria usata per l'interoperabilità tra D3D11 e D3D12. Per avere sia il contesto del dispositivo D3D11 che gli elenchi di comandi D3D12 operano sulle stesse risorse, è necessario creare risorse "wrapped" usando l'API CreateWrappedResource . Questo metodo "promuove" una risorsa D3D12 da comprendere in D3D11. Una risorsa con wrapping inizia nello stato "acquisito", una proprietà modificata dai metodi AcquireWrappedResources e ReleaseWrappedResources .

Example Usage (Esempio di uso)

L'utilizzo tipico di D3D11On11On12 consiste nell'usare D2D per eseguire il rendering di testo o immagini sopra un buffer back D3D12. Per esempio, vedere l'esempio D3D11On12. Ecco una struttura approssimativa dei passaggi da eseguire per farlo:

  • Creare un dispositivo D3D12 (D3D12CreateDevice) e una catena di scambio D3D12 (CreateSwapChain con ID3D12CommandQueue come input).
  • Creare un dispositivo D3D11On12 usando il dispositivo D3D12 e la stessa coda di comandi dell'input.
  • Recuperare i buffer back della catena di scambio e creare risorse con wrapping D3D11 per ognuna di esse. Lo stato di input usato deve essere l'ultimo modo in cui D3D12 lo usa (ad esempio RENDER_TARGET) e lo stato di output deve essere il modo in cui D3D12 verrà usato dopo il completamento di D3D11 (ad esempio PRESENT).
  • Inizializzare D2D e fornire le risorse con wrapping D3D11 a D2D per preparare il rendering.

Quindi, in ogni frame, eseguire le operazioni seguenti:

  • Eseguire il rendering nel buffer di back della catena di scambio corrente usando un elenco di comandi D3D12 ed eseguirlo.
  • Acquisire la risorsa wrapped del buffer back corrente (AcquireWrappedResources).
  • Eseguire i comandi di rendering D2D.
  • Rilasciare la risorsa con wrapping (ReleaseWrappedResources).
  • Scaricare il contesto immediato D3D11.
  • Presente (IDXGISwapChain1::P resent1).

Sfondo

D3D11On12 funziona sistematicamente. Ogni chiamata API D3D11 passa attraverso la convalida di runtime tipica e ne fa il modo per il driver. A livello di driver, gli elenchi di comandi speciali 11on12 registrano lo stato e i problemi di rendering delle operazioni negli elenchi di comandi D3D12. Questi elenchi di comandi vengono inviati in base alle esigenze( ad esempio, una query GetData o una risorsa Map potrebbero richiedere il download dei comandi) o come richiesto da Flush. La creazione di un oggetto D3D11 comporta in genere la creazione dell'oggetto D3D12 corrispondente. Alcune operazioni di rendering delle funzioni fisse in D3D11, ad esempio GenerateMips o DrawAuto non sono supportate in D3D12 e quindi D3D11On12 li emula usando shader e risorse aggiuntive.

Per l'interoperabilità, è importante comprendere in che modo D3D11On12 interagisce con gli oggetti D3D12 creati e forniti dall'app. Per garantire che il lavoro si verifichi nell'ordine corretto, il contesto immediato D3D11 deve essere scaricato prima che sia possibile inviare ulteriori operazioni D3D12 a tale coda. È anche importante assicurarsi che la coda specificata a D3D11On112 sia svuotabile in ogni momento. Ciò significa che eventuali attese nella coda devono essere soddisfatte, anche se il thread di rendering D3D11 blocca in modo indefinito. Non prendere una dipendenza da quando D3D11On112 inserisce scaricamenti o attese, in quanto può cambiare con le versioni future. Inoltre, D3D11On12 tiene traccia e modifica gli stati delle risorse autonomamente. L'unico modo per garantire la coesistenza delle transizioni di stato consiste nell'usare le API di acquisizione/rilascio per modificare il rilevamento dello stato in base alle esigenze dell'app.

Pulizia

Per rilasciare una risorsa con wrapping D3D11On12, due elementi devono verificarsi in questo ordine:

  • Tutti i riferimenti alla risorsa, incluse le visualizzazioni della risorsa, devono essere rilasciati.
  • L'elaborazione di distruzione posticipata deve essere eseguita. Il modo più semplice per assicurarsi che ciò si verifichi consiste nell'richiamare l'API di contesto Flush immediata.

Dopo aver completato entrambi i passaggi, tutti i riferimenti eseguiti dalla risorsa con wrapping devono essere rilasciati e la risorsa D3D12 diventa esclusivamente di proprietà del componente D3D12. Tenere presente che D3D12 richiede comunque l'attesa del completamento della GPU prima di rilasciare completamente una risorsa, quindi assicurarsi di contenere un riferimento sulla risorsa prima di eseguire i due passaggi precedenti, a meno che non sia già stata confermata che la GPU non usa più la risorsa.

Tutte le altre risorse o oggetti creati da D3D11On12 verranno puliti al momento appropriato, al termine dell'uso della GPU, usando il meccanismo di distruzione posticipato di D3D11. Tuttavia, se si tenta di rilasciare il dispositivo D3D11On12 stesso mentre la GPU è ancora in esecuzione, la distruzione potrebbe bloccare fino al completamento della GPU.

Limitazioni

Il livello D3D11On12 implementa un subset molto grande dell'API D3D11, ma esistono alcune lacune note (oltre ai bug nell'implementazione che possono causare il rendering non corretto).

A partire da Windows 10, versione 1809 (10,0; Build 17763), purché D3D11On11On12 sia in esecuzione su un driver che supporta Shader Model 6.0 o versione successiva, può quindi eseguire shader che usano interfacce. Nelle versioni precedenti di Windows, la funzionalità delle interfacce shader non viene implementata in D3D11On11On12 e il tentativo di usare la funzionalità causerà errori e messaggi di debug.

A partire da Windows 10, versione 1803 (10.0; Build 17134), le catene di scambio sono supportate nei dispositivi D3D11On12. Nelle versioni precedenti di Windows non sono.

D3D11On12 non è stato ottimizzato per le prestazioni. È probabile che si verifichi un sovraccarico della CPU moderato rispetto a un driver D3D11 standard, un sovraccarico minimo della GPU e che sia noto un sovraccarico di memoria significativo. Pertanto non è consigliabile usare D3D11On12 per scene 3D complicate ed è invece consigliabile per il rendering di scene semplici o 2D.

API

Le API che costituiscono il livello 11on12 sono descritte in Riferimento a 11on12.

D2D usando D3D111on12 procedura dettagliata

Informazioni su Direct3D 12

Uso di Direct3D 11, Direct3D 10 e Direct2D