mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Set up main thread dispatcher required for WGL GLContext sharing in Windows, r=emilio
This commit is contained in:
parent
77dd618e7a
commit
b1b074e988
2 changed files with 31 additions and 0 deletions
|
@ -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<CompositorProxy>
|
||||
}
|
||||
|
||||
impl webrender_traits::RenderDispatcher for CompositorThreadDispatcher {
|
||||
fn dispatch(&self, f: Box<Fn() + Send>) {
|
||||
self.compositor_proxy.send(Msg::Dispatch(f));
|
||||
}
|
||||
}
|
||||
|
||||
impl<Window: WindowMethods> IOCompositor<Window> {
|
||||
fn new(window: Rc<Window>, state: InitialCompositorState)
|
||||
-> IOCompositor<Window> {
|
||||
|
@ -426,6 +437,15 @@ impl<Window: WindowMethods> IOCompositor<Window> {
|
|||
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<Window: WindowMethods> IOCompositor<Window> {
|
|||
}
|
||||
}
|
||||
|
||||
(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.
|
||||
|
|
|
@ -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<Fn() + Send>)
|
||||
}
|
||||
|
||||
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"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue