Skip to content

Commit

Permalink
Pass collected frame timing events to Blink
Browse files Browse the repository at this point in the history
Related Blink change: https://codereview.chromium.org/908453003/
Related cc change: https://codereview.chromium.org/914403003/

BUG=441552
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel

Review URL: https://codereview.chromium.org/1137823002

Cr-Commit-Position: refs/heads/master@{#333128}
  • Loading branch information
mpb authored and Commit bot committed Jun 5, 2015
1 parent cb8f0c2 commit ed24c2c
Show file tree
Hide file tree
Showing 23 changed files with 241 additions and 19 deletions.
27 changes: 24 additions & 3 deletions cc/debug/frame_timing_tracker.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,13 @@
#include <limits>

#include "base/metrics/histogram.h"
#include "cc/trees/layer_tree_host_impl.h"
#include "cc/trees/proxy.h"

namespace cc {
namespace {
int kSendTimingIntervalMS = 200;
}

FrameTimingTracker::CompositeTimingEvent::CompositeTimingEvent(
int _frame_id,
Expand All @@ -32,11 +36,19 @@ FrameTimingTracker::MainFrameTimingEvent::~MainFrameTimingEvent() {
}

// static
scoped_ptr<FrameTimingTracker> FrameTimingTracker::Create() {
return make_scoped_ptr(new FrameTimingTracker);
scoped_ptr<FrameTimingTracker> FrameTimingTracker::Create(
LayerTreeHostImpl* layer_tree_host_impl) {
return make_scoped_ptr(new FrameTimingTracker(layer_tree_host_impl));
}

FrameTimingTracker::FrameTimingTracker() {
FrameTimingTracker::FrameTimingTracker(LayerTreeHostImpl* layer_tree_host_impl)
: layer_tree_host_impl_(layer_tree_host_impl),
post_events_notifier_(
layer_tree_host_impl_->proxy()->HasImplThread()
? layer_tree_host_impl_->proxy()->ImplThreadTaskRunner()
: layer_tree_host_impl_->proxy()->MainThreadTaskRunner(),
base::Bind(&FrameTimingTracker::PostEvents, base::Unretained(this)),
base::TimeDelta::FromMilliseconds(kSendTimingIntervalMS)) {
}

FrameTimingTracker::~FrameTimingTracker() {
Expand All @@ -51,6 +63,8 @@ void FrameTimingTracker::SaveTimeStamps(
(*composite_events_)[pair.second].push_back(
CompositeTimingEvent(pair.first, timestamp));
}
if (!post_events_notifier_.HasPendingNotification())
post_events_notifier_.Schedule();
}

void FrameTimingTracker::SaveMainFrameTimeStamps(
Expand All @@ -65,6 +79,8 @@ void FrameTimingTracker::SaveMainFrameTimeStamps(
events.push_back(
MainFrameTimingEvent(source_frame_number, main_frame_time, end_time));
}
if (!post_events_notifier_.HasPendingNotification())
post_events_notifier_.Schedule();
}

scoped_ptr<FrameTimingTracker::CompositeTimingSet>
Expand Down Expand Up @@ -95,4 +111,9 @@ FrameTimingTracker::GroupMainFrameCountsByRectId() {
return main_frame_events_.Pass();
}

void FrameTimingTracker::PostEvents() {
layer_tree_host_impl_->PostFrameTimingEvents(GroupCompositeCountsByRectId(),
GroupMainFrameCountsByRectId());
}

} // namespace cc
17 changes: 13 additions & 4 deletions cc/debug/frame_timing_tracker.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,12 @@
#include "base/memory/scoped_ptr.h"
#include "base/time/time.h"
#include "cc/base/cc_export.h"
#include "cc/base/delayed_unique_notifier.h"

namespace cc {

class LayerTreeHostImpl;

// This class maintains a history of timestamps and rect IDs to communicate
// frame events back to Blink
// TODO(mpb): Start using this. crbug.com/442554
Expand All @@ -30,7 +33,7 @@ class CC_EXPORT FrameTimingTracker {
};

using CompositeTimingSet =
base::hash_map<int, std::vector<CompositeTimingEvent>>;
base::hash_map<int64_t, std::vector<CompositeTimingEvent>>;

struct CC_EXPORT MainFrameTimingEvent {
MainFrameTimingEvent(int frame_id,
Expand All @@ -44,9 +47,10 @@ class CC_EXPORT FrameTimingTracker {
};

using MainFrameTimingSet =
base::hash_map<int, std::vector<MainFrameTimingEvent>>;
base::hash_map<int64_t, std::vector<MainFrameTimingEvent>>;

static scoped_ptr<FrameTimingTracker> Create();
static scoped_ptr<FrameTimingTracker> Create(
LayerTreeHostImpl* layer_tree_host_impl);

~FrameTimingTracker();

Expand Down Expand Up @@ -74,11 +78,16 @@ class CC_EXPORT FrameTimingTracker {
int source_frame_number);

private:
FrameTimingTracker();
explicit FrameTimingTracker(LayerTreeHostImpl* layer_tree_host_impl);

void PostEvents();

scoped_ptr<CompositeTimingSet> composite_events_;
scoped_ptr<MainFrameTimingSet> main_frame_events_;

LayerTreeHostImpl* layer_tree_host_impl_;
DelayedUniqueNotifier post_events_notifier_;

DISALLOW_COPY_AND_ASSIGN(FrameTimingTracker);
};

Expand Down
66 changes: 57 additions & 9 deletions cc/debug/frame_timing_tracker_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
#include "base/trace_event/trace_event_argument.h"
#include "base/values.h"
#include "cc/debug/frame_timing_tracker.h"
#include "cc/test/fake_impl_proxy.h"
#include "cc/test/fake_layer_tree_host_impl.h"
#include "cc/test/test_shared_bitmap_manager.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cc {
Expand Down Expand Up @@ -70,23 +73,38 @@ std::string MainFrameToString(
}

TEST(FrameTimingTrackerTest, DefaultTrackerIsEmpty) {
scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create());
FakeImplProxy proxy;
TestSharedBitmapManager shared_bitmap_manager;
FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);

scoped_ptr<FrameTimingTracker> tracker(
FrameTimingTracker::Create(&host_impl));
EXPECT_EQ("{\"values\":[]}",
CompositeToString(tracker->GroupCompositeCountsByRectId()));
EXPECT_EQ("{\"values\":[]}",
MainFrameToString(tracker->GroupMainFrameCountsByRectId()));
}

TEST(FrameTimingTrackerTest, NoFrameIdsIsEmpty) {
scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create());
FakeImplProxy proxy;
TestSharedBitmapManager shared_bitmap_manager;
FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);

scoped_ptr<FrameTimingTracker> tracker(
FrameTimingTracker::Create(&host_impl));
std::vector<std::pair<int, int64_t>> ids;
tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(100), ids);
EXPECT_EQ("{\"values\":[]}",
CompositeToString(tracker->GroupCompositeCountsByRectId()));
}

TEST(FrameTimingTrackerTest, NoRectIdsYieldsNoMainFrameEvents) {
scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create());
FakeImplProxy proxy;
TestSharedBitmapManager shared_bitmap_manager;
FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);

