Bug 1506748 - Record profiler markers for scene building and blob rasterization. r=mstange

MozReview-Commit-ID: IA2ooFX5jtA

Differential Revision: https://phabricator.services.mozilla.com/D11723

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Matt Woodrow 2018-11-14 23:21:23 +00:00
parent 50bf6ce556
commit 2ce22ca25d
6 changed files with 52 additions and 2 deletions

View File

@ -54,6 +54,20 @@ bool is_in_render_thread()
return mozilla::wr::RenderThread::IsInRenderThread();
}
void gecko_profiler_start_marker(const char* name)
{
#ifdef MOZ_GECKO_PROFILER
profiler_tracing("WebRender", name, TRACING_INTERVAL_START);
#endif
}
void gecko_profiler_end_marker(const char* name)
{
#ifdef MOZ_GECKO_PROFILER
profiler_tracing("WebRender", name, TRACING_INTERVAL_END);
#endif
}
bool is_glcontext_egl(void* glcontext_ptr)
{
MOZ_ASSERT(glcontext_ptr);

View File

@ -15,6 +15,7 @@
#include "mozilla/layers/WebRenderDrawEventRecorder.h"
#include "WebRenderTypes.h"
#include "webrender_ffi.h"
#include "GeckoProfiler.h"
#include <unordered_map>
@ -325,6 +326,7 @@ static bool Moz2DRenderCallback(const Range<const uint8_t> aBlob,
const mozilla::wr::DeviceUintRect *aDirtyRect,
Range<uint8_t> aOutput)
{
AUTO_PROFILER_TRACING("WebRender", "RasterizeSingleBlob");
MOZ_ASSERT(aSize.width > 0 && aSize.height > 0);
if (aSize.width <= 0 || aSize.height <= 0) {
return false;

View File

@ -749,6 +749,11 @@ pub unsafe extern "C" fn wr_pipeline_info_delete(_info: WrPipelineInfo) {
// the underlying vec memory
}
extern "C" {
pub fn gecko_profiler_start_marker(name: *const c_char);
pub fn gecko_profiler_end_marker(name: *const c_char);
}
#[allow(improper_ctypes)] // this is needed so that rustc doesn't complain about passing the &mut Transaction to an extern function
extern "C" {
// These callbacks are invoked from the scene builder thread (aka the APZ
@ -786,6 +791,7 @@ impl SceneBuilderHooks for APZCallbacks {
}
fn pre_scene_build(&self) {
unsafe { gecko_profiler_start_marker(b"SceneBuilding\0".as_ptr() as *const c_char); }
}
fn pre_scene_swap(&self, scenebuild_time: u64) {
@ -806,13 +812,16 @@ impl SceneBuilderHooks for APZCallbacks {
// otherwise there's no guarantee that the new scene will get rendered
// anytime soon
unsafe { wr_schedule_render(self.window_id) }
unsafe { gecko_profiler_end_marker(b"SceneBuilding\0".as_ptr() as *const c_char); }
}
fn post_resource_update(&self) {
unsafe { wr_schedule_render(self.window_id) }
unsafe { gecko_profiler_end_marker(b"SceneBuilding\0".as_ptr() as *const c_char); }
}
fn post_empty_scene_build(&self) {
unsafe { gecko_profiler_end_marker(b"SceneBuilding\0".as_ptr() as *const c_char); }
}
fn poke(&self) {

View File

@ -7,7 +7,7 @@
//! registering fonts found in the blob (see `prepare_request`).
use webrender::api::*;
use bindings::{ByteSlice, MutByteSlice, wr_moz2d_render_cb, ArcVecU8};
use bindings::{ByteSlice, MutByteSlice, wr_moz2d_render_cb, ArcVecU8, gecko_profiler_start_marker, gecko_profiler_end_marker};
use rayon::ThreadPool;
use rayon::prelude::*;
@ -16,7 +16,7 @@ use std::collections::hash_map;
use std::collections::btree_map::BTreeMap;
use std::collections::Bound::Included;
use std::mem;
use std::os::raw::c_void;
use std::os::raw::{c_void, c_char};
use std::ptr;
use std::sync::Arc;
use std;
@ -453,10 +453,28 @@ struct Moz2dBlobRasterizer {
blob_commands: HashMap<ImageKey, BlobCommand>,
}
struct GeckoProfilerMarker {
name: &'static [u8],
}
impl GeckoProfilerMarker {
pub fn new(name: &'static [u8]) -> GeckoProfilerMarker {
unsafe { gecko_profiler_start_marker(name.as_ptr() as *const c_char); }
GeckoProfilerMarker { name }
}
}
impl Drop for GeckoProfilerMarker {
fn drop(&mut self) {
unsafe { gecko_profiler_end_marker(self.name.as_ptr() as *const c_char); }
}
}
impl AsyncBlobImageRasterizer for Moz2dBlobRasterizer {
fn rasterize(&mut self, requests: &[BlobImageParams], low_priority: bool) -> Vec<(BlobImageRequest, BlobImageResult)> {
// All we do here is spin up our workers to callback into gecko to replay the drawing commands.
let _marker = GeckoProfilerMarker::new(b"BlobRasterization\0");
let requests: Vec<Job> = requests.into_iter().map(|params| {
let command = &self.blob_commands[&params.request.key];
@ -604,6 +622,7 @@ extern "C" {
);
fn DeleteBlobFont(key: WrFontInstanceKey);
fn ClearBlobImageResources(namespace: WrIdNamespace);
}
impl Moz2dBlobImageHandler {

View File

@ -30,6 +30,9 @@ void* get_proc_address_from_glcontext(void* glcontext_ptr, const char* procname)
void gecko_profiler_register_thread(const char* threadname);
void gecko_profiler_unregister_thread();
void gecko_profiler_start_marker(const char* name);
void gecko_profiler_end_marker(const char* name);
// Prelude of types necessary before including webrender_ffi_generated.h
namespace mozilla {
namespace wr {

View File

@ -1156,6 +1156,9 @@ extern bool is_in_main_thread();
extern bool is_in_render_thread();
extern void gecko_profiler_start_marker(const char* name);
extern void gecko_profiler_end_marker(const char* name);
extern void record_telemetry_time(TelemetryProbe aProbe,
uint64_t aTimeNs);