[D3D11] Multiple Swap Chains -> Rendern in mehrere Fenster??

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Stefan Zerbst
Moderator
Beiträge: 189
Registriert: 25.02.2009, 19:54

[D3D11] Multiple Swap Chains -> Rendern in mehrere Fenster??

Beitrag von Stefan Zerbst »

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
Benutzeravatar
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

Beitrag von Aramis »

Hi -

Hast du es mal mit IDXGIFactory::CreateSwapChain probiert? Erster Parameter ist zwar ein IUnknown, aber da sollte dein D3D-Deviceobjekt funktionieren.
Stefan Zerbst
Moderator
Beiträge: 189
Registriert: 25.02.2009, 19:54

Re: [D3D11] Multiple Swap Chains -> Rendern in mehrere Fenst

Beitrag von Stefan Zerbst »

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 :)
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [D3D11] Multiple Swap Chains -> Rendern in mehrere Fenst

Beitrag von dot »

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.
Stefan Zerbst
Moderator
Beiträge: 189
Registriert: 25.02.2009, 19:54

Re: [D3D11] Multiple Swap Chains -> Rendern in mehrere Fenst

Beitrag von Stefan Zerbst »

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:

Code: Alles auswählen

D3D11CreateDevice( ..., &DriverApi::_d3d_11_device, ..., &DriverApi::_d3d_11_device_context )
2. Für jede Swap Chain (mindestens eine) die DXGI Factory über das Device holen und dort CreateSwapChain aufrufen

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);
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.

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
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [D3D11] Multiple Swap Chains -> Rendern in mehrere Fenst

Beitrag von dot »

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:
Stefan Zerbst
Moderator
Beiträge: 189
Registriert: 25.02.2009, 19:54

Re: [D3D11] Multiple Swap Chains -> Rendern in mehrere Fenst

Beitrag von Stefan Zerbst »

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. :)
Antworten