[gelöst][DX10] Switching to FullScreen

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
kkrahl
Beiträge: 56
Registriert: 20.10.2008, 13:41

[gelöst][DX10] Switching to FullScreen

Beitrag von kkrahl »

Bin schon wider auf ein Problem gestoßen bei dem ich eure Hilfe gebrauchen könnte.

Ich will in meiner Applikation per Kommando von Windowed auf FullScreen oder von FullScreen auf Windowed bei gleich bleibender Auflösung umschalten können. Wenn ich das von FullScreen auf Windowed machen so funktioniert das so weit auch aber wenn ich umgekehrt von Windowed auf FullScreen umschalte dann fährt er nur kurz (für einen Augenblick, nur Modeswitch) im FullScreen und wechselt aber sofort wider in den Windowed Modus.

Hier das Code-Stück das beides bewerkstelligt, sowohl FS -> W als auch W -> FS

Code: Alles auswählen

if(dxCore->mpRenderTargetView) 
    dxCore->mpRenderTargetView->Release();

if(dxCore->mpDepthStencilView)
    dxCore->mpDepthStencilView->Release();

if(dxCore->mpDepthStencilState)
    dxCore->mpDepthStencilState->Release();

if(dxCore->mpDepthStencil)
    dxCore->mpDepthStencil->Release();

DXConfig::SetFullScreenMode(pFullScreen);

DXGI_MODE_DESC modeDesc;
modeDesc.Format = DXConfig::ColorMode();
modeDesc.Height = DXConfig::WindowHeight();
modeDesc.Width = DXConfig::WindowWidth();
modeDesc.RefreshRate.Numerator = DXConfig::RefreshRate();
modeDesc.RefreshRate.Denominator = 1;
modeDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
modeDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
dxCore->mpSwapChain->ResizeTarget(&modeDesc);

if(DXConfig::SetFullScreenMode(pFullScreen))
    if(FAILED(dxCore->mpSwapChain->SetFullscreenState(TRUE,NULL)))
        return Core::Logging::LogError(L"Setting screen mode failed!");
else
    if(FAILED(dxCore->mpSwapChain->SetFullscreenState(FALSE,NULL)))
        return Core::Logging::LogError(L"Setting screen mode failed!");

if(!dxCore->CreateRenderTargetView())
    return Core::Logging::LogError(L"CreateRenderTargetView failed!");

if(!dxCore->CreateDepthStencil())
    return Core::Logging::LogError(L"CreateDepthStencil failed!");

// Set the Render Target
dxCore->mpD3DDevice->OMSetRenderTargets(1,&dxCore->mpRenderTargetView,dxCore->mpDepthStencilView);
Wär für euren Rat sehr dankbar

Karl
Zuletzt geändert von kkrahl am 03.09.2009, 10:56, insgesamt 1-mal geändert.
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX10] Switching to FullScreen

Beitrag von Krishty »

Hi,

Dein Device mit Debug-Flag erzeugen, den Fehler nochmal provozieren und das Ausgabefenster beobachten.

Es ist auch ratsam, ResizeBuffers() nur als Ergebnis der WM_SIZE-Nachricht mit den dabei übergebenen Werten durchzuführen und nicht unbedingt manuell.

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
kkrahl
Beiträge: 56
Registriert: 20.10.2008, 13:41

Re: [DX10] Switching to FullScreen

Beitrag von kkrahl »

Das Problem ist ja ich bekomme keinen Fehler, denn er switcht nur für einen Augenblick auf FullScreen und läuft dann ohne irgendwelche Probleme in FensterModus weiter.

Karl
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX10] Switching to FullScreen

Beitrag von Krishty »

Dann verschieb das ResizeBuffers() in die Behandlung von WM_SIZE und, vor allem, geh sicher dass du es auch wirklich mit den übergebenen Ausmaßen aufrufst und nicht mit eigenen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Gelöschter Benutzer
Beiträge: 92
Registriert: 26.02.2009, 22:09

Re: [DX10] Switching to FullScreen

Beitrag von Gelöschter Benutzer »

Code: Alles auswählen

DXGI_SWAP_CHAIN_DESC::Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH
und

Code: Alles auswählen

BOOL fScreen;
IDXGISwapChainDesc::GetFullscreenState(&fScreen, NULL);
IDXGISwapChainDesc::SetFullscreenState(!fScreen, NULL);
probiert?

Edit: Ansonsten mal die Konfiguration in der Swap Chain Desc auf Kompabilität prüfen.
kkrahl
Beiträge: 56
Registriert: 20.10.2008, 13:41

Re: [DX10] Switching to FullScreen

