blob: 6bf66d686a487adce888a916b6e7a4f3ab27d23f [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_CANVAS_RESOURCE_HOST_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_CANVAS_RESOURCE_HOST_H_
#include <memory>
#include "cc/layers/texture_layer.h"
#include "cc/layers/texture_layer_client.h"
#include "third_party/blink/renderer/platform/graphics/graphics_types.h"
#include "third_party/blink/renderer/platform/graphics/paint/paint_canvas.h"
#include "third_party/blink/renderer/platform/platform_export.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/hdr_metadata.h"
namespace cc {
class PaintCanvas;
} // namespace cc
namespace blink {
class CanvasResourceProvider;
class SharedContextRateLimiter;
class PLATFORM_EXPORT CanvasResourceHost : public cc::TextureLayerClient {
public:
explicit CanvasResourceHost(gfx::Size size);
~CanvasResourceHost() override;
// cc::TextureLayerClient implementation.
bool PrepareTransferableResource(
cc::SharedBitmapIdRegistrar* bitmap_registrar,
viz::TransferableResource* out_resource,
viz::ReleaseCallback* out_release_callback) override;
virtual void NotifyGpuContextLost() = 0;
virtual void SetNeedsCompositingUpdate() = 0;
virtual void InitializeForRecording(cc::PaintCanvas* canvas) const = 0;
virtual void UpdateMemoryUsage() = 0;
virtual size_t GetMemoryUsage() const = 0;
virtual void PageVisibilityChanged() {}
virtual CanvasResourceProvider* GetOrCreateCanvasResourceProvider(
RasterModeHint hint) = 0;
virtual CanvasResourceProvider* GetOrCreateCanvasResourceProviderImpl(
RasterModeHint hint) = 0;
bool IsComposited() const;
bool IsResourceValid();
gfx::Size Size() const { return size_; }
virtual void SetSize(gfx::Size size) { size_ = size; }
virtual void SetFilterQuality(cc::PaintFlags::FilterQuality filter_quality);
cc::PaintFlags::FilterQuality FilterQuality() const {
return filter_quality_;
}
void SetHdrMetadata(const gfx::HDRMetadata& hdr_metadata);
const gfx::HDRMetadata& GetHDRMetadata() const { return hdr_metadata_; }
virtual bool LowLatencyEnabled() const { return false; }
CanvasResourceProvider* ResourceProvider() const {
return resource_provider_.get();
}
// TODO(junov): remove "virtual" when refactoring is complete.
virtual void FlushRecording(FlushReason reason);
std::unique_ptr<CanvasResourceProvider> ReplaceResourceProvider(
std::unique_ptr<CanvasResourceProvider>);
virtual void DiscardResourceProvider();
void SetIsDisplayed(bool);
bool IsDisplayed() { return is_displayed_; }
virtual bool IsPageVisible() = 0;
virtual bool IsPrinting() const { return false; }
virtual bool PrintedInCurrentTask() const = 0;
virtual bool IsHibernating() const { return false; }
RasterModeHint preferred_2d_raster_mode() const {
return preferred_2d_raster_mode_;
}
bool ShouldTryToUseGpuRaster() const;
void SetPreferred2DRasterMode(RasterModeHint);
// Temporary plumbing while relocating code from Canvas2DLayerBridge.
SharedContextRateLimiter* RateLimiter() const;
void CreateRateLimiter();
unsigned IncrementFramesSinceLastCommit() {
return ++frames_since_last_commit_;
}
void AlwaysEnableRasterTimersForTesting() {
always_enable_raster_timers_for_testing_ = true;
}
// Actual RasterMode used for rendering 2d primitives.
RasterMode GetRasterMode() const;
void ResetLayer();
void ClearLayerTexture();
void SetNeedsPushProperties();
cc::TextureLayer* GetOrCreateCcLayerIfNeeded();
cc::TextureLayer* CcLayer() { return cc_layer_.get(); }
void DoPaintInvalidation(const gfx::Rect& dirty_rect);
void SetOpacityMode(OpacityMode opacity_mode);
// Temporary, for canvas_2d_layer_bridge use.
bool context_lost() { return context_lost_; }
void set_context_lost(bool value) { context_lost_ = value; }
private:
bool is_displayed_ = false;
bool context_lost_ = false;
unsigned frames_since_last_commit_ = 0;
std::unique_ptr<SharedContextRateLimiter> rate_limiter_;
std::unique_ptr<CanvasResourceProvider> resource_provider_;
cc::PaintFlags::FilterQuality filter_quality_ =
cc::PaintFlags::FilterQuality::kLow;
gfx::HDRMetadata hdr_metadata_;
RasterModeHint preferred_2d_raster_mode_ = RasterModeHint::kPreferCPU;
gfx::Size size_;
bool always_enable_raster_timers_for_testing_ = false;
scoped_refptr<cc::TextureLayer> cc_layer_;
OpacityMode opacity_mode_ = kNonOpaque;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_CANVAS_RESOURCE_HOST_H_