void FSlateD3DRenderer::Private_CreateViewport( TSharedRef<SWindow> InWindow, const FVector2D &WindowSize ) { TSharedRef< FGenericWindow > NativeWindow = InWindow->GetNativeWindow().ToSharedRef(); bool bFullscreen = IsViewportFullscreen( *InWindow ); bool bWindowed = true;//@todo implement fullscreen: !bFullscreen; DXGI_SWAP_CHAIN_DESC SwapChainDesc; FMemory::Memzero(&SwapChainDesc, sizeof(SwapChainDesc) ); SwapChainDesc.BufferCount = 1; SwapChainDesc.BufferDesc.Width = FMath::TruncToInt(WindowSize.X); SwapChainDesc.BufferDesc.Height = FMath::TruncToInt(WindowSize.Y); SwapChainDesc.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; SwapChainDesc.BufferDesc.RefreshRate.Numerator = 0; SwapChainDesc.BufferDesc.RefreshRate.Denominator = 1; SwapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; SwapChainDesc.OutputWindow = (HWND)NativeWindow->GetOSWindowHandle(); SwapChainDesc.SampleDesc.Count = 1; SwapChainDesc.SampleDesc.Quality = 0; SwapChainDesc.Windowed = bWindowed; SwapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; SwapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; TRefCountPtr<IDXGIDevice> DXGIDevice; HRESULT Hr = GD3DDevice->QueryInterface( __uuidof(IDXGIDevice), (void**)DXGIDevice.GetInitReference() ); check( SUCCEEDED(Hr) ); TRefCountPtr<IDXGIAdapter> DXGIAdapter; Hr = DXGIDevice->GetParent(__uuidof(IDXGIAdapter), (void **)DXGIAdapter.GetInitReference() ); check( SUCCEEDED(Hr) ); TRefCountPtr<IDXGIFactory> DXGIFactory; DXGIAdapter->GetParent(__uuidof(IDXGIFactory), (void **)DXGIFactory.GetInitReference() ); check( SUCCEEDED(Hr) ); FSlateD3DViewport Viewport; Hr = DXGIFactory->CreateSwapChain(DXGIDevice.GetReference(), &SwapChainDesc, Viewport.D3DSwapChain.GetInitReference() ); check( SUCCEEDED(Hr) ); Hr = DXGIFactory->MakeWindowAssociation((HWND)NativeWindow->GetOSWindowHandle(),DXGI_MWA_NO_ALT_ENTER); check(SUCCEEDED(Hr)); uint32 Width = FMath::TruncToInt(WindowSize.X); uint32 Height = FMath::TruncToInt(WindowSize.Y); Viewport.ViewportInfo.MaxDepth = 1.0f; Viewport.ViewportInfo.MinDepth = 0.0f; Viewport.ViewportInfo.Width = Width; Viewport.ViewportInfo.Height = Height; Viewport.ViewportInfo.TopLeftX = 0; Viewport.ViewportInfo.TopLeftY = 0; CreateBackBufferResources( Viewport.D3DSwapChain, Viewport.BackBufferTexture, Viewport.RenderTargetView ); Viewport.ProjectionMatrix = CreateProjectionMatrixD3D( Width, Height ); WindowToViewportMap.Add( &InWindow.Get(), Viewport ); }
void FSlateOpenGLRenderer::UpdateFullscreenState( const TSharedRef<SWindow> InWindow, uint32 OverrideResX, uint32 OverrideResY ) { FSlateOpenGLViewport* Viewport = WindowToViewportMap.Find( &InWindow.Get() ); if( Viewport ) { bool bFullscreen = IsViewportFullscreen( *InWindow ); // todo: support Fullscreen modes in OpenGL // uint32 ResX = OverrideResX ? OverrideResX : GSystemResolution.ResX; // uint32 ResY = OverrideResY ? OverrideResY : GSystemResolution.ResY; Private_ResizeViewport( FVector2D( Viewport->ViewportRect.Right, Viewport->ViewportRect.Bottom ), *Viewport, bFullscreen ); } }
void FSlateD3DRenderer::RequestResize( const TSharedPtr<SWindow>& InWindow, uint32 NewSizeX, uint32 NewSizeY ) { const bool bFullscreen = IsViewportFullscreen( *InWindow ); Private_ResizeViewport( InWindow.ToSharedRef(), NewSizeX, NewSizeY, bFullscreen ); }