Seite 1 von 1

[gelöst][DX10] Switching to FullScreen

Verfasst: 17.04.2009, 00:39
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

Re: [DX10] Switching to FullScreen

Verfasst: 17.04.2009, 10:13
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

Re: [DX10] Switching to FullScreen

Verfasst: 17.04.2009, 10:21
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

Re: [DX10] Switching to FullScreen

Verfasst: 17.04.2009, 10:23
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.

Re: [DX10] Switching to FullScreen

Verfasst: 17.04.2009, 10:46
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.

Re: [DX10] Switching to FullScreen

Verfasst: 24.08.2009, 02:33
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

Re: [DX10] Switching to FullScreen

Verfasst: 27.08.2009, 10:02
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.

Re: [DX10] Switching to FullScreen

Verfasst: 03.09.2009, 10:52
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.