scoped_ptr<FrameTimingTracker> tracker(
FrameTimingTracker::Create(&host_impl));
tracker->SaveMainFrameTimeStamps(std::vector<int64_t>(),
base::TimeTicks::FromInternalValue(100),
base::TimeTicks::FromInternalValue(110), 1);
Expand All @@ -95,7 +113,12 @@ TEST(FrameTimingTrackerTest, NoRectIdsYieldsNoMainFrameEvents) {
}

TEST(FrameTimingTrackerTest, OneFrameId) {
scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create());
FakeImplProxy proxy;
TestSharedBitmapManager shared_bitmap_manager;
FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);

scoped_ptr<FrameTimingTracker> tracker(
FrameTimingTracker::Create(&host_impl));
std::vector<std::pair<int, int64_t>> ids;
ids.push_back(std::make_pair(1, 2));
tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(100), ids);
Expand All @@ -106,7 +129,12 @@ TEST(FrameTimingTrackerTest, OneFrameId) {
}

TEST(FrameTimingTrackerTest, OneMainFrameRect) {
scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create());
FakeImplProxy proxy;
TestSharedBitmapManager shared_bitmap_manager;
FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);

scoped_ptr<FrameTimingTracker> tracker(
FrameTimingTracker::Create(&host_impl));
std::vector<int64_t> rect_ids;
rect_ids.push_back(1);
tracker->SaveMainFrameTimeStamps(rect_ids,
Expand All @@ -119,7 +147,12 @@ TEST(FrameTimingTrackerTest, OneMainFrameRect) {
}

TEST(FrameTimingTrackerTest, UnsortedTimestampsIds) {
scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create());
FakeImplProxy proxy;
TestSharedBitmapManager shared_bitmap_manager;
FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);

