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

Side by Side Diff: third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2DUsageTrackingTest.cpp

Issue 2210123002: Improved heuristic for disable acceleration. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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 unified diff | Download patch
OLDNEW
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/CanvasRenderingContext2D.h" 5 #include "modules/canvas2d/CanvasRenderingContext2D.h"
6 6
7 #include "core/fetch/MemoryCache.h" 7 #include "core/fetch/MemoryCache.h"
8 #include "core/frame/FrameView.h" 8 #include "core/frame/FrameView.h"
9 #include "core/frame/Settings.h" 9 #include "core/frame/Settings.h"
10 #include "core/html/HTMLCanvasElement.h" 10 #include "core/html/HTMLCanvasElement.h"
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 EXPECT_TRUE(context2d()->getUsage().boundingBoxPerimeterDrawCalls[BaseRender ingContext2D::FillText] > 0.0); 183 EXPECT_TRUE(context2d()->getUsage().boundingBoxPerimeterDrawCalls[BaseRender ingContext2D::FillText] > 0.0);
184 EXPECT_TRUE(context2d()->getUsage().boundingBoxPerimeterDrawCalls[BaseRender ingContext2D::StrokeText] == 0.0); 184 EXPECT_TRUE(context2d()->getUsage().boundingBoxPerimeterDrawCalls[BaseRender ingContext2D::StrokeText] == 0.0);
185 185
186 186
187 187
188 // create gradient 188 // create gradient
189 CanvasGradient* gradient; 189 CanvasGradient* gradient;
190 gradient = context2d()->createLinearGradient(0, 0, 100, 100); 190 gradient = context2d()->createLinearGradient(0, 0, 100, 100);
191 context2d()->setFillStyle(StringOrCanvasGradientOrCanvasPattern::fromCanvasG radient(gradient)); 191 context2d()->setFillStyle(StringOrCanvasGradientOrCanvasPattern::fromCanvasG radient(gradient));
192 context2d()->fillRect(10, 10, 100, 20); 192 context2d()->fillRect(10, 10, 100, 20);
193 EXPECT_EQ(1, context2d()->getUsage().numGradients); 193 EXPECT_EQ(1, context2d()->getUsage().numLinearGradients);
194 EXPECT_NEAR(100 * 20, context2d()->getUsage().boundingBoxAreaFillType[BaseRe nderingContext2D::LinearGradientFillType], 1.0); 194 EXPECT_NEAR(100 * 20, context2d()->getUsage().boundingBoxAreaFillType[BaseRe nderingContext2D::LinearGradientFillType], 1.0);
195 195
196 NonThrowableExceptionState exceptionState; 196 NonThrowableExceptionState exceptionState;
197 gradient = context2d()->createRadialGradient(0, 0, 100, 100, 200, 200, excep tionState); 197 gradient = context2d()->createRadialGradient(0, 0, 100, 100, 200, 200, excep tionState);
198 context2d()->setFillStyle(StringOrCanvasGradientOrCanvasPattern::fromCanvasG radient(gradient)); 198 context2d()->setFillStyle(StringOrCanvasGradientOrCanvasPattern::fromCanvasG radient(gradient));
199 context2d()->fillRect(10, 10, 100, 20); 199 context2d()->fillRect(10, 10, 100, 20);
200 EXPECT_EQ(2, context2d()->getUsage().numGradients); 200 EXPECT_EQ(1, context2d()->getUsage().numLinearGradients);
201 EXPECT_EQ(1, context2d()->getUsage().numRadialGradients);
201 EXPECT_NEAR(100 * 20, context2d()->getUsage().boundingBoxAreaFillType[BaseRe nderingContext2D::RadialGradientFillType], 1.0); 202 EXPECT_NEAR(100 * 20, context2d()->getUsage().boundingBoxAreaFillType[BaseRe nderingContext2D::RadialGradientFillType], 1.0);
202 203
203 // create pattern 204 // create pattern
204 NonThrowableExceptionState exceptionState2; 205 NonThrowableExceptionState exceptionState2;
205 ExecutionContext* execCtx = canvasElement().getExecutionContext(); 206 ExecutionContext* execCtx = canvasElement().getExecutionContext();
206 CanvasPattern* canvasPattern = context2d()->createPattern(execCtx, &m_opaque Bitmap, "repeat-x", exceptionState2); 207 CanvasPattern* canvasPattern = context2d()->createPattern(execCtx, &m_opaque Bitmap, "repeat-x", exceptionState2);
207 StringOrCanvasGradientOrCanvasPattern pattern = StringOrCanvasGradientOrCanv asPattern::fromCanvasPattern(canvasPattern); 208 StringOrCanvasGradientOrCanvasPattern pattern = StringOrCanvasGradientOrCanv asPattern::fromCanvasPattern(canvasPattern);
208 context2d()->setFillStyle(pattern); 209 context2d()->setFillStyle(pattern);
209 context2d()->fillRect(10, 10, 200, 100); 210 context2d()->fillRect(10, 10, 200, 100);
210 EXPECT_EQ(1, context2d()->getUsage().numPatterns); 211 EXPECT_EQ(1, context2d()->getUsage().numPatterns);
211 EXPECT_NEAR(200 * 100, context2d()->getUsage().boundingBoxAreaFillType[BaseR enderingContext2D::PatternFillType], 1.0); 212 EXPECT_NEAR(200 * 100, context2d()->getUsage().boundingBoxAreaFillType[BaseR enderingContext2D::PatternFillType], 1.0);
212 213
213 // Other fill method 214 // Other fill method
214 context2d()->fill(Path2D::create("Hello World!!!")); 215 context2d()->fill(Path2D::create("Hello World!!!"));
215 EXPECT_EQ(numReps * 2 + 1, context2d()->getUsage().numDrawCalls[BaseRenderin gContext2D::FillPath]); 216 EXPECT_EQ(numReps * 2 + 1, context2d()->getUsage().numDrawCalls[BaseRenderin gContext2D::FillPath]);
216 217
217 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St rokePath]); 218 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St rokePath]);
218 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St rokeText]); 219 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St rokeText]);
219 EXPECT_EQ(0, context2d()->getUsage().numPutImageDataCalls); 220 EXPECT_EQ(0, context2d()->getUsage().numPutImageDataCalls);
220 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Dr awImage]); 221 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Dr awSVGImage]);
222 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Dr awPNGImage]);
221 EXPECT_EQ(0, context2d()->getUsage().numGetImageDataCalls); 223 EXPECT_EQ(0, context2d()->getUsage().numGetImageDataCalls);
222 } 224 }
223 225
224 TEST_F(CanvasRenderingContextUsageTrackingTest, StrokeTracking) 226 TEST_F(CanvasRenderingContextUsageTrackingTest, StrokeTracking)
225 { 227 {
226 createContext(NonOpaque); 228 createContext(NonOpaque);
227 229
228 int numReps = 100; 230 int numReps = 100;
229 for (int i = 0; i < numReps; i++) { 231 for (int i = 0; i < numReps; i++) {
230 context2d()->strokeRect(10, 10, 100, 100); 232 context2d()->strokeRect(10, 10, 100, 100);
(...skipping 19 matching lines...) Expand all
250 EXPECT_NEAR(static_cast<double>(numReps * (100 * 100) * 2), context2d()- >getUsage().boundingBoxAreaDrawCalls[BaseRenderingContext2D::StrokeRect], 1.0); 252 EXPECT_NEAR(static_cast<double>(numReps * (100 * 100) * 2), context2d()- >getUsage().boundingBoxAreaDrawCalls[BaseRenderingContext2D::StrokeRect], 1.0);
251 EXPECT_NEAR(static_cast<double>(numReps * (2*100 + 2*100) * 2), context2d()- >getUsage().boundingBoxPerimeterDrawCalls[BaseRenderingContext2D::StrokeRect], 1 .0); 253 EXPECT_NEAR(static_cast<double>(numReps * (2*100 + 2*100) * 2), context2d()- >getUsage().boundingBoxPerimeterDrawCalls[BaseRenderingContext2D::StrokeRect], 1 .0);
252 EXPECT_NEAR(static_cast<double>(numReps * (3 * 3)), context2d()->getUsage(). boundingBoxAreaDrawCalls[BaseRenderingContext2D::StrokePath], 1.0); 254 EXPECT_NEAR(static_cast<double>(numReps * (3 * 3)), context2d()->getUsage(). boundingBoxAreaDrawCalls[BaseRenderingContext2D::StrokePath], 1.0);
253 EXPECT_NEAR(static_cast<double>(numReps * (2*3 + 2*3)), context2d()->getUsag e().boundingBoxPerimeterDrawCalls[BaseRenderingContext2D::StrokePath], 1.0); 255 EXPECT_NEAR(static_cast<double>(numReps * (2*3 + 2*3)), context2d()->getUsag e().boundingBoxPerimeterDrawCalls[BaseRenderingContext2D::StrokePath], 1.0);
254 256
255 // create gradient 257 // create gradient
256 CanvasGradient* gradient; 258 CanvasGradient* gradient;
257 gradient = context2d()->createLinearGradient(0, 0, 100, 100); 259 gradient = context2d()->createLinearGradient(0, 0, 100, 100);
258 context2d()->setStrokeStyle(StringOrCanvasGradientOrCanvasPattern::fromCanva sGradient(gradient)); 260 context2d()->setStrokeStyle(StringOrCanvasGradientOrCanvasPattern::fromCanva sGradient(gradient));
259 context2d()->strokeRect(10, 10, 100, 100); 261 context2d()->strokeRect(10, 10, 100, 100);
260 EXPECT_EQ(1, context2d()->getUsage().numGradients); 262 EXPECT_EQ(1, context2d()->getUsage().numLinearGradients);
261 EXPECT_NEAR(100 * 100, context2d()->getUsage().boundingBoxAreaFillType[BaseR enderingContext2D::LinearGradientFillType], 1.0); 263 EXPECT_NEAR(100 * 100, context2d()->getUsage().boundingBoxAreaFillType[BaseR enderingContext2D::LinearGradientFillType], 1.0);
262 264
263 // create pattern 265 // create pattern
264 NonThrowableExceptionState exceptionState; 266 NonThrowableExceptionState exceptionState;
265 ExecutionContext* execCtx = canvasElement().getExecutionContext(); 267 ExecutionContext* execCtx = canvasElement().getExecutionContext();
266 CanvasPattern* canvasPattern = context2d()->createPattern(execCtx, &m_opaque Bitmap, "repeat-x", exceptionState); 268 CanvasPattern* canvasPattern = context2d()->createPattern(execCtx, &m_opaque Bitmap, "repeat-x", exceptionState);
267 StringOrCanvasGradientOrCanvasPattern pattern = StringOrCanvasGradientOrCanv asPattern::fromCanvasPattern(canvasPattern); 269 StringOrCanvasGradientOrCanvasPattern pattern = StringOrCanvasGradientOrCanv asPattern::fromCanvasPattern(canvasPattern);
268 context2d()->setStrokeStyle(pattern); 270 context2d()->setStrokeStyle(pattern);
269 context2d()->strokeRect(10, 10, 100, 100); 271 context2d()->strokeRect(10, 10, 100, 100);
270 EXPECT_EQ(1, context2d()->getUsage().numPatterns); 272 EXPECT_EQ(1, context2d()->getUsage().numPatterns);
271 EXPECT_NEAR(100 * 100, context2d()->getUsage().boundingBoxAreaFillType[BaseR enderingContext2D::PatternFillType], 1.0); 273 EXPECT_NEAR(100 * 100, context2d()->getUsage().boundingBoxAreaFillType[BaseR enderingContext2D::PatternFillType], 1.0);
272 274
273 // Other stroke method 275 // Other stroke method
274 context2d()->stroke(Path2D::create("Hello World!!!")); 276 context2d()->stroke(Path2D::create("Hello World!!!"));
275 EXPECT_EQ(numReps + 1, context2d()->getUsage().numDrawCalls[BaseRenderingCon text2D::StrokePath]); 277 EXPECT_EQ(numReps + 1, context2d()->getUsage().numDrawCalls[BaseRenderingCon text2D::StrokePath]);
276 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi llPath]); 278 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi llPath]);
277 EXPECT_EQ(0, context2d()->getUsage().numNonConvexFillPathCalls); 279 EXPECT_EQ(0, context2d()->getUsage().numNonConvexFillPathCalls);
278 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi llText]); 280 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi llText]);
279 EXPECT_EQ(0, context2d()->getUsage().numPutImageDataCalls); 281 EXPECT_EQ(0, context2d()->getUsage().numPutImageDataCalls);
280 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Dr awImage]); 282 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Dr awSVGImage]);
283 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Dr awPNGImage]);
281 EXPECT_EQ(0, context2d()->getUsage().numGetImageDataCalls); 284 EXPECT_EQ(0, context2d()->getUsage().numGetImageDataCalls);
282 } 285 }
283 286
284 TEST_F(CanvasRenderingContextUsageTrackingTest, ImageTracking) 287 TEST_F(CanvasRenderingContextUsageTrackingTest, ImageTracking)
285 { 288 {
286 // Testing draw, put, get and filters 289 // Testing draw, put, get and filters
287 createContext(NonOpaque); 290 createContext(NonOpaque);
288 NonThrowableExceptionState exceptionState; 291 NonThrowableExceptionState exceptionState;
289 292
290 int numReps = 5; 293 int numReps = 5;
291 int imgWidth = 100; 294 int imgWidth = 100;
292 int imgHeight = 200; 295 int imgHeight = 200;
293 for (int i = 0; i < numReps; i++) { 296 for (int i = 0; i < numReps; i++) {
294 context2d()->putImageData(m_fullImageData.get(), 0, 0, exceptionState); 297 context2d()->putImageData(m_fullImageData.get(), 0, 0, exceptionState);
295 context2d()->drawImage(canvasElement().getExecutionContext(), &m_opaqueB itmap, 0, 0, 1, 1, 0, 0, imgWidth, imgHeight, exceptionState); 298 context2d()->drawImage(canvasElement().getExecutionContext(), &m_opaqueB itmap, 0, 0, 1, 1, 0, 0, imgWidth, imgHeight, exceptionState);
296 context2d()->getImageData(0, 0, 10, 100, exceptionState); 299 context2d()->getImageData(0, 0, 10, 100, exceptionState);
297 } 300 }
298 301
299 EXPECT_NEAR(numReps * imgWidth * imgHeight, context2d()->getUsage().bounding BoxAreaDrawCalls[BaseRenderingContext2D::DrawImage], 0.1); 302 EXPECT_NEAR(numReps * imgWidth * imgHeight, context2d()->getUsage().bounding BoxAreaDrawCalls[BaseRenderingContext2D::DrawPNGImage], 0.1);
300 EXPECT_NEAR(numReps * (2*imgWidth + 2*imgHeight), context2d()->getUsage().bo undingBoxPerimeterDrawCalls[BaseRenderingContext2D::DrawImage], 0.1); 303 EXPECT_NEAR(numReps * (2*imgWidth + 2*imgHeight), context2d()->getUsage().bo undingBoxPerimeterDrawCalls[BaseRenderingContext2D::DrawPNGImage], 0.1);
304
305 EXPECT_NEAR(0.0, context2d()->getUsage().boundingBoxAreaDrawCalls[BaseRender ingContext2D::DrawSVGImage], 0.1);
306 EXPECT_NEAR(0.0, context2d()->getUsage().boundingBoxPerimeterDrawCalls[BaseR enderingContext2D::DrawSVGImage], 0.1);
301 307
302 context2d()->setFilter("blur(5px)"); 308 context2d()->setFilter("blur(5px)");
303 context2d()->drawImage(canvasElement().getExecutionContext(), &m_opaqueBitma p, 0, 0, 1, 1, 0, 0, 10, 10, exceptionState); 309 context2d()->drawImage(canvasElement().getExecutionContext(), &m_opaqueBitma p, 0, 0, 1, 1, 0, 0, 10, 10, exceptionState);
304 310
305 EXPECT_EQ(numReps, context2d()->getUsage().numPutImageDataCalls); 311 EXPECT_EQ(numReps, context2d()->getUsage().numPutImageDataCalls);
306 EXPECT_NE(0, context2d()->getUsage().areaPutImageDataCalls); 312 EXPECT_NE(0, context2d()->getUsage().areaPutImageDataCalls);
307 EXPECT_NEAR(numReps * m_fullImageData.get()->width() * m_fullImageData.get() ->height(), context2d()->getUsage().areaPutImageDataCalls, 0.1); 313 EXPECT_NEAR(numReps * m_fullImageData.get()->width() * m_fullImageData.get() ->height(), context2d()->getUsage().areaPutImageDataCalls, 0.1);
308 314
309 EXPECT_EQ(numReps + 1, context2d()->getUsage().numDrawCalls[BaseRenderingCon text2D::DrawImage]); 315 EXPECT_EQ(numReps + 1, context2d()->getUsage().numDrawCalls[BaseRenderingCon text2D::DrawPNGImage]);
310 EXPECT_EQ(numReps, context2d()->getUsage().numGetImageDataCalls); 316 EXPECT_EQ(numReps, context2d()->getUsage().numGetImageDataCalls);
311 317
312 EXPECT_EQ(1, context2d()->getUsage().numFilters); 318 EXPECT_EQ(1, context2d()->getUsage().numFilters);
313 EXPECT_NEAR(numReps * 10 * 100, context2d()->getUsage().areaGetImageDataCall s, 0.1); 319 EXPECT_NEAR(numReps * 10 * 100, context2d()->getUsage().areaGetImageDataCall s, 0.1);
314 320
315 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi llPath]); 321 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi llPath]);
316 EXPECT_EQ(0, context2d()->getUsage().numNonConvexFillPathCalls); 322 EXPECT_EQ(0, context2d()->getUsage().numNonConvexFillPathCalls);
317 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi llText]); 323 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi llText]);
318 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St rokePath]); 324 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St rokePath]);
319 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St rokeText]); 325 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::St rokeText]);
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi llRect]); 491 EXPECT_EQ(0, context2d()->getUsage().numDrawCalls[BaseRenderingContext2D::Fi llRect]);
486 492
487 for (int i = 0; i < numReps; i++) { 493 for (int i = 0; i < numReps; i++) {
488 context2d()->fillRect(10, 10, 100, 100); 494 context2d()->fillRect(10, 10, 100, 100);
489 } 495 }
490 EXPECT_EQ(numReps, context2d()->getUsage().numDrawCalls[BaseRenderingContext 2D::FillRect]); 496 EXPECT_EQ(numReps, context2d()->getUsage().numDrawCalls[BaseRenderingContext 2D::FillRect]);
491 } 497 }
492 498
493 } // namespace UsageTrackingTests 499 } // namespace UsageTrackingTests
494 } // namespace blink 500 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698