diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc | 104 |
1 files changed, 35 insertions, 69 deletions
diff --git a/chromium/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc b/chromium/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc index 0122380a437..f03d90ef1e9 100644 --- a/chromium/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc +++ b/chromium/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc @@ -30,10 +30,10 @@ #include "base/location.h" #include "base/single_thread_task_runner.h" +#include "cc/layers/texture_layer.h" #include "components/viz/common/resources/transferable_resource.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "third_party/blink/public/platform/platform.h" -#include "third_party/blink/public/platform/web_compositor_support.h" #include "third_party/blink/renderer/platform/graphics/canvas_heuristic_parameters.h" #include "third_party/blink/renderer/platform/graphics/canvas_metrics.h" #include "third_party/blink/renderer/platform/graphics/canvas_resource.h" @@ -46,7 +46,7 @@ #include "third_party/blink/renderer/platform/graphics/web_graphics_context_3d_provider_wrapper.h" #include "third_party/blink/renderer/platform/histogram.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" -#include "third_party/blink/renderer/platform/scheduler/child/web_scheduler.h" +#include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h" #include "third_party/skia/include/core/SkData.h" #include "third_party/skia/include/core/SkSurface.h" @@ -65,11 +65,9 @@ Canvas2DLayerBridge::Canvas2DLayerBridge(const IntSize& size, AccelerationMode acceleration_mode, const CanvasColorParams& color_params) : logger_(std::make_unique<Logger>()), - weak_ptr_factory_(this), msaa_sample_count_(msaa_sample_count), bytes_allocated_(0), have_recorded_draw_commands_(false), - destruction_in_progress_(false), filter_quality_(kLow_SkFilterQuality), is_hidden_(false), is_deferral_enabled_(true), @@ -78,7 +76,8 @@ Canvas2DLayerBridge::Canvas2DLayerBridge(const IntSize& size, color_params_(color_params), size_(size), snapshot_state_(kInitialSnapshotState), - resource_host_(nullptr) { + resource_host_(nullptr), + weak_ptr_factory_(this) { // Used by browser tests to detect the use of a Canvas2DLayerBridge. TRACE_EVENT_INSTANT0("test_gpu", "Canvas2DLayerBridgeCreation", TRACE_EVENT_SCOPE_GLOBAL); @@ -96,9 +95,25 @@ Canvas2DLayerBridge::Canvas2DLayerBridge(const IntSize& size, } Canvas2DLayerBridge::~Canvas2DLayerBridge() { - BeginDestruction(); - DCHECK(destruction_in_progress_); - layer_.reset(); + if (IsHibernating()) + logger_->ReportHibernationEvent(kHibernationEndedWithTeardown); + ResetResourceProvider(); + + if (layer_ && acceleration_mode_ != kDisableAcceleration) { + GraphicsLayer::UnregisterContentsLayer(layer_.get()); + layer_->ClearTexture(); + // Orphaning the layer is required to trigger the recration of a new layer + // in the case where destruction is caused by a canvas resize. Test: + // virtual/gpu/fast/canvas/canvas-resize-after-paint-without-layout.html + layer_->RemoveFromParent(); + } + + DCHECK(!bytes_allocated_); + + if (layer_) { + layer_->ClearClient(); + layer_ = nullptr; + } } void Canvas2DLayerBridge::StartRecording() { @@ -188,11 +203,6 @@ void Canvas2DLayerBridge::Hibernate() { hibernation_scheduled_ = false; - if (destruction_in_progress_) { - logger_->ReportHibernationEvent(kHibernationAbortedDueToPendingDestruction); - return; - } - if (!resource_provider_) { logger_->ReportHibernationEvent(kHibernationAbortedBecauseNoSurface); return; @@ -298,13 +308,12 @@ CanvasResourceProvider* Canvas2DLayerBridge::GetOrCreateResourceProvider( } if (resource_provider_ && resource_provider_->IsAccelerated() && !layer_) { - layer_ = - Platform::Current()->CompositorSupport()->CreateExternalTextureLayer( - this); - layer_->SetOpaque(ColorParams().GetOpacityMode() == kOpaque); + layer_ = cc::TextureLayer::CreateForMailbox(this); + layer_->SetIsDrawable(true); + layer_->SetContentsOpaque(ColorParams().GetOpacityMode() == kOpaque); layer_->SetBlendBackgroundColor(ColorParams().GetOpacityMode() != kOpaque); - GraphicsLayer::RegisterContentsLayer(layer_->Layer()); layer_->SetNearestNeighbor(filter_quality_ == kNone_SkFilterQuality); + GraphicsLayer::RegisterContentsLayer(layer_.get()); } if (resource_provider_ && IsHibernating()) { @@ -384,31 +393,7 @@ void Canvas2DLayerBridge::DisableDeferral(DisableDeferralReason reason) { resource_host_->RestoreCanvasMatrixClipStack(resource_provider_->Canvas()); } -void Canvas2DLayerBridge::BeginDestruction() { - if (destruction_in_progress_) - return; - if (IsHibernating()) - logger_->ReportHibernationEvent(kHibernationEndedWithTeardown); - hibernation_image_.reset(); - recorder_.reset(); - destruction_in_progress_ = true; - SetIsHidden(true); - ResetResourceProvider(); - - if (layer_ && acceleration_mode_ != kDisableAcceleration) { - GraphicsLayer::UnregisterContentsLayer(layer_->Layer()); - layer_->ClearTexture(); - // Orphaning the layer is required to trigger the recration of a new layer - // in the case where destruction is caused by a canvas resize. Test: - // virtual/gpu/fast/canvas/canvas-resize-after-paint-without-layout.html - layer_->Layer()->RemoveFromParent(); - } - - DCHECK(!bytes_allocated_); -} - void Canvas2DLayerBridge::SetFilterQuality(SkFilterQuality filter_quality) { - DCHECK(!destruction_in_progress_); filter_quality_ = filter_quality; if (resource_provider_) resource_provider_->SetFilterQuality(filter_quality); @@ -417,16 +402,15 @@ void Canvas2DLayerBridge::SetFilterQuality(SkFilterQuality filter_quality) { } void Canvas2DLayerBridge::SetIsHidden(bool hidden) { - bool new_hidden_value = hidden || destruction_in_progress_; - if (is_hidden_ == new_hidden_value) + if (is_hidden_ == hidden) return; - is_hidden_ = new_hidden_value; + is_hidden_ = hidden; if (resource_provider_) resource_provider_->SetResourceRecyclingEnabled(!IsHidden()); if (CANVAS2D_HIBERNATION_ENABLED && resource_provider_ && IsHidden() && - !destruction_in_progress_ && !hibernation_scheduled_) { + !hibernation_scheduled_) { if (layer_) layer_->ClearTexture(); logger_->ReportHibernationEvent(kHibernationScheduled); @@ -512,7 +496,6 @@ void Canvas2DLayerBridge::SkipQueuedDrawCommands() { } void Canvas2DLayerBridge::FlushRecording() { - DCHECK(!destruction_in_progress_); if (have_recorded_draw_commands_ && GetOrCreateResourceProvider()) { TRACE_EVENT0("cc", "Canvas2DLayerBridge::flushRecording"); @@ -538,9 +521,6 @@ bool Canvas2DLayerBridge::IsValid() const { } bool Canvas2DLayerBridge::CheckResourceProviderValid() { - DCHECK(!destruction_in_progress_); - if (destruction_in_progress_) - return false; if (IsHibernating()) return true; if (!layer_ || acceleration_mode_ == kDisableAcceleration) @@ -552,7 +532,7 @@ bool Canvas2DLayerBridge::CheckResourceProviderValid() { context_lost_ = true; ResetResourceProvider(); if (resource_host_) - resource_host_->NotifySurfaceInvalid(); + resource_host_->NotifyGpuContextLost(); CanvasMetrics::CountCanvasContextUsage( CanvasMetrics::kAccelerated2DCanvasGPUContextLost); return false; @@ -563,9 +543,8 @@ bool Canvas2DLayerBridge::CheckResourceProviderValid() { } bool Canvas2DLayerBridge::Restore() { - DCHECK(!destruction_in_progress_); DCHECK(context_lost_); - if (destruction_in_progress_ || !IsAccelerated()) + if (!IsAccelerated()) return false; DCHECK(!resource_provider_); @@ -607,14 +586,6 @@ bool Canvas2DLayerBridge::PrepareTransferableResource( cc::SharedBitmapIdRegistrar* bitmap_registrar, viz::TransferableResource* out_resource, std::unique_ptr<viz::SingleReleaseCallback>* out_release_callback) { - if (destruction_in_progress_) { - // It can be hit in the following sequence. - // 1. Canvas draws something. - // 2. The compositor begins the frame. - // 3. Javascript makes a context be lost. - // 4. Here. - return false; - } DCHECK(layer_); // This explodes if FinalizeFrame() was not called. @@ -643,18 +614,15 @@ bool Canvas2DLayerBridge::PrepareTransferableResource( // Note frame is kept alive via a reference kept in out_release_callback. bool success = frame->PrepareTransferableResource(out_resource, out_release_callback); - if (success) - out_resource->color_space = color_params_.GetSamplerGfxColorSpace(); return success; } return false; } -WebLayer* Canvas2DLayerBridge::Layer() { - DCHECK(!destruction_in_progress_); +cc::Layer* Canvas2DLayerBridge::Layer() { // Trigger lazy layer creation GetOrCreateResourceProvider(kPreferAcceleration); - return layer_ ? layer_->Layer() : nullptr; + return layer_.get(); } void Canvas2DLayerBridge::DidDraw(const FloatRect& rect) { @@ -685,7 +653,6 @@ void Canvas2DLayerBridge::DidDraw(const FloatRect& rect) { void Canvas2DLayerBridge::FinalizeFrame() { TRACE_EVENT0("blink", "Canvas2DLayerBridge::FinalizeFrame"); - DCHECK(!destruction_in_progress_); // Make sure surface is ready for painting: fix the rendering mode now // because it will be too late during the paint invalidation phase. @@ -710,9 +677,8 @@ void Canvas2DLayerBridge::FinalizeFrame() { } void Canvas2DLayerBridge::DoPaintInvalidation(const FloatRect& dirty_rect) { - DCHECK(!destruction_in_progress_); if (layer_ && acceleration_mode_ != kDisableAcceleration) - layer_->Layer()->InvalidateRect(EnclosingIntRect(dirty_rect)); + layer_->SetNeedsDisplayRect(EnclosingIntRect(dirty_rect)); } scoped_refptr<StaticBitmapImage> Canvas2DLayerBridge::NewImageSnapshot( |