summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2021-05-20 09:47:09 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2021-06-07 11:15:42 +0000
commit189d4fd8fad9e3c776873be51938cd31a42b6177 (patch)
tree6497caeff5e383937996768766ab3bb2081a40b2 /chromium/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
parent8bc75099d364490b22f43a7ce366b366c08f4164 (diff)
downloadqtwebengine-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.cc62
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));
}
}