diff --git a/webrender/Cargo.toml b/webrender/Cargo.toml index 84e6a66360..54a44d5a7f 100644 --- a/webrender/Cargo.toml +++ b/webrender/Cargo.toml @@ -11,6 +11,7 @@ serde_macros = ["webrender_traits/serde_macros"] [dependencies] app_units = "0.3" +bincode = "0.6.0" bit-set = "0.4" byteorder = "0.5" euclid = "0.9" diff --git a/webrender/src/lib.rs b/webrender/src/lib.rs index 83b351139d..ce810b088d 100644 --- a/webrender/src/lib.rs +++ b/webrender/src/lib.rs @@ -59,6 +59,7 @@ mod geometry; mod internal_types; mod layer; mod profiler; +mod record; mod render_backend; mod resource_cache; mod resource_list; @@ -95,6 +96,7 @@ extern crate core_text; extern crate freetype; extern crate app_units; +extern crate bincode; extern crate euclid; extern crate fnv; extern crate gleam; diff --git a/webrender/src/record.rs b/webrender/src/record.rs new file mode 100644 index 0000000000..90287cb8d8 --- /dev/null +++ b/webrender/src/record.rs @@ -0,0 +1,32 @@ +use bincode::serde::serialize; +use bincode; +use std::fs::OpenOptions; +use std::io::Write; +use webrender_traits::ApiMsg; +use byteorder::{LittleEndian, WriteBytesExt}; + +pub fn write_data(frame:u32, data: &Vec){ + let filename = format!("record/frame_{}.bin", frame); + let mut file = OpenOptions::new().append(true).create(true).open(filename).unwrap(); + file.write_u32::(data.len() as u32).ok(); + file.write(data).ok(); +} + +pub fn write_msg(frame:u32, msg: &ApiMsg){ + match msg{ + ref msg @ &ApiMsg::AddRawFont(..) | + ref msg @ &ApiMsg::AddNativeFont(..) | + ref msg @ &ApiMsg::AddImage(..) | + ref msg @ &ApiMsg::SetRootPipeline(..) | + ref msg @ &ApiMsg::UpdateImage(..) | + ref msg @ &ApiMsg::Scroll(..)| + ref msg @ &ApiMsg::TickScrollingBounce| + ref msg @ &ApiMsg::DeleteImage(..)| + ref msg @ &ApiMsg::SetRootStackingContext(..) =>{ + let buff = serialize(msg, bincode::SizeLimit::Infinite).unwrap(); + write_data(frame, &buff) + } + _ => {} + } +} + diff --git a/webrender/src/render_backend.rs b/webrender/src/render_backend.rs index 271dcf7fd0..9217c579ad 100644 --- a/webrender/src/render_backend.rs +++ b/webrender/src/render_backend.rs @@ -10,6 +10,7 @@ use profiler::BackendProfileCounters; use resource_cache::ResourceCache; use scene::Scene; use std::collections::HashMap; +use std::fs; use std::io::{Cursor, Read}; use std::sync::{Arc, Mutex}; use std::sync::mpsc::Sender; @@ -18,6 +19,7 @@ use webrender_traits::{ApiMsg, AuxiliaryLists, BuiltDisplayList, IdNamespace}; use webrender_traits::{PipelineId, RenderNotifier, WebGLContextId}; use batch::new_id; use device::TextureId; +use record; use tiling::FrameBuilderConfig; use offscreen_gl_context::{ColorAttachmentType, GLContext}; use offscreen_gl_context::{NativeGLContext, NativeGLContextHandle}; @@ -40,6 +42,7 @@ pub struct RenderBackend { webrender_context_handle: Option, webgl_contexts: HashMap>, current_bound_webgl_context_id: Option, + enable_recording: bool, } impl RenderBackend { @@ -53,7 +56,8 @@ impl RenderBackend { notifier: Arc>>>, webrender_context_handle: Option, config: FrameBuilderConfig, - debug: bool) -> RenderBackend { + debug: bool, + enable_recording:bool) -> RenderBackend { let resource_cache = ResourceCache::new(texture_cache, device_pixel_ratio, enable_aa); @@ -72,16 +76,23 @@ impl RenderBackend { webrender_context_handle: webrender_context_handle, webgl_contexts: HashMap::new(), current_bound_webgl_context_id: None, + enable_recording:enable_recording, } } pub fn run(&mut self) { let mut profile_counters = BackendProfileCounters::new(); - + let mut frame_counter:u32 = 0; + if self.enable_recording{ + fs::create_dir("record").ok(); + } loop { let msg = self.api_rx.recv(); match msg { Ok(msg) => { + if self.enable_recording{ + record::write_msg(frame_counter, &msg); + } match msg { ApiMsg::AddRawFont(id, bytes) => { profile_counters.font_templates.inc(bytes.len()); @@ -153,7 +164,10 @@ impl RenderBackend { for leftover_auxiliary_data in leftover_auxiliary_data { self.payload_tx.send(&leftover_auxiliary_data[..]).unwrap() } - + if self.enable_recording{ + record::write_data(frame_counter, &auxiliary_data); + frame_counter += 1; + } let mut auxiliary_data = Cursor::new(&mut auxiliary_data[8..]); for (display_list_id, display_list_descriptor) in display_lists.into_iter() { diff --git a/webrender/src/renderer.rs b/webrender/src/renderer.rs index f70ef1e8e3..347a54454f 100644 --- a/webrender/src/renderer.rs +++ b/webrender/src/renderer.rs @@ -467,6 +467,7 @@ impl Renderer { let debug = options.debug; let (device_pixel_ratio, enable_aa) = (options.device_pixel_ratio, options.enable_aa); let payload_tx_for_backend = payload_tx.clone(); + let enable_recording = options.enable_recording; thread::spawn(move || { let mut backend = RenderBackend::new(api_rx, payload_rx, @@ -478,7 +479,8 @@ impl Renderer { backend_notifier, context_handle, config, - debug); + debug, + enable_recording); backend.run(); }); @@ -1606,4 +1608,5 @@ pub struct RendererOptions { pub enable_msaa: bool, pub enable_profiler: bool, pub debug: bool, + pub enable_recording: bool, }