scoped_ptr<FrameTimingTracker> tracker(
FrameTimingTracker::Create(&host_impl));
std::vector<std::pair<int, int64_t>> ids;
ids.push_back(std::make_pair(1, 2));
tracker->SaveTimeStamps(base::TimeTicks::FromInternalValue(200), ids);
Expand All @@ -134,7 +167,12 @@ TEST(FrameTimingTrackerTest, UnsortedTimestampsIds) {
}

TEST(FrameTimingTrackerTest, MainFrameUnsortedTimestamps) {
scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create());
FakeImplProxy proxy;
TestSharedBitmapManager shared_bitmap_manager;
FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);

scoped_ptr<FrameTimingTracker> tracker(
FrameTimingTracker::Create(&host_impl));
std::vector<int64_t> rect_ids;
rect_ids.push_back(2);
tracker->SaveMainFrameTimeStamps(rect_ids,
Expand All @@ -155,7 +193,12 @@ TEST(FrameTimingTrackerTest, MainFrameUnsortedTimestamps) {
}

TEST(FrameTimingTrackerTest, MultipleFrameIds) {
scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create());
FakeImplProxy proxy;
TestSharedBitmapManager shared_bitmap_manager;
FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);

scoped_ptr<FrameTimingTracker> tracker(
FrameTimingTracker::Create(&host_impl));

std::vector<std::pair<int, int64_t>> ids200;
ids200.push_back(std::make_pair(1, 2));
Expand Down Expand Up @@ -187,7 +230,12 @@ TEST(FrameTimingTrackerTest, MultipleFrameIds) {
}

TEST(FrameTimingTrackerTest, MultipleMainFrameEvents) {
scoped_ptr<FrameTimingTracker> tracker(FrameTimingTracker::Create());
FakeImplProxy proxy;
TestSharedBitmapManager shared_bitmap_manager;
FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);

scoped_ptr<FrameTimingTracker> tracker(
FrameTimingTracker::Create(&host_impl));

std::vector<int64_t> rect_ids200;
rect_ids200.push_back(2);
Expand Down
4 changes: 4 additions & 0 deletions cc/test/fake_layer_tree_host_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ class FakeLayerTreeHostClient : public LayerTreeHostClient,
void DidCommitAndDrawFrame() override {}
void DidCompleteSwapBuffers() override {}
void DidCompletePageScaleAnimation() override {}
void RecordFrameTimingEvents(
scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events,
scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events)
override {}

// LayerTreeHostSingleThreadClient implementation.
void DidPostSwapBuffers() override {}
Expand Down
5 changes: 5 additions & 0 deletions cc/test/fake_layer_tree_host_impl_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#ifndef CC_TEST_FAKE_LAYER_TREE_HOST_IMPL_CLIENT_H_
#define CC_TEST_FAKE_LAYER_TREE_HOST_IMPL_CLIENT_H_

#include "cc/debug/frame_timing_tracker.h"
#include "cc/output/begin_frame_args.h"
#include "cc/trees/layer_tree_host_impl.h"

Expand Down Expand Up @@ -42,6 +43,10 @@ class FakeLayerTreeHostImplClient : public LayerTreeHostImplClient {
void DidPrepareTiles() override {}
void DidCompletePageScaleAnimationOnImplThread() override {}
void OnDrawForOutputSurface() override {}
void PostFrameTimingEventsOnImplThread(
scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events,
scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events)
override {}
};

} // namespace cc
Expand Down
5 changes: 5 additions & 0 deletions cc/test/layer_tree_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,11 @@ class LayerTreeHostClientForTesting : public LayerTreeHostClient,
void DidCompletePageScaleAnimation() override {}
void BeginMainFrameNotExpectedSoon() override {}

