DirectX11 sans fenêtre attachée?

13

Je me demande simplement s'il est possible d'initialiser et d'utiliser DX11 ou DX9 pour le rendu hors écran uniquement - c'est-à-dire sans fenêtre attachée. Mon intention est de faire un benchmarking GPU avant d'ouvrir la fenêtre réelle. Dans cette analyse comparative, une scène de test est rendue, mais ne doit pas être visible. (En fait, selon le score de référence, différentes fenêtres sont ouvertes)

GPUquant
la source
2
Avec D3D11, vous devez fournir une poignée de fenêtre lors de la création de la chaîne d'échange, voir ici . Mais peut-être qu'il y a un moyen de cacher cette fenêtre?
Laurent Couvidou
1
oui, je sais, que DX11 nécessite un handle de fenêtre pour le swapchain - mais si vous effectuez un rendu hors écran, avez-vous vraiment besoin d'un swapchain? Existe-t-il un moyen d'initialiser et de rendre sans swapchain - Je pensais que swapchain est juste pour le rendu d'écran ...
GPUquant
1
En ce moment j'essaye d'utiliser la fenêtre 1x1px qui est cachée. Mais ce n'est pas une bonne solution, je dirais.
GPUquant

Réponses:

15

Oui. Vous pouvez initialiser le périphérique Direct3D à l'aide de D3D11CreateDevice, qui ne nécessite aucune fenêtre. Vous ne créez tout simplement pas du tout de chaîne d'échange. Vous pouvez toujours créer des cibles de rendu hors écran et y dessiner de la manière habituelle. Au lieu d'appeler Presentsur la chaîne de swap, vous pouvez appeler ID3D11DeviceContext::Flushpour lancer le GPU avec le travail que vous avez mis en file d'attente.

Si vous souhaitez par la suite créer une fenêtre, vous pouvez détruire le périphérique et le recréer avec D3D11CreateDeviceAndSwapChain, ou vous pouvez créer une chaîne de permutation et l'attacher au périphérique existant avec IDXGIFactory::CreateSwapChain. (Le IDXGIFactoryest un objet COM distinct qui doit d'abord être créé CreateDXGIFactory.)

Nathan Reed
la source
+1 Appel Flushau lieu de présenter la chaîne de swap, c'est bien!
Laurent Couvidou
Est-ce possible en quelque sorte avec D3D9 via la IDirect3D9::CreateDeviceméthode? Je n'ai D3D9CreateDevicemalheureusement pas trouvé de méthode.
Vinz
@Vinzenz Je ne pense pas. D3D9 ne sépare pas les concepts de "périphérique" et de "chaîne d'échange", comme le font D3D10 et les versions ultérieures. Ils sont tous deux intégrés dans l'objet périphérique D3D9, qui nécessite une HWNDcréation.
Nathan Reed