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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp

Issue 1609343004: Add display list fallback reason histograms for 2D canvas (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: git cl web Created 4 years, 10 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 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 324
325 SkCanvas* Canvas2DLayerBridge::canvas() 325 SkCanvas* Canvas2DLayerBridge::canvas()
326 { 326 {
327 if (!m_isDeferralEnabled) { 327 if (!m_isDeferralEnabled) {
328 SkSurface* s = getOrCreateSurface(); 328 SkSurface* s = getOrCreateSurface();
329 return s ? s->getCanvas() : nullptr; 329 return s ? s->getCanvas() : nullptr;
330 } 330 }
331 return m_recorder->getRecordingCanvas(); 331 return m_recorder->getRecordingCanvas();
332 } 332 }
333 333
334 void Canvas2DLayerBridge::disableDeferral() 334 void Canvas2DLayerBridge::disableDeferral(DisableDeferralReason reason)
335 { 335 {
336 // Disabling deferral is permanent: once triggered by disableDeferral() 336 // Disabling deferral is permanent: once triggered by disableDeferral()
337 // we stay in immediate mode indefinitely. This is a performance heuristic 337 // we stay in immediate mode indefinitely. This is a performance heuristic
338 // that significantly helps a number of use cases. The rationale is that if 338 // that significantly helps a number of use cases. The rationale is that if
339 // immediate rendering was needed once, it is likely to be needed at least 339 // immediate rendering was needed once, it is likely to be needed at least
340 // once per frame, which eliminates the possibility for inter-frame 340 // once per frame, which eliminates the possibility for inter-frame
341 // overdraw optimization. Furthermore, in cases where immediate mode is 341 // overdraw optimization. Furthermore, in cases where immediate mode is
342 // required multiple times per frame, the repeated flushing of deferred 342 // required multiple times per frame, the repeated flushing of deferred
343 // commands would cause significant overhead, so it is better to just stop 343 // commands would cause significant overhead, so it is better to just stop
344 // trying to defer altogether. 344 // trying to defer altogether.
345 if (!m_isDeferralEnabled) 345 if (!m_isDeferralEnabled)
346 return; 346 return;
347 347
348 Platform::current()->histogramEnumeration("Canvas.GPUAccelerated2DCanvasDisa bleDeferralReason", reason, DisableDeferralReasonCount);
348 CanvasMetrics::countCanvasContextUsage(CanvasMetrics::GPUAccelerated2DCanvas DeferralDisabled); 349 CanvasMetrics::countCanvasContextUsage(CanvasMetrics::GPUAccelerated2DCanvas DeferralDisabled);
349 flushRecordingOnly(); 350 flushRecordingOnly();
350 // Because we will be discarding the recorder, if the flush failed 351 // Because we will be discarding the recorder, if the flush failed
351 // content will be lost -> force m_haveRecordedDrawCommands to false 352 // content will be lost -> force m_haveRecordedDrawCommands to false
352 m_haveRecordedDrawCommands = false; 353 m_haveRecordedDrawCommands = false;
353 354
354 m_isDeferralEnabled = false; 355 m_isDeferralEnabled = false;
355 m_recorder.clear(); 356 m_recorder.clear();
356 // install the current matrix/clip stack onto the immediate canvas 357 // install the current matrix/clip stack onto the immediate canvas
357 SkSurface* surface = getOrCreateSurface(); 358 SkSurface* surface = getOrCreateSurface();
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 if (bitmap) { 595 if (bitmap) {
595 // Using accelerated 2d canvas with software renderer, which 596 // Using accelerated 2d canvas with software renderer, which
596 // should only happen in tests that use fake graphics contexts 597 // should only happen in tests that use fake graphics contexts
597 // or in Android WebView in software mode. In this case, we do 598 // or in Android WebView in software mode. In this case, we do
598 // not care about producing any results for this canvas. 599 // not care about producing any results for this canvas.
599 skipQueuedDrawCommands(); 600 skipQueuedDrawCommands();
600 m_lastImageId = 0; 601 m_lastImageId = 0;
601 return false; 602 return false;
602 } 603 }
603 604
604 RefPtr<SkImage> image = newImageSnapshot(PreferAcceleration); 605 RefPtr<SkImage> image = newImageSnapshot(PreferAcceleration, SnapshotReasonU nknown);
605 if (!image || !image->getTexture()) 606 if (!image || !image->getTexture())
606 return false; 607 return false;
607 608
608 WebGraphicsContext3D* webContext = context(); 609 WebGraphicsContext3D* webContext = context();
609 610
610 // Early exit if canvas was not drawn to since last prepareMailbox 611 // Early exit if canvas was not drawn to since last prepareMailbox
611 GLenum filter = m_filterQuality == kNone_SkFilterQuality ? GL_NEAREST : GL_L INEAR; 612 GLenum filter = m_filterQuality == kNone_SkFilterQuality ? GL_NEAREST : GL_L INEAR;
612 if (image->uniqueID() == m_lastImageId && filter == m_lastFilter) 613 if (image->uniqueID() == m_lastImageId && filter == m_lastFilter)
613 return false; 614 return false;
614 m_lastImageId = image->uniqueID(); 615 m_lastImageId = image->uniqueID();
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 return m_layer->layer(); 732 return m_layer->layer();
732 } 733 }
733 734
734 void Canvas2DLayerBridge::didDraw(const FloatRect& rect) 735 void Canvas2DLayerBridge::didDraw(const FloatRect& rect)
735 { 736 {
736 if (m_isDeferralEnabled) { 737 if (m_isDeferralEnabled) {
737 m_haveRecordedDrawCommands = true; 738 m_haveRecordedDrawCommands = true;
738 IntRect pixelBounds = enclosingIntRect(rect); 739 IntRect pixelBounds = enclosingIntRect(rect);
739 m_recordingPixelCount += pixelBounds.width() * pixelBounds.height(); 740 m_recordingPixelCount += pixelBounds.width() * pixelBounds.height();
740 if (m_recordingPixelCount >= (m_size.width() * m_size.height() * Expensi veCanvasHeuristicParameters::ExpensiveOverdrawThreshold)) { 741 if (m_recordingPixelCount >= (m_size.width() * m_size.height() * Expensi veCanvasHeuristicParameters::ExpensiveOverdrawThreshold)) {
741 disableDeferral(); 742 disableDeferral(DisableDeferralReasonExpensiveOverdrawHeuristic);
742 } 743 }
743 } 744 }
744 if (!m_isRegisteredTaskObserver) { 745 if (!m_isRegisteredTaskObserver) {
745 Platform::current()->currentThread()->addTaskObserver(this); 746 Platform::current()->currentThread()->addTaskObserver(this);
746 m_isRegisteredTaskObserver = true; 747 m_isRegisteredTaskObserver = true;
747 } 748 }
748 } 749 }
749 750
750 void Canvas2DLayerBridge::prepareSurfaceForPaintingIfNeeded() 751 void Canvas2DLayerBridge::prepareSurfaceForPaintingIfNeeded()
751 { 752 {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 788
788 m_renderingTaskCompletedForCurrentFrame = true; 789 m_renderingTaskCompletedForCurrentFrame = true;
789 unregisterTaskObserver(); 790 unregisterTaskObserver();
790 } 791 }
791 792
792 void Canvas2DLayerBridge::willProcessTask() 793 void Canvas2DLayerBridge::willProcessTask()
793 { 794 {
794 ASSERT_NOT_REACHED(); 795 ASSERT_NOT_REACHED();
795 } 796 }
796 797
797 PassRefPtr<SkImage> Canvas2DLayerBridge::newImageSnapshot(AccelerationHint hint) 798 PassRefPtr<SkImage> Canvas2DLayerBridge::newImageSnapshot(AccelerationHint hint, SnapshotReason)
798 { 799 {
799 if (!checkSurfaceValid()) 800 if (!checkSurfaceValid())
800 return nullptr; 801 return nullptr;
801 if (!getOrCreateSurface(hint)) 802 if (!getOrCreateSurface(hint))
802 return nullptr; 803 return nullptr;
803 flush(); 804 flush();
804 // A readback operation may alter the texture parameters, which may affect 805 // A readback operation may alter the texture parameters, which may affect
805 // the compositor's behavior. Therefore, we must trigger copy-on-write 806 // the compositor's behavior. Therefore, we must trigger copy-on-write
806 // even though we are not technically writing to the texture, only to its 807 // even though we are not technically writing to the texture, only to its
807 // parameters. 808 // parameters.
(...skipping 12 matching lines...) Expand all
820 m_image = other.m_image; 821 m_image = other.m_image;
821 m_parentLayerBridge = other.m_parentLayerBridge; 822 m_parentLayerBridge = other.m_parentLayerBridge;
822 } 823 }
823 824
824 void Canvas2DLayerBridge::Logger::reportHibernationEvent(HibernationEvent event) 825 void Canvas2DLayerBridge::Logger::reportHibernationEvent(HibernationEvent event)
825 { 826 {
826 blink::Platform::current()->histogramEnumeration("Canvas.HibernationEvents", event, HibernationEventCount); 827 blink::Platform::current()->histogramEnumeration("Canvas.HibernationEvents", event, HibernationEventCount);
827 } 828 }
828 829
829 } // namespace blink 830 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698