DirectX11 bez dołączonego okna?

13

Zastanawiam się tylko, czy można zainicjować i używać DX11 lub DX9 tylko do renderowania poza ekranem - czyli bez dołączonego okna. Moim zamiarem jest wykonanie testu porównawczego GPU przed otwarciem rzeczywistego okna. Podczas tego testu porównawczego niektóre sceny testowe są renderowane, ale nie powinny być widoczne. (Właściwie w zależności od wyniku testu otwierają się różne okna)

GPUquant
źródło
2
Z D3D11 musisz zapewnić uchwyt okna podczas tworzenia łańcucha wymiany, patrz tutaj . Ale może jest jakiś sposób na ukrycie tego okna?
Laurent Couvidou
1
tak, wiem, że DX11 wymaga uchwytu okna dla swapchain - ale jeśli renderujesz tylko poza ekranem, czy naprawdę potrzebujesz jakiegoś swapchaina? Czy jest jakiś sposób na zainicjowanie i renderowanie bez swapchaina - myślałem, że swapchain służy tylko do renderowania ekranu ...
GPUquant
1
W tej chwili próbuję użyć okna 1x1px, które jest ukryte. Ale nie jest to miłe rozwiązanie.
GPUquant

Odpowiedzi:

15

Tak. Możesz zainicjować urządzenie Direct3D za pomocą D3D11CreateDevice, które nie wymaga okna. Po prostu wcale nie tworzysz łańcucha wymiany. Nadal możesz tworzyć cele renderowania poza ekranem i rysować do nich w zwykły sposób. Zamiast wywoływać Presentłańcuch wymiany, możesz zadzwonić, ID3D11DeviceContext::Flushaby uruchomić procesor graficzny za pomocą pracy, którą ustawiłeś w kolejce.

Jeśli chcesz później utworzyć okno, możesz zniszczyć urządzenie i odtworzyć je za pomocą D3D11CreateDeviceAndSwapChainlub utworzyć łańcuch wymiany i dołączyć go do istniejącego urządzenia za pomocą IDXGIFactory::CreateSwapChain. ( IDXGIFactoryJest to oddzielny obiekt COM, który należy CreateDXGIFactorynajpierw utworzyć ).

Nathan Reed
źródło
+1 Dzwonienie Flushzamiast prezentacji łańcucha wymiany, jest fajne!
Laurent Couvidou
Czy jest to jakoś możliwe w przypadku D3D9 za pomocą tej IDirect3D9::CreateDevicemetody? D3D9CreateDeviceNiestety nie mogłem znaleźć metody.
Vinz
@ Vinzenz Nie sądzę. D3D9 nie rozdziela pojęć „urządzenie” i „łańcuch wymiany”, podobnie jak D3D10 i nowsze. Oba są wtaczane do obiektu urządzenia D3D9, który wymaga HWNDutworzenia.
Nathan Reed