Skip to content

Commit

Permalink
Add flow events connecting pointer events to frames (#7807)
Browse files Browse the repository at this point in the history
  • Loading branch information
nathanrogersgoogle committed Feb 14, 2019
1 parent 0a5a7c5 commit e2394ad
Show file tree
Hide file tree
Showing 10 changed files with 57 additions and 8 deletions.
18 changes: 18 additions & 0 deletions shell/common/animator.cc
Expand Up @@ -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() {
Expand All @@ -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;
Expand Down
7 changes: 7 additions & 0 deletions shell/common/animator.h
Expand Up @@ -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"
Expand Down Expand Up @@ -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>;

Expand Down Expand Up @@ -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_;

Expand Down
6 changes: 5 additions & 1 deletion shell/common/engine.cc
Expand Up @@ -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);
}

Expand Down
3 changes: 2 additions & 1 deletion shell/common/engine.h
Expand Up @@ -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,
Expand Down
8 changes: 6 additions & 2 deletions shell/common/shell.cc
Expand Up @@ -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|
Expand Down
2 changes: 2 additions & 0 deletions shell/common/shell.h
Expand Up @@ -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(
Expand Down
10 changes: 8 additions & 2 deletions shell/platform/android/android_shell_holder.cc
Expand Up @@ -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(
Expand Down
1 change: 1 addition & 0 deletions shell/platform/android/android_shell_holder.h
Expand Up @@ -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);

Expand Down
9 changes: 7 additions & 2 deletions shell/platform/embedder/embedder_engine.cc
Expand Up @@ -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;
}
Expand Down
1 change: 1 addition & 0 deletions shell/platform/embedder/embedder_engine.h
Expand Up @@ -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);
};
Expand Down

0 comments on commit e2394ad

Please sign in to comment.