summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc
diff options
context:
space:
mode:
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.cc104
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(