diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-05-20 09:47:09 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-06-07 11:15:42 +0000 |
commit | 189d4fd8fad9e3c776873be51938cd31a42b6177 (patch) | |
tree | 6497caeff5e383937996768766ab3bb2081a40b2 /chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc | |
parent | 8bc75099d364490b22f43a7ce366b366c08f4164 (diff) | |
download | qtwebengine-chromium-189d4fd8fad9e3c776873be51938cd31a42b6177.tar.gz |
BASELINE: Update Chromium to 90.0.4430.221
Change-Id: Iff4d9d18d2fcf1a576f3b1f453010f744a232920
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc | 62 |
1 files changed, 49 insertions, 13 deletions
diff --git a/chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc b/chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc index 882843937ed..cd91934b558 100644 --- a/chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc +++ b/chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc @@ -8,6 +8,9 @@ #include "base/debug/stack_trace.h" #include "base/single_thread_task_runner.h" +#include "components/power_scheduler/power_mode.h" +#include "components/power_scheduler/power_mode_arbiter.h" +#include "components/power_scheduler/power_mode_voter.h" #include "components/viz/common/quads/compositor_frame.h" #include "components/viz/common/quads/texture_draw_quad.h" #include "components/viz/common/resources/resource_format.h" @@ -21,6 +24,7 @@ #include "third_party/blink/renderer/platform/graphics/canvas_resource.h" #include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h" #include "third_party/blink/renderer/platform/graphics/offscreen_canvas_placeholder.h" +#include "third_party/blink/renderer/platform/graphics/resource_id_traits.h" #include "third_party/blink/renderer/platform/instrumentation/histogram.h" #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h" #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h" @@ -51,6 +55,8 @@ struct CanvasResourceDispatcher::FrameResource { CanvasResourceDispatcher::CanvasResourceDispatcher( CanvasResourceDispatcherClient* client, + scoped_refptr<base::SingleThreadTaskRunner> + agent_group_scheduler_compositor_task_runner, uint32_t client_id, uint32_t sink_id, int canvas_id, @@ -61,7 +67,12 @@ CanvasResourceDispatcher::CanvasResourceDispatcher( needs_begin_frame_(false), placeholder_canvas_id_(canvas_id), num_unreclaimed_frames_posted_(0), - client_(client) { + client_(client), + agent_group_scheduler_compositor_task_runner_( + std::move(agent_group_scheduler_compositor_task_runner)), + animation_power_mode_voter_( + power_scheduler::PowerModeArbiter::GetInstance()->NewVoter( + "PowerModeVoter.Animation.Canvas")) { // Frameless canvas pass an invalid |frame_sink_id_|; don't create mojo // channel for this special case. if (!frame_sink_id_.is_valid()) @@ -140,13 +151,11 @@ void CanvasResourceDispatcher::PostImageToPlaceholderIfNotBlocked( void CanvasResourceDispatcher::PostImageToPlaceholder( scoped_refptr<CanvasResource> canvas_resource, viz::ResourceId resource_id) { - scoped_refptr<base::SingleThreadTaskRunner> dispatcher_task_runner = - Thread::Current()->GetTaskRunner(); // After this point, |canvas_resource| can only be used on the main thread, // until it is returned. canvas_resource->Transfer(); PostCrossThreadTask( - *Thread::MainThread()->Scheduler()->CompositorTaskRunner(), FROM_HERE, + *agent_group_scheduler_compositor_task_runner_, FROM_HERE, CrossThreadBindOnce(UpdatePlaceholderImage, placeholder_canvas_id_, std::move(canvas_resource), resource_id)); } @@ -203,12 +212,12 @@ bool CanvasResourceDispatcher::PrepareFrame( return false; } - next_resource_id_++; + auto next_resource_id = id_generator_.GenerateNextId(); // For frameless canvas, we don't get a valid frame_sink_id and should drop. if (!frame_sink_id_.is_valid()) { PostImageToPlaceholderIfNotBlocked(std::move(canvas_resource), - next_resource_id_); + next_resource_id); return false; } @@ -248,7 +257,7 @@ bool CanvasResourceDispatcher::PrepareFrame( canvas_resource->PrepareTransferableResource( &resource, &frame_resource->release_callback, kVerifiedSyncToken); - const unsigned resource_id = next_resource_id_; + const viz::ResourceId resource_id = next_resource_id; resource.id = resource_id; resources_.insert(resource_id, std::move(frame_resource)); @@ -303,8 +312,24 @@ void CanvasResourceDispatcher::DidReceiveCompositorFrameAck( } void CanvasResourceDispatcher::SetNeedsBeginFrame(bool needs_begin_frame) { - if (needs_begin_frame_ == needs_begin_frame) + if (needs_begin_frame_ == needs_begin_frame) { + // If the offscreencanvas is in the same tread as the canvas, and we are + // trying for a second time to request the being frame, and we are in a + // capture_stream scenario, we will call a BeginFrame right away. So + // Offscreen Canvas can behave in a more synchronous way when it's on the + // main thread. + if (needs_begin_frame_ && IsMainThread()) { + OffscreenCanvasPlaceholder* placeholder_canvas = + OffscreenCanvasPlaceholder::GetPlaceholderCanvasById( + placeholder_canvas_id_); + if (placeholder_canvas && + placeholder_canvas->IsOffscreenCanvasRegistered() && + placeholder_canvas->HasCanvasCapture() && Client()) { + Client()->BeginFrame(); + } + } return; + } needs_begin_frame_ = needs_begin_frame; if (!suspend_animation_) SetNeedsBeginFrameInternal(); @@ -319,8 +344,19 @@ void CanvasResourceDispatcher::SetSuspendAnimation(bool suspend_animation) { } void CanvasResourceDispatcher::SetNeedsBeginFrameInternal() { - if (sink_) - sink_->SetNeedsBeginFrame(needs_begin_frame_ && !suspend_animation_); + if (!sink_) + return; + + bool needs_begin_frame = needs_begin_frame_ && !suspend_animation_; + sink_->SetNeedsBeginFrame(needs_begin_frame); + + if (needs_begin_frame) { + animation_power_mode_voter_->VoteFor( + power_scheduler::PowerMode::kAnimation); + } else { + animation_power_mode_voter_->ResetVoteAfterTimeout( + power_scheduler::PowerModeVoter::kAnimationTimeout); + } } bool CanvasResourceDispatcher::HasTooManyPendingFrames() const { @@ -379,7 +415,7 @@ void CanvasResourceDispatcher::ReclaimResource(viz::ResourceId resource_id) { kMaxUnreclaimedPlaceholderFrames - 1); PostImageToPlaceholderIfNotBlocked(std::move(latest_unposted_image_), latest_unposted_resource_id_); - latest_unposted_resource_id_ = 0; + latest_unposted_resource_id_ = viz::kInvalidResourceId; } } @@ -425,9 +461,9 @@ void CanvasResourceDispatcher::SetPlaceholderCanvasDispatcher( placeholder_canvas_id); } else { PostCrossThreadTask( - *Thread::MainThread()->Scheduler()->CompositorTaskRunner(), FROM_HERE, + *agent_group_scheduler_compositor_task_runner_, FROM_HERE, CrossThreadBindOnce(UpdatePlaceholderDispatcher, this->GetWeakPtr(), - WTF::Passed(std::move(dispatcher_task_runner)), + std::move(dispatcher_task_runner), placeholder_canvas_id)); } } |