From b1b074e9886899ce2738f2f2b13e5be23aba0f35 Mon Sep 17 00:00:00 2001 From: Imanol Fernandez Date: Thu, 20 Oct 2016 23:56:23 +0200 Subject: [PATCH] Set up main thread dispatcher required for WGL GLContext sharing in Windows, r=emilio --- components/compositing/compositor.rs | 26 +++++++++++++++++++++ components/compositing/compositor_thread.rs | 5 ++++ 2 files changed, 31 insertions(+) diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 44b05eae273..956623132c2 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -354,6 +354,17 @@ impl webrender_traits::RenderNotifier for RenderNotifier { } } +// Used to dispatch functions from webrender to the main thread's event loop. +struct CompositorThreadDispatcher { + compositor_proxy: Box +} + +impl webrender_traits::RenderDispatcher for CompositorThreadDispatcher { + fn dispatch(&self, f: Box) { + self.compositor_proxy.send(Msg::Dispatch(f)); + } +} + impl IOCompositor { fn new(window: Rc, state: InitialCompositorState) -> IOCompositor { @@ -426,6 +437,15 @@ impl IOCompositor { compositor.constellation_chan.clone()); compositor.webrender.set_render_notifier(Box::new(render_notifier)); + if cfg!(target_os = "windows") { + // Used to dispatch functions from webrender to the main thread's event loop. + // Required to allow WGL GLContext sharing in Windows. + let dispatcher = Box::new(CompositorThreadDispatcher { + compositor_proxy: compositor.channel_to_self.clone_compositor_proxy() + }); + compositor.webrender.set_main_thread_dispatcher(dispatcher); + } + // Set the size of the root layer. compositor.update_zoom_transform(); @@ -642,6 +662,12 @@ impl IOCompositor { } } + (Msg::Dispatch(func), ShutdownState::NotShuttingDown) => { + // The functions sent here right now are really dumb, so they can't panic. + // But if we start running more complex code here, we should really catch panic here. + func(); + } + // When we are shutting_down, we need to avoid performing operations // such as Paint that may crash because we have begun tearing down // the rest of our resources. diff --git a/components/compositing/compositor_thread.rs b/components/compositing/compositor_thread.rs index 3ff92b5129e..70e9dac59c0 100644 --- a/components/compositing/compositor_thread.rs +++ b/components/compositing/compositor_thread.rs @@ -126,6 +126,10 @@ pub enum Msg { // sends a reply on the IpcSender, the constellation knows it's safe to // tear down the other threads associated with this pipeline. PipelineExited(PipelineId, IpcSender<()>), + /// Runs a closure in the compositor thread. + /// It's used to dispatch functions from webrender to the main thread's event loop. + /// Required to allow WGL GLContext sharing in Windows. + Dispatch(Box) } impl Debug for Msg { @@ -158,6 +162,7 @@ impl Debug for Msg { Msg::PipelineVisibilityChanged(..) => write!(f, "PipelineVisibilityChanged"), Msg::PipelineExited(..) => write!(f, "PipelineExited"), Msg::NewScrollFrameReady(..) => write!(f, "NewScrollFrameReady"), + Msg::Dispatch(..) => write!(f, "Dispatch"), } } }