mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
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:
parent
50bf6ce556
commit
2ce22ca25d
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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[¶ms.request.key];
|
||||
@ -604,6 +622,7 @@ extern "C" {
|
||||
);
|
||||
fn DeleteBlobFont(key: WrFontInstanceKey);
|
||||
fn ClearBlobImageResources(namespace: WrIdNamespace);
|
||||
|
||||
}
|
||||
|
||||
impl Moz2dBlobImageHandler {
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user