DirectX11 sin ventana adjunta?

13

Me pregunto si es posible inicializar y usar DX11 o DX9 solo para renderizar fuera de pantalla, es decir, sin ventana adjunta. Mi intención es hacer un benchmarking de GPU antes de abrir la ventana real. En esta evaluación comparativa se representa una escena de prueba, pero no debe ser visible. (En realidad, dependiendo del puntaje de referencia, se abren diferentes ventanas)

GPUquant
fuente
2
Con D3D11 debe proporcionar un identificador de ventana al crear la cadena de intercambio, consulte aquí . ¿Pero tal vez hay una manera de ocultar esta ventana?
Laurent Couvidou
1
Sí, lo sé, que DX11 requiere un tirador de ventana para la cadena de intercambio, pero si solo representa fuera de la pantalla, ¿realmente necesita alguna cadena de intercambio? ¿Hay alguna manera de inicializar y dejar sin swapchain - pensé swapchain es sólo para visualización en pantalla ...
GPUquant
1
En este momento estoy tratando de usar la ventana 1x1px que está oculta. Pero no es una buena solución, diría.
GPUquant

Respuestas:

15

Si. Puede inicializar el dispositivo Direct3D utilizando D3D11CreateDevice, lo que no requiere ninguna ventana. Simplemente no crea una cadena de intercambio en absoluto. Todavía puede crear objetivos de renderizado fuera de pantalla y dibujar en ellos de la manera habitual. En lugar de llamar Presenta la cadena de intercambio, puedes llamar ID3D11DeviceContext::Flushpara patear la GPU con el trabajo que has puesto en cola.

Si más tarde desea crear una ventana, puede destruir el dispositivo y volver a D3D11CreateDeviceAndSwapChaincrearlo, o puede crear una cadena de intercambio y adjuntarlo al dispositivo existente con IDXGIFactory::CreateSwapChain. (El IDXGIFactoryes un objeto COM separado que debe crearse CreateDXGIFactoryprimero).

Nathan Reed
fuente
Llamando +1 en Flushlugar de presentar la cadena de intercambio, ¡esto es genial!
Laurent Couvidou
¿Es esto de alguna manera posible con D3D9 a través del IDirect3D9::CreateDevicemétodo? No pude encontrar un D3D9CreateDevicemétodo tristemente.
Vinz
@ Vinzenz, no lo creo. D3D9 no separa los conceptos de "dispositivo" y "cadena de intercambio", como lo hacen D3D10 en adelante. Ambos están enrollados en el objeto del dispositivo D3D9, que requiere un HWNDpara crear.
Nathan Reed