Add flow events connecting pointer events to frames (#7807)

This commit is contained in:
nathanrogersgoogle
2019-02-13 22:27:12 -08:00
committed by GitHub
parent 0a5a7c56dd
commit e2394ad77e
10 changed files with 57 additions and 8 deletions
+18
View File
@@ -62,6 +62,17 @@ void Animator::SetDimensionChangePending() {
dimension_change_pending_ = true;
}
void Animator::EnqueueTraceFlowId(uint64_t trace_flow_id) {
fml::TaskRunner::RunNowOrPostTask(
task_runners_.GetUITaskRunner(),
[self = weak_factory_.GetWeakPtr(), trace_flow_id] {
if (!self) {
return;
}
self->trace_flow_ids_.push_back(trace_flow_id);
});
}
// This Parity is used by the timeline component to correctly align
// GPU Workloads events with their respective Framework Workload.
const char* Animator::FrameParity() {
@@ -78,6 +89,13 @@ void Animator::BeginFrame(fml::TimePoint frame_start_time,
fml::TimePoint frame_target_time) {
TRACE_EVENT_ASYNC_END0("flutter", "Frame Request Pending", frame_number_++);
TRACE_EVENT0("flutter", "Animator::BeginFrame");
while (!trace_flow_ids_.empty()) {
uint64_t trace_flow_id = trace_flow_ids_.front();
TRACE_FLOW_END("flutter", "DispatchPointerDataPacket", trace_flow_id);
trace_flow_ids_.pop_front();
}
frame_scheduled_ = false;
notify_idle_task_id_++;
regenerate_layer_tree_ = false;
+7
View File
@@ -5,6 +5,8 @@
#ifndef FLUTTER_SHELL_COMMON_ANIMATOR_H_
#define FLUTTER_SHELL_COMMON_ANIMATOR_H_
#include <deque>
#include "flutter/common/task_runners.h"
#include "flutter/fml/memory/ref_ptr.h"
#include "flutter/fml/memory/weak_ptr.h"
@@ -48,6 +50,10 @@ class Animator final {
void SetDimensionChangePending();
// Enqueue |trace_flow_id| into |trace_flow_ids_|. The corresponding flow
// will be ended during the next |BeginFrame|.
void EnqueueTraceFlowId(uint64_t trace_flow_id);
private:
using LayerTreePipeline = flutter::Pipeline<flow::LayerTree>;
@@ -77,6 +83,7 @@ class Animator final {
int notify_idle_task_id_;
bool dimension_change_pending_;
SkISize last_layer_tree_size_;
std::deque<uint64_t> trace_flow_ids_;
fml::WeakPtrFactory<Animator> weak_factory_;
+5 -1
View File
@@ -355,7 +355,11 @@ void Engine::HandleSettingsPlatformMessage(blink::PlatformMessage* message) {
}
}
void Engine::DispatchPointerDataPacket(const blink::PointerDataPacket& packet) {
void Engine::DispatchPointerDataPacket(const blink::PointerDataPacket& packet,
uint64_t trace_flow_id) {
TRACE_EVENT0("flutter", "Engine::DispatchPointerDataPacket");
TRACE_FLOW_STEP("flutter", "PointerEvent", trace_flow_id);
animator_->EnqueueTraceFlowId(trace_flow_id);
runtime_controller_->DispatchPointerDataPacket(packet);
}
+2 -1
View File
@@ -104,7 +104,8 @@ class Engine final : public blink::RuntimeDelegate {
void DispatchPlatformMessage(fml::RefPtr<blink::PlatformMessage> message);
void DispatchPointerDataPacket(const blink::PointerDataPacket& packet);
void DispatchPointerDataPacket(const blink::PointerDataPacket& packet,
uint64_t trace_flow_id);
void DispatchSemanticsAction(int id,
blink::SemanticsAction action,
+6 -2
View File
@@ -546,14 +546,18 @@ void Shell::OnPlatformViewDispatchPlatformMessage(
// |shell::PlatformView::Delegate|
void Shell::OnPlatformViewDispatchPointerDataPacket(
std::unique_ptr<blink::PointerDataPacket> packet) {
TRACE_EVENT0("flutter", "Shell::OnPlatformViewDispatchPointerDataPacket");
TRACE_FLOW_BEGIN("flutter", "PointerEvent", next_pointer_flow_id_);
FML_DCHECK(is_setup_);
FML_DCHECK(task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread());
task_runners_.GetUITaskRunner()->PostTask(fml::MakeCopyable(
[engine = engine_->GetWeakPtr(), packet = std::move(packet)] {
[engine = engine_->GetWeakPtr(), packet = std::move(packet),
flow_id = next_pointer_flow_id_] {
if (engine) {
engine->DispatchPointerDataPacket(*packet);
engine->DispatchPointerDataPacket(*packet, flow_id);
}
}));
next_pointer_flow_id_++;
}
// |shell::PlatformView::Delegate|
+2
View File
@@ -99,6 +99,8 @@ class Shell final : public PlatformView::Delegate,
service_protocol_handlers_;
bool is_setup_ = false;
uint64_t next_pointer_flow_id_ = 0;
Shell(blink::TaskRunners task_runners, blink::Settings settings);
static std::unique_ptr<Shell> CreateShellOnPlatformThread(
@@ -192,12 +192,18 @@ void AndroidShellHolder::DispatchPointerDataPacket(
return;
}
TRACE_EVENT0("flutter", "AndroidShellHolder::DispatchPointerDataPacket");
TRACE_FLOW_BEGIN("flutter", "PointerEvent", next_pointer_flow_id_);
shell_->GetTaskRunners().GetUITaskRunner()->PostTask(fml::MakeCopyable(
[engine = shell_->GetEngine(), packet = std::move(packet)] {
[engine = shell_->GetEngine(), packet = std::move(packet),
flow_id = next_pointer_flow_id_] {
if (engine) {
engine->DispatchPointerDataPacket(*packet);
engine->DispatchPointerDataPacket(*packet, flow_id);
}
}));
next_pointer_flow_id_++;
}
Rasterizer::Screenshot AndroidShellHolder::Screenshot(
@@ -52,6 +52,7 @@ class AndroidShellHolder {
std::unique_ptr<Shell> shell_;
bool is_valid_ = false;
pthread_key_t thread_destruct_key_;
uint64_t next_pointer_flow_id_;
static void ThreadDestructCallback(void* value);
+7 -2
View File
@@ -89,12 +89,17 @@ bool EmbedderEngine::DispatchPointerDataPacket(
return false;
}
TRACE_EVENT0("flutter", "EmbedderEngine::DispatchPointerDataPacket");
TRACE_FLOW_BEGIN("flutter", "PointerEvent", next_pointer_flow_id_);
shell_->GetTaskRunners().GetUITaskRunner()->PostTask(fml::MakeCopyable(
[engine = shell_->GetEngine(), packet = std::move(packet)] {
[engine = shell_->GetEngine(), packet = std::move(packet),
flow_id = next_pointer_flow_id_] {
if (engine) {
engine->DispatchPointerDataPacket(*packet);
engine->DispatchPointerDataPacket(*packet, flow_id);
}
}));
next_pointer_flow_id_++;
return true;
}
@@ -56,6 +56,7 @@ class EmbedderEngine {
const EmbedderExternalTextureGL::ExternalTextureCallback
external_texture_callback_;
bool is_valid_ = false;
uint64_t next_pointer_flow_id_;
FML_DISALLOW_COPY_AND_ASSIGN(EmbedderEngine);
};