| Index: third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
|
| diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
|
| index ca1f5ac6b3c46766c330ea23d7032a3c969c193e..b5c6d50cb04145361d174bbe805c33656fef6c13 100644
|
| --- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
|
| +++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
|
| @@ -148,6 +148,8 @@ inline HTMLCanvasElement::HTMLCanvasElement(Document& document)
|
| , m_originClean(true)
|
| , m_didFailToCreateImageBuffer(false)
|
| , m_imageBufferIsClear(false)
|
| + , m_numFramesSinceLastRenderingModeSwitch(0)
|
| + , m_pendingRenderingModeSwitch(false)
|
| {
|
| CanvasMetrics::countCanvasContextUsage(CanvasMetrics::CanvasCreated);
|
| }
|
| @@ -316,6 +318,32 @@ void HTMLCanvasElement::didFinalizeFrame()
|
| ro->invalidatePaintRectangle(mappedDirtyRect);
|
| }
|
| m_dirtyRect = FloatRect();
|
| +
|
| + m_numFramesSinceLastRenderingModeSwitch++;
|
| + if (RuntimeEnabledFeatures::enableCanvas2dDynamicRenderingModeSwitchingEnabled()
|
| + && !RuntimeEnabledFeatures::canvas2dFixedRenderingModeEnabled()) {
|
| + if (m_context->is2d() && buffer()->isAccelerated()
|
| + && m_numFramesSinceLastRenderingModeSwitch >= ExpensiveCanvasHeuristicParameters::MinFramesBeforeSwitch
|
| + && !m_pendingRenderingModeSwitch) {
|
| + if (!m_context->isAccelerationOptimalForCanvasContent()) {
|
| + // The switch must be done asynchronously in order to avoid switching during the paint invalidation step.
|
| + Platform::current()->currentThread()->getWebTaskRunner()->postTask(
|
| + BLINK_FROM_HERE,
|
| + WTF::bind([](WeakPtr<ImageBuffer> buffer) {
|
| + if (buffer) {
|
| + buffer->disableAcceleration();
|
| + }
|
| + },
|
| + m_imageBuffer->m_weakPtrFactory.createWeakPtr()));
|
| + m_numFramesSinceLastRenderingModeSwitch = 0;
|
| + m_pendingRenderingModeSwitch = true;
|
| + }
|
| + }
|
| + }
|
| +
|
| + if (m_pendingRenderingModeSwitch && !buffer()->isAccelerated()) {
|
| + m_pendingRenderingModeSwitch = false;
|
| + }
|
| }
|
|
|
| void HTMLCanvasElement::didDisableAcceleration()
|
|
|