diff --git a/webrender/src/lib.rs b/webrender/src/lib.rs index 9b98050d39..f0cae58b65 100644 --- a/webrender/src/lib.rs +++ b/webrender/src/lib.rs @@ -153,5 +153,6 @@ pub use device::build_shader_strings; pub use renderer::{CpuProfile, DebugFlags, GpuProfile, OutputImageHandler, RendererKind}; pub use renderer::{ExternalImage, ExternalImageHandler, ExternalImageSource}; pub use renderer::{GraphicsApi, GraphicsApiInfo, ReadPixelsFormat, Renderer, RendererOptions}; +pub use renderer::{ThreadListener}; pub use renderer::MAX_VERTEX_TEXTURE_WIDTH; pub use webrender_api as api; diff --git a/webrender/src/renderer.rs b/webrender/src/renderer.rs index b1aed76404..edb80eca43 100644 --- a/webrender/src/renderer.rs +++ b/webrender/src/renderer.rs @@ -1787,33 +1787,57 @@ impl Renderer { let debug_flags = options.debug_flags; let payload_tx_for_backend = payload_tx.clone(); let recorder = options.recorder; - let worker_config = ThreadPoolConfig::new() - .thread_name(|idx| format!("WebRender:Worker#{}", idx)) - .start_handler(|idx| { - register_thread_with_profiler(format!("WebRender:Worker#{}", idx)); - }); + let thread_listener = Arc::new(options.thread_listener); + let thread_listener_for_rayon_start = thread_listener.clone(); + let thread_listener_for_rayon_end = thread_listener.clone(); let workers = options .workers .take() - .unwrap_or_else(|| Arc::new(ThreadPool::new(worker_config).unwrap())); + .unwrap_or_else(|| { + let worker_config = ThreadPoolConfig::new() + .thread_name(|idx|{ format!("WRWorker#{}", idx) }) + .start_handler(move |idx| { + register_thread_with_profiler(format!("WRWorker#{}", idx)); + if let Some(ref thread_listener) = *thread_listener_for_rayon_start { + thread_listener.thread_started(&format!("WRWorker#{}", idx)); + } + }) + .exit_handler(move |idx| { + if let Some(ref thread_listener) = *thread_listener_for_rayon_end { + thread_listener.thread_stopped(&format!("WRWorker#{}", idx)); + } + }); + Arc::new(ThreadPool::new(worker_config).unwrap()) + }); let enable_render_on_scroll = options.enable_render_on_scroll; let blob_image_renderer = options.blob_image_renderer.take(); - try!{ thread::Builder::new().name("RenderBackend".to_string()).spawn(move || { - let mut backend = RenderBackend::new(api_rx, - payload_rx, - payload_tx_for_backend, - result_tx, - device_pixel_ratio, - texture_cache, - workers, - backend_notifier, - config, - recorder, - blob_image_renderer, - enable_render_on_scroll); - backend.run(backend_profile_counters); - })}; + let thread_listener_for_render_backend = thread_listener.clone(); + let thread_name = format!("WRRenderBackend#{}", options.renderer_id.unwrap_or(0)); + try!{ + thread::Builder::new().name(thread_name.clone()).spawn(move || { + register_thread_with_profiler(thread_name.clone()); + if let Some(ref thread_listener) = *thread_listener_for_render_backend { + thread_listener.thread_started(&thread_name); + } + let mut backend = RenderBackend::new(api_rx, + payload_rx, + payload_tx_for_backend, + result_tx, + device_pixel_ratio, + texture_cache, + workers, + backend_notifier, + config, + recorder, + blob_image_renderer, + enable_render_on_scroll); + backend.run(backend_profile_counters); + if let Some(ref thread_listener) = *thread_listener_for_render_backend { + thread_listener.thread_stopped(&thread_name); + } + }) + }; let gpu_cache_texture = CacheTexture::new(&mut device); @@ -3826,6 +3850,11 @@ pub trait OutputImageHandler { fn unlock(&mut self, pipeline_id: PipelineId); } +pub trait ThreadListener { + fn thread_started(&self, thread_name: &str); + fn thread_stopped(&self, thread_name: &str); +} + pub struct RendererOptions { pub device_pixel_ratio: f32, pub resource_override_path: Option, @@ -3845,8 +3874,10 @@ pub struct RendererOptions { pub workers: Option>, pub blob_image_renderer: Option>, pub recorder: Option>, + pub thread_listener: Option>, pub enable_render_on_scroll: bool, pub debug_flags: DebugFlags, + pub renderer_id: Option, } impl Default for RendererOptions { @@ -3871,7 +3902,9 @@ impl Default for RendererOptions { workers: None, blob_image_renderer: None, recorder: None, + thread_listener: None, enable_render_on_scroll: true, + renderer_id: None, } } }