Hi,
ich spiele gerade mal wieder ein wenig mit Direct3D und bin nun erstmals in der Version 11 angekommen. Bisher hing ich noch bei Version 9. Allerdings finde ich auf Teufel komm raus kein Info in der Doku oder im Netz, wie man "offiziell" in mehrere Fenster rendert.
In Direct3D 9 habe ich einfach via CreateAdditionalSwapChain für jedes Fenster eine eigene SwapChain erzeugt. Aber in DirectX 11 kann man ja nur die SwapChain zusammen mit dem Device in einer Methode erzeugen. Ich möchte aber eine SwapChain, die quasi den Context und das Device der erste Swap Chain shared damit man die Resourcen sharen kann.
Hat jemand eine Ahnung wie man das mit DX11 macht?
Ciao,
Stefan
[D3D11] Multiple Swap Chains -> Rendern in mehrere Fenster??
-
- Moderator
- Beiträge: 189
- Registriert: 25.02.2009, 19:54
- Aramis
- Moderator
- Beiträge: 1458
- Registriert: 25.02.2009, 19:50
- Echter Name: Alexander Gessler
- Wohnort: 2016
- Kontaktdaten:
Re: [D3D11] Multiple Swap Chains -> Rendern in mehrere Fenst
Hi -
Hast du es mal mit IDXGIFactory::CreateSwapChain probiert? Erster Parameter ist zwar ein IUnknown, aber da sollte dein D3D-Deviceobjekt funktionieren.
Hast du es mal mit IDXGIFactory::CreateSwapChain probiert? Erster Parameter ist zwar ein IUnknown, aber da sollte dein D3D-Deviceobjekt funktionieren.
-
- Moderator
- Beiträge: 189
- Registriert: 25.02.2009, 19:54
Re: [D3D11] Multiple Swap Chains -> Rendern in mehrere Fenst
Ah ... das klingt gut. Ich habe immer in der DirectX 11 API gesucht :)
Aber das scheint tatsächlich der Weg zu sein, um irgendein beliebiges Device mit einer Swap Chain auszustatten. Ich werde das heute abend zu Hause mal testen wie es sich verhält.
Danke schon mal :)
Aber das scheint tatsächlich der Weg zu sein, um irgendein beliebiges Device mit einer Swap Chain auszustatten. Ich werde das heute abend zu Hause mal testen wie es sich verhält.
Danke schon mal :)
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: [D3D11] Multiple Swap Chains -> Rendern in mehrere Fenst
Genau, der ganze Kram von wegen Enumeration, SwapChains, etc. wurde aus D3D in eine eigene API (DXGI) abgezogen. D3D11CreateDeviceAndSwapChain() ist nur eine Hilfsfunktion die den gängigen Fall (1 Adapter, 1 Output, 1 Device, 1 SwapChain) implementiert. Als kleiner Hinweis vielleicht (ist nach meinem Kenntnisstand abgesehen von den Warnungen die die Debug Runtime in dem Fall ausgibt momentan nicht wirklich dokumentiert): Achte drauf dass du zum Erzeugen der SwapChain die gleiche DXGI Factory verwenden musst die auch das Adapter Objekt auf dem dein D3D Device erzeugt wurde geboren hat. Wenn du an D3D11CreateDevice() 0 als Adapter übergibst dann erzeugt die Funktion intern eine eigene IDXGIFactory1 und verwendet die. Wenn du dann für dieses Device eine SwapChain erstellen willst musst du dir das IDXGIDevice1 Interface von deinem D3D Device holen und über das den Adapter und über den die Factory abfragen und dann diese Factory verwenden um die SwapChain zu erstellen. Wenn du Adapter und Outputs selber Enumerierst kennst du die Factory natürlich schon und brauchst dich nicht extra drum zu kümmern. Und: Im Zusammenhang mit D3D11 sollte man immer DXGI 1.1 verwenden.
-
- Moderator
- Beiträge: 189
- Registriert: 25.02.2009, 19:54
Re: [D3D11] Multiple Swap Chains -> Rendern in mehrere Fenst
Ich liebe dieses Forum :mrgreen:
Danke für die schnelle Hilfe und die Hinweise auf das DXGI. Es funktioniert exakt so, wie ihr gesagt habt. Ein klitzekleiner Satz in der DX Doku dazu hätte sicherlich nicht geschadet. Aber DX hat den Fokus wohl zu sehr auf Fullscreen Gaming Applikationen :geek:
Kurzfassung für alle die das Thema auch noch mal brauchen:
1. Einmalig das Device und den Context erzeugen:
2. Für jede Swap Chain (mindestens eine) die DXGI Factory über das Device holen und dort CreateSwapChain aufrufen
3. Für jede weitere SwapChain die man nach der ersten erzeugt muss man den Reference-Counter für das Device und den Context erhöhen. Wenn man eine SwapChain zerstört, dann muss man jeweils einmal den Reference-Counter für das Device und den Context erniedrigen.
Ciao,
Stefan
Danke für die schnelle Hilfe und die Hinweise auf das DXGI. Es funktioniert exakt so, wie ihr gesagt habt. Ein klitzekleiner Satz in der DX Doku dazu hätte sicherlich nicht geschadet. Aber DX hat den Fokus wohl zu sehr auf Fullscreen Gaming Applikationen :geek:
Kurzfassung für alle die das Thema auch noch mal brauchen:
1. Einmalig das Device und den Context erzeugen:
Code: Alles auswählen
D3D11CreateDevice( ..., &DriverApi::_d3d_11_device, ..., &DriverApi::_d3d_11_device_context )
Code: Alles auswählen
IDXGIDevice* dxgi_device = 0;
IDXGIAdapter* dxgi_adapter = 0;
IDXGIFactory1* dxgi_factory = 0;
DriverApi::_d3d_11_device->QueryInterface(&dxgi_device);
dxgi_device->GetAdapter(&dxgi_adapter);
dxgi_adapter->GetParent(IID_PPV_ARGS(&dxgi_factory));
DXGI_SWAP_CHAIN_DESC sd;
memset(&sd, 0, sizeof(sd));
sd. blablabla
...
dxgi_factory->CreateSwapChain(DriverApi::_d3d_11_device, &sd, &api->_d3d_11_swap_chain);
Code: Alles auswählen
DriverApi::_d3d_11_device->AddRef()
DriverApi::_d3d_11_device_context->AddRef()
bzw.
DriverApi::_d3d_11_device->Release()
DriverApi::_d3d_11_device_context->Release()
Ciao,
Stefan
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: [D3D11] Multiple Swap Chains -> Rendern in mehrere Fenst
In der DX Doku ist das eh total ausfühlich beschrieben: http://msdn.microsoft.com/en-us/library/bb205075.aspx
Lediglich dass man für alles die selbe Factory verwenden muss ist irgendwie nicht explizit dokumentiert, das musste ich leider auf die harte Tour lernen :mrgreen:
Lediglich dass man für alles die selbe Factory verwenden muss ist irgendwie nicht explizit dokumentiert, das musste ich leider auf die harte Tour lernen :mrgreen:
-
- Moderator
- Beiträge: 189
- Registriert: 25.02.2009, 19:54
Re: [D3D11] Multiple Swap Chains -> Rendern in mehrere Fenst
Ja die DX Doku ist im Vergleich zur OpenGL Spec deutlich ausführlicher.
Diesen Teil der Doku hatte ich vorher auch schon gelesen. Allerdings steht das mit Rendern über ein D3D11 Device in mehrere Fenster quasi nur zwischen den Zeilen. Wenn man das dort irgendwo explizit geschrieben hätte, dann hätte es mir einige Fragezeichen erspart. Zum Beispiel ob es legal ist auf einem Device mutliple Swap Chains zu erzeugen und diese zwischendurch zu releasen. :)
Diesen Teil der Doku hatte ich vorher auch schon gelesen. Allerdings steht das mit Rendern über ein D3D11 Device in mehrere Fenster quasi nur zwischen den Zeilen. Wenn man das dort irgendwo explizit geschrieben hätte, dann hätte es mir einige Fragezeichen erspart. Zum Beispiel ob es legal ist auf einem Device mutliple Swap Chains zu erzeugen und diese zwischendurch zu releasen. :)