OLD | NEW |
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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 std::unique_ptr<gfx::GpuMemoryBuffer> m_gpuMemoryBuffer; | 75 std::unique_ptr<gfx::GpuMemoryBuffer> m_gpuMemoryBuffer; |
76 | 76 |
77 // The id of the CHROMIUM image. | 77 // The id of the CHROMIUM image. |
78 const GLuint m_imageId; | 78 const GLuint m_imageId; |
79 | 79 |
80 // The id of the texture bound to the CHROMIUM image. | 80 // The id of the texture bound to the CHROMIUM image. |
81 const GLuint m_textureId; | 81 const GLuint m_textureId; |
82 }; | 82 }; |
83 #endif // USE_IOSURFACE_FOR_2D_CANVAS | 83 #endif // USE_IOSURFACE_FOR_2D_CANVAS |
84 | 84 |
85 static sk_sp<SkSurface> createSkSurface(GrContext* gr, | 85 static sk_sp<PaintSurface> createSkSurface(GrContext* gr, |
86 const IntSize& size, | 86 const IntSize& size, |
87 int msaaSampleCount, | 87 int msaaSampleCount, |
88 OpacityMode opacityMode, | 88 OpacityMode opacityMode, |
89 sk_sp<SkColorSpace> colorSpace, | 89 sk_sp<SkColorSpace> colorSpace, |
90 SkColorType colorType, | 90 SkColorType colorType, |
91 bool* surfaceIsAccelerated) { | 91 bool* surfaceIsAccelerated) { |
92 if (gr) | 92 if (gr) |
93 gr->resetContext(); | 93 gr->resetContext(); |
94 | 94 |
95 SkAlphaType alphaType = | 95 SkAlphaType alphaType = |
96 (Opaque == opacityMode) ? kOpaque_SkAlphaType : kPremul_SkAlphaType; | 96 (Opaque == opacityMode) ? kOpaque_SkAlphaType : kPremul_SkAlphaType; |
97 SkImageInfo info = SkImageInfo::Make(size.width(), size.height(), colorType, | 97 SkImageInfo info = SkImageInfo::Make(size.width(), size.height(), colorType, |
98 alphaType, colorSpace); | 98 alphaType, colorSpace); |
99 SkSurfaceProps disableLCDProps(0, kUnknown_SkPixelGeometry); | 99 SkSurfaceProps disableLCDProps(0, kUnknown_SkPixelGeometry); |
100 sk_sp<SkSurface> surface; | 100 sk_sp<PaintSurface> surface; |
101 | 101 |
102 if (gr) { | 102 if (gr) { |
103 *surfaceIsAccelerated = true; | 103 *surfaceIsAccelerated = true; |
104 surface = SkSurface::MakeRenderTarget( | 104 surface = PaintSurface::MakeRenderTarget( |
105 gr, SkBudgeted::kNo, info, msaaSampleCount, | 105 gr, SkBudgeted::kNo, info, msaaSampleCount, |
106 Opaque == opacityMode ? 0 : &disableLCDProps); | 106 Opaque == opacityMode ? 0 : &disableLCDProps); |
107 } | 107 } |
108 | 108 |
109 if (!surface) { | 109 if (!surface) { |
110 *surfaceIsAccelerated = false; | 110 *surfaceIsAccelerated = false; |
111 surface = SkSurface::MakeRaster( | 111 surface = PaintSurface::MakeRaster( |
112 info, Opaque == opacityMode ? 0 : &disableLCDProps); | 112 info, Opaque == opacityMode ? 0 : &disableLCDProps); |
113 } | 113 } |
114 | 114 |
115 if (surface) { | 115 if (surface) { |
116 if (opacityMode == Opaque) { | 116 if (opacityMode == Opaque) { |
117 surface->getCanvas()->clear(SK_ColorBLACK); | 117 surface->getCanvas()->clear(SK_ColorBLACK); |
118 } else { | 118 } else { |
119 surface->getCanvas()->clear(SK_ColorTRANSPARENT); | 119 surface->getCanvas()->clear(SK_ColorTRANSPARENT); |
120 } | 120 } |
121 } | 121 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 #endif // USE_IOSURFACE_FOR_2D_CANVAS | 167 #endif // USE_IOSURFACE_FOR_2D_CANVAS |
168 | 168 |
169 m_layer.reset(); | 169 m_layer.reset(); |
170 DCHECK_EQ(0u, m_mailboxes.size()); | 170 DCHECK_EQ(0u, m_mailboxes.size()); |
171 } | 171 } |
172 | 172 |
173 void Canvas2DLayerBridge::startRecording() { | 173 void Canvas2DLayerBridge::startRecording() { |
174 DCHECK(m_isDeferralEnabled); | 174 DCHECK(m_isDeferralEnabled); |
175 m_recorder = WTF::wrapUnique(new PaintRecorder); | 175 m_recorder = WTF::wrapUnique(new PaintRecorder); |
176 PaintCanvas* canvas = | 176 PaintCanvas* canvas = |
177 m_recorder->beginRecording(m_size.width(), m_size.height()); | 177 m_recorder->beginRecording(m_size.width(), m_size.height(), nullptr); |
178 // Always save an initial frame, to support resetting the top level matrix | 178 // Always save an initial frame, to support resetting the top level matrix |
179 // and clip. | 179 // and clip. |
180 canvas->save(); | 180 canvas->save(); |
181 | 181 |
182 if (m_imageBuffer) { | 182 if (m_imageBuffer) { |
183 m_imageBuffer->resetCanvas(canvas); | 183 m_imageBuffer->resetCanvas(canvas); |
184 } | 184 } |
185 m_recordingPixelCount = 0; | 185 m_recordingPixelCount = 0; |
186 } | 186 } |
187 | 187 |
188 void Canvas2DLayerBridge::setLoggerForTesting(std::unique_ptr<Logger> logger) { | 188 void Canvas2DLayerBridge::setLoggerForTesting(std::unique_ptr<Logger> logger) { |
189 m_logger = std::move(logger); | 189 m_logger = std::move(logger); |
190 } | 190 } |
191 | 191 |
192 void Canvas2DLayerBridge::ResetSurface() { | |
193 m_surfacePaintCanvas.reset(); | |
194 m_surface.reset(); | |
195 } | |
196 | |
197 bool Canvas2DLayerBridge::shouldAccelerate(AccelerationHint hint) const { | 192 bool Canvas2DLayerBridge::shouldAccelerate(AccelerationHint hint) const { |
198 bool accelerate; | 193 bool accelerate; |
199 if (m_softwareRenderingWhileHidden) | 194 if (m_softwareRenderingWhileHidden) |
200 accelerate = false; | 195 accelerate = false; |
201 else if (m_accelerationMode == ForceAccelerationForTesting) | 196 else if (m_accelerationMode == ForceAccelerationForTesting) |
202 accelerate = true; | 197 accelerate = true; |
203 else if (m_accelerationMode == DisableAcceleration) | 198 else if (m_accelerationMode == DisableAcceleration) |
204 accelerate = false; | 199 accelerate = false; |
205 else | 200 else |
206 accelerate = hint == PreferAcceleration || | 201 accelerate = hint == PreferAcceleration || |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 return; | 490 return; |
496 } | 491 } |
497 | 492 |
498 if (!isAccelerated()) { | 493 if (!isAccelerated()) { |
499 m_logger->reportHibernationEvent( | 494 m_logger->reportHibernationEvent( |
500 HibernationAbortedDueToSwitchToUnacceleratedRendering); | 495 HibernationAbortedDueToSwitchToUnacceleratedRendering); |
501 return; | 496 return; |
502 } | 497 } |
503 | 498 |
504 TRACE_EVENT0("blink", "Canvas2DLayerBridge::hibernate"); | 499 TRACE_EVENT0("blink", "Canvas2DLayerBridge::hibernate"); |
505 sk_sp<SkSurface> tempHibernationSurface = | 500 sk_sp<PaintSurface> tempHibernationSurface = |
506 SkSurface::MakeRasterN32Premul(m_size.width(), m_size.height()); | 501 PaintSurface::MakeRasterN32Premul(m_size.width(), m_size.height()); |
507 if (!tempHibernationSurface) { | 502 if (!tempHibernationSurface) { |
508 m_logger->reportHibernationEvent(HibernationAbortedDueToAllocationFailure); | 503 m_logger->reportHibernationEvent(HibernationAbortedDueToAllocationFailure); |
509 return; | 504 return; |
510 } | 505 } |
511 // No HibernationEvent reported on success. This is on purppose to avoid | 506 // No HibernationEvent reported on success. This is on purppose to avoid |
512 // non-complementary stats. Each HibernationScheduled event is paired with | 507 // non-complementary stats. Each HibernationScheduled event is paired with |
513 // exactly one failure or exit event. | 508 // exactly one failure or exit event. |
514 flushRecordingOnly(); | 509 flushRecordingOnly(); |
515 // The following checks that the flush succeeded, which should always be the | 510 // The following checks that the flush succeeded, which should always be the |
516 // case because flushRecordingOnly should only fail it it fails to allocate | 511 // case because flushRecordingOnly should only fail it it fails to allocate |
517 // a surface, and we have an early exit at the top of this function for when | 512 // a surface, and we have an early exit at the top of this function for when |
518 // 'this' does not already have a surface. | 513 // 'this' does not already have a surface. |
519 DCHECK(!m_haveRecordedDrawCommands); | 514 DCHECK(!m_haveRecordedDrawCommands); |
520 SkPaint copyPaint; | 515 PaintFlags copyPaint; |
521 copyPaint.setBlendMode(SkBlendMode::kSrc); | 516 copyPaint.setBlendMode(SkBlendMode::kSrc); |
522 m_surface->draw(tempHibernationSurface->getCanvas(), 0, 0, | 517 m_surface->draw(tempHibernationSurface->getCanvas(), 0, 0, |
523 ©Paint); // GPU readback | 518 ©Paint); // GPU readback |
524 m_hibernationImage = tempHibernationSurface->makeImageSnapshot(); | 519 m_hibernationImage = tempHibernationSurface->makeImageSnapshot(); |
525 ResetSurface(); | 520 m_surface.reset(); // destroy the GPU-backed buffer |
526 m_layer->clearTexture(); | 521 m_layer->clearTexture(); |
527 #if USE_IOSURFACE_FOR_2D_CANVAS | 522 #if USE_IOSURFACE_FOR_2D_CANVAS |
528 clearCHROMIUMImageCache(); | 523 clearCHROMIUMImageCache(); |
529 #endif // USE_IOSURFACE_FOR_2D_CANVAS | 524 #endif // USE_IOSURFACE_FOR_2D_CANVAS |
530 m_logger->didStartHibernating(); | 525 m_logger->didStartHibernating(); |
531 } | 526 } |
532 | 527 |
533 sk_sp<SkColorSpace> Canvas2DLayerBridge::skSurfaceColorSpace() const { | 528 sk_sp<SkColorSpace> Canvas2DLayerBridge::skSurfaceColorSpace() const { |
534 if (m_skSurfacesUseColorSpace) | 529 if (m_skSurfacesUseColorSpace) |
535 return m_colorSpace.ToSkColorSpace(); | 530 return m_colorSpace.ToSkColorSpace(); |
536 return nullptr; | 531 return nullptr; |
537 } | 532 } |
538 | 533 |
539 void Canvas2DLayerBridge::reportSurfaceCreationFailure() { | 534 void Canvas2DLayerBridge::reportSurfaceCreationFailure() { |
540 if (!m_surfaceCreationFailedAtLeastOnce) { | 535 if (!m_surfaceCreationFailedAtLeastOnce) { |
541 // Only count the failure once per instance so that the histogram may | 536 // Only count the failure once per instance so that the histogram may |
542 // reflect the proportion of Canvas2DLayerBridge instances with surface | 537 // reflect the proportion of Canvas2DLayerBridge instances with surface |
543 // allocation failures. | 538 // allocation failures. |
544 CanvasMetrics::countCanvasContextUsage( | 539 CanvasMetrics::countCanvasContextUsage( |
545 CanvasMetrics::GPUAccelerated2DCanvasSurfaceCreationFailed); | 540 CanvasMetrics::GPUAccelerated2DCanvasSurfaceCreationFailed); |
546 m_surfaceCreationFailedAtLeastOnce = true; | 541 m_surfaceCreationFailedAtLeastOnce = true; |
547 } | 542 } |
548 } | 543 } |
549 | 544 |
550 SkSurface* Canvas2DLayerBridge::getOrCreateSurface(AccelerationHint hint) { | 545 PaintSurface* Canvas2DLayerBridge::getOrCreateSurface(AccelerationHint hint) { |
551 if (m_surface) | 546 if (m_surface) |
552 return m_surface.get(); | 547 return m_surface.get(); |
553 | 548 |
554 if (m_layer && !isHibernating() && hint == PreferAcceleration && | 549 if (m_layer && !isHibernating() && hint == PreferAcceleration && |
555 m_accelerationMode != DisableAcceleration) { | 550 m_accelerationMode != DisableAcceleration) { |
556 return nullptr; // re-creation will happen through restore() | 551 return nullptr; // re-creation will happen through restore() |
557 } | 552 } |
558 | 553 |
559 bool wantAcceleration = shouldAccelerate(hint); | 554 bool wantAcceleration = shouldAccelerate(hint); |
560 if (CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU && isHidden() && | 555 if (CANVAS2D_BACKGROUND_RENDER_SWITCH_TO_CPU && isHidden() && |
561 wantAcceleration) { | 556 wantAcceleration) { |
562 wantAcceleration = false; | 557 wantAcceleration = false; |
563 m_softwareRenderingWhileHidden = true; | 558 m_softwareRenderingWhileHidden = true; |
564 } | 559 } |
565 | 560 |
566 bool surfaceIsAccelerated; | 561 bool surfaceIsAccelerated; |
567 m_surface = createSkSurface( | 562 m_surface = createSkSurface( |
568 wantAcceleration ? m_contextProvider->grContext() : nullptr, m_size, | 563 wantAcceleration ? m_contextProvider->grContext() : nullptr, m_size, |
569 m_msaaSampleCount, m_opacityMode, skSurfaceColorSpace(), m_colorType, | 564 m_msaaSampleCount, m_opacityMode, skSurfaceColorSpace(), m_colorType, |
570 &surfaceIsAccelerated); | 565 &surfaceIsAccelerated); |
571 m_surfacePaintCanvas = | |
572 WTF::wrapUnique(new PaintCanvas(m_surface->getCanvas())); | |
573 | 566 |
574 if (m_surface) { | 567 if (m_surface) { |
575 // Always save an initial frame, to support resetting the top level matrix | 568 // Always save an initial frame, to support resetting the top level matrix |
576 // and clip. | 569 // and clip. |
577 m_surfacePaintCanvas->save(); | 570 m_surface->getCanvas()->save(); |
578 } else { | 571 } else { |
579 reportSurfaceCreationFailure(); | 572 reportSurfaceCreationFailure(); |
580 } | 573 } |
581 | 574 |
582 if (m_surface && surfaceIsAccelerated && !m_layer) { | 575 if (m_surface && surfaceIsAccelerated && !m_layer) { |
583 m_layer = | 576 m_layer = |
584 Platform::current()->compositorSupport()->createExternalTextureLayer( | 577 Platform::current()->compositorSupport()->createExternalTextureLayer( |
585 this); | 578 this); |
586 m_layer->setOpaque(m_opacityMode == Opaque); | 579 m_layer->setOpaque(m_opacityMode == Opaque); |
587 m_layer->setBlendBackgroundColor(m_opacityMode != Opaque); | 580 m_layer->setBlendBackgroundColor(m_opacityMode != Opaque); |
588 GraphicsLayer::registerContentsLayer(m_layer->layer()); | 581 GraphicsLayer::registerContentsLayer(m_layer->layer()); |
589 m_layer->setNearestNeighbor(m_filterQuality == kNone_SkFilterQuality); | 582 m_layer->setNearestNeighbor(m_filterQuality == kNone_SkFilterQuality); |
590 } | 583 } |
591 | 584 |
592 if (m_surface && isHibernating()) { | 585 if (m_surface && isHibernating()) { |
593 if (surfaceIsAccelerated) { | 586 if (surfaceIsAccelerated) { |
594 m_logger->reportHibernationEvent(HibernationEndedNormally); | 587 m_logger->reportHibernationEvent(HibernationEndedNormally); |
595 } else { | 588 } else { |
596 if (isHidden()) | 589 if (isHidden()) |
597 m_logger->reportHibernationEvent( | 590 m_logger->reportHibernationEvent( |
598 HibernationEndedWithSwitchToBackgroundRendering); | 591 HibernationEndedWithSwitchToBackgroundRendering); |
599 else | 592 else |
600 m_logger->reportHibernationEvent(HibernationEndedWithFallbackToSW); | 593 m_logger->reportHibernationEvent(HibernationEndedWithFallbackToSW); |
601 } | 594 } |
602 | 595 |
603 SkPaint copyPaint; | 596 PaintFlags copyPaint; |
604 copyPaint.setBlendMode(SkBlendMode::kSrc); | 597 copyPaint.setBlendMode(SkBlendMode::kSrc); |
605 m_surface->getCanvas()->drawImage(m_hibernationImage.get(), 0, 0, | 598 m_surface->getCanvas()->drawImage(m_hibernationImage.get(), 0, 0, |
606 ©Paint); | 599 ©Paint); |
607 m_hibernationImage.reset(); | 600 m_hibernationImage.reset(); |
608 | 601 |
609 if (m_imageBuffer) | 602 if (m_imageBuffer) |
610 m_imageBuffer->updateGPUMemoryUsage(); | 603 m_imageBuffer->updateGPUMemoryUsage(); |
611 | 604 |
612 if (m_imageBuffer && !m_isDeferralEnabled) | 605 if (m_imageBuffer && !m_isDeferralEnabled) |
613 m_imageBuffer->resetCanvas(m_surfacePaintCanvas.get()); | 606 m_imageBuffer->resetCanvas(m_surface->getCanvas()); |
614 } | 607 } |
615 | 608 |
616 return m_surface.get(); | 609 return m_surface.get(); |
617 } | 610 } |
618 | 611 |
619 PaintCanvas* Canvas2DLayerBridge::canvas() { | 612 PaintCanvas* Canvas2DLayerBridge::canvas() { |
620 if (!m_isDeferralEnabled) { | 613 if (!m_isDeferralEnabled) { |
621 getOrCreateSurface(); | 614 PaintSurface* s = getOrCreateSurface(); |
622 return m_surfacePaintCanvas.get(); | 615 return s ? s->getCanvas() : nullptr; |
623 } | 616 } |
624 return m_recorder->getRecordingCanvas(); | 617 return m_recorder->getRecordingCanvas(); |
625 } | 618 } |
626 | 619 |
627 void Canvas2DLayerBridge::disableDeferral(DisableDeferralReason reason) { | 620 void Canvas2DLayerBridge::disableDeferral(DisableDeferralReason reason) { |
628 // Disabling deferral is permanent: once triggered by disableDeferral() | 621 // Disabling deferral is permanent: once triggered by disableDeferral() |
629 // we stay in immediate mode indefinitely. This is a performance heuristic | 622 // we stay in immediate mode indefinitely. This is a performance heuristic |
630 // that significantly helps a number of use cases. The rationale is that if | 623 // that significantly helps a number of use cases. The rationale is that if |
631 // immediate rendering was needed once, it is likely to be needed at least | 624 // immediate rendering was needed once, it is likely to be needed at least |
632 // once per frame, which eliminates the possibility for inter-frame | 625 // once per frame, which eliminates the possibility for inter-frame |
(...skipping 11 matching lines...) Expand all Loading... |
644 CanvasMetrics::countCanvasContextUsage( | 637 CanvasMetrics::countCanvasContextUsage( |
645 CanvasMetrics::GPUAccelerated2DCanvasDeferralDisabled); | 638 CanvasMetrics::GPUAccelerated2DCanvasDeferralDisabled); |
646 flushRecordingOnly(); | 639 flushRecordingOnly(); |
647 // Because we will be discarding the recorder, if the flush failed | 640 // Because we will be discarding the recorder, if the flush failed |
648 // content will be lost -> force m_haveRecordedDrawCommands to false | 641 // content will be lost -> force m_haveRecordedDrawCommands to false |
649 m_haveRecordedDrawCommands = false; | 642 m_haveRecordedDrawCommands = false; |
650 | 643 |
651 m_isDeferralEnabled = false; | 644 m_isDeferralEnabled = false; |
652 m_recorder.reset(); | 645 m_recorder.reset(); |
653 // install the current matrix/clip stack onto the immediate canvas | 646 // install the current matrix/clip stack onto the immediate canvas |
654 getOrCreateSurface(); | 647 PaintSurface* surface = getOrCreateSurface(); |
655 if (m_imageBuffer && m_surfacePaintCanvas) | 648 if (m_imageBuffer && surface) |
656 m_imageBuffer->resetCanvas(m_surfacePaintCanvas.get()); | 649 m_imageBuffer->resetCanvas(surface->getCanvas()); |
657 } | 650 } |
658 | 651 |
659 void Canvas2DLayerBridge::setImageBuffer(ImageBuffer* imageBuffer) { | 652 void Canvas2DLayerBridge::setImageBuffer(ImageBuffer* imageBuffer) { |
660 m_imageBuffer = imageBuffer; | 653 m_imageBuffer = imageBuffer; |
661 if (m_imageBuffer && m_isDeferralEnabled) { | 654 if (m_imageBuffer && m_isDeferralEnabled) { |
662 m_imageBuffer->resetCanvas(m_recorder->getRecordingCanvas()); | 655 m_imageBuffer->resetCanvas(m_recorder->getRecordingCanvas()); |
663 } | 656 } |
664 } | 657 } |
665 | 658 |
666 void Canvas2DLayerBridge::beginDestruction() { | 659 void Canvas2DLayerBridge::beginDestruction() { |
667 if (m_destructionInProgress) | 660 if (m_destructionInProgress) |
668 return; | 661 return; |
669 if (isHibernating()) | 662 if (isHibernating()) |
670 m_logger->reportHibernationEvent(HibernationEndedWithTeardown); | 663 m_logger->reportHibernationEvent(HibernationEndedWithTeardown); |
671 m_hibernationImage.reset(); | 664 m_hibernationImage.reset(); |
672 m_recorder.reset(); | 665 m_recorder.reset(); |
673 m_imageBuffer = nullptr; | 666 m_imageBuffer = nullptr; |
674 m_destructionInProgress = true; | 667 m_destructionInProgress = true; |
675 setIsHidden(true); | 668 setIsHidden(true); |
676 ResetSurface(); | 669 m_surface.reset(); |
677 | 670 |
678 if (m_layer && m_accelerationMode != DisableAcceleration) { | 671 if (m_layer && m_accelerationMode != DisableAcceleration) { |
679 GraphicsLayer::unregisterContentsLayer(m_layer->layer()); | 672 GraphicsLayer::unregisterContentsLayer(m_layer->layer()); |
680 m_layer->clearTexture(); | 673 m_layer->clearTexture(); |
681 // Orphaning the layer is required to trigger the recration of a new layer | 674 // Orphaning the layer is required to trigger the recration of a new layer |
682 // in the case where destruction is caused by a canvas resize. Test: | 675 // in the case where destruction is caused by a canvas resize. Test: |
683 // virtual/gpu/fast/canvas/canvas-resize-after-paint-without-layout.html | 676 // virtual/gpu/fast/canvas/canvas-resize-after-paint-without-layout.html |
684 m_layer->layer()->removeFromParent(); | 677 m_layer->layer()->removeFromParent(); |
685 } | 678 } |
686 | 679 |
(...skipping 24 matching lines...) Expand all Loading... |
711 BLINK_FROM_HERE, WTF::bind(&hibernateWrapperForTesting, | 704 BLINK_FROM_HERE, WTF::bind(&hibernateWrapperForTesting, |
712 m_weakPtrFactory.createWeakPtr())); | 705 m_weakPtrFactory.createWeakPtr())); |
713 } else { | 706 } else { |
714 Platform::current()->currentThread()->scheduler()->postIdleTask( | 707 Platform::current()->currentThread()->scheduler()->postIdleTask( |
715 BLINK_FROM_HERE, | 708 BLINK_FROM_HERE, |
716 WTF::bind(&hibernateWrapper, m_weakPtrFactory.createWeakPtr())); | 709 WTF::bind(&hibernateWrapper, m_weakPtrFactory.createWeakPtr())); |
717 } | 710 } |
718 } | 711 } |
719 if (!isHidden() && m_softwareRenderingWhileHidden) { | 712 if (!isHidden() && m_softwareRenderingWhileHidden) { |
720 flushRecordingOnly(); | 713 flushRecordingOnly(); |
721 SkPaint copyPaint; | 714 PaintFlags copyPaint; |
722 copyPaint.setBlendMode(SkBlendMode::kSrc); | 715 copyPaint.setBlendMode(SkBlendMode::kSrc); |
723 | 716 |
724 sk_sp<SkSurface> oldSurface = std::move(m_surface); | 717 sk_sp<PaintSurface> oldSurface = std::move(m_surface); |
725 ResetSurface(); | 718 m_surface.reset(); |
726 | 719 |
727 m_softwareRenderingWhileHidden = false; | 720 m_softwareRenderingWhileHidden = false; |
728 SkSurface* newSurface = | 721 PaintSurface* newSurface = |
729 getOrCreateSurface(PreferAccelerationAfterVisibilityChange); | 722 getOrCreateSurface(PreferAccelerationAfterVisibilityChange); |
730 if (newSurface) { | 723 if (newSurface) { |
731 if (oldSurface) | 724 if (oldSurface) |
732 oldSurface->draw(newSurface->getCanvas(), 0, 0, ©Paint); | 725 oldSurface->draw(newSurface->getCanvas(), 0, 0, ©Paint); |
733 if (m_imageBuffer && !m_isDeferralEnabled) { | 726 if (m_imageBuffer && !m_isDeferralEnabled) { |
734 m_imageBuffer->resetCanvas(m_surfacePaintCanvas.get()); | 727 m_imageBuffer->resetCanvas(m_surface->getCanvas()); |
735 } | 728 } |
736 } | 729 } |
737 } | 730 } |
738 if (!isHidden() && isHibernating()) { | 731 if (!isHidden() && isHibernating()) { |
739 getOrCreateSurface(); // Rude awakening | 732 getOrCreateSurface(); // Rude awakening |
740 } | 733 } |
741 } | 734 } |
742 | 735 |
743 bool Canvas2DLayerBridge::writePixels(const SkImageInfo& origInfo, | 736 bool Canvas2DLayerBridge::writePixels(const SkImageInfo& origInfo, |
744 const void* pixels, | 737 const void* pixels, |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
826 if (m_destructionInProgress) | 819 if (m_destructionInProgress) |
827 return false; | 820 return false; |
828 if (isHibernating()) | 821 if (isHibernating()) |
829 return true; | 822 return true; |
830 if (!m_layer || m_accelerationMode == DisableAcceleration) | 823 if (!m_layer || m_accelerationMode == DisableAcceleration) |
831 return true; | 824 return true; |
832 if (!m_surface) | 825 if (!m_surface) |
833 return false; | 826 return false; |
834 if (m_contextProvider->contextGL()->GetGraphicsResetStatusKHR() != | 827 if (m_contextProvider->contextGL()->GetGraphicsResetStatusKHR() != |
835 GL_NO_ERROR) { | 828 GL_NO_ERROR) { |
836 ResetSurface(); | 829 m_surface.reset(); |
837 for (auto mailboxInfo = m_mailboxes.begin(); | 830 for (auto mailboxInfo = m_mailboxes.begin(); |
838 mailboxInfo != m_mailboxes.end(); ++mailboxInfo) { | 831 mailboxInfo != m_mailboxes.end(); ++mailboxInfo) { |
839 if (mailboxInfo->m_image) | 832 if (mailboxInfo->m_image) |
840 mailboxInfo->m_image.reset(); | 833 mailboxInfo->m_image.reset(); |
841 } | 834 } |
842 if (m_imageBuffer) | 835 if (m_imageBuffer) |
843 m_imageBuffer->notifySurfaceInvalid(); | 836 m_imageBuffer->notifySurfaceInvalid(); |
844 CanvasMetrics::countCanvasContextUsage( | 837 CanvasMetrics::countCanvasContextUsage( |
845 CanvasMetrics::Accelerated2DCanvasGPUContextLost); | 838 CanvasMetrics::Accelerated2DCanvasGPUContextLost); |
846 } | 839 } |
847 return m_surface.get(); | 840 return m_surface.get(); |
848 } | 841 } |
849 | 842 |
850 bool Canvas2DLayerBridge::restoreSurface() { | 843 bool Canvas2DLayerBridge::restoreSurface() { |
851 DCHECK(!m_destructionInProgress); | 844 DCHECK(!m_destructionInProgress); |
852 if (m_destructionInProgress || !isAccelerated()) | 845 if (m_destructionInProgress || !isAccelerated()) |
853 return false; | 846 return false; |
854 DCHECK(!m_surface); | 847 DCHECK(!m_surface); |
855 | 848 |
856 gpu::gles2::GLES2Interface* sharedGL = nullptr; | 849 gpu::gles2::GLES2Interface* sharedGL = nullptr; |
857 m_layer->clearTexture(); | 850 m_layer->clearTexture(); |
858 m_contextProvider = WTF::wrapUnique( | 851 m_contextProvider = WTF::wrapUnique( |
859 Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); | 852 Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); |
860 if (m_contextProvider) | 853 if (m_contextProvider) |
861 sharedGL = m_contextProvider->contextGL(); | 854 sharedGL = m_contextProvider->contextGL(); |
862 | 855 |
863 if (sharedGL && sharedGL->GetGraphicsResetStatusKHR() == GL_NO_ERROR) { | 856 if (sharedGL && sharedGL->GetGraphicsResetStatusKHR() == GL_NO_ERROR) { |
864 GrContext* grCtx = m_contextProvider->grContext(); | 857 GrContext* grCtx = m_contextProvider->grContext(); |
865 bool surfaceIsAccelerated; | 858 bool surfaceIsAccelerated; |
866 sk_sp<SkSurface> surface(createSkSurface( | 859 sk_sp<PaintSurface> surface(createSkSurface( |
867 grCtx, m_size, m_msaaSampleCount, m_opacityMode, skSurfaceColorSpace(), | 860 grCtx, m_size, m_msaaSampleCount, m_opacityMode, skSurfaceColorSpace(), |
868 m_colorType, &surfaceIsAccelerated)); | 861 m_colorType, &surfaceIsAccelerated)); |
869 if (!m_surface) | 862 if (!m_surface) |
870 reportSurfaceCreationFailure(); | 863 reportSurfaceCreationFailure(); |
871 | 864 |
872 // The current paradigm does not support switching from accelerated to | 865 // The current paradigm does not support switching from accelerated to |
873 // non-accelerated, which would be tricky due to changes to the layer tree, | 866 // non-accelerated, which would be tricky due to changes to the layer tree, |
874 // which can only happen at specific times during the document lifecycle. | 867 // which can only happen at specific times during the document lifecycle. |
875 // Therefore, we can only accept the restored surface if it is accelerated. | 868 // Therefore, we can only accept the restored surface if it is accelerated. |
876 if (surface && surfaceIsAccelerated) { | 869 if (surface && surfaceIsAccelerated) { |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1116 default; | 1109 default; |
1117 | 1110 |
1118 void Canvas2DLayerBridge::Logger::reportHibernationEvent( | 1111 void Canvas2DLayerBridge::Logger::reportHibernationEvent( |
1119 HibernationEvent event) { | 1112 HibernationEvent event) { |
1120 DEFINE_STATIC_LOCAL(EnumerationHistogram, hibernationHistogram, | 1113 DEFINE_STATIC_LOCAL(EnumerationHistogram, hibernationHistogram, |
1121 ("Canvas.HibernationEvents", HibernationEventCount)); | 1114 ("Canvas.HibernationEvents", HibernationEventCount)); |
1122 hibernationHistogram.count(event); | 1115 hibernationHistogram.count(event); |
1123 } | 1116 } |
1124 | 1117 |
1125 } // namespace blink | 1118 } // namespace blink |
OLD | NEW |