Commit c2c6b351 authored by Fernando Serboncini's avatar Fernando Serboncini Committed by Commit Bot

Only ack Worker.RAF BeginFrame after sending OffscreenCanvas


Bug: 995235
Change-Id: I2aaebe2c87f43a647e9b6823f13b64f890a7c7fa
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1829483
Commit-Queue: Fernando Serboncini <fserb@chromium.org>
Reviewed-by: default avatarKhushal <khushalsagar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#701182}
parent 175d8c40
...@@ -36,25 +36,31 @@ void WorkerAnimationFrameProvider::CancelCallback(int id) { ...@@ -36,25 +36,31 @@ void WorkerAnimationFrameProvider::CancelCallback(int id) {
callback_collection_.CancelFrameCallback(id); callback_collection_.CancelFrameCallback(id);
} }
void WorkerAnimationFrameProvider::BeginFrame( void WorkerAnimationFrameProvider::BeginFrame(const viz::BeginFrameArgs& args) {
const base::TimeTicks& frame_time) { TRACE_EVENT_WITH_FLOW0("blink", "WorkerAnimationFrameProvider::BeginFrame",
TRACE_EVENT0("blink", "WorkerAnimationFrameProvider::BeginFrame"); TRACE_ID_GLOBAL(args.trace_id),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
double time = (frame_time - base::TimeTicks()).InMillisecondsF();
Microtask::EnqueueMicrotask(WTF::Bind( Microtask::EnqueueMicrotask(WTF::Bind(
[](base::WeakPtr<WorkerAnimationFrameProvider> provider, double time) { [](base::WeakPtr<WorkerAnimationFrameProvider> provider,
const viz::BeginFrameArgs& args) {
if (!provider) if (!provider)
return; return;
TRACE_EVENT0("blink", TRACE_EVENT_WITH_FLOW0(
"WorkerAnimationFrameProvider::RequestAnimationFrame"); "blink", "WorkerAnimationFrameProvider::RequestAnimationFrame",
OffscreenCanvas::ScopedInsideWorkerRAF inside_raf_scope; TRACE_ID_GLOBAL(args.trace_id), TRACE_EVENT_FLAG_FLOW_IN);
for (auto& offscreen_canvas : provider->offscreen_canvases_) { {
inside_raf_scope.AddOffscreenCanvas(offscreen_canvas); OffscreenCanvas::ScopedInsideWorkerRAF inside_raf_scope;
} for (auto& offscreen_canvas : provider->offscreen_canvases_) {
inside_raf_scope.AddOffscreenCanvas(offscreen_canvas);
}
provider->callback_collection_.ExecuteFrameCallbacks(time, time); double time = (args.frame_time - base::TimeTicks()).InMillisecondsF();
provider->callback_collection_.ExecuteFrameCallbacks(time, time);
}
provider->begin_frame_provider_->FinishBeginFrame(args);
}, },
weak_factory_.GetWeakPtr(), time)); weak_factory_.GetWeakPtr(), args));
} }
void WorkerAnimationFrameProvider::RegisterOffscreenCanvas( void WorkerAnimationFrameProvider::RegisterOffscreenCanvas(
......
...@@ -39,7 +39,7 @@ class CORE_EXPORT WorkerAnimationFrameProvider ...@@ -39,7 +39,7 @@ class CORE_EXPORT WorkerAnimationFrameProvider
void Trace(blink::Visitor* visitor); void Trace(blink::Visitor* visitor);
// BeginFrameProviderClient // BeginFrameProviderClient
void BeginFrame(const base::TimeTicks& frame_time) override; void BeginFrame(const viz::BeginFrameArgs&) override;
void RegisterOffscreenCanvas(OffscreenCanvas*); void RegisterOffscreenCanvas(OffscreenCanvas*);
void DeregisterOffscreenCanvas(OffscreenCanvas*); void DeregisterOffscreenCanvas(OffscreenCanvas*);
......
...@@ -95,6 +95,10 @@ void BeginFrameProvider::RequestBeginFrame() { ...@@ -95,6 +95,10 @@ void BeginFrameProvider::RequestBeginFrame() {
void BeginFrameProvider::OnBeginFrame( void BeginFrameProvider::OnBeginFrame(
const viz::BeginFrameArgs& args, const viz::BeginFrameArgs& args,
WTF::HashMap<uint32_t, ::viz::mojom::blink::FrameTimingDetailsPtr>) { WTF::HashMap<uint32_t, ::viz::mojom::blink::FrameTimingDetailsPtr>) {
TRACE_EVENT_WITH_FLOW0("blink", "BeginFrameProvider::OnBeginFrame",
TRACE_ID_GLOBAL(args.trace_id),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
if (args.deadline < base::TimeTicks::Now()) { if (args.deadline < base::TimeTicks::Now()) {
compositor_frame_sink_->DidNotProduceFrame(viz::BeginFrameAck(args, false)); compositor_frame_sink_->DidNotProduceFrame(viz::BeginFrameAck(args, false));
return; return;
...@@ -103,14 +107,16 @@ void BeginFrameProvider::OnBeginFrame( ...@@ -103,14 +107,16 @@ void BeginFrameProvider::OnBeginFrame(
// If there was no need for a BeginFrame, just skip it. // If there was no need for a BeginFrame, just skip it.
if (needs_begin_frame_ && requested_needs_begin_frame_) { if (needs_begin_frame_ && requested_needs_begin_frame_) {
requested_needs_begin_frame_ = false; requested_needs_begin_frame_ = false;
begin_frame_client_->BeginFrame(args.frame_time); begin_frame_client_->BeginFrame(args);
} else { } else {
if (!requested_needs_begin_frame_) { if (!requested_needs_begin_frame_) {
needs_begin_frame_ = false; needs_begin_frame_ = false;
compositor_frame_sink_->SetNeedsBeginFrame(false); compositor_frame_sink_->SetNeedsBeginFrame(false);
} }
} }
}
void BeginFrameProvider::FinishBeginFrame(const viz::BeginFrameArgs& args) {
compositor_frame_sink_->DidNotProduceFrame(viz::BeginFrameAck(args, false)); compositor_frame_sink_->DidNotProduceFrame(viz::BeginFrameAck(args, false));
} }
......
...@@ -24,7 +24,7 @@ struct PLATFORM_EXPORT BeginFrameProviderParams final { ...@@ -24,7 +24,7 @@ struct PLATFORM_EXPORT BeginFrameProviderParams final {
class PLATFORM_EXPORT BeginFrameProviderClient { class PLATFORM_EXPORT BeginFrameProviderClient {
public: public:
virtual void BeginFrame(const base::TimeTicks& frame_time) = 0; virtual void BeginFrame(const viz::BeginFrameArgs&) = 0;
virtual ~BeginFrameProviderClient() = default; virtual ~BeginFrameProviderClient() = default;
}; };
...@@ -39,6 +39,7 @@ class PLATFORM_EXPORT BeginFrameProvider ...@@ -39,6 +39,7 @@ class PLATFORM_EXPORT BeginFrameProvider
void CreateCompositorFrameSinkIfNeeded(); void CreateCompositorFrameSinkIfNeeded();
void RequestBeginFrame(); void RequestBeginFrame();
void FinishBeginFrame(const viz::BeginFrameArgs&);
// viz::mojom::blink::CompositorFrameSinkClient implementation. // viz::mojom::blink::CompositorFrameSinkClient implementation.
void DidReceiveCompositorFrameAck( void DidReceiveCompositorFrameAck(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment