I. Introduction▲
Jesse Natalie est développeur chez Microsoft dans l'équipe Direct 3D. Ce guide est destiné aux développeurs connaissant et ayant déjà utilisé DirectX 11.
II. Vidéo▲
Guide pour porter une application DirectX 11 vers DirectX 12
III. Transposition de la bibliothèque▲
III-A. Ressources▲
Direct3D 11 |
Direct3D 12 |
ID3D11Resource |
ID3D12Resource |
ID3D11Buffer |
ID3D12Device::CreateCommitedResource |
ID3D11Texture1D |
|
ID3D11Texture2D |
|
ID3D11Texture3D |
ID3D12CreateCommitedResource permet d'obtenir une ressource ayant à la fois son espace d'adressage virtuel et son espace d'adressage physique d'alloués.
Direct3D 11 |
Direct3D 12 |
D3D11_RESOURCE_MISC_TILES |
ID3D12Device::CreateReservedResource |
ID3D12Device::CreateReservedResource permet d'obtenir une ressource n'ayant que de la mémoire allouée virtuellement.
Direct3D 11 |
Direct3D 12 |
D3D11_RESOURCE_MISC_TILE_POOL |
ID3D12Device::CreateHeap |
ID3D12Device::CreateHeap permet d'obtenir une ressource n'ayant que de la mémoire physique. Ainsi vous pouvez l'utiliser pour la faire correspondre page par page à votre mémoire virtuelle.
III-A-1. Envoi des données▲
Avec Direct3D 12, vous avez le contrôle total du nombre de copies et du moment où arrivent ces copies :
- CopyTextureRegion et CopyBufferRegion pour suivre la timeline GPU (les données doivent être prêtes lorsque le GPU en a besoin) ;
- Map pour suivre la timeline CPU ;
- les fonctions D3DX12 UpdateSubresources (entrainant deux copies).
III-B. Shaders et objets d'états▲
Direct3D 11 |
Direct3D 12 |
ID3D11Device::Create* |
ID3D12Device::Create*PipelineState |
ID3D12GraphicsCommandList::SetPipelineState |
Tous les éléments d'états constituant le pipeline (états du tampon de profondeur/stencil, états de la fusion des couleurs, états du rasterizer) sont maintenant représentés sous la forme d'un unique élément : l'état du pipeline (PipelineState).
III-C. Envoi du travail à la carte graphique▲
Avec Direct3D 11, l'envoi du travail se faisait de manière automatique. Si vous vouliez le forcer, vous pouviez utiliser ID3D11DeviceContext::Flush.
Avec Direct3D 12, vous avez :
- les listes de commandes (ID3D12CommandList) permettent d'enregistrer les commandes à envoyer plus tard. Cela peut être comparé au contexte différé de Direct3D 11 ;
- les allocateurs de commandes (ID3D12CommandAllocator) permettent de gérer la mémoire pour les commandes ;
- les queues de commandes (ID3D12CommandQueue) permettent d'enchainer les listes de commandes.
III-D. Synchronisation CPU/GPU▲
Encore une fois, dans Direct3D 11, la synchronisation était automatique. Le CPU attendait le GPU pendant les opérations Present()/Map().
Dans Direct3D 12, vous avez les barrières (ID3D12Fence). Le GPU peut envoyer une notification lorsqu'il a terminé de traiter un travail.
La mémoire ne doit pas être détruite (les ressources, la pile, les allocateurs de commandes) ni écrasée tant que le GPU n'a pas terminé avec celle-ci.
Les ressources accessibles par le CPU et pour lesquelles il y a des opérations de lecture par le GPU doivent être « renommées » pour éviter que le GPU ne soit en attente.
III-D-1. Renommage▲
Direct3D 11 |
Direct3D 12 |
Map(D3D11_MAP_WRITE_DISCARD) |
Allouer plus de mémoire |
Utiliser des barrières pour savoir lorsque les opérations GPU sont terminées |
|
Penser aux tampons circulaires |
III-E. Liaisons des ressources▲
Direct3D 11 |
Direct3D 12 |
Les vues |
Les descripteurs |
ID3D11Device::Create*View |
ID3D12Device::Create*View |
ID3D11*View |
ID3D12DescriptorHeap |
ID3D11DeviceContext ::*Set* |
ID3D12CommandList::Set*RootDescriptorTable |
Lors de la création d'une vue, vous avez besoin de lui indiquer un emplacement dans la pile de descripteurs.
III-E-1. Signature racine▲
Les opérations Direct3D 11 pour lier les ressources aux shaders étaient implicites. Avec Direct3D 12, cela devient explicite et le concept de signature racine (root signature) est ajouté.
L'application contrôle la correspondance de la signature racine jusqu'aux registres utilisés par le shader. Elle est aussi responsable du renommage des tables de descripteurs. Finalement, l'application contrôle quels sont les descripteurs qui sont partagés entre les niveaux de shader, la fréquence des mises à jour…
III-F. État de ressource▲
Direct3D 12 apporte les états de ressource. L'application doit indiquer au pilote lorsque l'utilisation des ressources change. Ainsi, il est possible de mieux synchroniser le CPU et le GPU, de vider les caches ou encore de gérer les changements de la disposition de la mémoire.
III-G. Swapchains▲
Direct3D 11 |
Direct3D 12 |
DXGI_SWAP_EFFECT |
DXGI_SWAP_EFFECT |
DXGI_SWAP_EFFECT est toujours d'actualité. Toutefois quelques modifications mineures ont été apportées : seuls FLIP_SEQUENTIAL et FLIP_DISCARD existent. FLIP_DISCARD n'est disponible que pour Windows 10.
De plus, la rotation des tampons devient explicite. Vous pouvez utiliser IDXGISwapChain3::GetCurrentBackBufferIndex pour choisir le tampon dans lequel vous voulez dessiner.
III-H. Fonctions de rendu▲
Direct3D 11 |
Direct3D 12 |
GenerateMips |
L'application est responsable de la création de shaders pour reproduire ces opérations. |
DrawAuto |
IV. Commenter▲
Vous pouvez commenter et donner vos avis dans la discussion associée sur le forum.