void FSlateD3DRenderer::DrawWindows( FSlateDrawBuffer& InWindowDrawBuffer ) { // Update the font cache with new text before elements are batched FontCache->UpdateCache(); // Iterate through each element list and set up an RHI window for it if needed TArray<FSlateWindowElementList>& WindowElementLists = InWindowDrawBuffer.GetWindowElementLists(); for( int32 ListIndex = 0; ListIndex < WindowElementLists.Num(); ++ListIndex ) { FSlateWindowElementList& ElementList = WindowElementLists[ListIndex]; if ( ElementList.GetWindow().IsValid() ) { TSharedRef<SWindow> WindowToDraw = ElementList.GetWindow().ToSharedRef(); // Add all elements for this window to the element batcher ElementBatcher->AddElements( ElementList.GetDrawElements() ); bool bUnused = false; ElementBatcher->FillBatchBuffers( ElementList, bUnused ); // All elements for this window have been batched and rendering data updated ElementBatcher->ResetBatches(); FVector2D WindowSize = WindowToDraw->GetSizeInScreen(); FSlateD3DViewport* Viewport = WindowToViewportMap.Find( &WindowToDraw.Get() ); check(Viewport); RenderingPolicy->UpdateBuffers( ElementList ); check(Viewport); GD3DDeviceContext->RSSetViewports(1, &Viewport->ViewportInfo ); ID3D11RenderTargetView* RTV = Viewport->RenderTargetView; ID3D11DepthStencilView* DSV = Viewport->DepthStencilView; GD3DDeviceContext->OMSetRenderTargets( 1, &RTV, NULL ); RenderingPolicy->DrawElements( ViewMatrix*Viewport->ProjectionMatrix, ElementList.GetRenderBatches() ); GD3DDeviceContext->OMSetRenderTargets(0, NULL, NULL); const bool bUseVSync = false; Viewport->D3DSwapChain->Present( bUseVSync ? 1 : 0, 0); // All elements have been drawn. Reset all cached data ElementBatcher->ResetBatches(); } } // flush the cache if needed FontCache->ConditionalFlushCache(); }
void FSlateD3DRenderer::Private_ResizeViewport( const TSharedRef<SWindow> InWindow, uint32 Width, uint32 Height, bool bFullscreen ) { FSlateD3DViewport* Viewport = WindowToViewportMap.Find( &InWindow.Get() ); if( Viewport && ( Width != Viewport->ViewportInfo.Width || Height != Viewport->ViewportInfo.Height || bFullscreen != Viewport->bFullscreen ) ) { GD3DDeviceContext->OMSetRenderTargets(0,NULL,NULL); Viewport->BackBufferTexture.SafeRelease(); Viewport->RenderTargetView.SafeRelease(); Viewport->DepthStencilView.SafeRelease(); Viewport->ViewportInfo.Width = Width; Viewport->ViewportInfo.Height = Height; Viewport->bFullscreen = bFullscreen; Viewport->ProjectionMatrix = CreateProjectionMatrixD3D( Width, Height ); DXGI_SWAP_CHAIN_DESC Desc; Viewport->D3DSwapChain->GetDesc( &Desc ); HRESULT Hr = Viewport->D3DSwapChain->ResizeBuffers( Desc.BufferCount, Viewport->ViewportInfo.Width, Viewport->ViewportInfo.Height, Desc.BufferDesc.Format, Desc.Flags ); check( SUCCEEDED(Hr) ); CreateBackBufferResources( Viewport->D3DSwapChain, Viewport->BackBufferTexture,Viewport->RenderTargetView ); } }