diff --git a/gpu/ipc/service/direct_composition_surface_win.cc b/gpu/ipc/service/direct_composition_surface_win.cc index b0a2af8ef4f683..921f0a30459877 100644 --- a/gpu/ipc/service/direct_composition_surface_win.cc +++ b/gpu/ipc/service/direct_composition_surface_win.cc @@ -689,6 +689,17 @@ void DCLayerTree::SwapChainPresenter::PresentToSwapChain( base::win::ScopedComPtr context; d3d11_device_->GetImmediateContext(context.GetAddressOf()); context->CopyResource(dest_texture.Get(), src_texture.Get()); + + // Additionally wait for the GPU to finish executing its commands, or + // there still may be a black flicker when presenting expensive content + // (e.g. 4k video). + base::win::ScopedComPtr dxgi_device2; + hr = d3d11_device_.CopyTo(dxgi_device2.GetAddressOf()); + DCHECK(SUCCEEDED(hr)); + base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC, + base::WaitableEvent::InitialState::NOT_SIGNALED); + dxgi_device2->EnqueueSetEvent(event.handle()); + event.Wait(); } swap_chain_->Present(1, 0);