Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(447)

Unified Diff: third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp

Issue 2210123002: Improved heuristic for disable acceleration. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Disable trackDrawCall when Canvas 2D Dynamic Rendering Mode Switching is disabled Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
diff --git a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
index f85fa19e099fb93512ea3ba4641da01ac768635c..8f80b02040daa0f04f29f6c585c61e1dd5c5e908 100644
--- a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
+++ b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp
@@ -949,7 +949,12 @@ static bool isDrawScalingDown(const FloatRect& srcRect, const FloatRect& dstRect
void BaseRenderingContext2D::drawImageInternal(SkCanvas* c, CanvasImageSource* imageSource, Image* image, const FloatRect& srcRect, const FloatRect& dstRect, const SkPaint* paint)
{
- trackDrawCall(DrawImage, nullptr, dstRect.width(), dstRect.height());
+ if (imageSource->isSVGSource()) {
+ trackDrawCall(DrawVectorImage, nullptr, dstRect.width(), dstRect.height());
+ } else {
+ trackDrawCall(DrawBitmapImage, nullptr, dstRect.width(), dstRect.height());
+ }
+
int initialSaveCount = c->getSaveCount();
SkPaint imagePaint = *paint;
@@ -1523,12 +1528,17 @@ void BaseRenderingContext2D::checkOverdraw(const SkRect& rect, const SkPaint* pa
void BaseRenderingContext2D::trackDrawCall(DrawCallType callType, Path2D* path2d, int width, int height)
{
+ if (!RuntimeEnabledFeatures::enableCanvas2dDynamicRenderingModeSwitchingEnabled()) {
+ // Rendering mode switching is disabled so no need to track the usage
+ return;
+ }
+
m_usageCounters.numDrawCalls[callType]++;
- double boundingRectWidth = static_cast<double>(width);
- double boundingRectHeight = static_cast<double>(height);
- double boundingRectArea = boundingRectWidth * boundingRectHeight;
- double boundingRectPerimeter = (2.0 * boundingRectWidth) + (2.0 * boundingRectHeight);
+ float boundingRectWidth = static_cast<float>(width);
+ float boundingRectHeight = static_cast<float>(height);
+ float boundingRectArea = boundingRectWidth * boundingRectHeight;
+ float boundingRectPerimeter = (2.0 * boundingRectWidth) + (2.0 * boundingRectHeight);
if (callType == FillText
|| callType == FillPath
@@ -1544,19 +1554,21 @@ void BaseRenderingContext2D::trackDrawCall(DrawCallType callType, Path2D* path2d
skPath = m_path.getSkPath();
}
- if (callType == FillPath && !(skPath.getConvexity() == SkPath::kConvex_Convexity)) {
- m_usageCounters.numNonConvexFillPathCalls++;
- }
- if (!(callType == FillRect || callType == StrokeRect || callType == DrawImage)) {
+ if (!(callType == FillRect || callType == StrokeRect || callType == DrawVectorImage || callType == DrawBitmapImage)) {
// The correct width and height were not passed as parameters
const SkRect& boundingRect = skPath.getBounds();
- boundingRectWidth = static_cast<double>(std::abs(boundingRect.width()));
- boundingRectHeight = static_cast<double>(std::abs(boundingRect.height()));
+ boundingRectWidth = static_cast<float>(std::abs(boundingRect.width()));
+ boundingRectHeight = static_cast<float>(std::abs(boundingRect.height()));
boundingRectArea = boundingRectWidth * boundingRectHeight;
boundingRectPerimeter = 2.0 * boundingRectWidth + 2.0 * boundingRectHeight;
}
+ if (callType == FillPath && skPath.getConvexity() != SkPath::kConvex_Convexity) {
+ m_usageCounters.numNonConvexFillPathCalls++;
+ m_usageCounters.nonConvexFillPathArea += boundingRectArea;
+ }
+
m_usageCounters.boundingBoxPerimeterDrawCalls[callType] += boundingRectPerimeter;
m_usageCounters.boundingBoxAreaDrawCalls[callType] += boundingRectArea;
@@ -1569,10 +1581,12 @@ void BaseRenderingContext2D::trackDrawCall(DrawCallType callType, Path2D* path2d
CanvasGradient* gradient = canvasStyle->getCanvasGradient();
if (gradient) {
- m_usageCounters.numGradients++;
+
if (gradient->getGradient()->isRadial()) {
+ m_usageCounters.numRadialGradients++;
m_usageCounters.boundingBoxAreaFillType[BaseRenderingContext2D::RadialGradientFillType] += boundingRectArea;
} else {
+ m_usageCounters.numLinearGradients++;
m_usageCounters.boundingBoxAreaFillType[BaseRenderingContext2D::LinearGradientFillType] += boundingRectArea;
}
} else if (canvasStyle->getCanvasPattern()) {
@@ -1583,9 +1597,9 @@ void BaseRenderingContext2D::trackDrawCall(DrawCallType callType, Path2D* path2d
}
}
- if (callType == DrawImage) {
- m_usageCounters.boundingBoxPerimeterDrawCalls[DrawImage] += boundingRectPerimeter;
- m_usageCounters.boundingBoxAreaDrawCalls[DrawImage] += boundingRectArea;
+ if (callType == DrawVectorImage || callType == DrawBitmapImage) {
+ m_usageCounters.boundingBoxPerimeterDrawCalls[callType] += boundingRectPerimeter;
+ m_usageCounters.boundingBoxAreaDrawCalls[callType] += boundingRectArea;
}
if (callType == FillText
@@ -1594,7 +1608,8 @@ void BaseRenderingContext2D::trackDrawCall(DrawCallType callType, Path2D* path2d
|| callType == StrokePath
|| callType == FillRect
|| callType == StrokeRect
- || callType == DrawImage) {
+ || callType == DrawVectorImage
+ || callType == DrawBitmapImage) {
if (state().shadowBlur() > 0.0 && SkColorGetA(state().shadowColor()) > 0) {
m_usageCounters.numBlurredShadows++;
m_usageCounters.boundingBoxAreaTimesShadowBlurSquared += boundingRectArea * state().shadowBlur() * state().shadowBlur();
@@ -1622,17 +1637,19 @@ DEFINE_TRACE(BaseRenderingContext2D)
}
BaseRenderingContext2D::UsageCounters::UsageCounters() :
- numDrawCalls {0, 0, 0, 0, 0, 0},
- boundingBoxPerimeterDrawCalls {0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
- boundingBoxAreaDrawCalls {0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
- boundingBoxAreaFillType {0.0, 0.0, 0.0, 0.0},
+ numDrawCalls {0, 0, 0, 0, 0, 0, 0},
+ boundingBoxPerimeterDrawCalls {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f},
+ boundingBoxAreaDrawCalls {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f},
+ boundingBoxAreaFillType {0.0f, 0.0f, 0.0f, 0.0f},
numNonConvexFillPathCalls(0),
- numGradients(0),
+ nonConvexFillPathArea(0.0f),
+ numRadialGradients(0),
+ numLinearGradients(0),
numPatterns(0),
numDrawWithComplexClips(0),
numBlurredShadows(0),
- boundingBoxAreaTimesShadowBlurSquared(0.0),
- boundingBoxPerimeterTimesShadowBlurSquared(0.0),
+ boundingBoxAreaTimesShadowBlurSquared(0.0f),
+ boundingBoxPerimeterTimesShadowBlurSquared(0.0f),
numFilters(0),
numGetImageDataCalls(0),
areaGetImageDataCalls(0.0),
@@ -1642,4 +1659,51 @@ BaseRenderingContext2D::UsageCounters::UsageCounters() :
numDrawFocusCalls(0),
numFramesSinceReset(0) {}
+
+float BaseRenderingContext2D::estimateRenderingCost(ExpensiveCanvasHeuristicParameters::RenderingModeCostIndex index) const
+{
+ float basicCostOfDrawCalls =
+ ExpensiveCanvasHeuristicParameters::FillRectFixedCost[index] * m_usageCounters.numDrawCalls[BaseRenderingContext2D::FillRect] +
+ ExpensiveCanvasHeuristicParameters::FillConvexPathFixedCost[index] * (m_usageCounters.numDrawCalls[BaseRenderingContext2D::FillPath] - m_usageCounters.numNonConvexFillPathCalls) +
+ ExpensiveCanvasHeuristicParameters::FillNonConvexPathFixedCost[index] * m_usageCounters.numNonConvexFillPathCalls +
+ ExpensiveCanvasHeuristicParameters::FillTextFixedCost[index] * m_usageCounters.numDrawCalls[BaseRenderingContext2D::FillText] +
+
+ ExpensiveCanvasHeuristicParameters::StrokeRectFixedCost[index] * m_usageCounters.numDrawCalls[BaseRenderingContext2D::StrokeRect] +
+ ExpensiveCanvasHeuristicParameters::StrokePathFixedCost[index] * m_usageCounters.numDrawCalls[BaseRenderingContext2D::StrokePath] +
+ ExpensiveCanvasHeuristicParameters::StrokeTextFixedCost[index] * m_usageCounters.numDrawCalls[BaseRenderingContext2D::StrokeText] +
+
+ ExpensiveCanvasHeuristicParameters::FillRectVariableCostPerArea[index] * m_usageCounters.boundingBoxAreaDrawCalls[BaseRenderingContext2D::FillRect] +
+ ExpensiveCanvasHeuristicParameters::FillConvexPathVariableCostPerArea[index] * (m_usageCounters.boundingBoxAreaDrawCalls[BaseRenderingContext2D::FillPath] - m_usageCounters.nonConvexFillPathArea) +
+ ExpensiveCanvasHeuristicParameters::FillNonConvexPathVariableCostPerArea[index] * m_usageCounters.nonConvexFillPathArea +
+ ExpensiveCanvasHeuristicParameters::FillTextVariableCostPerArea[index] * m_usageCounters.boundingBoxAreaDrawCalls[BaseRenderingContext2D::FillText] +
+
+ ExpensiveCanvasHeuristicParameters::StrokeRectVariableCostPerArea[index] * m_usageCounters.boundingBoxAreaDrawCalls[BaseRenderingContext2D::StrokeRect] +
+ ExpensiveCanvasHeuristicParameters::StrokePathVariableCostPerArea[index] * m_usageCounters.boundingBoxAreaDrawCalls[BaseRenderingContext2D::StrokePath] +
+ ExpensiveCanvasHeuristicParameters::StrokeTextVariableCostPerArea[index] * m_usageCounters.boundingBoxAreaDrawCalls[BaseRenderingContext2D::StrokeText] +
+
+ ExpensiveCanvasHeuristicParameters::PutImageDataFixedCost[index] * m_usageCounters.numPutImageDataCalls +
+ ExpensiveCanvasHeuristicParameters::PutImageDataVariableCostPerArea[index] * m_usageCounters.areaPutImageDataCalls +
+
+ ExpensiveCanvasHeuristicParameters::DrawSVGImageFixedCost[index] * m_usageCounters.numDrawCalls[BaseRenderingContext2D::DrawVectorImage] +
+ ExpensiveCanvasHeuristicParameters::DrawPNGImageFixedCost[index] * m_usageCounters.numDrawCalls[BaseRenderingContext2D::DrawBitmapImage] +
+
+ ExpensiveCanvasHeuristicParameters::DrawSVGImageVariableCostPerArea[index] * m_usageCounters.boundingBoxAreaDrawCalls[BaseRenderingContext2D::DrawVectorImage] +
+ ExpensiveCanvasHeuristicParameters::DrawPNGImageVariableCostPerArea[index] * m_usageCounters.boundingBoxAreaDrawCalls[BaseRenderingContext2D::DrawBitmapImage];
+
+ float fillTypeAdjustment =
+ ExpensiveCanvasHeuristicParameters::PatternFillTypeFixedCost[index] * m_usageCounters.numPatterns +
+ ExpensiveCanvasHeuristicParameters::LinearGradientFillTypeFixedCost[index] * m_usageCounters.numLinearGradients +
+ ExpensiveCanvasHeuristicParameters::RadialGradientFillTypeFixedCost[index] * m_usageCounters.numRadialGradients +
+
+ ExpensiveCanvasHeuristicParameters::PatternFillTypeVariableCostPerArea[index] * m_usageCounters.boundingBoxAreaFillType[BaseRenderingContext2D::PatternFillType] +
+ ExpensiveCanvasHeuristicParameters::LinearGradientFillVariableCostPerArea[index] * m_usageCounters.boundingBoxAreaFillType[BaseRenderingContext2D::LinearGradientFillType] +
+ ExpensiveCanvasHeuristicParameters::RadialGradientFillVariableCostPerArea[index] * m_usageCounters.boundingBoxAreaFillType[BaseRenderingContext2D::RadialGradientFillType];
+
+ float shadowAdjustment =
+ ExpensiveCanvasHeuristicParameters::ShadowFixedCost[index] * m_usageCounters.numBlurredShadows +
+ ExpensiveCanvasHeuristicParameters::ShadowVariableCostPerAreaTimesShadowBlurSquared[index] * m_usageCounters.boundingBoxAreaTimesShadowBlurSquared;
+
+ return basicCostOfDrawCalls + fillTypeAdjustment + shadowAdjustment;
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698