Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "modules/canvas2d/BaseRenderingContext2D.h" | 5 #include "modules/canvas2d/BaseRenderingContext2D.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/ExceptionMessages.h" | 7 #include "bindings/core/v8/ExceptionMessages.h" |
| 8 #include "bindings/core/v8/ExceptionState.h" | 8 #include "bindings/core/v8/ExceptionState.h" |
| 9 #include "bindings/core/v8/ExceptionStatePlaceholder.h" | 9 #include "bindings/core/v8/ExceptionStatePlaceholder.h" |
| 10 #include "core/css/parser/CSSParser.h" | 10 #include "core/css/parser/CSSParser.h" |
| (...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 957 } | 957 } |
| 958 | 958 |
| 959 void BaseRenderingContext2D::drawImageInternal(SkCanvas* c, CanvasImageSource* i mageSource, Image* image, const FloatRect& srcRect, const FloatRect& dstRect, co nst SkPaint* paint) | 959 void BaseRenderingContext2D::drawImageInternal(SkCanvas* c, CanvasImageSource* i mageSource, Image* image, const FloatRect& srcRect, const FloatRect& dstRect, co nst SkPaint* paint) |
| 960 { | 960 { |
| 961 if (imageSource->isSVGSource()) { | 961 if (imageSource->isSVGSource()) { |
| 962 trackDrawCall(DrawVectorImage, nullptr, dstRect.width(), dstRect.height( )); | 962 trackDrawCall(DrawVectorImage, nullptr, dstRect.width(), dstRect.height( )); |
| 963 } else { | 963 } else { |
| 964 trackDrawCall(DrawBitmapImage, nullptr, dstRect.width(), dstRect.height( )); | 964 trackDrawCall(DrawBitmapImage, nullptr, dstRect.width(), dstRect.height( )); |
| 965 } | 965 } |
| 966 | 966 |
| 967 | |
| 968 int initialSaveCount = c->getSaveCount(); | 967 int initialSaveCount = c->getSaveCount(); |
| 969 SkPaint imagePaint = *paint; | 968 SkPaint imagePaint = *paint; |
| 970 | 969 |
| 971 if (paint->getImageFilter()) { | 970 if (paint->getImageFilter()) { |
| 972 SkMatrix ctm = c->getTotalMatrix(); | 971 SkMatrix ctm = c->getTotalMatrix(); |
| 973 SkMatrix invCtm; | 972 SkMatrix invCtm; |
| 974 if (!ctm.invert(&invCtm)) { | 973 if (!ctm.invert(&invCtm)) { |
| 975 // There is an earlier check for invertibility, but the arithmetic | 974 // There is an earlier check for invertibility, but the arithmetic |
| 976 // in AffineTransform is not exactly identical, so it is possible | 975 // in AffineTransform is not exactly identical, so it is possible |
| 977 // for SkMatrix to find the transform to be non-invertible at this s tage. | 976 // for SkMatrix to find the transform to be non-invertible at this s tage. |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1069 return; | 1068 return; |
| 1070 | 1069 |
| 1071 DisableDeferralReason reason = DisableDeferralReasonUnknown; | 1070 DisableDeferralReason reason = DisableDeferralReasonUnknown; |
| 1072 if (shouldDisableDeferral(imageSource, &reason)) | 1071 if (shouldDisableDeferral(imageSource, &reason)) |
| 1073 disableDeferral(reason); | 1072 disableDeferral(reason); |
| 1074 else if (image->isTextureBacked()) | 1073 else if (image->isTextureBacked()) |
| 1075 disableDeferral(DisableDeferralDrawImageWithTextureBackedSourceImage); | 1074 disableDeferral(DisableDeferralDrawImageWithTextureBackedSourceImage); |
| 1076 | 1075 |
| 1077 validateStateStack(); | 1076 validateStateStack(); |
| 1078 | 1077 |
| 1078 // Heuristic for disabling acceleration based on anticipated texture upload overhead | |
| 1079 // See comments in ExpensiveCanvasHeuristicParameters.h for explanation. | |
| 1080 ImageBuffer* buffer = imageBuffer(); | |
| 1081 if (buffer && buffer->isAccelerated() && !imageSource->isAccelerated()) { | |
| 1082 float srcArea = srcRect.width() * srcRect.height(); | |
| 1083 if (srcArea > ExpensiveCanvasHeuristicParameters::DrawImageTextureUpload HardSizeLimit) { | |
| 1084 buffer->disableAcceleration(); | |
| 1085 } else if (srcArea > ExpensiveCanvasHeuristicParameters::DrawImageTextur eUploadSoftSizeLimit) { | |
| 1086 SkRect bounds = dstRect; | |
| 1087 SkMatrix ctm = drawingCanvas()->getTotalMatrix(); | |
| 1088 ctm.mapRect(&bounds); | |
| 1089 float dstArea = dstRect.width() * dstRect.height(); | |
| 1090 if (srcArea > dstArea * ExpensiveCanvasHeuristicParameters::DrawImag eTextureUploadSoftSizeLimitScaleThreshold) { | |
|
xidachen
2016/09/23 20:56:36
I am a little confused by this logic.
Say that sr
| |
| 1091 buffer->disableAcceleration(); | |
| 1092 } | |
| 1093 } | |
| 1094 } | |
| 1095 | |
| 1096 validateStateStack(); | |
| 1097 | |
| 1079 // TODO(xidachen): After collecting some data, come back and prune off | 1098 // TODO(xidachen): After collecting some data, come back and prune off |
| 1080 // the ones that is not needed. | 1099 // the ones that is not needed. |
| 1081 Optional<ScopedUsHistogramTimer> timer; | 1100 Optional<ScopedUsHistogramTimer> timer; |
| 1082 if (imageBuffer() && imageBuffer()->isAccelerated()) { | 1101 if (imageBuffer() && imageBuffer()->isAccelerated()) { |
| 1083 if (imageSource->isVideoElement()) { | 1102 if (imageSource->isVideoElement()) { |
| 1084 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, scopedUsCounte rVideoGPU, new CustomCountHistogram("Blink.Canvas.DrawImage.Video.GPU", 0, 10000 000, 50)); | 1103 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, scopedUsCounte rVideoGPU, new CustomCountHistogram("Blink.Canvas.DrawImage.Video.GPU", 0, 10000 000, 50)); |
| 1085 timer.emplace(scopedUsCounterVideoGPU); | 1104 timer.emplace(scopedUsCounterVideoGPU); |
| 1086 } else if (imageSource->isCanvasElement()) { | 1105 } else if (imageSource->isCanvasElement()) { |
| 1087 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, scopedUsCounte rCanvasGPU, new CustomCountHistogram("Blink.Canvas.DrawImage.Canvas.GPU", 0, 100 00000, 50)); | 1106 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, scopedUsCounte rCanvasGPU, new CustomCountHistogram("Blink.Canvas.DrawImage.Canvas.GPU", 0, 100 00000, 50)); |
| 1088 timer.emplace(scopedUsCounterCanvasGPU); | 1107 timer.emplace(scopedUsCounterCanvasGPU); |
| (...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1709 ExpensiveCanvasHeuristicParameters::RadialGradientFillVariableCostPerAre a[index] * m_usageCounters.boundingBoxAreaFillType[BaseRenderingContext2D::Radia lGradientFillType]; | 1728 ExpensiveCanvasHeuristicParameters::RadialGradientFillVariableCostPerAre a[index] * m_usageCounters.boundingBoxAreaFillType[BaseRenderingContext2D::Radia lGradientFillType]; |
| 1710 | 1729 |
| 1711 float shadowAdjustment = | 1730 float shadowAdjustment = |
| 1712 ExpensiveCanvasHeuristicParameters::ShadowFixedCost[index] * m_usageCoun ters.numBlurredShadows + | 1731 ExpensiveCanvasHeuristicParameters::ShadowFixedCost[index] * m_usageCoun ters.numBlurredShadows + |
| 1713 ExpensiveCanvasHeuristicParameters::ShadowVariableCostPerAreaTimesShadow BlurSquared[index] * m_usageCounters.boundingBoxAreaTimesShadowBlurSquared; | 1732 ExpensiveCanvasHeuristicParameters::ShadowVariableCostPerAreaTimesShadow BlurSquared[index] * m_usageCounters.boundingBoxAreaTimesShadowBlurSquared; |
| 1714 | 1733 |
| 1715 return basicCostOfDrawCalls + fillTypeAdjustment + shadowAdjustment; | 1734 return basicCostOfDrawCalls + fillTypeAdjustment + shadowAdjustment; |
| 1716 } | 1735 } |
| 1717 | 1736 |
| 1718 } // namespace blink | 1737 } // namespace blink |
| OLD | NEW |