Chromium Code Reviews| Index: third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp |
| diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp |
| index baa008606aa270dee1285506c565e58a9ef0362e..b20cbe4f00700f2184fdb1059d09196eef4df2f0 100644 |
| --- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp |
| +++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp |
| @@ -53,7 +53,6 @@ |
| #include "modules/canvas2d/Path2D.h" |
| #include "platform/fonts/FontCache.h" |
| #include "platform/graphics/DrawLooperBuilder.h" |
| -#include "platform/graphics/ExpensiveCanvasHeuristicParameters.h" |
| #include "platform/graphics/ImageBuffer.h" |
| #include "platform/graphics/StrokeData.h" |
| #include "platform/graphics/skia/SkiaUtils.h" |
| @@ -1068,30 +1067,69 @@ unsigned CanvasRenderingContext2D::hitRegionsCount() const |
| return 0; |
| } |
| + |
| +double CanvasRenderingContext2D::estimateRenderingCostForUsage(BaseRenderingContext2D::UsageCounters usage, ExpensiveCanvasHeuristicParameters::RenderingModeCostIndex index) const |
|
Justin Novosad
2016/08/04 15:53:17
double -> float here and below
sebastienlc
2016/08/04 16:36:27
Done.
|
| +{ |
| + double basicCostOfDrawCalls = |
| + ExpensiveCanvasHeuristicParameters::FillRectFixedCost[index] * usage.numDrawCalls[BaseRenderingContext2D::FillRect] + |
| + ExpensiveCanvasHeuristicParameters::FillConvexPathFixedCost[index] * (usage.numDrawCalls[BaseRenderingContext2D::FillPath] - usage.numNonConvexFillPathCalls) + |
| + ExpensiveCanvasHeuristicParameters::FillNonConvexPathFixedCost[index] * usage.numNonConvexFillPathCalls + |
| + ExpensiveCanvasHeuristicParameters::FillTextFixedCost[index] * usage.numDrawCalls[BaseRenderingContext2D::FillText] + |
| + |
| + ExpensiveCanvasHeuristicParameters::StrokeRectFixedCost[index] * usage.numDrawCalls[BaseRenderingContext2D::StrokeRect] + |
| + ExpensiveCanvasHeuristicParameters::StrokePathFixedCost[index] * usage.numDrawCalls[BaseRenderingContext2D::StrokePath] + |
| + ExpensiveCanvasHeuristicParameters::StrokeTextFixedCost[index] * usage.numDrawCalls[BaseRenderingContext2D::StrokeText] + |
| + |
| + ExpensiveCanvasHeuristicParameters::FillRectVariableCostPerArea[index] * usage.boundingBoxAreaDrawCalls[BaseRenderingContext2D::FillRect] + |
| + ExpensiveCanvasHeuristicParameters::FillConvexPathVariableCostPerArea[index] * (usage.boundingBoxAreaDrawCalls[BaseRenderingContext2D::FillPath] - usage.nonConvexFillPathArea) + |
| + ExpensiveCanvasHeuristicParameters::FillNonConvexPathVariableCostPerArea[index] * usage.nonConvexFillPathArea + |
| + ExpensiveCanvasHeuristicParameters::FillTextVariableCostPerArea[index] * usage.boundingBoxAreaDrawCalls[BaseRenderingContext2D::FillText] + |
| + |
| + ExpensiveCanvasHeuristicParameters::StrokeRectVariableCostPerArea[index] * usage.boundingBoxAreaDrawCalls[BaseRenderingContext2D::StrokeRect] + |
| + ExpensiveCanvasHeuristicParameters::StrokePathVariableCostPerArea[index] * usage.boundingBoxAreaDrawCalls[BaseRenderingContext2D::StrokePath] + |
| + ExpensiveCanvasHeuristicParameters::StrokeTextVariableCostPerArea[index] * usage.boundingBoxAreaDrawCalls[BaseRenderingContext2D::StrokeText] + |
| + |
| + ExpensiveCanvasHeuristicParameters::PutImageDataFixedCost[index] * usage.numPutImageDataCalls + |
| + ExpensiveCanvasHeuristicParameters::PutImageDataVariableCostPerArea[index] * usage.areaPutImageDataCalls + |
| + |
| + ExpensiveCanvasHeuristicParameters::DrawSVGImageFixedCost[index] * usage.numDrawCalls[BaseRenderingContext2D::DrawSVGImage] + |
| + ExpensiveCanvasHeuristicParameters::DrawPNGImageFixedCost[index] * usage.numDrawCalls[BaseRenderingContext2D::DrawPNGImage] + |
| + |
| + ExpensiveCanvasHeuristicParameters::DrawSVGImageVariableCostPerArea[index] * usage.boundingBoxAreaDrawCalls[BaseRenderingContext2D::DrawSVGImage] + |
| + ExpensiveCanvasHeuristicParameters::DrawPNGImageVariableCostPerArea[index] * usage.boundingBoxAreaDrawCalls[BaseRenderingContext2D::DrawPNGImage]; |
| + |
| + double fillTypeAdjustment = |
| + ExpensiveCanvasHeuristicParameters::PatternFillTypeFixedCost[index] * usage.numPatterns + |
| + ExpensiveCanvasHeuristicParameters::LinearGradientFillTypeFixedCost[index] * usage.numLinearGradients + |
| + ExpensiveCanvasHeuristicParameters::RadialGradientFillTypeFixedCost[index] * usage.numRadialGradients + |
| + |
| + ExpensiveCanvasHeuristicParameters::PatternFillTypeVariableCostPerArea[index] * usage.boundingBoxAreaFillType[BaseRenderingContext2D::PatternFillType] + |
| + ExpensiveCanvasHeuristicParameters::LinearGradientFillVariableCostPerArea[index] * usage.boundingBoxAreaFillType[BaseRenderingContext2D::LinearGradientFillType] + |
| + ExpensiveCanvasHeuristicParameters::RadialGradientFillVariableCostPerArea[index] * usage.boundingBoxAreaFillType[BaseRenderingContext2D::RadialGradientFillType]; |
| + |
| + double shadowAdjustment = |
| + ExpensiveCanvasHeuristicParameters::ShadowFixedCost[index] * usage.numBlurredShadows + |
| + ExpensiveCanvasHeuristicParameters::ShadowVariableCostPerAreaTimesShadowBlurSquared[index] * usage.boundingBoxAreaTimesShadowBlurSquared; |
| + |
| + return basicCostOfDrawCalls + fillTypeAdjustment + shadowAdjustment; |
| +} |
| + |
| bool CanvasRenderingContext2D::isAccelerationOptimalForCanvasContent() const |
| { |
| - // Simple heuristic to determine if the GPU accelerated pipeline should be |
| - // used to maximize performance of 2D canvas based on past usage. |
| + // Heuristic to determine if the GPU accelerated rendering pipeline is optimal |
| + // for performance based on past usage. It has a bias towards suggesting that the |
| + // accelerated pipeline is optimal. |
| - int numDrawPathCalls = |
| - m_usageCounters.numDrawCalls[StrokePath] + |
| - m_usageCounters.numDrawCalls[FillPath] + |
| - m_usageCounters.numDrawCalls[FillText] + |
| - m_usageCounters.numDrawCalls[StrokeText] + |
| - m_usageCounters.numDrawCalls[FillRect] + |
| - m_usageCounters.numDrawCalls[StrokeRect]; |
| + double acceleratedCost = estimateRenderingCostForUsage(m_usageCounters, ExpensiveCanvasHeuristicParameters::AcceleratedModeIndex); |
|
Justin Novosad
2016/08/04 15:53:17
double -> float here and below
sebastienlc
2016/08/04 16:36:27
Done.
|
| - double acceleratedCost = |
| - numDrawPathCalls * ExpensiveCanvasHeuristicParameters::AcceleratedDrawPathApproximateCost + |
| - m_usageCounters.numGetImageDataCalls * ExpensiveCanvasHeuristicParameters::AcceleratedGetImageDataApproximateCost+ |
| - m_usageCounters.numDrawCalls[DrawImage] * ExpensiveCanvasHeuristicParameters::AcceleratedDrawImageApproximateCost; |
| + double recordingCost = estimateRenderingCostForUsage(m_usageCounters, ExpensiveCanvasHeuristicParameters::RecordingModeIndex); |
| - double recordingCost = |
| - numDrawPathCalls * ExpensiveCanvasHeuristicParameters::RecordingDrawPathApproximateCost + |
| - m_usageCounters.numGetImageDataCalls * ExpensiveCanvasHeuristicParameters::UnacceleratedGetImageDataApproximateCost + |
| - m_usageCounters.numDrawCalls[DrawImage] * ExpensiveCanvasHeuristicParameters::RecordingDrawImageApproximateCost; |
| + double costDifference = acceleratedCost - recordingCost; |
| + double percentCostReduction = costDifference / acceleratedCost * 100.0; |
| + double costDifferencePerFrame = costDifference / m_usageCounters.numFramesSinceReset; |
| - if (recordingCost * ExpensiveCanvasHeuristicParameters::AcceleratedHeuristicBias < acceleratedCost) { |
| + if (percentCostReduction >= ExpensiveCanvasHeuristicParameters::MinPercentageImprovementToSuggestDisableAcceleration |
| + && costDifferencePerFrame >= ExpensiveCanvasHeuristicParameters::MinCostPerFrameImprovementToSuggestDisableAcceleration) { |
| return false; |
| } |
| return true; |