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
ID3D11Device::CreateBuffer

ID3D12Device::CreateCommitedResource

ID3D11Texture1D
ID3D11Device::CreateTexture1D

ID3D11Texture2D
ID3D11Device::CreateTexture2D

ID3D11Texture3D
ID3D11Device::CreateTexture3D

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*
ID3D11DeviceContext ::*Set*

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
ID3D12Device::CreateDescriptorHeap

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.