Beitrag von kkrahl »

Nach dem ich dieses Thema nun einige zeit ruhen gelassen hatte wollte ich nun endlich den Full-Screen Mode-Switch implementieren.

bei WM_SIZE mach ich

Code: Alles auswählen

dxCore->mAllowRendering = false;

			RECT rect;
			::GetClientRect(dxCore->mWindow, &rect);
			int width = rect.right - rect.left;
			if(width < 0)
  				width*= -1;
			int height = rect.bottom -  rect.top;
			if(height < 0)
  				height*= -1;

			if(!(DXConfig::WindowWidth(width)))
  				return Core::Logging::LogError(L"Error setting new width!");
			if(!(DXConfig::WindowHeight(height)))
  				return Core::Logging::LogError(L"Error setting ne height!");

			// Clear Buffers
			if(dxCore->mpDepthStencilView)
  				dxCore->mpDepthStencilView->Release();

			if(dxCore->mpDepthStencilState)
  				dxCore->mpDepthStencilState->Release();

			if(dxCore->mpDepthStencil)
  				dxCore->mpDepthStencil->Release();

			if(dxCore->mpRenderTargetView) 
  				dxCore->mpRenderTargetView->Release();

			// ReCreate Buffers
			if(FAILED(dxCore->mpSwapChain->ResizeBuffers(1, width, height, DXConfig::ColorMode(), DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH )))
  				return Core::Logging::LogError(L"ResizeBuffers failed!");

			if(!dxCore->CreateRenderTargetView())
  				return Core::Logging::LogError(L"CreateRenderTargetView failed!");

			if(!dxCore->CreateDepthStencil())
  				return Core::Logging::LogError(L"CreateDepthStencil failed!");

			dxCore->mpD3DDevice->OMSetRenderTargets(1,&dxCore->mpRenderTargetView,dxCore->mpDepthStencilView);

			dxCore->mAllowRendering = true;
Das funktioniert für Alt+Enter genau 2x, dann kankt das Programm ab (freezed)! :(

Für den manuellen switch habe ich nun

Code: Alles auswählen

			if(DXConfig::IsFullScreen())
  				dxCore->mpSwapChain->SetFullscreenState(TRUE, NULL);
			else
  				dxCore->mpSwapChain->SetFullscreenState(FALSE, NULL);
und

Code: Alles auswählen

			IDXGIFactory* dxgiFactory;
			if(SUCCEEDED(CreateDXGIFactory (__uuidof(IDXGIFactory), (void**)&dxgiFactory)))
			{
  				IDXGIAdapter* dxgiAdapter;
  				// Enumerate through all graphic adapters (cards) installed on the system for finding out thiere capabilities
  				if(SUCCEEDED(dxgiFactory->EnumAdapters(0,&dxgiAdapter)))
  				{
    					IDXGIOutput* dxgiOutput;
    					// Enumerate through all outputs(displays) connected to the graphic adapter to find out the posibilities
    					if(SUCCEEDED(dxgiAdapter->EnumOutputs(1,&dxgiOutput)))
    					{
    						if(DXConfig::IsFullScreen())
      							dxCore->mpSwapChain->SetFullscreenState(TRUE, dxgiOutput);
    						else
      							dxCore->mpSwapChain->SetFullscreenState(FALSE, dxgiOutput);
    					}
  				}
			}
versucht. Aber bei beiden freezed das Programm sofort wenn ich auf FullScreen geweschelt bin. :(

Mode-Switch funktioniert bei mir leider nur beim Start des Programmes direkt nach D3D10CreateDeviceAndSwapChain.

Kann mir irgendjemand sagen was ich nun falsch mache?

Danke

Karl
Gelöschter Benutzer
Beiträge: 92
Registriert: 26.02.2009, 22:09

Re: [DX10] Switching to FullScreen

Beitrag von Gelöschter Benutzer »

Was steht in der Debug von DirectX?

Wenn du dort noch nicht geprüft haben solltest: Start -> Programme -> DirectX SDK -> Ultities -> Control Panel -> DirectX 10 -> Programm eintragen -> Info auch an.
kkrahl
Beiträge: 56
Registriert: 20.10.2008, 13:41

Re: [DX10] Switching to FullScreen

Beitrag von kkrahl »

Hab das Problem gefunden! Mein grundsätzliches Problem ist das ich auf den 2ten Monitor mit der Engine gearbeitet haben, Full-Screen-Modes aber dort anscheinen nicht zu 100% von DXGI unterstützt wird. Mache ich das ganze auf dem 1ten Monitor habe ich keine Probleme.
Antworten