void RecordFrameTimingEvents(
scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events,
scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events)
override {}

private:
explicit LayerTreeHostClientForTesting(TestHooks* test_hooks)
: test_hooks_(test_hooks) {}
Expand Down
7 changes: 7 additions & 0 deletions cc/trees/layer_tree_host.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1302,4 +1302,11 @@ void LayerTreeHost::SetAuthoritativeVSyncInterval(
proxy_->SetAuthoritativeVSyncInterval(interval);
}

void LayerTreeHost::RecordFrameTimingEvents(
scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events,
scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) {
client_->RecordFrameTimingEvents(composite_events.Pass(),
main_frame_events.Pass());
}

} // namespace cc
5 changes: 5 additions & 0 deletions cc/trees/layer_tree_host.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "cc/animation/animation_events.h"
#include "cc/base/cc_export.h"
#include "cc/base/scoped_ptr_vector.h"
#include "cc/debug/frame_timing_tracker.h"
#include "cc/debug/micro_benchmark.h"
#include "cc/debug/micro_benchmark_controller.h"
#include "cc/input/input_handler.h"
Expand Down Expand Up @@ -329,6 +330,10 @@ class CC_EXPORT LayerTreeHost {
return settings().impl_side_painting;
}

void RecordFrameTimingEvents(
scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events,
scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events);

protected:
explicit LayerTreeHost(InitParams* params);
void InitializeThreaded(
Expand Down
4 changes: 4 additions & 0 deletions cc/trees/layer_tree_host_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/time/time.h"
#include "cc/debug/frame_timing_tracker.h"

namespace gfx {
class Vector2d;
Expand Down Expand Up @@ -46,6 +47,9 @@ class LayerTreeHostClient {
virtual void DidCommit() = 0;
virtual void DidCommitAndDrawFrame() = 0;
virtual void DidCompleteSwapBuffers() = 0;
virtual void RecordFrameTimingEvents(
scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events,
scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) = 0;

// Called when page scale animation has completed.
virtual void DidCompletePageScaleAnimation() = 0;
Expand Down
9 changes: 8 additions & 1 deletion cc/trees/layer_tree_host_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ LayerTreeHostImpl::LayerTreeHostImpl(
id_(id),
requires_high_res_to_draw_(false),
is_likely_to_require_a_draw_(false),
frame_timing_tracker_(FrameTimingTracker::Create()) {
frame_timing_tracker_(FrameTimingTracker::Create(this)) {
DCHECK(proxy_->IsImplThread());
DidVisibilityChange(this, visible_);
animation_registrar_->set_supports_scroll_animations(
Expand Down Expand Up @@ -2174,6 +2174,13 @@ void LayerTreeHostImpl::RecordMainFrameTiming(
request_ids, start_time, end_time, active_tree_->source_frame_number());
}

void LayerTreeHostImpl::PostFrameTimingEvents(
scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events,
scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) {
client_->PostFrameTimingEventsOnImplThread(composite_events.Pass(),
main_frame_events.Pass());
}

void LayerTreeHostImpl::DestroyTileManager() {
tile_manager_ = nullptr;
resource_pool_ = nullptr;
Expand Down
9 changes: 9 additions & 0 deletions cc/trees/layer_tree_host_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,10 @@ class LayerTreeHostImplClient {
// Called when output surface asks for a draw.
virtual void OnDrawForOutputSurface() = 0;

virtual void PostFrameTimingEventsOnImplThread(
scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events,
scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) = 0;

protected:
virtual ~LayerTreeHostImplClient() {}
};
Expand Down Expand Up @@ -539,6 +543,11 @@ class CC_EXPORT LayerTreeHostImpl
const BeginFrameArgs& start_of_main_frame_args,
const BeginFrameArgs& expected_next_main_frame_args);

// Post the given frame timing events to the requester.
void PostFrameTimingEvents(
scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events,
scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events);

protected:
LayerTreeHostImpl(
const LayerTreeSettings& settings,
Expand Down
Loading

0 comments on commit ed24c2c

Please sign in to comment.