DirectX11 ohne Fenster angeschlossen?

13

Ich frage mich nur, ob es möglich ist, DX11 oder DX9 nur für das Offscreen-Rendering zu initialisieren und zu verwenden - das heißt, ohne angeschlossenes Fenster. Ich beabsichtige, ein GPU-Benchmarking durchzuführen, bevor ich das eigentliche Fenster öffne. In diesem Benchmarking wird eine Testszene gerendert, sollte aber nicht sichtbar sein. (Tatsächlich werden je nach Benchmark-Score verschiedene Fenster geöffnet)

GPUquant
quelle
2
Mit D3D11 Sie benötigen einen Fenstergriff zu schaffen , wenn die Swap - Kette erstellen, finden Sie hier . Aber vielleicht gibt es eine Möglichkeit, dieses Fenster zu verbergen?
Laurent Couvidou
1
Ja, ich weiß, dass DX11 ein Fensterhandle für die Swapchain benötigt - aber wenn Sie nur offscreen rendern, brauchen Sie dann wirklich eine Swapchain? Gibt es eine Möglichkeit , ohne swapchain zu initialisieren und machen - ich dachte swapchain ist nur für die Bildschirmwiedergabe ...
GPUquant
1
Im Moment versuche ich, 1x1px-Fenster zu verwenden, das versteckt ist. Aber es ist keine schöne Lösung, würde ich sagen.
GPUquant

Antworten:

15

Ja. Sie können das Direct3D-Gerät mit initialisieren D3D11CreateDevice, für das kein Fenster erforderlich ist. Sie erstellen einfach überhaupt keine Swap-Kette. Sie können weiterhin Offscreen-Rendering-Ziele erstellen und auf die übliche Weise darauf zeichnen. Anstatt Presentdie Swap-Kette anzurufen, können Sie anrufen ID3D11DeviceContext::Flush, um die GPU mit der Arbeit zu starten, die Sie in der Warteschlange angestellt haben.

Wenn Sie später ein Fenster erstellen möchten, können Sie das Gerät zerstören und mit neu erstellen D3D11CreateDeviceAndSwapChain, oder Sie können eine Auslagerungskette erstellen und mit an das vorhandene Gerät anhängen IDXGIFactory::CreateSwapChain. (Dies IDXGIFactoryist ein separates COM-Objekt, mit dem CreateDXGIFactoryzuerst erstellt werden muss.)

Nathan Reed
quelle
+1 FlushAnstatt die Swap-Kette zu präsentieren, ist das ordentlich!
Laurent Couvidou
Ist das mit D3D9 irgendwie über die IDirect3D9::CreateDeviceMethode möglich? Ich konnte D3D9CreateDeviceleider keine Methode finden .
Vinz
@Vinzenz denke ich nicht. D3D9 trennt nicht die Konzepte "Gerät" und "Swap-Kette", wie D3D10 und höher. Sie sind beide im D3D9-Geräteobjekt zusammengefasst, für dessen HWNDErstellung ein erforderlich ist .
Nathan Reed