Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.12.2013, 01:45

D3D11/DXGI Bug?

Hey Leute,

schon einmal vorweg, tut mir Leid, dass der Titel so ungünstig gewählt ist, aber mir fällt kein besserer ein (bin für Vorschläge offen) :D
Nun zum Problem. Ich versuche seit knapp 4 Tagen eine sehr lästige Warnung von DXGI, die mir peinlicher Weise noch nie aufgefallen ist, los zuwerden. Dabei habe ich ein Verhalten von DXGI festgestellt, was so nicht auf MSDN dokumentiert ist. Wenn man z.B. mit Alt-Enter in den Vollbild-Modus wechselt bekommt man so eine schöne Warnung:

"DXGI WARNING: IDXGISwapChain::Present: Fullscreen presentation inefficiencies incurred due to application not using IDXGISwapChain::ResizeBuffers appropriately, specifying a DXGI_MODE_DESC not available in IDXGIOutput::GetDisplayModeList, or not using DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH.DXGI_SWAP_CHAIN_DESC::BufferDesc = { 1600, 900, { 0, 0 }, R8G8B8A8_UNORM, 0, 0 }; DXGI_SWAP_CHAIN_DESC::SampleDesc = { 1, 0 }; DXGI_SWAP_CHAIN_DESC::Flags = 0x2; [ MISCELLANEOUS WARNING #98: ]"

Aber nur beim ersten mal. Wenn man das danach noch ein paar mal macht, kommt keine Warnung mehr. Das Problem ist, dass WM_SIZE beim ersten mal nicht gesendet wird, danach aber schon.
Dabei müsste mein Code sich richtig verhalten und somit diese Warnung überhaupt nicht auslösen, weil ich im Prinzip alles so mache wie hier beschrieben wird.
Jetzt ist die Frage, ob das ein Bug im Code von D3D11/DXGI ist oder bei mir (zu 98% bei mir...)?

Ich habe mal schnell ein kleines Test-Programm zusammengebastelt, was dieses Verhalten bei mir auslöst: http://pastebin.com/J7VEufym (Visual Studio 2013, C++11)
Wäre nett, wenn ihr mir sagen könntet ob das bei euch auch so ist bzw. ob was an dem Code so nicht stimmt.

Btw: Sry für das Crossposting, habe schon auf GameDev.net nachgefragt. Falls das hier unerwünscht ist kann der Thread auch gelöscht werden.

Edit: Ok jetzt bin ich mir ziemlich sicher, dass es ein Bug im Code von DXGI ist. Ich habe jetzt mal das Test-Programm mit D3D11.1/DXGI1.2 umgeschrieben um zu sehen ob es sich dort evtl auch so seltsam verhält und siehe da, das gleiche passiert. Wenn ich als SwapEffect DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL benutze gibt es auch eine Fehlermeldung, die meinen Verdacht bestätigt:

"DXGI ERROR: IDXGISwapChain::Present: The application has not called ResizeBuffers or re-created the SwapChain after a fullscreen or windowed transition. SwapChains created with DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL are required to do so. [ MISCELLANEOUS ERROR #117: ]"

Hinzu kommt noch, dass beim ersten mal Alt-Enter der Bildschirm schwarz bleibt, was ja klar ist, weil DXGI ResizeBuffers erwartet.
Wenn man nun wieder in den Windowed-Mode und dann wieder per Alt-Enter Fullscreen geht, klappt alles ...
Hier ist das abgeänderte Program: http://pastebin.com/PUsJ1z3G

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Batzer« (15.12.2013, 17:38)


2

15.12.2013, 17:39

Habe den ersten Beitrag editiert :ninja:

3

16.12.2013, 21:46

Edit: Hat sich erledigt, Blindheit beim lesen ...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Batzer« (16.12.2013, 22:29)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

16.12.2013, 22:11

Das Verhalten scheint korrekt zu sein. Du versuchst lediglich in einen Fullscreen-Mode zu wechseln der nicht unterstützt wird. Man beachte, dass mit DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH die Größe des Fensters (nicht Clientarea) für den Modus verwendet wird:

Zitat


Set this flag to enable an application to switch modes by calling IDXGISwapChain::ResizeTarget. When switching from windowed to full-screen mode, the display mode (or monitor resolution) will be changed to match the dimensions of the application window.
@D13_Dreinig

5

16.12.2013, 22:20

Mmh ok das macht tatsächlich Sinn :dash:
Verdammt jetzt klappen beide Versionen des Codes tatsächlich (wenn AdjustWindowRect weg ist).
Hätte mich auch gewundert, wenn die so einen trivialen Bug drinnen hätten.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Batzer« (17.12.2013, 00:28)


Werbeanzeige